ZGlmZiAtLWdpdCBhL3YxL1JFQURNRS50eHQgYi92MS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmUxOWI4Li4wMDAwMDAwCi0tLSBhL3YxL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotWE1MQmVhbnMgdjEuMC4yCi0KLVdlbGNvbWUgdG8gWG1sQmVhbnMhCi0KLUFwYWNoZSBYTUxCZWFucyBpcyBhbiBlZmZvcnQgdW5kZXJnb2luZyBpbmN1YmF0aW9uIGF0IHRoZSAKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpLCBzcG9uc29yZWQgYnkgdGhlIFhNTCBwcm9qZWN0LiAKLUluY3ViYXRpb24gaXMgcmVxdWlyZWQgb2YgYWxsIG5ld2x5IGFjY2VwdGVkIHByb2plY3RzIHVudGlsIGEgCi1mdXJ0aGVyIHJldmlldyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5mcmFzdHJ1Y3R1cmUsIGNvbW11bmljYXRpb25zLCAKLWFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcyBoYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCAKLXdpdGggb3RoZXIgc3VjY2Vzc2Z1bCBBU0YgcHJvamVjdHMuIFdoaWxlIGluY3ViYXRpb24gc3RhdHVzIGlzIG5vdCAKLW5lY2Vzc2FyaWx5IGEgcmVmbGVjdGlvbiBvZiB0aGUgY29tcGxldGVuZXNzIG9yIHN0YWJpbGl0eSBvZiB0aGUgCi1jb2RlLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgdGhlIHByb2plY3QgaGFzIHlldCB0byBiZSBmdWxseSAKLWVuZG9yc2VkIGJ5IHRoZSBBU0YuIAotCi0KLUlmIHlvdSd2ZSBjb21lIGhlcmUgdG8gbGVhcm4gbW9yZSBhYm91dCBYbWxCZWFucywgaGVyZSBhcmUgYSBmZXcKLXN0YXJ0aW5nIHBvaW50czoKLQotCi0KLQotKDEpIERvY3MKLSAgICAKLUlmIHlvdSAiYW50IGRvY3MiIHRoZW4geW91IGNhbiBnZXQgamF2YWRvY3MgYnVpbHQgZm9yIGEgYnVuY2gKLW9mIG91ciBzdHVmZi4gSW4gcGFydGljdWxhciwgbG9vayBhdCB0aGUgb3JnLmFwYWNoZS54bWxiZWFucyBwYWNrYWdlLAotc3RhcnRpbmcgd2l0aCBYbWxPYmplY3QgYW5kIFhtbEN1cnNvci4KLQotTm90IGEgbG90IGlzIGRvYydlZCB5ZXQsIHNvIHlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlIHNhbXBsZXMKLXRvIGxlYXJuIG1vcmUgLSB3ZSByZWFsbHkgbmVlZCBhIGxpdHRsZSB0dXRvcmlhbC4KLQotSW4gdGhlIG1lYW4gdGltZSwgaWYgeW91J3ZlIGdvdCBtb3JlIHF1ZXN0aW9ucywgcGxlYXNlIHBvc3QgeW91ciBxdWVzdGlvbnMKLXRvIHhtbGJlYW5zLXVzZXJAeG1sLmFwYWNoZS5vcmcgKHlvdSBuZWVkIHRvIHN1YnNjcmliZSBwcmlvciB0byBwb3N0aW5nLAotYnkgc2VuZGluZyBhIGJsYW5rIG1haWwgdG8geG1sYmVhbnMtdXNlci1zdWJzY3JpYmVAeG1sLmFwYWNoZS5vcmcpLgotCi0KLQotKDIpIEJ1aWxkCi0KLVRoZSBkZWZhdWx0IHRhcmdldCwgYWthICJhbnQgZGVmYXVsdCIsIGJ1aWxkcyBldmVyeXRoaW5nIHlvdSBuZWVkCi10byB0ZXN0IGFuZCBydW4uIAotCi0KLU90aGVyIHRhcmdldHM6Ci0gIGFudCBidWlsZDogYnVpbGRzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGphcnMgc28gb3RoZXIgZGVwZW5kZW5jaWVzIGNhbiBjb21waWxlCi0gIGFudCBkZXBsb3k6IGJ1aWxkcyB4YmVhbi5qYXIgdG9vCi0gIGFudCBkcnQ6IGJ1aWxkcyBkcnQgdGVzdHMgdG9vCi0gIGFudCBib290c3RyYXA6IGJ1aWxkcyB4YmVhbi5qYXIsIHRoZW4gYnVpbGRzIGl0IGFnYWluIHVzaW5nIGl0c2VsZi4KLQotCi1JbnRlcmZhY2UgSkFSczoKLQoteG1scHVibGljLmphciAtIHRoZSBYQmVhbnMgcHVibGljIGludGVyZmFjZXMsIGZvciB1c2UgYnkgb3VyIHVzZXJzLgotd2x4YmVhbi5qYXIgLSBpbnRlcmZhY2VzIHNwZWNpZmljIHRvIHRoZSBJREUvcnVudGltZSwgbm90IGZvciB1c2UgYnkgb3RoZXJzLgotCi0KLUltcGxlbWVudGF0aW9uIEpBUnM6Ci0KLXhiZWFuLmphciAtIHRoZSB3aG9sZSB4YmVhbi5qYXIgLSBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHJ1bi4gV2hlbiB0aGlzCi0gaXMgb24geW91ciBjbGFzc3BhdGgsIHlvdSBkb24ndCBuZWVkIHhtbHB1YmxpYy5qYXIgb3Igd2x4YmVhbi5qYXIKLQotCi1UZXN0aW5nIEpBUnM6Ci0KLWRydC5qYXIgLSBvdXIgRFJUCi1lbnVtdGVzdC5qYXIsIGVhc3lwby5qYXIsIG5hbWV3b3JsZC5qYXIsIHhzdHlwZXMuamFyIC0gc2FtcGxlIFhCZWFuIEpBUnMuCi0KLQotT3RoZXIgSkFSczoKLQotb2xkeGJlYW4uamFyIC0gYSBmdWxseSBidWlsdCBwcmV2aW91cy12ZXJzaW9uIG9mIHhiZWFuLmphciwgdXNlZCBmb3IKLSAgYm9vdHN0cmFwcGluZywgc2luY2UgeGJlYW5zIGFyZSB1c2VkIGluIGJ1aWxkaW5nIHhiZWFuLmphciBpdHNlbGYuCi0KLQotCi0KLQotKDMpIFJ1bm5pbmcKLQotVGhlcmUgYXJlIGEgZmV3IHdheXMgeW91IGNhbiBydW4uICBUaGVyZSBpcyBzb21lIHByZXR0eSBwbGFpbi1qYW5lCi1KVW5pdCB0ZXN0aW5nIGNvZGUgY2hlY2tlZCBpbnRvIHhiZWFuXHRlc3Rcc3JjXGRydCB0aGF0IHlvdSBjYW4KLXVzZSB0byBzZWUgaG93IHRvIGV4ZXJjaXNlIG91ciBmdW5jdGlvbmFsaXR5LiAoVGhlIHRlc3RzIGluIHRoYXQKLWRpcmVjdG9yeSBhcmUgb3VyIERldmVsb3BlciBSZWdyZXNzaW9uIFRlc3RzLikKLQotWW91IGNhbiBydW4gdGhlIGRydCB1c2luZyB4YmVhblxiaW5cZHJ0Wy5zaHwuY21kXS4KLQotQW5vdGhlciB0b29sIHRoYXQgeW91IGNhbiB1c2UgaXMgInNjb21wIiwgdGhlIFhCZWFuIHNjaGVtYQotY29tcGlsZXIuIFRoZSBzY29tcCBzY3JpcHQgaXMgYXQgeGJlYW5cYmluXHNjb21wWy5zaHwuY21kXS4KLQotVG8gcnVuIHNjb21wLCBqdXN0IHBvaW50IGl0IGF0IGFuIFhTRCBmaWxlIG9yIGEgZGlyZWN0b3J5IGZ1bGwKLW9mIFhTRCBmaWxlcywgYW5kIGl0IHdpbGwgcHJvZHVjZSBhbiBvdXRwdXQgLmphciB3aXRoIGFsbCB5b3VyCi10eXBlcy4KLQotU2luY2Ugc2NvbXAgamFycyB1cCBpdHMgcmVzdWx0cywgaXQgY2FuIGJlIGhhcmQgdG8gc2VlIHdoYXQgaXQKLWlzIGRvaW5nLiBCdXQgaWYgeW91IHVzZSB0aGUgIi1zcmMgbXlkaXIiIG9wdGlvbiB3aXRoIHNjb21wLAoteW91IGNhbiBzcGVjaWZ5IGEgZGlyZWN0b3J5IGludG8gd2hpY2ggaXQgd2lsbCBkdW1wIC5qYXZhIHNvdXJjZQotY29kZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGphdmEgdHlwZXMgaXQgaXMgZ2VuZXJhdGluZy4KLQotRmluYWxseSwgdGhlcmUgaXMgYSB1dGlsaXR5IGNhbGxlZCAiZHVtcHhzYiIuIElmIHlvdSB1bmphcgotYSBidWlsdCB4YmVhbiBqYXIsIHlvdSdsbCBub3RpY2UgYSBidW5jaCBvZiAueHNiIGZpbGVzIHNjYXR0ZXJlZAotYWJvdXQuIEVhY2ggb25lIG9mIHRoZXNlIGZpbGVzIHJlcHJlc2VudHMgYSBzY2hlbWEgdHlwZSwgYXR0cmlidXRlLAotb3IgZWxlbWVudCBkZWZpbml0aW9uLCBhbmQgeW91IGNhbiB1c2UgImR1bXB4c2IiIHRvIHNlZSB0aGUKLWNvbnRlbnRzLgotCmRpZmYgLS1naXQgYS92MS9iaW4vZHVtcHhzYiBiL3YxL2Jpbi9kdW1weHNiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMDI0ZGE1Li4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9kdW1weHNiCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyEvYmluL3NoCi0jWFNCIGZpbGUgZHVtcGVyCi0jUHJpbnRzIHRoZSBjb250ZW50cyBvZiBhbiB4c2IgZmlsZSBpbiBodW1hbi1yZWFkbWJsZSBmb3JtCi0KLWNwPQotCi1pZiBbIC1lICRYTUxCRUFOU19IT01FL2J1aWxkL2FyL3hiZWFuLmphciBdOyB0aGVuCi0gICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2J1aWxkL2FyL3hiZWFuLmphcjsKLWVsaWYgWyAtZSAkWE1MQkVBTlNfSE9NRS9saWIveGJlYW4uamFyIF07IHRoZW4KLSAgICBjcD0kY3A6JFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphcjsKLWZpCi0KLWNhc2UgImB1bmFtZWAiIGluCi0gICAgQ1lHV0lOKikKLSAgICAgICAgY3A9YGN5Z3BhdGggLXcgLXAgJGNwYAotICAgICAgICA7OwotZXNhYwotCi1qYXZhIC1jbGFzc3BhdGggJGNwIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlhzYkR1bXBlciAkKgpkaWZmIC0tZ2l0IGEvdjEvYmluL2R1bXB4c2IuY21kIGIvdjEvYmluL2R1bXB4c2IuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlmZTFhLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9kdW1weHNiLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLUByZW0gWFNCIGZpbGUgZHVtcGVyCi1AcmVtCi1AcmVtIFByaW50cyB0aGUgY29udGVudHMgb2YgYW4geHNiIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLQotaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCi0pIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KLSkKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWHNiRHVtcGVyICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vamF4YmMuY21kIGIvdjEvYmluL2pheGJjLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkMjA3OS4uMDAwMDAwMAotLS0gYS92MS9iaW4vamF4YmMuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQHJlbSBTY2hlbWEgY29tcGlsZXIKLUByZW0KLUByZW0gQnVpbGRzIGpheGIgdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLUBlY2hvIG9mZgotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyCi1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcZXh0ZXJuYWxcbGliXGpheGItMS4wXGpheGItYXBpLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAtamF4YiAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3JhbmRvbS5jbWQgYi92MS9iaW4vcmFuZG9tLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyN2QyNi4uMDAwMDAwMAotLS0gYS92MS9iaW4vcmFuZG9tLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUBlY2hvIG9mZgotCi1AcmVtIERSVAotQHJlbQotQHJlbSBJbnZva2VzIFJhbmRvbSB0ZXN0Ci0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxwcml2YXRlXGxpYlxyYW5kb20uamFyCi1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRccHJpdmF0ZVxsaWJcZWFzeXBvLmphcgotCi1yZW0gamF2YSAtZWEgLUR0cmVlYXNzZXJ0cz10cnVlICAtRHhiZWFuLnJvb3RkaXI9JVhNTEJFQU5TX0hPTUUlIC1jbGFzc3BhdGggJWNwJSBSYW5kb20gLW5vcXVlcnkgJSoKLSAgICBqYXZhIC1lYSAtRHRyZWVhc3NlcnRzPWZhbHNlIC1EeGJlYW4ucm9vdGRpcj0lWE1MQkVBTlNfSE9NRSUgLWNsYXNzcGF0aCAlY3AlIFJhbmRvbSAtbm9xdWVyeSAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb21wIGIvdjEvYmluL3Njb21wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2NiZWVlLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9zY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jU2NoZW1hIGNvbXBpbGVyCi0jQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgotCi1jcD0KLQotaWYgWyAtZSAkWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXIgXTsgdGhlbgotICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXI7Ci1lbGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphciBdOyB0aGVuCi0gICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94YmVhbi5qYXI7Ci1maQotCi1jYXNlICJgdW5hbWVgIiBpbgotICAgIENZR1dJTiopCi0gICAgICAgIGNwPWBjeWdwYXRoIC13IC1wICRjcGAKLSAgICAgICAgOzsKLWVzYWMKLQotamF2YSAtY2xhc3NwYXRoICRjcCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAkKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb21wLmNtZCBiL3YxL2Jpbi9zY29tcC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmIwNTYuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3Njb21wLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUByZW0gU2NoZW1hIGNvbXBpbGVyCi1AcmVtCi1AcmVtIEJ1aWxkcyBYQmVhbiB0eXBlcyBmcm9tIHhzZCBmaWxlcy4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLQotaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCi0pIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KLSkKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29tcGlsZXIgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL2Jpbi9zY29weS5jbWQgYi92MS9iaW4vc2NvcHkuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTI5YTYyLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9zY29weS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AcmVtIFNjaGVtYSBjb21waWxlcgotQHJlbQotQHJlbSBCdWlsZHMgWEJlYW4gdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLUBlY2hvIG9mZgotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci0KLWlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgotKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCi0pCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvcHkgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL2Jpbi9zZG93bmxvYWQuY21kIGIvdjEvYmluL3Nkb3dubG9hZC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYjNlMmIuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3Nkb3dubG9hZC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AcmVtIFNjaGVtYSBkb3dubG9hZGVyCi1AcmVtCi1AcmVtIFRvb2wgdG8gZG93bmxvYWQgc2NoZW1hcy4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLQotaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCi0pIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KLSkKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hUmVzb3VyY2VNYW5hZ2VyICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vc2ZhY3Rvci5jbWQgYi92MS9iaW4vc2ZhY3Rvci5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMzRlMzIuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3NmYWN0b3IuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQHJlbSBTY2hlbWEgRmFjdG9yaW5nIHRvb2wKLUByZW0KLUByZW0gRmFjdG9yZXMgcmVkdW5kYW50IGRlZmluaXRpb25zIG91dCBvZiBhIHNldCBvZiBzY2hlbWFzIGFuZCB1c2VzIGltcG9ydHMgaW5zdGVhZC4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLQotaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCi0pIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KLSkKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuRmFjdG9ySW1wb3J0cyAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3ZhbGlkYXRlIGIvdjEvYmluL3ZhbGlkYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTg5ZGM5Li4wMDAwMDAwCi0tLSBhL3YxL2Jpbi92YWxpZGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBJbnN0YW5jZSBWYWxpZGF0b3IKLSMKLSMgVmFsaWRhdGVzIGFuIGluc3RhbmNlIGFnYWluc3QgYSBzY2hlbWEuCi0KLUNQPQotCi1pZiBbIC1lICRYTUxCRUFOU19IT01FL2J1aWxkL2FyL3hiZWFuLmphciBdOyB0aGVuCi0gICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2J1aWxkL2FyL3hiZWFuLmphcjsKLWVsaWYgWyAtZSAkWE1MQkVBTlNfSE9NRS9saWIveGJlYW4uamFyIF07IHRoZW4KLSAgICBjcD0kY3A6JFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphcjsKLWZpCi0KLWNhc2UgImB1bmFtZWAiIGluCi0gICAgQ1lHV0lOKikKLSAgICAgICAgQ1A9YGN5Z3BhdGggLXcgLXAgJENQYAotICAgICAgICA7OwotZXNhYwotCi1qYXZhIC1jbGFzc3BhdGggJENQIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLkluc3RhbmNlVmFsaWRhdG9yICQqCmRpZmYgLS1naXQgYS92MS9iaW4vdmFsaWRhdGUuY21kIGIvdjEvYmluL3ZhbGlkYXRlLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzZGQ0MS4uMDAwMDAwMAotLS0gYS92MS9iaW4vdmFsaWRhdGUuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQHJlbSBJbnN0YW5jZSBWYWxpZGF0b3IKLUByZW0KLUByZW0gVmFsaWRhdGVzIGFuIGluc3RhbmNlIGFnYWluc3QgYSBzY2hlbWEuCi0KLUBlY2hvIG9mZgotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci0KLWlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgotKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCi0pCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLkluc3RhbmNlVmFsaWRhdG9yICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4veHByZXR0eS5jbWQgYi92MS9iaW4veHByZXR0eS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZmUxM2IuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3hwcmV0dHkuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLUByZW0gSW52b2tlcyBwcmV0dHkgcHJpbnRlcgotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci0KLWlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgotKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCi0pCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlByZXR0eVByaW50ZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2Jpbi94c2R0cmVlLmNtZCBiL3YxL2Jpbi94c2R0cmVlLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2MjAyYy4uMDAwMDAwMAotLS0gYS92MS9iaW4veHNkdHJlZS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1AZWNobyBvZmYKLQotQHJlbSBJbnZva2VzIHR5cGUgaGllcmFyY2h5IHByaW50ZXIKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotCi1pZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4KLSkgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgotKQotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5UeXBlSGllcmFyY2h5UHJpbnRlciAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3hzdGMuY21kIGIvdjEvYmluL3hzdGMuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2I4ZTdiLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi94c3RjLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUBlY2hvIG9mZgotCi1AcmVtIEludm9rZXMgWFNUQwotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci0KLWlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgotKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCi0pCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlhTVENUZXN0ZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2J1aWxkLnhtbCBiL3YxL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3MmVlMC4uMDAwMDAwMAotLS0gYS92MS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NDYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08cHJvamVjdCBuYW1lPSJYYmVhbiIgZGVmYXVsdD0iZGVmYXVsdCIgYmFzZWRpcj0iLiI+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0iamF2YWMxLjQiLz4KLSAgPHByb3BlcnR5IG5hbWU9InByb2R1Y3QudmVyc2lvbiIgdmFsdWU9IjEuMC4yIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ1c2FnZSI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iVGhlIGZvbGxvd2luZyBhbnQgdGFyZ2V0cyBhcmUgZGVmaW5lZDoiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJ1c2FnZSAgICAtIHRoaXMgaGVscCB0ZXh0Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iYnVpbGQgICAgLSBidWlsZHMgb3VyIHB1YmxpYyBpbnRlcmZhY2UgamFycyBzbyBvdGhlcnMgY2FuIGNvbXBpbGUiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJkZXBsb3kgICAtIGJ1aWxkcyBvdXIgaW1wbGVtZW50YXRpb24gamFyICh4YmVhbi5qYXIpIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iY2xlYW4gICAgLSBjbGVhbnMgb3V0IHRoZSB4YmVhbnMgZGlyZWN0b3JpZXMiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJidWlsZGRydCAtIGJ1aWxkcywgYnV0IGRvZXMgbm90IHJ1biwgdGhlIHhiZWFuIGRydCIvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImRydCAgICAgIC0gcnVucyB0aGUgeGJlYW4gZHJ0Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSJidWlsZCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0ic291cmNlcywgeGJlYW4sIGRydC5qYXIsIHJhbmRvbS5qYXIiIC8+Ci0KLSAgPHRhcmdldCBuYW1lPSJzb3VyY2VzIiBkZXBlbmRzPSJkaXJzIj4KLSAgICA8emlwIGRlc3RmaWxlPSJidWlsZC9hci94YmVhbnNyYy56aXAiIGJhc2VkaXI9Ii4iIGV4Y2x1ZGVzPSJidWlsZC8qKiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InhiZWFuIiBkZXBlbmRzPSJ4YmVhbi5qYXIiPgotICAgIDxjb3B5IGZpbGU9ImJ1aWxkL2xpYi94YmVhbi5qYXIiIHRvZmlsZT0iYnVpbGQvYXIveGJlYW4uamFyIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlycyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvbGliIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvYXIiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9zcmMiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9saWIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkcnQiID4KLSAgICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgcmFuZG9tIHRlc3RlciIvPgotICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iUmFuZG9tIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvcmFuZG9tLmphciIvPgotICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICAgICA8YXJnIGxpbmU9Ii1zZWVkIDAgLWkgMjAgLW5vcXVlcnkiLz4KLSAgICAgICA8L2phdmE+Ci0KLSAgICA8bWtkaXIgZGlyPSJidWlsZC90ZXN0L291dHB1dCIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgeGJlYW4gcHJvZHVjdCBkcnQgdGVzdHMiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJKVW5pdCBvdXRwdXQgYmVpbmcgc2VudCB0byB4YmVhbi9idWlsZC90ZXN0L291dHB1dC9kcnQtcHJvZHVjdC50eHQiLz4KLSAgICA8anVuaXQgZm9yaz0ieWVzIiBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBzaG93b3V0cHV0PSJ5ZXMiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ4YmVhbi5yb290ZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0idHJlZWFzc2VydHMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9kcnQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIveHN0eXBlcy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9udW1lcmFscy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi94YmVhbl94cGF0aC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIvamF4ZW4uamFyIi8+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iLz4KLSAgICAgIDx0ZXN0IG5hbWU9ImRydGNhc2VzLlNtb2tlVGVzdHMiIG91dGZpbGU9ImJ1aWxkL3Rlc3Qvb3V0cHV0L2RydC1wcm9kdWN0IiAvPgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iYnVpbGRkcnQiIGRlcGVuZHM9ImRydC5qYXIsIHJhbmRvbS5qYXIsIGVyaWMiLz4KLQotICA8dGFyZ2V0IG5hbWU9ImVyaWMiIGRlcGVuZHM9ImVyaWN0ZXN0LmphciIvPgotCi0gIDx0YXJnZXQgbmFtZT0iZGVmYXVsdCIgZGVwZW5kcz0iZGVwbG95LCBidWlsZGRydCIvPgotCi0gIDx0YXJnZXQgbmFtZT0icmVkZXBsb3kiIGRlcGVuZHM9ImNsZWFuLCBkZXBsb3kiLz4KLQotICA8IS0tIG9sZHhiZWFuLmphciB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9Im9sZHhiZWFuLmphciI+Ci0gICAgPGNvcHkgZmlsZT0iZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphciIgdG9maWxlPSJidWlsZC9wcml2YXRlL2xpYi9vbGR4YmVhbi5qYXIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBib290c3RyYXAgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJib290c3RyYXAiIGRlcGVuZHM9InhiZWFuIj4KLQotICAgIDwhLS0gYWZ0ZXIgeGJlYW4uamFyIGlzIGJ1aWx0LCBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5IGFuZCBjbGVhbiB0aGUgcHJvamVjdCAtLT4KLSAgICA8dGVtcGZpbGUgcHJvcGVydHk9ImJvb3RzdHJhcC5qYXJmaWxlIiBwcmVmaXg9Im9sZHhiZWFuIiBzdWZmaXg9Ii5qYXIiLz4KLSAgICA8bW92ZSBmaWxlPSJidWlsZC9hci94YmVhbi5qYXIiIHRvZmlsZT0iJHtib290c3RyYXAuamFyZmlsZX0iLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIiBpbmhlcml0QWxsPSJmYWxzZSIvPgotCi0gICAgPCEtLSB0aGVuIG1vdmUgaXQgYmFjayBpbnRvIHBsYWNlIGFzIG9sZHhiZWFuLmphciBhbmQgZG8gYW5vdGhlciBidWlsZCAtLT4KLSAgICA8bW92ZSBmaWxlPSIke2Jvb3RzdHJhcC5qYXJmaWxlfSIgdG9maWxlPSJidWlsZC9wcml2YXRlL2xpYi9vbGR4YmVhbi5qYXIiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InhiZWFuIiBpbmhlcml0QWxsPSJmYWxzZSIvPgotCi0gICAgPCEtLSBjb21wYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlyc3QgamFyIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgc2Vjb25kIGphciAtLT4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InppcGNvbXBhcmUuY2xhc3NlcyIgaW5oZXJpdEFsbD0iZmFsc2UiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9InppcGNvbXBhcmUuWmlwQ29tcGFyZSIKLSAgICAgICAgICBjbGFzc3BhdGg9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy96aXBjb21wYXJlIgotICAgICAgICAgIGZvcms9InRydWUiCi0gICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSJidWlsZC9hci94YmVhbi5qYXIgYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIi8+Ci0gICAgPC9qYXZhPgotCi0gICAgPCEtLSB3aGVuIGV2ZXJ5dGhpbmcgc3VjY2VlZHMsIGNvcHkgb2xkeGJlYW4uamFyIHRvIGV4dGVybmFsL2xpYiAtLT4KLSAgICA8ZWNobyBtZXNzYWdlPSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IlJlc3VsdHMgbWF0Y2ghIEJvb3RzdHJhcCBzdWNjZWVkZWQuIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJBdHRlbXB0aW5nIHRvIGNvcHkgb2xkeGJlYW4uamFyIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iSWYgdGhlIGNvcHkgZmFpbHMsIHlvdSBtdXN0IGNoZWNrIG91dCBvbGR4YmVhbi5qYXIiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJvdmVyd3JpdGluZyBvbGQgZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphciIvPgotICAgIDxjb3B5IGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL29sZHhiZWFuLmphciIgdG9maWxlPSJleHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icXVpY2tib290c3RyYXAiPgotICAgIDxlY2hvIG1lc3NhZ2U9Ij09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJCb290c3RyYXBwaW5nIGN1cnJlbnRseSBidWlsdCB4YmVhbi5qYXIgd2l0aG91dCB2ZXJpZnlpbmcuIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIvPgotICAgIDxjb3B5IGZpbGU9ImJ1aWxkL2FyL3hiZWFuLmphciIgdG9maWxlPSJleHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gemlwY29tcGFyZSAoZm9yIGNoZWNraW5nIGJvb3RzdHJhcCkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InppcGNvbXBhcmUuY2xhc3NlcyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3ppcGNvbXBhcmUiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMvemlwY29tcGFyZSIKLSAgICAgICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3ppcGNvbXBhcmUiCi0gICAgICAgICAgIGRlYnVnPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHRlc3QgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxwYXRoIGlkPSJ0ZXN0LmNvbXBpbGUucGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJleHRlcm5hbC9saWIvanVuaXQuamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2VyaWNzY2hlbWEuamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9zY2hlbWFzLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZW51bXRlc3QuamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi94c3R5cGVzLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIveGJlYW5feHBhdGguamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9udW1lcmFscy5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi9qYXhlbi5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJ0ZXN0LnJ1bi5wYXRoIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgotICA8L3BhdGg+Ci0KLSAgPCEtLSBidWlsZGRydCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImRydC5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCBlYXN5cG8uamFyLCBzY2hlbWFzLmphciwKLSAgCSAgeHN0eXBlcy5qYXIsIGVudW10ZXN0LmphciwgeGJlYW5feHBhdGguamFyLCBudW1lcmFscy5qYXIiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9kcnQiLz4KLSAgICA8amF2YWMKLSAgICAgICBzcmNkaXI9InRlc3Qvc3JjL2RydCIKLSAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZHJ0IgotICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jb21waWxlLnBhdGgiCi0gICAgICAgc291cmNlPSIxLjQiCi0gICAgICAgZGVidWc9Im9uIi8+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+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJ0ZXN0L3NyYy9lbnVtdGVzdCIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgotICAgIDwvdXB0b2RhdGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZW51bXRlc3QuamFyIiBkZXBlbmRzPSJlbnVtdGVzdC5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0iZW51bXRlc3Qubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIgdGVzdC9zcmMvZW51bXRlc3QiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0geHN0eXBlcyAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4c3R5cGVzLmNoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9InhzdHlwZXMubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3hzdHlwZXMuamFyIj4KLSAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZSIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgotICAgIDwvdXB0b2RhdGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ieHN0eXBlcy5qYXIiIGRlcGVuZHM9InhzdHlwZXMuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9InhzdHlwZXMubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi94c3R5cGVzLmphciB0ZXN0L3NyYy94c3R5cGVzIi8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8IS0tIGphdmFkb2NzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8IS0tIEFsbCBkb2NzIHRvIGJ1aWxkL2RvY3MsIGluY2x1ZGluZyBndWlkZSBhbmQgamF2YWRvY3MuIC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iZG9jcyIgZGVwZW5kcz0ieGJlYW4iPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLmRpciIgdmFsdWU9ImJ1aWxkL2RvY3MiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkb2NzLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2RvY3MuZGlyfSIvPgotICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iKiIgc291cmNlcGF0aD0ic3JjL3htbHB1YmxpYyIgY2xhc3NwYXRoPSIke2phdmFkb2MucGF0aH0iIGRlc3RkaXI9IiR7ZG9jcy5kaXJ9L3JlZmVyZW5jZSIgd2luZG93dGl0bGU9IlhNTEJlYW5zIERvY3VtZW50YXRpb24iIHNvdXJjZT0iMS40IiBzdHlsZXNoZWV0ZmlsZT0iZG9jcy9zdHlsZXNoZWV0LmNzcyI+Ci0gICAgICA8bGluayBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvZG9jcy9yZWZlcmVuY2UvaW5kZXguaHRtbCIvPgotICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpLyIvPgotICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlLzEuNC9kb2NzL2FwaS8iLz4KLSAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9hcGlEb2NzLyIvPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgICA8Y29weSBmaWxlPSJkb2NzL3htbGJlYW5zLmNzcyIgdG9maWxlPSIke2RvY3MuZGlyfS94bWxiZWFucy5jc3MiIC8+Ci0gICAgPGNvcHkgdG9kaXI9IiR7ZG9jcy5kaXJ9L2d1aWRlIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iZG9jcy9ndWlkZSIvPgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHtkb2NzLmRpcn0vaW1hZ2VzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iZG9jcy9pbWFnZXMiLz4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gc3RyZWFtIGNvbmZvcm1hbmNlIHRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InN0cmVhbXRlc3QuY2xhc3NlcyIgZGVwZW5kcz0iZGlycyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3N0cmVhbXRlc3QiLz4KLSAgICA8amF2YWMKLSAgICAgIHNyY2Rpcj0idGVzdC9zcmMvc3RyZWFtdGVzdCIKLSAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9zdHJlYW10ZXN0IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNvbXBpbGUucGF0aCIKLSAgICAgIHNvdXJjZT0iMS40IgotICAgICAgZGVidWc9Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic3RyZWFtdGVzdC5qYXIiIGRlcGVuZHM9InN0cmVhbXRlc3QuY2xhc3NlcyI+Ci0gICAgPGphciBqYXJmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zdHJlYW10ZXN0LmphciIgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3N0cmVhbXRlc3QiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHBhdGggaWQ9InJ1bi5zdHJlYW1jb25mLnBhdGgiPgotICAgIDxwYXRoIHJlZmlkPSJ0ZXN0LnJ1bi5wYXRoIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc3RyZWFtdGVzdC8iLz4KLSAgPC9wYXRoPgotCi0gIDx0YXJnZXQgbmFtZT0ic3RyZWFtY29uZiIgZGVwZW5kcz0ic3RyZWFtdGVzdC5qYXIiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ic3RyZWFtdGVzdC5YbWxTdHJlYW1Db25mb3JtYW5jZSIKLSAgICAgICAgICBjbGFzc3BhdGhyZWY9InJ1bi5zdHJlYW1jb25mLnBhdGgiCi0gICAgICAgICAgZm9yaz0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDwhLS1hcmcgbGluZT0idGVzdC9jYXNlcy9zdHJlYW1jb25mL3NtYWxsLnhtbCIgLy0tPgotICAgICAgPGFyZyBsaW5lPSJ0ZXN0L2Nhc2VzL3N0cmVhbWNvbmYvZHRkLnhtbCIgLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJkaXN0LXNyYywgZGlzdC1iaW4iPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRpc3QtYmluIiBkZXBlbmRzPSJ4YmVhbiwgZG9jcyI+Ci0gICAgIDxkZWxldGUgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIvPgotICAgICA8ZGVsZXRlIGZpbGU9ImJ1aWxkL3ByaXZhdGUvaW5jdWJhdGluZy14bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0uemlwIi8+Ci0gICAgIDxkZWxldGUgZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS50Z3oiLz4KLQotICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIvPgotICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InhraXQiLz4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iYmluLyoqIi8+Ci0gICAgIDwvY29weT4KLSAgICAgPGNvcHkgdG9kaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L3NjaGVtYXMvczRzIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMveHNkc2NoZW1hL3NjaGVtYSIgaW5jbHVkZXM9IlhNTFNjaGVtYS54c2QsdzNjLXNjaGVtYS1saWNlbnNlLmh0bWwiLz4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMveG1sc2NoZW1hL3NjaGVtYSIgaW5jbHVkZXM9IlhNTC54c2QsdzNjLXhtbC1saWNlbnNlLmh0bWwiLz4KLSAgICAgPC9jb3B5PgotICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vc2NoZW1hcyI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9zcmMiIGluY2x1ZGVzPSJlYXN5cG8vKi54c2QsZWFzeXBvLyoueHNkY29uZmlnIi8+Ci0gICAgIDwvY29weT4KLQotICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9saWIiLz4KLSAgICAgPGNvcHkgdG9kaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2xpYiIgZmlsZT0iYnVpbGQvYXIveGJlYW4uamFyIi8+Ci0gICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9saWIiIGZpbGU9ImV4dGVybmFsL2xpYi9qYXhlbi0xLjEtYmV0YS0yLmphciIvPgotCi0gICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L3NyYy9zY2hlbWEiLz4KLSAgICAgPGNvcHkgdG9kaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L3NyYy9zY2hlbWEiPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90b29sc2NoZW1hIi8+Ci0gICAgIDwvY29weT4KLQotICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9kb2NzIi8+Ci0gICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9kb2NzIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9kb2NzIi8+Ci0gICAgIDwvY29weT4KLQotICAgICA8emlwIGRlc3RmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LnppcCIKLSAgICAgICAgICBiYXNlZGlyPSJidWlsZC9wcml2YXRlIgotICAgICAgICAgIGluY2x1ZGVzPSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vKioiCi0gICAgICAgICAgZXhjbHVkZXM9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9zY2hlbWFzL2N5Y2xvbmUvKiosIHhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9zY2hlbWFzL2oyZWUvKioiPgotICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0ic3JjL2xpY2Vuc2UvTElDRU5TRS50eHQiIGZ1bGxwYXRoPSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vTElDRU5TRS50eHQiLz4KLSAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InNyYy9saWNlbnNlL05PVElDRS50eHQiIGZ1bGxwYXRoPSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vTk9USUNFLnR4dCIvPgotICAgICA8L3ppcD4KLSAgICAgPHRhciBkZXN0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS50Z3oiCi0gICAgICAgICAgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZSIKLSAgICAgICAgICBpbmNsdWRlcz0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LyoqIgotICAgICAgICAgIGV4Y2x1ZGVzPSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vc2NoZW1hcy9jeWNsb25lLyoqLCB4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vc2NoZW1hcy9qMmVlLyoqIgotICAgICAgICAgIGNvbXByZXNzaW9uPSJnemlwIj4KLSAgICAgICAgIDx0YXJmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InNyYy9saWNlbnNlL0xJQ0VOU0UudHh0IiBmdWxscGF0aD0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L0xJQ0VOU0UudHh0Ii8+Ci0gICAgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzcmMvbGljZW5zZS9OT1RJQ0UudHh0IiBmdWxscGF0aD0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L05PVElDRS50eHQiLz4KLSAgICAgPC90YXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdC1zcmMiIGRlcGVuZHM9ImNsZWFuLCBkaXJzIj4KLSAgICAgPGRlbGV0ZSBmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LXNyYy56aXAiLz4KLSAgICAgPGRlbGV0ZSBmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LXNyYy50Z3oiLz4KLQotICAgICA8emlwIGRlc3RmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LXNyYy56aXAiPgotICAgICAJPHppcGZpbGVzZXQKLSAgICAgCQlkaXI9Ii4iCi0gICAgICAgCQlpbmNsdWRlcz0iKioiCi0gICAgICAgICAgICAgICAgZXhjbHVkZXM9ImJ1aWxkLyoqLCB0ZXN0L3NyYy90ZXN0c3RvcmUvKiosIHRlc3Qvc3JjL2Vhc3lwb3VzZS8qKiwgdGVzdC9zcmMvbmFtZXdvcmxkdXNlLyoqLAotICAgICAgICAgICAgICAgIHRlc3Qvc3JjL3N0c3NjaGVtYS8qKiwgdGVzdC9zcmMvdW5tYXJzaGFsLyoqLCB0ZXN0L2Nhc2VzL3NjaGVtYS8qKiwgZXh0ZXJuYWwvbGliL2p1bml0LmphciwKLSAgICAgICAgICAgICAgICB4a2l0L3NjaGVtYXMvY3ljbG9uZS8qKiwgeGtpdC9zY2hlbWFzL2oyZWUvKioiCi0gICAgICAgCQlwcmVmaXg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIgLz4KLSAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InNyYy9saWNlbnNlL0xJQ0VOU0UudHh0IiBmdWxscGF0aD0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L0xJQ0VOU0UudHh0Ii8+Ci0gICAgICAgICA8emlwZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzcmMvbGljZW5zZS9OT1RJQ0UudHh0IiBmdWxscGF0aD0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L05PVElDRS50eHQiLz4KLSAgICAgPC96aXA+Ci0gICAgIDx0YXIgZGVzdGZpbGU9ImJ1aWxkL3ByaXZhdGUvaW5jdWJhdGluZy14bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0tc3JjLnRneiIKLQkgCSAgY29tcHJlc3Npb249Imd6aXAiPgotICAgICAJPHRhcmZpbGVzZXQKLSAgICAgCQlkaXI9Ii4iCi0gICAgICAgCQlpbmNsdWRlcz0iKioiCi0gICAgICAgCQlleGNsdWRlcz0iYnVpbGQvKiosIHRlc3Qvc3JjL3Rlc3RzdG9yZS8qKiwgdGVzdC9zcmMvZWFzeXBvdXNlLyoqLCB0ZXN0L3NyYy9uYW1ld29ybGR1c2UvKiosCi0gICAgICAgICAgICAgICAgdGVzdC9zcmMvc3Rzc2NoZW1hLyoqLCB0ZXN0L3NyYy91bm1hcnNoYWwvKiosIHRlc3QvY2FzZXMvc2NoZW1hLyoqLCBleHRlcm5hbC9saWIvanVuaXQuamFyLAotICAgICAgICAgICAgICAgIHhraXQvc2NoZW1hcy9jeWNsb25lLyoqLCB4a2l0L3NjaGVtYXMvajJlZS8qKiIKLSAgICAgICAJCXByZWZpeD0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259Ii8+Ci0gICAgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzcmMvbGljZW5zZS9MSUNFTlNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9MSUNFTlNFLnR4dCIvPgotICAgICAgICAgPHRhcmZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0ic3JjL2xpY2Vuc2UvTk9USUNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9OT1RJQ0UudHh0Ii8+Ci0gICAgIDwvdGFyPgotICA8L3RhcmdldD4KLQotICA8IS0tIHByZXZpb3VzbHkgaW4geGJlYW4ueG1sIC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ieGJlYW4uamFyIgotICAgICAgICBkZXBlbmRzPSJkaXJzLCB4bWxwdWJsaWMuY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIGNvbW1vbi5jbGFzc2VzLCB0eXBlaW1wbC5jbGFzc2VzLCB4bWxjb21wLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIHhtbHN0b3JlLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIG9sZHhiZWFuLmphciwgeHNkc2NoZW1hLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiPgotICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvbGliL3hiZWFuLmphciIgaW5kZXg9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVpbXBsIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29tcCIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL2NvbmZpZ3NjaGVtYSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94c2RzY2hlbWEiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzY2hlbWEiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9saWNlbnNlIi8+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gYnVpbGQgWE1MSW5wdXRTdHJlYW0gaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhtbGlucHV0c3RyZWFtLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMveG1saW5wdXRzdHJlYW0iCi0gICAgICAgIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iCi0gICAgICAgIGRlYnVnPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHhtbHB1YmxpYyB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhtbHB1YmxpYy5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxwdWJsaWMiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGg+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+Ci0KLSAgIDx0YXJnZXQgbmFtZT0iY2hlY2suamF4ZW4uamFyIj4KLSAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF4ZW4uamFyLmV4aXN0cyI+Ci0gICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImJ1aWxkL2xpYi9qYXhlbi5qYXIiLz4KLSAgICAgPC9jb25kaXRpb24+Ci0gICA8L3RhcmdldD4KLQotICAgPHRhcmdldCBuYW1lPSJqYXhlbi5qYXIiIGRlcGVuZHM9ImNoZWNrLmpheGVuLmphciwgZGlycyIgdW5sZXNzPSJqYXhlbi5qYXIuZXhpc3RzIj4KLSAgICAgPCEtLWdldCBkZXN0PSJidWlsZC9saWIvamF4ZW4uamFyIgotICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIgotICAgICAgICAgIHZlcmJvc2U9InRydWUiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIi8gLS0+Ci0gICAgIDxjb3B5IGZpbGU9ImV4dGVybmFsL2xpYi9qYXhlbi0xLjEtYmV0YS0yLmphciIgdG9maWxlPSJidWlsZC9saWIvamF4ZW4uamFyIiAvPgotICAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB4cGF0aCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ieHBhdGguY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmphciwgamF4ZW4uamFyIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMveHBhdGgiLz4KLSAgICA8amF2YWMKLSAgICAgICBzcmNkaXI9InNyYy94cGF0aCIKLSAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMveHBhdGgiCi0gICAgICAgY2xhc3NwYXRocmVmPSJ4cGF0aC5jb21waWxlLnBhdGgiCi0gICAgICAgc291cmNlPSIxLjQiCi0gICAgICAgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGggaWQ9InhwYXRoLmNvbXBpbGUucGF0aCI+Ci0gICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGJlYW4uamFyIi8+Ci0gICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIvamF4ZW4uamFyIi8+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InhiZWFuX3hwYXRoLmphciIgZGVwZW5kcz0ieHBhdGguY2xhc3NlcyI+Ci0gICAgPGphciBqYXJmaWxlPSJidWlsZC9wcml2YXRlL2xpYi94YmVhbl94cGF0aC5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy94cGF0aCIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHRlc3QgeHBhdGggdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RfeHBhdGguY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmphciwgamF4ZW4uamFyLCB4YmVhbl94cGF0aC5qYXIiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0eHBhdGgiLz4KLSAgICA8amF2YWMKLSAgICAgICBzcmNkaXI9InRlc3Qvc3JjL3hwYXRoIgotICAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0eHBhdGgiCi0gICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0eHBhdGguY29tcGlsZS5wYXRoIgotICAgICAgIHNvdXJjZT0iMS40IgotICAgICAgIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoIGlkPSJ0ZXN0eHBhdGguY29tcGlsZS5wYXRoIj4KLSAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWxwdWJsaWMuamFyIi8+Ci0gICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIvamF4ZW4uamFyIi8+Ci0gICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi94YmVhbl94cGF0aC5qYXIiLz4KLSAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icnVuX3Rlc3RfeHBhdGgiIGRlcGVuZHM9InRlc3RfeHBhdGguY2xhc3NlcywgeGJlYW4iPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhwYXRoLmpheGVuLlhCZWFuc0RlbW8iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGJlYW4uamFyIi8+Ci0gICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIvamF4ZW4uamFyIi8+Ci0gICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi94YmVhbl94cGF0aC5qYXIiLz4KLSAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0eHBhdGgiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWRhIi8+Ci0gICAgICA8YXJnIGxpbmU9J3Rlc3QvY2FzZXMveHBhdGgvbXVjaF9hZG8ueG1sICJQTEFZL0FDVC9TQ0VORS9TUEVFQ0gvU1BFQUtFUiInLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvYW50WG1sYmVhbi5odG1sIGIvdjEvZG9jcy9ndWlkZS9hbnRYbWxiZWFuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2EwOTAuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9hbnRYbWxiZWFuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08aHRtbD48IS0tIEluc3RhbmNlQmVnaW4gdGVtcGxhdGU9ImZpbGU6Ly8vQ3wvcDQvbWFpbi9oZWxwL2lkZS9lbi9UZW1wbGF0ZXMvQ29tbWFuZC5kd3QiIGNvZGVPdXRzaWRlSFRNTElzTG9ja2VkPSJmYWxzZSIgLS0+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT54bWxiZWFuIEFudCBUYXNrPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotPG1ldGEgbmFtZT0iY29tcG9uZW50IiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgZGVzY3JpcHRpb24gbWV0YXRhZywgcGxlYXNlIHByb3ZpZGUgYSBCUklFRiBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIC0tPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBjb21wb25lbnQgbWV0YXRhZywgcGxlYXNlIGxpc3Qga2V5d29yZHMgdGhhdCB3aWxsIGhlbHAgYSB1c2VyIHNlYXJjaCBmb3IgdGhpcyB0b3BpYy4gLS0+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+Ci08ZGl2IGlkPXRvcGljdGl0bGU+Ci0gIDxIMSBjbGFzcz1UaXRsZT54bWxiZWFuIEFudCBUYXNrPC9oMT4KLTwvZGl2PgotPGRpdiBpZD10b3BpY3RleHQ+Ci0gIDxwPkNvbXBpbGVzIGEgc2V0IG9mIFhTRCBhbmQvb3IgV1NETCBmaWxlcyBpbnRvIFhNTEJlYW5zLiBUaGlzIGlzIHVzZWZ1bCBmb3IKLSAgICBidWlsZGluZyBhbiBYTUxCZWFuIEpBUiBmcm9tIFhTRCBhbmQgV1NETCBmaWxlcy4gSWYgZGVzaXJlZCwgdGhlIHRhc2sgY2FuCi0gICAgYWxzbyBnZW5lcmF0ZSB0aGUgc291cmNlIGNvZGUgdGhhdCBtYWtlcyB1cCB0aGUgWE1MQmVhbiB0eXBlIHN5c3RlbSBzcGVjaWZpZWQKLSAgICBieSB0aGUgc2NoZW1hIGZpbGVzLjwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gYW4gZXh0ZXJuYWwgbGlicmFyeSBub3QKLSAgICBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbiBjYWxsZWQgeGJlYW4uamFyLiAmbmJzcDtJdCBjYW4gYmUgZm91bmQgaW4KLSAgICB0aGUgWE1MQmVhbnMgZGV2ZWxvcGVyIGtpdCBhdCA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvIgotICAgICAgICB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzwvYT4uCi0gICAgVGhlIGJ1aWxkIHNjcmlwdCB3aWxsIG5lZWQgdG8gaW5jbHVkZSBhIHRhc2tkZWYgZm9yIHhtbGJlYW4sIHdoaWNoIGNvdWxkIGxvb2sKLSAgICBsaWtlIHRoaXM6PC9wPgotPC9kaXY+Ci08YmxvY2txdW90ZT4KLSAgPGRpdiBjbGFzcz0ibm90ZXBhcmEiPgotICAgIDxwcmUgY2xhc3M9Im5vdGVwYXJhIj4mbHQ7dGFza2RlZiBuYW1lPSJ4bWxiZWFuIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlhNTEJlYW4iIGNsYXNzcGF0aD0icGF0aC90by94YmVhbi5qYXIiLyZndDs8L3ByZT4KLSAgPC9kaXY+Ci08L2Jsb2NrcXVvdGU+Ci08ZGl2PgotPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzCi0gICAgY2FuIGJlIGRvbmUgd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluY2x1ZGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluY2x1ZGVzZmlsZTwvc3Bhbj4sCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGVzZmlsZTwvc3Bhbj4KLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRlZmF1bHRleGNsdWRlczwvc3Bhbj4gYXR0cmlidXRlcy4gV2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluY2x1ZGVzPC9zcGFuPgotICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlc2ZpbGU8L3NwYW4+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUKLSAgICBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGU8L3NwYW4+Ci0gICAgb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGVzZmlsZTwvc3Bhbj4gYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5Ci0gICAgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZAotICAgIGZpbmFsbHkgd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRlZmF1bHRleGNsdWRlczwvc3Bhbj4gYXR0cmlidXRlLAotICAgIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlCi0gICAgc2VjdGlvbiBvbiA8YQotIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIiB0YXJnZXQ9Il9ibGFuayI+ZGlyZWN0b3J5Ci0gICAgYmFzZWQgdGFza3M8L2E+IGluIHRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsLyIgdGFyZ2V0PSJfYmxhbmsiPkFudAotICAgIGRvY3VtZW50YXRpb248L2E+LCBvbiBob3cgdGhlIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cKLSAgICB0byB3cml0ZSBwYXR0ZXJucy48L3A+Ci0gIDxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YQotIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkZpbGVTZXQ8L2E+Ci0gICAgYW5kIHN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDxjb2RlPmRpcjwvY29kZT4KLSAgICBiZWNvbWVzIDxjb2RlPmJhc2VkaXI8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwKLSAgICA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KLSAgPGgzPlBhcmFtZXRlcnM8L2gzPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0Ym9keT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNjaGVtYTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlIHRoYXQgcG9pbnRzIHRvIGVpdGhlciBhbiBpbmRpdmlkdWFsIHNjaGVtYSBmaWxlCi0gICAgICAgICAgb3IgYSBkaXJlY3Rvcnkgb2YgZmlsZXMuICZuYnNwO05vdCBhIHBhdGggcmVmZXJlbmNlLiAmbmJzcDtJZiBtdWx0aXBsZQotICAgICAgICAgIHNjaGVtYSBmaWxlcyBuZWVkIHRvIGJlIGJ1aWx0IHRvZ2V0aGVyLCB1c2UgYSBuZXN0ZWQgZmlsZXNldCBpbnN0ZWFkCi0gICAgICAgICAgb2Ygc2V0dGluZyBzY2hlbWEuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBhIGZpbGVzZXQgZWxlbWVudCBpcyBuZXN0ZWQuPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgamFyIGZpbGUgY3JlYXRlZC4mbmJzcDsgRm9yIGluc3RhbmNlLAotICAgICAgICAgICJteVhNTEJlYW4uamFyIiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGlzIHRhc2sgaW50byBhIGphciB3aXRoCi0gICAgICAgICAgdGhlIHNhbWUgbmFtZS48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzICJ4bWx0eXBlcy5qYXIiLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRvd25sb2FkPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIFVSTHMgZm9yCi0gICAgICAgICAgaW1wb3J0cyBhbmQgaW5jbHVkZXMuJm5ic3A7IERlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIGFsbCBpbXBvcnRzIGFuZAotICAgICAgICAgIGluY2x1ZGVzIG11c3QgYmUgY29waWVkIGxvY2FsbHkuPGJyPiA8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYW50IHRhcmdldCB3aWxsIGNvbnRpbnVlCi0gICAgICAgICAgaWYgdGhlIFhNTEJlYW4gY3JlYXRpb24gZW5jb3VudGVycyBhIGJ1aWxkIGVycm9yLjxicj4gPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0cnVlLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbHMgdGhlIGFtb3VudCBvZiBidWlsZCBtZXNzYWdlIG91dHB1dC48YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlc3lzdGVtbmFtZTxicj4gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHRoZSBUeXBlU3lzdGVtSG9sZGVyIGNsYXNzCi0gICAgICAgICAgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbi4mbmJzcDsgTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgbGVmdCB1bnNwZWNpZmllZC4KLSAgICAgICAgICBOb25lIG9mIHRoZSBYTUxCZWFucyBhcmUgZ2VuZXJhdGVkIGluIHRoaXMgcGFja2FnZS4gVXNlIC54c2Rjb25maWcgZmlsZXMKLSAgICAgICAgICB0byBtb2RpZnkgWE1MQmVhbiBwYWNrYWdlIG9yIGNsYXNzIG5hbWVzLjxicj4gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NnZW5kaXI8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgQ0xBU1MgZmlsZXMgaW50by48YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY29ubHk8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSB2YWx1ZSBvZiB0cnVlIG1lYW5zIHRoYXQgb25seSBzb3VyY2Ugd2lsbCBiZSBnZW5lcmF0ZWQuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2dlbmRpcjxicj4gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSBKQVZBIGZpbGVzIGludG8uPGJyPiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPGJyPiA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIGlmIHNjaGVtYXMgaW4gdGhlIGZpbGVzZXQgaW1wb3J0Ci0gICAgICAgICAgZGVmaW5pdGlvbnMgdGhhdCBhcmUgc3VwcGxpZWQgYnkgb3RoZXIgY29tcGlsZWQgWE1MQmVhbnMgSkFSIGZpbGVzLAotICAgICAgICAgIG9yIGlmIEpBVkEgZmlsZXMgYXJlIGluIHRoZSBzY2hlbWEgZmlsZXNldC4gQWxzbyBzdXBwb3J0cyBhIG5lc3RlZCBjbGFzc3BhdGguPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkcyBhIGNsYXNzcGF0aCwgZ2l2ZW4gYXMgPGEKLSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyIgdGFyZ2V0PSJfYmxhbmsiPnJlZmVyZW5jZTwvYT4KLSAgICAgICAgICB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdAotICAgICAgICAgIG11c3QgYmUgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0bwotICAgICAgICAgIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0Ci0gICAgICAgICAgbXVzdCBiZSBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbgotICAgICAgICAgIG9taXR0ZWQuPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvCi0gICAgICAgICAgYmUgYW4gZXhjbHVkZSBwYXR0ZXJuLjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3IKLSAgICAgICAgICBub3QgKCJ5ZXMiLyJubyIpLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWc8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBkZWJ1ZwotICAgICAgICAgIGluZm9ybWF0aW9uOyBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LiBJZiBzZXQgdG8gPGNvZGU+b2ZmPC9jb2RlPiwKLSAgICAgICAgICA8Y29kZT4tZzpub25lPC9jb2RlPiB3aWxsIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciBjb21waWxlcnMKLSAgICAgICAgICB0aGF0IHN1cHBvcnQgaXQgKGZvciBvdGhlciBjb21waWxlcnMsIG5vIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aWxsCi0gICAgICAgICAgYmUgdXNlZCkuIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPgotICAgICAgICAgIGF0dHJpYnV0ZSBkZXRlcm1pbmVzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnbGV2ZWw8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPktleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgPGNvZGU+LWc8L2NvZGU+IGNvbW1hbmQtbGluZQotICAgICAgICAgIHN3aXRjaC4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHQgPGNvZGU+bW9kZXJuPC9jb2RlPgotICAgICAgICAgIGFuZCA8Y29kZT5jbGFzc2ljKHZlciAmZ3Q7PSAxLjIpPC9jb2RlPi4gTGVnYWwgdmFsdWVzIGFyZSA8Y29kZT5ub25lPC9jb2RlPgotICAgICAgICAgIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyBrZXl3b3JkczogPGNvZGU+bGluZXM8L2NvZGU+LAotICAgICAgICAgIDxjb2RlPnZhcnM8L2NvZGU+LCBhbmQgPGNvZGU+c291cmNlPC9jb2RlPi4gSWYgPGNvZGU+ZGVidWdsZXZlbDwvY29kZT4KLSAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkLCBieSBkZWZhdWx0LCBub3RoaW5nIHdpbGwgYmUgYXBwZW5kZWQgdG8gPGNvZGU+LWc8L2NvZGU+LgotICAgICAgICAgIElmIDxjb2RlPmRlYnVnPC9jb2RlPiBpcyBub3QgdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpbWl6ZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbjsKLSAgICAgICAgICBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlQW50UnVudGltZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBBbnQgcnVuLXRpbWUgbGlicmFyaWVzIGluIHRoZQotICAgICAgICAgIGNsYXNzcGF0aDsgZGVmYXVsdHMgdG8gPGNvZGU+eWVzPC9jb2RlPi48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUphdmFSdW50aW1lPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlZmF1bHQgcnVuLXRpbWUgbGlicmFyaWVzIGZyb20KLSAgICAgICAgICB0aGUgZXhlY3V0aW5nIFZNIGluIHRoZSBjbGFzc3BhdGg7IGRlZmF1bHRzIHRvIDxjb2RlPm5vPC9jb2RlPi48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yazwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBleGVjdXRlIDxjb2RlPmphdmFjPC9jb2RlPiB1c2luZyB0aGUgSkRLIGNvbXBpbGVyCi0gICAgICAgICAgZXh0ZXJuYWxseTsgZGVmYXVsdHMgdG8gPGNvZGU+eWVzPC9jb2RlPi48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIHRydWU8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGVjdXRhYmxlPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wbGV0ZSBwYXRoIHRvIHRoZSA8Y29kZT5qYXZhYzwvY29kZT4gZXhlY3V0YWJsZSB0bwotICAgICAgICAgIHVzZSBpbiBjYXNlIG9mIDxjb2RlPmZvcms9JnF1b3Q7eWVzJnF1b3Q7PC9jb2RlPi4gRGVmYXVsdHMgdG8gdGhlIGNvbXBpbGVyCi0gICAgICAgICAgb2YgdGhlIEphdmEgdmVyc2lvbiB0aGF0IGlzIGN1cnJlbnRseSBydW5uaW5nIEFudC4gSWdub3JlZCBpZiA8Y29kZT5mb3JrPSZxdW90O25vJnF1b3Q7PC9jb2RlPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5tZW1vcnlJbml0aWFsU2l6ZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTSwKLSAgICAgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cwotICAgICAgICAgIHRvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4gKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sCi0gICAgICAgICAgPGNvZGU+ODE5MjBrPC9jb2RlPiwgb3IgPGNvZGU+ODBtPC9jb2RlPik8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWVtb3J5TWF4aW11bVNpemU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCi0gICAgICAgICAgaWYgPGNvZGU+amF2YWM8L2NvZGU+IGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHMKLSAgICAgICAgICB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuIChFeGFtcGxlczogPGNvZGU+ODM4ODYwODA8L2NvZGU+LAotICAgICAgICAgIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yIDxjb2RlPjgwbTwvY29kZT4pPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLiBJZiB0aGlzIGF0dHJpYnV0ZQotICAgICAgICAgIGlzIG5vdCBzZXQsIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5LCBpZgotICAgICAgICAgIHNldCwgd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgY3VycmVudCBWTQotICAgICAgICAgIHdpbGwgYmUgdXNlZC4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZUR1cGxpY2F0ZXNJbk5hbWVzcGFjZXM8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG9uZSBvciBtb3JlIG5hbWVzcGFjZXMKLSAgICAgICAgaW4gd2hpY2ggZHVwbGljYXRlIGRlZmluaXRpb25zIGFyZSB0byBiZSBpZ25vcmVkLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90Ym9keT4KLSAgPC90YWJsZT4KLSAgPGgzPkV4YW1wbGU8L2gzPgotPC9kaXY+Ci08ZGl2IGlkPXRvcGljdGV4dD4gQmUgc3VyZSB0byBkZWZpbmUgdGhlIHRhc2sgaW4geW91ciBzY3JpcHQsIGxpa2UgdGhpczo8L2Rpdj4KLTxkaXY+Ci0gIDxwcmU+Jmx0O3Rhc2tkZWYgbmFtZT0ieG1sYmVhbiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIjwvcHJlPgotICA8cD5UaGUgZm9sbG93aW5nIGJ1aWxkcyBhbGwgdGhlIHNjaGVtYXMgaW4gdGhlIHNjaGVtYXMgZGlyZWN0b3J5IGFuZCBjcmVhdGVzCi0gICAgYSBqYXIgY2FsbGVkICZxdW90O1NjaGVtYXMuamFyJnF1b3Q7LjwvcD4KLTwvZGl2PgotPGRpdj4KLSAgPHByZT4KLSZsdDt4bWxiZWFuIHNjaGVtYT0ic2NoZW1hcyIgZGVzdGZpbGU9IlNjaGVtYXMuamFyIi8mZ3Q7PC9wcmU+Ci0gIFRoZSBmb2xsb3dpbmcgY29tcGlsZXMgdGhlIHNjaGVtYSAmcXVvdDtvdXJTY2hlbWEueHNkJnF1b3Q7IGludG8gdGhlIGRlZmF1bHQKLSAgamFyICZxdW90O3htbHR5cGVzLmphciZxdW90Oy4gJm5ic3A7SWYgJm5ic3A7YW55IGltcG9ydHMgYW5kIGluY2x1ZGVzIGFyZSBkZWZpbmVkCi0gIGJ5IHJlbW90ZSBVUkxzLCB0aGV5IGFyZSBkb3dubG9hZGVkIGR1cmluZyB0aGUgYnVpbGQuCi0gIDxkaXY+Ci0gICAgPHByZT4mbHQ7eG1sYmVhbiBzY2hlbWE9InNjaGVtYXMvb3VyU2NoZW1hLnhzZCIgZG93bmxvYWQ9InRydWUiLyZndDs8L3ByZT4KLSAgPC9kaXY+Ci0gIDxkaXY+Ci0gICAgPGg0PlVzaW5nIGEgZmlsZXNldDwvaDQ+Ci0gIDwvZGl2PgotICA8ZGl2PgotICAgIDxwcmU+Jmx0O3htbGJlYW4gY2xhc3NnZW5kaXI9IiR7YnVpbGQuZGlyfSIgY2xhc3NwYXRoPSIke2NsYXNzLnBhdGh9Ijxicj4gICAgICBmYWlsb25lcnJvcj0idHJ1ZSImZ3Q7PGJyPiAgJmx0O2ZpbGVzZXQgYmFzZWRpcj0ic3JjIiBleGNsdWRlcz0iKiovKi54c2QiLyZndDs8YnI+ICAmbHQ7ZmlsZXNldCBiYXNlZGlyPSJzY2hlbWFzIiBpbmNsdWRlcz0iKiovKi4qIi8mZ3Q7PGJyPiZsdDsveG1sYmVhbiZndDs8L3ByZT4KLSAgPC9kaXY+Ci0gIDxkaXY+IEdhdGhlcnMgYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeSBleGNlcHQgWFNEIGZpbGVzLCBhbG9uZyB3aXRoCi0gICAgZXZlcnkgZmlsZSBpbiB0aGUgc2NoZW1hcyBkaXJlY3RvcnksIGFuZCBjb21waWxlcyB0aGVtLiBUaGUgZmlsZXNldCBjYW4gaW5jbHVkZQotICAgIHNjaGVtYSBmaWxlcyB0aGF0IHJlZmVyIHRvIHByZXZpb3VzbHkgY29tcGlsZWQgc2NoZW1hIGNvbXBvbmVudHMuJm5ic3A7IFRoZQotICAgIGZpbGVzZXQgY2FuIGFsc28gY29udGFpbiBKQVZBIGZpbGVzLiZuYnNwOyBUaGUgY2xhc3NwYXRoIHBhcmFtZXRlciBkZWZpbmVzCi0gICAgdGhlIGNsYXNzcGF0aCBuZWNlc3NhcnkgdG8gcmVzb2x2ZSBjb21waWxlZCBzY2hlbWEgYW5kIGphdmEgcmVmZXJlbmNlcy48YnI+Ci0gICAgPGJyPgotICAgIFRoZSBidWlsdCBjbGFzc2VzIHdpbGwgZ28gaW50byAke2J1aWxkLmRpcn0uPC9kaXY+Ci0gIDxkaXY+Ci0gICAgPHAgY2xhc3M9cmVsYXRlZHRvcGljcz5SZWxhdGVkIFRvcGljczwvcD4KLSAgICA8cD5Ob25lLjwvcD4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTwvYm9keT4KLTwhLS0gSW5zdGFuY2VFbmQgLS0+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjVjY2E4Li4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+R2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9InlvdXIgbmFtZSI+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIj4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KLTxtZXRhIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCIgY29udGVudD0iMTAvMjUvMDIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KLTxoMT4gR2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2gxPgotPGRpdiBpZD0idG9waWN0ZXh0Ij4KLSAgPHA+WE1MQmVhbnMgcHJvdmlkZXMgaW50dWl0aXZlIHdheXMgdG8gaGFuZGxlIFhNTCB0aGF0IG1ha2UgaXQgZWFzaWVyIGZvciB5b3UKLSAgICB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgWE1MIGRhdGEgYW5kIGRvY3VtZW50cyBpbiBKYXZhLiA8L3A+Ci0gIDxwPkNoYXJhY3RlcmlzdGljcyBvZiBYTUxCZWFucyBhcHByb2FjaCB0byBYTUw6PC9wPgotPC9kaXY+Ci08dWw+Ci0gIDxsaT4KLSAgICA8ZGl2Pkl0IHByb3ZpZGVzIGEgZmFtaWxpYXIgSmF2YSBvYmplY3QtYmFzZWQgdmlldyBvZiBYTUwgZGF0YSB3aXRob3V0IGxvc2luZwotICAgICAgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCwgbmF0aXZlIFhNTCBzdHJ1Y3R1cmUuPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8ZGl2PlRoZSBYTUwncyBpbnRlZ3JpdHkgYXMgYSBkb2N1bWVudCBpcyBub3QgbG9zdCB3aXRoIFhNTEJlYW5zLiBYTUwtb3JpZW50ZWQKLSAgICAgIEFQSXMgY29tbW9ubHkgdGFrZSB0aGUgWE1MIGFwYXJ0IGluIG9yZGVyIHRvIGJpbmQgdG8gaXRzIHBhcnRzLiBXaXRoIFhNTEJlYW5zLAotICAgICAgdGhlIGVudGlyZSBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgaXMgaGFuZGxlZCBhcyBhIHdob2xlLiBUaGUgWE1MIGRhdGEgaXMKLSAgICAgIHN0b3JlZCBpbiBtZW1vcnkgYXMgWE1MLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRvY3VtZW50IG9yZGVyIGlzIHByZXNlcnZlZAotICAgICAgYXMgd2VsbCBhcyB0aGUgb3JpZ2luYWwgZWxlbWVudCBjb250ZW50IHdpdGggd2hpdGVzcGFjZS48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxkaXY+V2l0aCB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEsIGFjY2VzcyB0byBYTUwgaW5zdGFuY2VzIGlzIHRocm91Z2gKLSAgICAgIEphdmFCZWFuLWxpa2UgYWNjZXNzb3JzLCB3aXRoIGdldCBhbmQgc2V0IG1ldGhvZHMuPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8ZGl2Pkl0IGlzIGRlc2lnbmVkIHdpdGggWE1MIHNjaGVtYSBpbiBtaW5kIGZyb20gdGhlIGJlZ2lubmluZyAmIzgyMTI7IFhNTEJlYW5zCi0gICAgICBzdXBwb3J0cyBhbGwgWE1MIHNjaGVtYSBkZWZpbml0aW9ucy48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPkFjY2VzcyB0byBYTUwgaXMgZmFzdC48L2xpPgotPC91bD4KLTxkaXY+Ci0gIDxwPlRoZSBzdGFydGluZyBwb2ludCBmb3IgWE1MQmVhbnMgaXMgWE1MIHNjaGVtYS4gQSBzY2hlbWEgKGNvbnRhaW5lZCBpbiBhbgotICAgIFhTRCBmaWxlKSBpcyBhbiBYTUwgZG9jdW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJ1bGVzIHRvIHdoaWNoIG90aGVyIFhNTAotICAgIGRvY3VtZW50cyBtdXN0IGNvbmZvcm0uIFRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYSByaWNoIGRhdGEKLSAgICBtb2RlbCB0aGF0IGFsbG93cyB5b3UgdG8gZXhwcmVzcyBzb3BoaXN0aWNhdGVkIHN0cnVjdHVyZSBhbmQgY29uc3RyYWludHMgb24KLSAgICB5b3VyIGRhdGEuIEZvciBleGFtcGxlLCBhbiBYTUwgc2NoZW1hIGNhbiBlbmZvcmNlIGNvbnRyb2wgb3ZlciBob3cgZGF0YSBpcwotICAgIG9yZGVyZWQgaW4gYSBkb2N1bWVudCwgb3IgY29uc3RyYWludHMgb24gcGFydGljdWxhciB2YWx1ZXMgKGZvciBleGFtcGxlLCBhCi0gICAgYmlydGggZGF0ZSB0aGF0IG11c3QgYmUgbGF0ZXIgdGhhbiAxOTAwKS4gVW5mb3J0dW5hdGVseSwgdGhlIGFiaWxpdHkgdG8gZW5mb3JjZQotICAgIHJ1bGVzIGxpa2UgdGhpcyBpcyB0eXBpY2FsbHkgbm90IGF2YWlsYWJsZSBpbiBKYXZhIHdpdGhvdXQgd3JpdGluZyBjdXN0b20KLSAgICBjb2RlLiBYTUxCZWFucyBob25vcnMgc2NoZW1hIGNvbnN0cmFpbnRzLjwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZXJlIGFuIFhNTCBzY2hlbWEgZGVmaW5lcyBydWxlcwotICAgIGZvciBhbiBYTUwgZG9jdW1lbnQsIGFuIFhNTCA8ZW0+aW5zdGFuY2U8L2VtPiBpcyBhbiBYTUwgZG9jdW1lbnQgdGhhdCBjb25mb3JtcwotICAgIHRvIHRoZSBzY2hlbWEuPC9wPgotICA8cD5Zb3UgY29tcGlsZSBhIHNjaGVtYSAoWFNEKSBmaWxlIHRvIGdlbmVyYXRlIGEgc2V0IG9mIEphdmEgaW50ZXJmYWNlcyB0aGF0Ci0gICAgbWlycm9yIHRoZSBzY2hlbWEuIFdpdGggdGhlc2UgdHlwZXMsIHlvdSBwcm9jZXNzIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMgdGhhdAotICAgIGNvbmZvcm0gdG8gdGhlIHNjaGVtYS4gWW91IGJpbmQgYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IHRvIHRoZXNlIHR5cGVzOyBjaGFuZ2VzCi0gICAgbWFkZSB0aHJvdWdoIHRoZSBKYXZhIGludGVyZmFjZSBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgWE1MIHJlcHJlc2VudGF0aW9uLjwvcD4KLSAgPHA+UHJldmlvdXMgb3B0aW9ucyBmb3IgaGFuZGxpbmcgWE1MIGluY2x1ZGUgdXNpbmcgWE1MIHByb2dyYW1taW5nIGludGVyZmFjZXMKLSAgICAoc3VjaCBhcyBET00gb3IgU0FYKSBvciBhbiBYTUwgbWFyc2hhbGxpbmcvYmluZGluZyB0b29sIChzdWNoIGFzIEpBWEIpLiBCZWNhdXNlCi0gICAgaXQgbGFja3Mgc3Ryb25nIHNjaGVtYS1vcmllbnRlZCB0eXBpbmcsIG5hdmlnYXRpb24gaW4gYSBET00tb3JpZW50ZWQgbW9kZWwKLSAgICBpcyBtb3JlIHRlZGlvdXMgYW5kIHJlcXVpcmVzIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNvbXBsZXRlIG9iamVjdCBtb2RlbC4KLSAgICBKQVhCIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24sIGJ1dCBoYW5kbGVzIG9ubHkgYQotICAgIHN1YnNldCBvZiBpdDsgWE1MQmVhbnMgc3VwcG9ydHMgYWxsIG9mIGl0LiBBbHNvLCBieSBzdG9yaW5nIHRoZSBkYXRhIGluIG1lbW9yeQotICAgIGFzIFhNTCwgWE1MQmVhbnMgaXMgYWJsZSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nLjwvcD4KLSAgPGgxPkFjY2Vzc2luZyBYTUwgVXNpbmcgSXRzIFNjaGVtYTwvaDE+Ci0gIDxwPlRvIGdldCBhIGdsaW1wc2Ugb2YgdGhlIGtpbmRzIG9mIHRoaW5ncyB5b3UgY2FuIGRvIHdpdGggWE1MQmVhbnMsIHRha2UgYQotICAgIGxvb2sgYXQgYW4gZXhhbXBsZSB1c2luZyBYTUwgZm9yIGEgcHVyY2hhc2Ugb3JkZXIuIFRoZSBwdXJjaGFzZSBvcmRlciBYTUwKLSAgICBjb250YWlucyBkYXRhIGV4Y2hhbmdlZCBieSB0d28gcGFydGllcywgc3VjaCBhcyB0d28gY29tcGFuaWVzLiBCb3RoIHBhcnRpZXMKLSAgICBuZWVkIHRvIGJlIGFibGUgdG8gcmVseSBvbiBhIGNvbnNpc3RlbnQgbWVzc2FnZSBzaGFwZSwgYW5kIGEgc2NoZW1hIHNwZWNpZmllcwotICAgIHRoZSBjb21tb24gZ3JvdW5kLiA8L3A+Ci0gIDxwPkhlcmUncyB3aGF0IGEgcHVyY2hhc2Ugb3JkZXIgWE1MIGluc3RhbmNlIG1pZ2h0IGxvb2sgbGlrZS48L3A+Ci0gIDxwcmU+Ci0mbHQ7cG86cHVyY2hhc2Utb3JkZXIgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iJmd0OwotICAgICZsdDtwbzpjdXN0b21lciZndDsKLSAgICAgICAgJmx0O3BvOm5hbWUmZ3Q7R2xhZHlzIEtyYXZpdHombHQ7L3BvOm5hbWUmZ3Q7Ci0gICAgICAgICZsdDtwbzphZGRyZXNzJmd0O0FueXRvd24sIFBBJmx0Oy9wbzphZGRyZXNzJmd0OwotICAgICZsdDsvcG86Y3VzdG9tZXImZ3Q7Ci0gICAgJmx0O3BvOmRhdGUmZ3Q7MjAwMy0wMS0wN1QxNDoxNjowMC0wNTowMCZsdDsvcG86ZGF0ZSZndDsKLSAgICAmbHQ7cG86bGluZS1pdGVtJmd0OwotICAgICAgICAmbHQ7cG86ZGVzY3JpcHRpb24mZ3Q7QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEmbHQ7L3BvOmRlc2NyaXB0aW9uJmd0OwotICAgICAgICAmbHQ7cG86cGVyLXVuaXQtb3VuY2VzJmd0OzUmbHQ7L3BvOnBlci11bml0LW91bmNlcyZndDsKLSAgICAgICAgJmx0O3BvOnByaWNlJmd0OzIxLjc5Jmx0Oy9wbzpwcmljZSZndDsKLSAgICAgICAgJmx0O3BvOnF1YW50aXR5Jmd0OzImbHQ7L3BvOnF1YW50aXR5Jmd0OwotICAgICZsdDsvcG86bGluZS1pdGVtJmd0OwotICAgICZsdDtwbzpsaW5lLWl0ZW0mZ3Q7Ci0gICAgICAgICZsdDtwbzpkZXNjcmlwdGlvbiZndDtCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiZsdDsvcG86ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgICZsdDtwbzpwZXItdW5pdC1vdW5jZXMmZ3Q7NSZsdDsvcG86cGVyLXVuaXQtb3VuY2VzJmd0OwotICAgICAgICAmbHQ7cG86cHJpY2UmZ3Q7MTkuODkmbHQ7L3BvOnByaWNlJmd0OwotICAgICAgICAmbHQ7cG86cXVhbnRpdHkmZ3Q7MiZsdDsvcG86cXVhbnRpdHkmZ3Q7Ci0gICAgJmx0Oy9wbzpsaW5lLWl0ZW0mZ3Q7Ci0mbHQ7cG86c2hpcHBlciZndDsKLSAgICAgICAgJmx0O3BvOm5hbWUmZ3Q7WmlwU2hpcCZsdDsvcG86bmFtZSZndDsKLSAgICAgICAgJmx0O3BvOnBlci1vdW5jZS1yYXRlJmd0OzAuNzQmbHQ7L3BvOnBlci1vdW5jZS1yYXRlJmd0OwotICAgICZsdDsvcG86c2hpcHBlciZndDsKLSZsdDsvcG86cHVyY2hhc2Utb3JkZXImZ3Q7PC9wcmU+Ci0gIDxwPlRoaXMgWE1MIGluY2x1ZGVzIGEgcm9vdCBlbGVtZW50LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVyY2hhc2Utb3JkZXI8L3NwYW4+LAotICAgIHRoYXQgaGFzIHRocmVlIGtpbmRzIG9mIGNoaWxkIGVsZW1lbnRzOiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3VzdG9tZXI8L3NwYW4+LAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kYXRlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4sCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaGlwcGVyPC9zcGFuPi4gQW4gaW50dWl0aXZlLCBvYmplY3QtYmFzZWQgdmlldwotICAgIG9mIHRoaXMgWE1MIHdvdWxkIHByb3ZpZGUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1cmNoYXNlLW9yZGVyPC9zcGFuPgotICAgIGVsZW1lbnQsIGFuZCBpdCB3b3VsZCBoYXZlIG1ldGhvZHMgZm9yIGdldHRpbmcgdGhlIGRhdGUgYW5kIGZvciBnZXR0aW5nIHN1Ym9yZGluYXRlCi0gICAgb2JqZWN0cyBmb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmN1c3RvbWVyPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4sCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaGlwcGVyPC9zcGFuPiBlbGVtZW50cy4gRWFjaCBvZiB0aGUgbGFzdCB0aHJlZQotICAgIHdvdWxkIGhhdmUgaXRzIG93biBtZXRob2RzIGZvciBnZXR0aW5nIHRoZSBkYXRhIGluc2lkZSB0aGVtIGFzIHdlbGwuPC9wPgotICA8aDI+TG9va2luZyBhdCB0aGUgU2NoZW1hPC9oMj4KLSAgPHA+VGhlIGZvbGxvd2luZyBYTUwgaXMgdGhlIHRoZSBzY2hlbWEgZm9yIHRoZSBwcmVjZWRpbmcgcHVyY2hhc2Ugb3JkZXIgWE1MLgotICAgIEl0IGRlZmluZXMgdGhlIFhNTCdzICZxdW90O3NoYXBlJnF1b3Q7ICYjODIxMjsgd2hhdCBpdHMgZWxlbWVudHMgYXJlLCB3aGF0Ci0gICAgb3JkZXIgdGhleSBhcHBlYXIgaW4sIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB3aGljaCwgYW5kIHNvIG9uLjwvcD4KLTwvZGl2PgotPGRpdj4KLSAgPHByZT4KLSZsdDt4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIgotICAgIHhtbG5zOnBvPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIgotICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCImZ3Q7Ci0KLSAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwdXJjaGFzZS1vcmRlciImZ3Q7Ci0gICAgICAgICZsdDt4czpjb21wbGV4VHlwZSZndDsKLSAgICAgICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0icG86Y3VzdG9tZXIiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJkYXRlIiB0eXBlPSJ4czpkYXRlVGltZSIvJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImxpbmUtaXRlbSIgdHlwZT0icG86bGluZS1pdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ic2hpcHBlciIgdHlwZT0icG86c2hpcHBlciIgbWluT2NjdXJzPSIwIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICZsdDsveHM6ZWxlbWVudCZndDsKLSAgICAmbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tZXIiJmd0OwotICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImFkZHJlc3MiIHR5cGU9InhzOnN0cmluZyIvJmd0OwotICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0gICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9ImxpbmUtaXRlbSImZ3Q7Ci0gICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InBlci11bml0LW91bmNlcyIgdHlwZT0ieHM6ZGVjaW1hbCIvJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzOmRvdWJsZSIvJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvJmd0OwotICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0gICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9InNoaXBwZXIiJmd0OwotICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InBlci1vdW5jZS1yYXRlIiB0eXBlPSJ4czpkZWNpbWFsIi8mZ3Q7Ci0gICAgICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7Ci0gICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsKLSZsdDsveHM6c2NoZW1hJmd0OzwvcHJlPgotICA8ZGl2PgotICAgIDxwPlRoaXMgc2NoZW1hIGRlc2NyaWJlcyB0aGUgcHVyY2hhc2Ugb3JkZXIgWE1MIGluc3RhbmNlIGJ5IGRlZmluaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgotICA8L2Rpdj4KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIDxkaXY+RGVmaW5pdGlvbnMgZm9yIHRocmVlIGNvbXBsZXggdHlwZXMgJiM4MjEyOyBjdXN0b21lciwgbGluZS1pdGVtLCBhbmQKLSAgICAgICAgc2hpcHBlci4gVGhlc2UgYXJlIHRoZSB0eXBlcyB1c2VkIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIHB1cmNoYXNlLW9yZGVyCi0gICAgICAgIGVsZW1lbnQuIEluIHNjaGVtYSwgYSBjb21wbGV4IHR5cGUgaXMgb25lIHRoYXQgZGVmaW5lcyBhbiBlbGVtZW50IHRoYXQKLSAgICAgICAgbWF5IGhhdmUgY2hpbGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuIFRoZSBzZXF1ZW5jZSBlbGVtZW50IG5lc3RlZCBpbgotICAgICAgICB0aGUgY29tcGxleCB0eXBlIGxpc3RzIGl0cyBjaGlsZCBlbGVtZW50cy48L2Rpdj4KLSAgICAgIDxwPlRoZXNlIGFyZSBhbHNvIDxlbT5nbG9iYWw8L2VtPiB0eXBlcy4gVGhleSBhcmUgZ2xvYmFsIGJlY2F1c2UgdGhleSBhcmUKLSAgICAgICAgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgc2NoZW1hIChpbiBvdGhlciB3b3JkcywganVzdCBiZW5lYXRoIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2NoZW1hPC9zcGFuPgotICAgICAgICByb290IGVsZW1lbnQpLiBUaGlzIG1lYW5zIHRoYXQgdGhleSBtYXkgYmUgcmVmZXJlbmNlZCBmcm9tIGFueXdoZXJlIGVsc2UKLSAgICAgICAgaW4gdGhlIHNjaGVtYS48L3A+Ci0gICAgPC9saT4KLSAgPC91bD4KLTwvZGl2PgotPGRpdj4KLSAgPHVsPgotICAgIDxsaT5Vc2Ugb2Ygc2ltcGxlIHR5cGVzIHdpdGhpbiB0aGUgY29tcGxleCB0eXBlcy4gVGhlIG5hbWUsIGFkZHJlc3MsIGFuZCBkZXNjcmlwdGlvbgotICAgICAgZWxlbWVudHMgKGFtb25nIG90aGVycykgYXJlIHR5cGVkIGFzIHNpbXBsZSB0eXBlcy4gQXMgaXQgaGFwcGVucywgdGhlc2UKLSAgICAgIGFyZSBhbHNvIDxlbT5idWlsdC1pbjwvZW0+IHR5cGVzLiBBIGJ1aWx0LWluIHR5cGUgKGhlcmUsIG9uZSB3aXRoIHRoZSAmcXVvdDt4cyZxdW90OwotICAgICAgcHJlZml4KSBpcyBwYXJ0IG9mIHRoZSBzY2hlbWEgc3BlY2lmaWNhdGlvbi4gKFRoZSBzcGVjaWZpY2F0aW9uIGRlZmluZXMKLSAgICAgIDQ2IGJ1aWx0LWluIHR5cGVzLik8L2xpPgotICAgIDxsaT5BIGdsb2JhbCBlbGVtZW50IGNhbGxlZCBwdXJjaGFzZS1vcmRlci4gVGhpcyBlbGVtZW50IGRlZmluaXRpb24gaW5jbHVkZXMKLSAgICAgIGEgbmVzdGVkIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBjaGlsZCBlbGVtZW50cyBmb3IgYQotICAgICAgcHVyY2hhc2Utb3JkZXIgZWxlbWVudC4gTm90aWNlIHRoYXQgdGhlIGNvbXBsZXggdHlwZSBpbmNsdWRlcyByZWZlcmVuY2VzCi0gICAgICB0byB0aGUgb3RoZXIgY29tcGxleCB0eXBlcyBkZWZpbmVkIGluIHRoaXMgc2NoZW1hLjwvbGk+Ci0gIDwvdWw+Ci0gIDxkaXY+PC9kaXY+Ci0gIDxwPkluIG90aGVyIHdvcmRzLCB0aGUgc2NoZW1hIGRlZmluZXMgdHlwZXMgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBhbmQgZGVzY3JpYmVzCi0gICAgdGhlaXIgcG9zaXRpb24gYXMgc3Vib3JkaW5hdGUgdG8gdGhlIHJvb3QgZWxlbWVudCwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1cmNoYXNlLW9yZGVyPC9zcGFuPi48L3A+Ci0gIDxwPldoZW4geW91IHVzZSB0aGUgWE1MQmVhbiBjb21waWxlciB3aXRoIGFuIFhTRCBmaWxlIHN1Y2ggYXMgdGhpcyBvbmUsIHlvdQotICAgIGdlbmVyYXRlIGEgSkFSIGZpbGUgY29udGFpbmluZyB0aGUgaW50ZXJmYWNlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLjwvcD4KLSAgPGgyPldyaXRpbmcgSmF2YSBDb2RlIFRoYXQgVXNlcyB0aGUgSW50ZXJmYWNlczwvaDI+Ci0gIDxwPldpdGggdGhlIFhNTEJlYW5zIGludGVyZmFjZXMgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiB3cml0ZSBjb2RlIHRoYXQKLSAgICB1c2VzIHRoZSBuZXcgdHlwZXMgdG8gaGFuZGxlIFhNTCBiYXNlZCBvbiB0aGUgc2NoZW1hLiBIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0Ci0gICAgZXh0cmFjdHMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGUgb3JkZXJlZCBpdGVtcyBpbiB0aGUgcHVyY2hhc2Ugb3JkZXIKLSAgICBYTUwsIGNvdW50cyB0aGUgaXRlbXMsIGFuZCBjYWxjdWxhdGVzIGEgdG90YWwgb2YgdGhlaXIgcHJpY2VzLiBJbiBwYXJ0aWN1bGFyLAotICAgIGxvb2sgYXQgdGhlIHVzZSBvZiB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hIGFuZCBpbXBvcnRlZCBhcyBwYXJ0IG9mCi0gICAgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5vcmcub3BlbnVyaS5lYXN5cG88L3NwYW4+IHBhY2thZ2UuIDwvcD4KLSAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmludEl0ZW1zPC9zcGFuPiBtZXRob2QgcmVjZWl2ZXMgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4KLSAgICBvYmplY3QgY29udGFpbmluZyB0aGUgcHVyY2hhc2Ugb3JkZXIgWE1MIGZpbGUuPC9wPgotICA8cHJlPgotcGFja2FnZSBkb2NzLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKLWltcG9ydCBvcmcub3BlbnVyaS5lYXN5cG8uUHVyY2hhc2VPcmRlckRvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby5QdXJjaGFzZU9yZGVyOwotaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby5MaW5lSXRlbTsKLQotcHVibGljIGNsYXNzIFBPSGFuZGxlcgotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEl0ZW1zKEZpbGUgcG8pIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFsbCBYTUxCZWFucyBzY2hlbWEgdHlwZXMgcHJvdmlkZSBhIG5lc3RlZCBGYWN0b3J5IGNsYXNzIHlvdSBjYW4KLSAgICAgICAgICogdXNlIHRvIGJpbmQgWE1MIHRvIHRoZSB0eXBlLCBvciB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdHlwZS4KLSAgICAgICAgICogTm90ZSB0aGF0IGEgIkRvY3VtZW50IiB0eXBlIHN1Y2ggYXMgdGhpcyBvbmUgaXMgYW4gWE1MQmVhbnMKLSAgICAgICAgICogY29uc3RydWN0IGZvciByZXByZXNlbnRpbmcgYSBnbG9iYWwgZWxlbWVudC4gSXQgcHJvdmlkZXMgYSB3YXkKLSAgICAgICAgICogZm9yIHlvdSB0byBnZXQgYW5kIHNldCB0aGUgY29udGVudHMgb2YgdGhlIGVudGlyZSBlbGVtZW50LgotICAgICAgICAgKgotICAgICAgICAgKiBBbHNvLCBub3RlIHRoYXQgdGhlIHBhcnNlIG1ldGhvZCB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUKLSAgICAgICAgICogWE1MIHlvdSdyZSBwYXJzaW5nIGFwcGVhcnMgdG8gY29uZm9ybSB0byB0aGUgc2NoZW1hLgotICAgICAgICAgKi8KLSAgICAgICAgUHVyY2hhc2VPcmRlckRvY3VtZW50IHBvRG9jID0KLSAgICAgICAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHBvKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgUHVyY2hhc2VPcmRlciB0eXBlIHJlcHJlc2VudHMgdGhlIHB1cmNoYXNlLW9yZGVyIGVsZW1lbnQncwotICAgICAgICAgKiBjb21wbGV4IHR5cGUuCi0gICAgICAgICAqLwotICAgICAgICBQdXJjaGFzZU9yZGVyIHBvID0gcG9Eb2MuZ2V0UHVyY2hhc2VPcmRlcigpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdoZW4gYW4gZWxlbWVudCBtYXkgb2NjdXIgbW9yZSB0aGFuIG9uY2UgYXMgYSBjaGlsZCBlbGVtZW50LAotICAgICAgICAgKiB0aGUgc2NoZW1hIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgbWV0aG9kcyB0aGF0IHJlZmVyIHRvIGFuCi0gICAgICAgICAqIGFycmF5IG9mIHRoYXQgZWxlbWVudC4gVGhlIGxpbmUtaXRlbSBlbGVtZW50IGlzIGRlZmluZWQgd2l0aAotICAgICAgICAgKiBhIG1heE9jY3VycyBhdHRyaWJ1dGUgdmFsdWUgb2YgInVuYm91bmRlZCIsIG1lYW5pbmcgdGhhdAotICAgICAgICAgKiBpdCBtYXkgb2NjdXIgYXMgbWFueSB0aW1lcyBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCBhcyBuZWVkZWQuCi0gICAgICAgICAqIFNvIHRoZXJlIGFyZSBtZXRob2RzIHN1Y2ggYXMgZ2V0TGluZUl0ZW1BcnJheSBhbmQgc2V0TGluZUl0ZW1BcnJheS4KLSAgICAgICAgICovCi0gICAgICAgIExpbmVJdGVtW10gbGluZWl0ZW1zID0gcG8uZ2V0TGluZUl0ZW1BcnJheSgpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlB1cmNoYXNlIG9yZGVyIGhhcyAiICsgbGluZWl0ZW1zLmxlbmd0aCArICIgbGluZSBpdGVtcy4iKTsKLQotICAgICAgICBkb3VibGUgdG90YWxBbW91bnQgPSAwLjA7Ci0gICAgICAgIGludCBudW1iZXJPZkl0ZW1zID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBMb29wIHRocm91Z2ggdGhlIGxpbmUtaXRlbSBlbGVtZW50cywgdXNpbmcgZ2VuZXJhdGVkIGFjY2Vzc29ycyB0bwotICAgICAgICAgKiBnZXQgdmFsdWVzIGZvciBjaGlsZCBlbGVtZW50cyBzdWNoIGEgZGVzY3JpcHRpb24sIHF1YW50aXR5LCBhbmQKLSAgICAgICAgICogcHJpY2UuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxpbmVpdGVtcy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgTGluZSBpdGVtOiAiICsgaik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgIiAgIERlc2NyaXB0aW9uOiAiICsgbGluZWl0ZW1zW2pdLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBRdWFudGl0eTogIiArIGxpbmVpdGVtc1tqXS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgUHJpY2U6ICIgKyBsaW5laXRlbXNbal0uZ2V0UHJpY2UoKSk7Ci0gICAgICAgICAgICBudW1iZXJPZkl0ZW1zICs9IGxpbmVpdGVtc1tqXS5nZXRRdWFudGl0eSgpOwotICAgICAgICAgICAgdG90YWxBbW91bnQgKz0gbGluZWl0ZW1zW2pdLmdldFByaWNlKCkgKiBsaW5laXRlbXNbal0uZ2V0UXVhbnRpdHkoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGl0ZW1zOiAiICsgbnVtYmVyT2ZJdGVtcyk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgYW1vdW50OiAiICsgdG90YWxBbW91bnQpOwotICAgIH0KLX0KLTwvcHJlPgotICA8cD5Ob3RpY2UgdGhhdCB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hIHJlZmxlY3Qgd2hhdCdzIGluIHRoZSBYTUw6PC9wPgotPC9kaXY+Ci08dWw+Ci0gIDxsaT4KLSAgICA8ZGl2PkEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlB1cmNoYXNlT3JkZXJEb2N1bWVudDwvc3Bhbj4gcmVwcmVzZW50cyB0aGUKLSAgICAgIGdsb2JhbCByb290IGVsZW1lbnQuPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8ZGl2PkEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFB1cmNoYXNlT3JkZXI8L3NwYW4+IG1ldGhvZCByZXR1cm5zIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlB1cmNoYXNlT3JkZXJEb2N1bWVudC5QdXJjaGFzZU9yZGVyPC9zcGFuPgotICAgICAgdHlwZSB0aGF0IGNvbnRhaW5zIGNoaWxkIGVsZW1lbnRzLCBpbmNsdWRpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4uCi0gICAgICBBIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRMaW5lSXRlbUFycmF5PC9zcGFuPiBtZXRob2QgcmV0dXJucyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5MaW5lSXRlbTwvc3Bhbj4KLSAgICAgIGFycmF5IGNvbnRhaW5pbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+IGVsZW1lbnRzLjwvZGl2PgotICA8L2xpPgotICA8bGk+T3RoZXIgbWV0aG9kcywgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0UXVhbnRpdHk8L3NwYW4+LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0UHJpY2U8L3NwYW4+LAotICAgIGFuZCBzbyBvbiwgZm9sbG93IG5hdHVyYWxseSBmcm9tIHdoYXQgdGhlIHNjaGVtYSBkZXNjcmliZXMsIHJldHVybmluZyBjb3JyZXNwb25kaW5nCi0gICAgY2hpbGRyZW4gb2YgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+IGVsZW1lbnQuPC9saT4KLSAgPGxpPlRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlc2UgdHlwZXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBzY2hlbWEncwotICAgIHRhcmdldCBuYW1lc3BhY2UuPC9saT4KLTwvdWw+Ci08ZGl2PgotICA8cD5DYXBpdGFsaXphdGlvbiBhbmQgcHVuY3R1YXRpb24gZm9yIGdlbmVyYXRlZCB0eXBlIG5hbWVzIGZvbGxvdyBKYXZhIGNvbnZlbnRpb24uCi0gICAgQWxzbywgd2hpbGUgdGhpcyBleGFtcGxlIHBhcnNlcyB0aGUgWE1MIGZyb20gYSBmaWxlLCBvdGhlciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cGFyc2U8L3NwYW4+Ci0gICAgbWV0aG9kcyBzdXBwb3J0IGEgSmF2YSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+SW5wdXRTdHJlYW08L3NwYW4+IG9iamVjdCwKLSAgICBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5SZWFkZXI8L3NwYW4+IG9iamVjdCwgYW5kIHNvIG9uLjwvcD4KLSAgPHA+VGhlIHByZWNlZGluZyBKYXZhIGNvZGUgcHJpbnRzIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGNvbnNvbGU6PC9wPgotPC9kaXY+Ci08ZGl2PgotICA8cHJlPgotUHVyY2hhc2Ugb3JkZXIgaGFzIDMgbGluZSBpdGVtcy4KLSBMaW5lIGl0ZW0gMAotICAgRGVzY3JpcHRpb246IEJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxCi0gICBRdWFudGl0eTogMgotICAgUHJpY2U6IDIxLjc5Ci0gTGluZSBpdGVtIDEKLSAgIERlc2NyaXB0aW9uOiBCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMgotICAgUXVhbnRpdHk6IDIKLSAgIFByaWNlOiAxOS44OQotVG90YWwgaXRlbXM6IDQKLVRvdGFsIGFtb3VudDogNDEuNjg8L3ByZT4KLSAgPGgyPkNyZWF0aW5nIE5ldyBYTUwgSW5zdGFuY2VzIGZyb20gU2NoZW1hPC9oMj4KLSAgPHA+QXMgeW91J3ZlIHNlZW4gWE1MQmVhbnMgcHJvdmlkZXMgYSAmcXVvdDtmYWN0b3J5JnF1b3Q7IGNsYXNzIHlvdSBjYW4gdXNlCi0gICAgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgbmV3IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXJjaGFzZS1vcmRlcjwvc3Bhbj4KLSAgICBlbGVtZW50IGFuZCBhZGRzIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmN1c3RvbWVyPC9zcGFuPiBjaGlsZCBlbGVtZW50LgotICAgIEl0IHRoZW4gaW5zZXJ0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5hZGRyZXNzPC9zcGFuPgotICAgIGNoaWxkIGVsZW1lbnRzLCBjcmVhdGluZyB0aGUgZWxlbWVudHMgYW5kIHNldHRpbmcgdGhlaXIgdmFsdWVzIHdpdGggYSBzaW5nbGUKLSAgICBjYWxsIHRvIHRoZWlyIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZXQ8L3NwYW4+IG1ldGhvZHMuPC9wPgotICA8cHJlPgotcHVibGljIFB1cmNoYXNlT3JkZXJEb2N1bWVudCBjcmVhdGVQTygpCi17Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQdXJjaGFzZU9yZGVyRG9jdW1lbnQgbmV3UE9Eb2MgPSBQdXJjaGFzZU9yZGVyRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHVyY2hhc2VPcmRlciBuZXdQTyA9IG5ld1BPRG9jLmFkZE5ld1B1cmNoYXNlT3JkZXIoKTsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0N1c3RvbWVyIG5ld0N1c3RvbWVyID0gbmV3UE8uYWRkTmV3Q3VzdG9tZXIoKTsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25ld0N1c3RvbWVyLnNldE5hbWUoJnF1b3Q7RG9yaXMgS3Jhdml0eiZxdW90Oyk7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuZXdDdXN0b21lci5zZXRBZGRyZXNzKCZxdW90O0JlbGxmbG93ZXIsIENBJnF1b3Q7KTsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3JldHVybiBuZXdQT0RvYzsKLX0KLTwvcHJlPgotICA8cD5UaGUgZm9sbG93aW5nIGlzIHRoZSBYTUwgdGhhdCByZXN1bHRzLiBOb3RlIHRoYXQgWE1MQmVhbnMgYXNzaWducyB0aGUgY29ycmVjdAotICAgIG5hbWVzcGFjZSBiYXNlZCBvbiB0aGUgc2NoZW1hLCB1c2luZyBhbiAmcXVvdDtuczEmcXVvdDsgKG9yLCAmcXVvdDtuYW1lc3BhY2UKLSAgICAxJnF1b3Q7KSBwcmVmaXguIEZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcmVmaXggaXRzZWxmIGRvZXNuJ3QgcmVhbGx5Ci0gICAgbWF0dGVyICYjODIxMjsgaXQncyB0aGUgbmFtZXNwYWNlIFVSSSAoaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbykgdGhhdCBkZWZpbmVzCi0gICAgdGhlIG5hbWVzcGFjZS4gVGhlIHByZWZpeCBpcyBtZXJlbHkgYSBtYXJrZXIgdGhhdCByZXByZXNlbnRzIGl0LjwvcD4KLSAgPHByZT4mbHQ7bnMxOnB1cmNoYXNlLW9yZGVyIHhtbG5zOm5zMT0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJnF1b3Q7Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O25zMTpjdXN0b21lciZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczE6bmFtZSZndDtEb3JpcyBLcmF2aXR6Jmx0Oy9uczE6bmFtZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczE6YWRkcmVzcyZndDtCZWxsZmxvd2VyLCBDQSZsdDsvbnMxOmFkZHJlc3MmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L25zMTpjdXN0b21lciZndDsKLSZsdDsvbnMxOnB1cmNoYXNlLW9yZGVyJmd0OwotPC9wcmU+Ci0gIDxwPk5vdGUgdGhhdCBhbGwgdHlwZXMgKGluY2x1ZGluZyB0aG9zZSBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEpIGluaGVyaXQgZnJvbQotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LCBhbmQgc28gcHJvdmlkZSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GYWN0b3J5PC9zcGFuPgotICAgIGNsYXNzLiBGb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIHR5cGUgc3lzdGVtIGluIHdoaWNoIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+Ci0gICAgZml0cywgc2VlIDxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0Ci0gICAgZm9yIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT4uIEZvciByZWZlcmVuY2UgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+WG1sT2JqZWN0Ci0gICAgSW50ZXJmYWNlPC9hPi48L3A+Ci0gIDxoMT5YTUxCZWFucyBIaWVyYXJjaHk8L2gxPgotICA8cD5UaGUgZ2VuZXJhdGVkIHR5cGVzIHlvdSBzYXcgdXNlZCBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUgYXJlIGFjdHVhbGx5IHBhcnQKLSAgICBvZiBhIGhpZXJhcmNoeSBvZiBYTUxCZWFucyB0eXBlcy4gVGhpcyBoaWVyYXJjaHkgaXMgb25lIG9mIHRoZSB3YXlzIGluIHdoaWNoCi0gICAgWE1MQmVhbnMgcHJlc2VudHMgYW4gaW50dWl0aXZlIHZpZXcgb2Ygc2NoZW1hLiBBdCB0aGUgdG9wIG9mIHRoZSBoaWVyYXJjaHkKLSAgICBpcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiwgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBYTUxCZWFucwotICAgIHR5cGVzLiBCZW5lYXRoIHRoaXMgbGV2ZWwsIHRoZXJlIGFyZSB0d28gbWFpbiB0eXBlIGNhdGVnb3JpZXM6IGdlbmVyYXRlZCB0eXBlcwotICAgIHRoYXQgcmVwcmVzZW50IHVzZXItZGVyaXZlZCBzY2hlbWEgdHlwZXMsIGFuZCBpbmNsdWRlZCB0eXBlcyB0aGF0IHJlcHJlc2VudAotICAgIGJ1aWx0LWluIHNjaGVtYSB0eXBlcy48L3A+Ci0gIFRoaXMgdG9waWMgaGFzIGFscmVhZHkgaW50cm9kdWNlZCBnZW5lcmF0ZWQgdHlwZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKLSAgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEgVHlwZXMgR2VuZXJhdGVkIGZyb20KLSAgVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlcy48L2E+Ci0gIDxoMj5CdWlsdC1JbiBUeXBlIFN1cHBvcnQ8L2gyPgotICA8cD5JbiBhZGRpdGlvbiB0byB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBhIGdpdmVuIHNjaGVtYSwgWE1MQmVhbnMgcHJvdmlkZXMgNDYKLSAgICBKYXZhIHR5cGVzIHRoYXQgbWlycm9yIHRoZSA0NiBidWlsdC1pbiB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24uCi0gICAgV2hlcmUgc2NoZW1hIGRlZmluZXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpkZWNpbWFsPC9zcGFuPiwKLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludDwvc3Bhbj4sIGZvciBleGFtcGxlLCBYTUxCZWFucyBwcm92aWRlcwotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuaHRtbCI+WG1sU3RyaW5nPC9hPjwvc3Bhbj4sCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuaHRtbCI+WG1sRGVjaW1hbDwvYT48L3NwYW4+LAotICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50Lmh0bWwiPlhtbEludDwvYT48L3NwYW4+LgotICAgIEVhY2ggb2YgdGhlc2UgYWxzbyBpbmhlcml0cyBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LAotICAgIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBidWlsdC1pbiBzY2hlbWEgdHlwZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6YW55VHlwZTwvc3Bhbj4uPC9wPgotICA8cD5YTUxCZWFucyBwcm92aWRlcyBhIHdheSBmb3IgeW91IHRvIGhhbmRsZSBYTUwgZGF0YSBhcyB0aGVzZSBidWlsdC1pbiB0eXBlcy4KLSAgICBXaGVyZSB5b3VyIHNjaGVtYSBpbmNsdWRlcyBhbiBlbGVtZW50IHdob3NlIHR5cGUgaXMsIGZvciBleGFtcGxlLCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6aW50PC9zcGFuPiwKLSAgICBYTUxCZWFucyB3aWxsIHByb3ZpZGUgYSBnZW5lcmF0ZWQgbWV0aG9kIGRlc2lnbmVkIHRvIHJldHVybiBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sSW50PC9zcGFuPi4KLSAgICBJbiBhZGRpdGlvbiwgYXMgeW91IHNhdyBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUsIGZvciBtb3N0IHR5cGVzIHRoZXJlIHdpbGwKLSAgICBhbHNvIGJlIGEgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5hdHVyYWwgSmF2YSB0eXBlIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmludDwvc3Bhbj4uCi0gICAgVGhlIGZvbGxvd2luZyB0d28gbGluZXMgb2YgY29kZSByZXR1cm4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5xdWFudGl0eTwvc3Bhbj4KLSAgICBlbGVtZW50J3MgdmFsdWUsIGJ1dCByZXR1cm4gaXQgYXMgZGlmZmVyZW50IHR5cGVzLjwvcD4KLSAgPHByZT4KLS8vIE1ldGhvZHMgdGhhdCByZXR1cm4gc2ltcGxlIHR5cGVzIGJlZ2luIHdpdGggYW4gIngiLgotWG1sSW50IHhtbFF1YW50aXR5ID0gbGluZWl0ZW1zW2pdLnhnZXRRdWFudGl0eSgpOwotLy8gTWV0aG9kcyB0aGF0IHJldHVybiBhIG5hdHVyYWwgSmF2YSB0eXBlIGFyZSB1bmFkb3JuZWQuCi1pbnQgamF2YVF1YW50aXR5ID0gbGluZWl0ZW1zW2pdLmdldFF1YW50aXR5KCk7Ci08L3ByZT4KLSAgPHA+SW4gYSBzZW5zZSBib3RoIGdldCBtZXRob2RzIG5hdmlnYXRlIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cXVhbnRpdHk8L3NwYW4+Ci0gICAgZWxlbWVudDsgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRRdWFudGl0eTwvc3Bhbj4gbWV0aG9kIGdvZXMgYSBzdGVwCi0gICAgZnVydGhlciBhbmQgY29udmVydHMgdGhlIGVsZW1lbnRzIHZhbHVlIHRvIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG5hdHVyYWwgSmF2YQotICAgIHR5cGUgYmVmb3JlIHJldHVybmluZyBpdC4gKFhNTEJlYW5zIGFsc28gcHJvdmlkZXMgYSBtZWFucyBmb3IgdmFsaWRhdGluZyB0aGUKLSAgICBYTUwgYXMgeW91IHdvcmsgd2l0aCBpdC4pPC9wPgotICA8cD5JZiB5b3Uga25vdyBhIGJpdCBhYm91dCBYTUwgc2NoZW1hLCBYTUxCZWFucyB0eXBlcyBzaG91bGQgc2VlbSBmYWlybHkgaW50dWl0aXZlLgotICAgIElmIHlvdSBkb24ndCwgeW91J2xsIGxlYXJuIGEgbG90IGJ5IGV4cGVyaW1lbnRpbmcgd2l0aCBYTUxCZWFucyB1c2luZyB5b3VyCi0gICAgb3duIHNjaGVtYXMgYW5kIFhNTCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlbS4gPC9wPgotICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbWV0aG9kcyBvZiB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEsIHNlZSA8YSBocmVmPSJjb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwiPk1ldGhvZHMKLSAgICBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC9hPi4gRm9yIG1vcmUgYWJvdXQgdGhlIGhvdyBYTUxCZWFucyByZXByZXNlbnRzCi0gICAgYnVpbHQtaW4gc2NoZW1hIHR5cGVzLCBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zCi0gICAgU3VwcG9ydCBmb3IgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPi48L3A+Ci0gIDxoMT5Vc2luZyBYUXVlcnkgRXhwcmVzc2lvbnM8L2gxPgotICA8cD5XaXRoIFhNTEJlYW5zIHlvdSBjYW4gdXNlIFhRdWVyeSB0byBxdWVyeSBYTUwgZm9yIHNwZWNpZmljIHBpZWNlcyBvZiBkYXRhLgotICAgIFhRdWVyeSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgJnF1b3Q7U1FMIGZvciBYTUwmcXVvdDsgYmVjYXVzZSBpdCBwcm92aWRlcwotICAgIGEgbWVjaGFuaXNtIHRvIGFjY2VzcyBkYXRhIGRpcmVjdGx5IGZyb20gWE1MIGRvY3VtZW50cywgbXVjaCBhcyBTUUwgcHJvdmlkZXMKLSAgICBhIG1lY2hhbmlzbSBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gdHJhZGl0aW9uYWwgZGF0YWJhc2VzLjwvcD4KLSAgPHA+WFF1ZXJ5IGJvcnJvd3Mgc29tZSBvZiBpdHMgc3ludGF4IGZyb20gWFBhdGgsIGEgc3ludGF4IGZvciBzcGVjaWZ5aW5nIG5lc3RlZAotICAgIGRhdGEgaW4gWE1MLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmV0dXJucyBhbGwgb2YgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+Ci0gICAgZWxlbWVudHMgd2hvc2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlPC9zcGFuPiBjaGlsZCBlbGVtZW50cyBoYXZlIHZhbHVlcwotICAgIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMC4wMDo8L3A+Ci0gIDxwcmU+Ci1QdXJjaGFzZU9yZGVyRG9jdW1lbnQgZG9jID0gUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UocG8pOwotCi0vKgotICogVGhlIFhRdWVyeSBleHByZXNzaW9uIGlzIHRoZSBmb2xsb3dpbmcgdHdvIHN0cmluZ3MgY29tYmluZWQuIFRoZXkncmUKLSAqIGRlY2xhcmVkIHNlcGFyYXRlbHkgaGVyZSBmb3IgY29udmVuaWVuY2UuIFRoZSBmaXJzdCBzdHJpbmcgZGVjbGFyZXMKLSAqIHRoZSBuYW1lc3BhY2UgcHJlZml4IHRoYXQncyB1c2VkIGluIHRoZSBxdWVyeSBleHByZXNzaW9uOyB0aGUgc2Vjb25kCi0gKiBkZWNsYXJlcyB0aGUgZXhwcmVzc2lvbiBpdHNlbGYuCi0gKi8KLVN0cmluZyBuc1RleHQgPSAiZGVjbGFyZSBuYW1lc3BhY2UgcG8gPSAnaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyciOwotU3RyaW5nIHBhdGhUZXh0ID0gIiR0aGlzL3BvOnB1cmNoYXNlLW9yZGVyL3BvOmxpbmUtaXRlbVtwbzpwcmljZSA8PSAyMC4wMF0iOwotU3RyaW5nIHF1ZXJ5VGV4dCA9IG5zVGV4dCArIHBhdGhUZXh0OwotCi1YbWxDdXJzb3IgaXRlbUN1cnNvciA9IGRvYy5uZXdDdXJzb3IoKS5leGVjUXVlcnkocXVlcnlUZXh0KTsKLVN5c3RlbS5vdXQucHJpbnRsbihpdGVtQ3Vyc29yLnhtbFRleHQoKSk7Ci08L3ByZT4KLSAgPHA+VGhpcyBjb2RlIGNyZWF0ZXMgYSBuZXcgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQuIEZyb20gdGhlcmUsCi0gICAgaXQgdXNlcyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlJ3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4KLSAgICBtZXRob2QgdG8gZXhlY3V0ZSB0aGUgcXVlcnkgZXhwcmVzc2lvbi4gSW4gdGhpcyBleGFtcGxlLCB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVyCi0gICAgaXMgYW4gWFF1ZXJ5IGV4cHJlc3Npb24gdGhhdCBzaW1wbHkgc2F5cywgJnF1b3Q7RnJvbSBteSBjdXJyZW50IGxvY2F0aW9uLAotICAgIG5hdmlnYXRlIHRocm91Z2ggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXJjaGFzZS1vcmRlcjwvc3Bhbj4gZWxlbWVudAotICAgIGFuZCByZXRyaWV2ZSB0aG9zZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bGluZS1pdGVtPC9zcGFuPiBlbGVtZW50cyB3aG9zZQotICAgIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMC4wMC4mcXVvdDsgVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpczwvc3Bhbj4KLSAgICB2YXJpYWJsZSBtZWFucyAmcXVvdDt0aGUgY3VycmVudCBwb3NpdGlvbi4mcXVvdDs8L3A+Ci0gIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFhRdWVyeSwgc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hxdWVyeS8iIHRhcmdldD0iX2JsYW5rIj5YUXVlcnkKLSAgICAxLjA6IEFuIFhNTCBRdWVyeSBMYW5ndWFnZTwvYT4gYXQgdGhlIFczQyB3ZWIgc2l0ZS48L3A+Ci0gIDxoMj5Vc2luZyBYTUwgQ3Vyc29yczwvaDI+Ci0gIDxwPkluIHRoZSBwcmVjZWRpbmcgZXhhbXBsZSB5b3UgbWF5IGhhdmUgbm90aWNlZCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj5YbWxDdXJzb3I8L2E+PC9zcGFuPgotICAgIGludGVyZmFjZS4gSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIGEgd2F5IHRvIGV4ZWN1dGUgWFF1ZXJ5IGV4cHJlc3Npb24sIGFuCi0gICAgWE1MIGN1cnNvcnMgb2ZmZXJzIGEgZmluZS1ncmFpbmVkIG1vZGVsIGZvciBtYW5pcHVsYXRpbmcgZGF0YS4gVGhlIFhNTCBjdXJzb3IKLSAgICBBUEksIGFuYWxvZ291cyB0byB0aGUgRE9NJ3Mgb2JqZWN0IEFQSSwgaXMgc2ltcGx5IGEgd2F5IHRvIHBvaW50IGF0IGEgcGFydGljdWxhcgotICAgIHBpZWNlIG9mIGRhdGEuIFNvLCBqdXN0IGxpa2UgYSBjdXJzb3IgaGVscHMgbmF2aWdhdGUgdGhyb3VnaCBhIHdvcmQgcHJvY2Vzc2luZwotICAgIGRvY3VtZW50LCB0aGUgWE1MIGN1cnNvciBkZWZpbmVzIGEgbG9jYXRpb24gaW4gWE1MIHdoZXJlIHlvdSBjYW4gcGVyZm9ybSBhY3Rpb25zCi0gICAgb24gdGhlIHNlbGVjdGVkIFhNTC48L3A+Ci0gIDxwPkN1cnNvcnMgYXJlIGlkZWFsIGZvciBtb3ZpbmcgdGhyb3VnaCBhbiBYTUwgZG9jdW1lbnQgd2hlbiB0aGVyZSdzIG5vIHNjaGVtYQotICAgIGF2YWlsYWJsZS4gT25jZSB5b3UndmUgZ290IHRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHlvdSdyZSBpbnRlcmVzdGVkIGluLAotICAgIHlvdSBjYW4gcGVyZm9ybSBhIHZhcmlldHkgb2Ygb3BlcmF0aW9ucyB3aXRoIGl0LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBzZXQKLSAgICBhbmQgZ2V0IHZhbHVlcywgaW5zZXJ0IGFuZCByZW1vdmUgZnJhZ21lbnRzIG9mIFhNTCwgY29weSBmcmFnbWVudHMgb2YgWE1MCi0gICAgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGRvY3VtZW50LCBhbmQgbWFrZSBvdGhlciBmaW5lLWdyYWluZWQgY2hhbmdlcyB0byB0aGUKLSAgICBYTUwgZG9jdW1lbnQuPC9wPgotICA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcyBhbiBYTUwgY3Vyc29yIHRvIG5hdmlnYXRlIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3VzdG9tZXI8L3NwYW4+Ci0gICAgZWxlbWVudCdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiBjaGlsZCBlbGVtZW50LjwvcD4KLSAgPHByZT4KLVB1cmNoYXNlT3JkZXJEb2N1bWVudCBkb2MgPQotICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHBvKTsKLQotWG1sQ3Vyc29yIGN1cnNvciA9IGRvYy5uZXdDdXJzb3IoKTsKLWN1cnNvci50b0ZpcnN0Q29udGVudFRva2VuKCk7Ci1jdXJzb3IudG9GaXJzdENoaWxkRWxlbWVudCgpOwotY3Vyc29yLnRvRmlyc3RDaGlsZEVsZW1lbnQoKTsKLVN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuZ2V0VGV4dCgpKTsKLQotY3Vyc29yLmRpc3Bvc2UoKTsKLTwvcHJlPgotICA8cD5XaGF0J3MgaGFwcGVuaW5nIGhlcmU/IEFzIHdpdGggdGhlIGVhcmxpZXIgZXhhbXBsZSwgdGhlIGNvZGUgbG9hZHMgdGhlIFhNTAotICAgIGZyb20gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4gb2JqZWN0LiBBZnRlciBsb2FkaW5nIHRoZSBkb2N1bWVudCwKLSAgICB0aGUgY29kZSBjcmVhdGVzIGEgY3Vyc29yIGF0IGl0cyBiZWdpbm5pbmcuIE1vdmluZyB0aGUgY3Vyc29yIGEgZmV3IHRpbWVzCi0gICAgdGFrZXMgaXQgdG8gdGhlIG5lc3RlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZSA8L3NwYW4+IGVsZW1lbnQuIE9uY2UKLSAgICB0aGVyZSwgdGhlIGdldFRleHQgbWV0aG9kIHJldHJpZXZlcyB0aGUgZWxlbWVudCdzIHZhbHVlLjwvcD4KLSAgPHA+VGhpcyBpcyBqdXN0IGFuIGludHJvZHVjdGlvbiB0byBYTUwgY3Vyc29ycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcKLSAgICBjdXJzb3JzLCBzZWUgPGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGgKLSAgICBDdXJzb3JzPC9hPi48L3A+Ci0gIDxoMj5XaGVyZSB0byBHbyBOZXh0PC9oMj4KLTwvZGl2PgotPHVsPgotICA8bGk+Ci0gICAgPGRpdj5YTUxCZWFucyBwcm92aWRlcyBpbnR1aXRpdmUgd2F5cyB0byBoYW5kbGUgWE1MLCBwYXJ0aWN1bGFybHkgaWYgeW91J3JlCi0gICAgICBzdGFydGluZyB3aXRoIHNjaGVtYS4gSWYgeW91J3JlIGFjY2Vzc2luZyBYTUwgdGhhdCdzIGJhc2VkIG9uIGEgc2NoZW1hLAotICAgICAgeW91J2xsIHByb2JhYmx5IGZpbmQgaXQgbW9zdCBlZmZpY2llbnQgdG8gYWNjZXNzIHRoZSBYTUwgdGhyb3VnaCBnZW5lcmF0ZWQKLSAgICAgIHR5cGVzIHNwZWNpZmljIHRvIHRoZSBzY2hlbWEuIFRvIGRvIHRoaXMsIHlvdSBiZWdpbiBieSBjb21waWxpbmcgdGhlIHNjaGVtYQotICAgICAgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgWE1MQmVhbnMgdHlwZXMgZ2VuZXJhdGVkCi0gICAgICBieSBjb21waWxpbmcgc2NoZW1hLCBzZWUgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEKLSAgICAgIFR5cGVzIEdlbmVyYXRlZCBGcm9tIFVzZXItRGVyaXZlZCBTY2hlbWEgVHlwZXM8L2E+IGFuZCA8YSBocmVmPSJjb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwiPk1ldGhvZHMKLSAgICAgIGZvciBUeXBlcyBHZW5lcmF0ZWQgRnJvbSBTY2hlbWE8L2E+LjwvZGl2PgotICA8L2xpPgotICA8bGk+Ci0gICAgPGRpdj5Zb3UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiByZWFkaW5nIG1vcmUgYWJvdXQgdGhlIHR5cGUgc3lzdGVtIG9uIHdoaWNoCi0gICAgICBYTUxCZWFucyBpcyBiYXNlZCwgcGFydGljdWxhcmx5IGlmIHlvdSdyZSB1c2luZyB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEuCi0gICAgICBYTUxCZWFucyBwcm92aWRlcyBhIGhpZXJhcmNoaWNhbCBzeXN0ZW0gb2YgdHlwZXMgdGhhdCBtaXJyb3Igd2hhdCB5b3UgZmluZAotICAgICAgaW4gdGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbiBpdHNlbGYuIElmIHlvdSdyZSB3b3JraW5nIHdpdGggc2NoZW1hLCB5b3UKLSAgICAgIG1pZ2h0IGZpbmQgaXQgaGVscHMgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgdHlwZXMgd29yay4gRm9yIG1vcmUgaW5mb3JtYXRpb24sCi0gICAgICBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zIFN1cHBvcnQKLSAgICAgIGZvciBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2E+IGFuZCA8YSBocmVmPSJjb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sIj5JbnRyb2R1Y3Rpb24KLSAgICAgIHRvIFNjaGVtYSBUeXBlIFNpZ25hdHVyZXM8L2E+LjwvZGl2PgotICA8L2xpPgotICA8bGk+Ci0gICAgPGRpdj5YTUxCZWFucyBwcm92aWRlcyBhY2Nlc3MgdG8gWE1MIHRocm91Z2ggWFF1ZXJ5LCB3aGljaCBib3Jyb3dzIHBhdGggc3ludGF4Ci0gICAgICBmcm9tIFhQYXRoLiBXaXRoIFhRdWVyeSwgeW91IGNhbiBzcGVjaWZ5IHNwZWNpZmljIGZyYWdtZW50cyBvZiBYTUwgZGF0YQotICAgICAgd2l0aCBvciB3aXRob3V0IHNjaGVtYS4gVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBYUXVlcnkgYW5kIFhQYXRoIGluIFhNTEJlYW5zLAotICAgICAgc2VlIDxhIGhyZWY9ImNvblNlbGVjdGluZ1hNTHdpdGhYUXVlcnlQYXRoWFBhdGguaHRtbCI+U2VsZWN0aW5nIFhNTCB3aXRoCi0gICAgICBYUXVlcnkgYW5kIFhQYXRoPC9hPi48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPllvdSBjYW4gdXNlIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UgZm9yCi0gICAgZmluZS1ncmFpbmVkIG5hdmlnYXRpb24gYW5kIG1hbmlwdWxhdGlvbiBvZiBYTUwuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKLSAgICA8YSBocmVmPSJjb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCI+TmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzPC9hPi48L2xpPgotPC91bD4KLTxkaXY+Ci0gIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgeGJlYW4uamFyIGZpbGUgdGhhdCBjb250YWlucwotICAgIHRoZSBYTUxCZWFucyBsaWJyYXJ5IGlzIGZ1bGx5IGZ1bmN0aW9uYWwgYXMgYSBzdGFuZGFsb25lIGxpYnJhcnkuPC9wPgotICA8aDE+UmVsYXRlZCBUb3BpY3M8L2gxPgotICA8cD48YSBocmVmPSIuLi8uLi9zYW1wbGVzL25hdlhNTEJlYW5zU2FtcGxlcy5odG1sIj5YTUxCZWFucyBTYW1wbGVzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDBmMjA2Li4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uSW50cm9Ub1RoZVNjaGVtYVR5cGVTeXN0ZW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT5JbnRyb2R1Y3Rpb24gdG8gU2NoZW1hIFR5cGUgU2lnbmF0dXJlczwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci0KLTxtZXRhIGNvbnRlbnQ9InlvdXIgbmFtZSIgbmFtZT0iYXV0aG9yIj4KLTxtZXRhIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiIgbmFtZT0iZGVzY3JpcHRpb24iPgotPG1ldGEgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyIgbmFtZT0ia2V5d29yZHMiPgotPG1ldGEgY29udGVudD0iMTAvMjUvMDIiIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgotPGgxPiBJbnRyb2R1Y3Rpb24gdG8gU2NoZW1hIFR5cGUgU2lnbmF0dXJlczwvaDE+Ci08ZGl2IGlkPSJ0b3BpY3RleHQiPgotICA8cD5XaGVuIHlvdSBjb21waWxlIHNjaGVtYSwgdGhlIEFQSSBnZW5lcmF0ZWQgZnJvbSB5b3VyIHNjaGVtYSBpcyBpbnRlZ3JhdGVkCi0gICAgd2l0aCB0aGUgWE1MQmVhbnMgdHlwZSBzeXN0ZW0gdGhhdCByZXByZXNlbnRzIHRoZSB1bmRlcmx5aW5nIFhNTCBzY2hlbWEuIEFsbAotICAgIHRvZ2V0aGVyLCB0aGVzZSB0eXBlcyBtYWtlIHVwIHRoZSA8ZW0+c2NoZW1hIHR5cGUgc3lzdGVtPC9lbT4gdG8gd2hpY2ggeW91cgotICAgIGNvZGUgaGFzIGFjY2Vzcy4gV2hlbiBoYW5kbGluZyBYTUwgYmFzZWQgb24gdGhlIHNjaGVtYSwgeW91IHR5cGljYWxseSBjYWxsCi0gICAgbWV0aG9kcyBvZiB0aGUgQVBJIGdlbmVyYXRlZCB3aGVuIHlvdSBjb21waWxlZCB0aGUgc2NoZW1hLiBIb3dldmVyLCBmb3IgdGhlCi0gICAgY2FzZXMgd2hlbiB5b3Ugd2FudCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjaGVtYSBpdHNlbGYsIHlvdSB1c2UgdGhlCi0gICAgc2NoZW1hIHR5cGUgc3lzdGVtIEFQSS48L3A+Ci0gIDxwPkluIHRoZSBYTUxCZWFucyBBUEksIHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgc3lzdGVtIGl0c2VsZiB0aHJvdWdoIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVTeXN0ZW0uaHRtbCI+PHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlNjaGVtYVR5cGVTeXN0ZW08L3NwYW4+PC9hPgotICAgIGFuZCByZWxhdGVkIGNsYXNzZXMuIFRoZXNlIG1ha2UgdXAgYSBraW5kIG9mICZxdW90O21ldGEtQVBJLCZxdW90OyBvciBhIHZpZXcKLSAgICBvbiB0aGUgc2NoZW1hLiBZb3UgY2FuIHVzZSB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtIEFQSSB0byBkaXNjb3ZlciB0aGUgdHlwZQotICAgIHN5c3RlbSBhdCBydW4gdGltZS4gU2VlIHRoZSByZWZlcmVuY2UgdG9waWMgb24gdGhhdCBpbnRlcmZhY2UgZm9yIGFuIG92ZXJ2aWV3Ci0gICAgb2YgdGhlIHNjaGVtYSB0eXBlIHN5c3RlbS48L3A+Ci0gIDxoMj5TY2hlbWEgVHlwZSAmcXVvdDtTaWduYXR1cmVzJnF1b3Q7PC9oMj4KLSAgPHA+QSBzY2hlbWEgaXMgbWFkZSB1cCBvZiBzY2hlbWEgY29tcG9uZW50cy4gU2NoZW1hIGNvbXBvbmVudHMgYXJlIHRoZSBwaWVjZXMKLSAgICBvZiBhIHNjaGVtYSwgc3VjaCBhcyBhIHR5cGUgZGVmaW5pdGlvbiwgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiwgYXR0cmlidXRlCi0gICAgZGVjbGFyYXRpb24sIGFuZCBzbyBvbi4gVG8gbWlycm9yIHRoZXNlIGluIHRoZSBzY2hlbWEgdHlwZSBzeXN0ZW0sIGEgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50Lmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TY2hlbWFDb21wb25lbnQ8L3NwYW4+PC9hPgotICAgIGluc3RhbmNlIHJlcHJlc2VudHMgYSBjb21wb25lbnQgaW4gdGhlIHVuZGVybHlpbmcgc2NoZW1hOyBzZXBhcmF0ZSBjb21wb25lbnRzCi0gICAgaGF2ZSBjb3JyZXNwb25kaW5nIHR5cGVzLiBGb3IgZXhhbXBsZSB5b3Ugd291bGQgaGF2ZSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlLmh0bWwiPlNjaGVtYVR5cGU8L2E+PC9zcGFuPgotICAgIG9iamVjdCBmb3IgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Q3VzdG9tZXJUeXBlPC9zcGFuPiB5b3VyIHNjaGVtYSBkZWZpbmVkLAotICAgIG9yIGEgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hR2xvYmFsRWxlbWVudC5odG1sIj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+U2NoZW1hR2xvYmFsRWxlbWVudDwvc3Bhbj48L2E+Ci0gICAgb2JqZWN0IGZvciBhIGdsb2JhbCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHVyY2hhc2VPcmRlcjwvc3Bhbj4gZWxlbWVudC4KLSAgICBZb3Ugd291bGQgYWxzbyBoYXZlIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlNjaGVtYVR5cGU8L3NwYW4+IGZvciBidWlsdC1pbgotICAgIHNjaGVtYSB0eXBlcywgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c3RyaW5nPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6ZGF0ZXRpbWU8L3NwYW4+LgotICAgIFhNTEJlYW4gcHJvdmlkZXMgYSAmcXVvdDtzaWduYXR1cmUmcXVvdDsgdG8gZGVzY3JpYmUgZWFjaCB0eXBlLiBZb3UgY2FuIHJldHJpZXZlCi0gICAgdGhpcyBzaWduYXR1cmUgYnkgY2FsbGluZyB0aGUgU2NoZW1hVHlwZSBjbGFzcydzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1N0cmluZzwvc3Bhbj4KLSAgICBtZXRob2QuPC9wPgotICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvU3RyaW5nPC9zcGFuPiBtZXRob2QgcmV0dXJucyBYTUxCZWFucycgdmVyc2lvbgotICAgIG9mIGEgdW5pcXVlIHNpZ25hdHVyZSBmb3IgYSBzY2hlbWEgdHlwZS4gVGhpcyBzdHJpbmcgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSAgICBiZWNhdXNlIGl0IGRlc2NyaWJlcyBhIGdpdmVuIHR5cGUgZXZlbiB3aGVuIHRoZSB0eXBlIGRvZXNuJ3QgaGF2ZSBhIG5hbWUuCi0gIDwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgdGhpcwotICAgIHNpZ25hdHVyZSBpcyBhbiBYTUxCZWFucyBjb252ZW50aW9uLCByYXRoZXIgdGhhbiBhIHN0YW5kYXJkIGZyb20gdGhlIHNjaGVtYQotICAgIHdvcmtpbmcgZ3JvdXAuIFRoZSB3b3JraW5nIGdyb3VwIGhhcyBub3QgeWV0IHN0YW5kYXJkaXplZCBhIHNpZ25hdHVyZSBmb3IKLSAgICBYTUwgc2NoZW1hIHR5cGVzLiBBcyBhIHJlc3VsdCB0aGUgc2lnbmF0dXJlIHlvdSdsbCBzZWUgZnJvbSBYTUxCZWFucyBpcyBzdWJqZWN0Ci0gICAgdG8gY2hhbmdlICYjODIxMjsgd2hhdGV2ZXIgdGhlIHNjaGVtYSB3b3JraW5nIGdyb3VwIGNvbWVzIHVwIHdpdGggaW4gdGhlIGVuZAotICAgIChpZiBhbnl0aGluZykgaXMgcHJvYmFibHkgd2hhdCB3aWxsIGJlIHVzZWQgYnkgdGhpcyBBUEkuIEluIG90aGVyIHdvcmRzLCBkb24ndAotICAgIHdyaXRlIGEgcHJvZ3JhbSB0byBkZWNvZGUgdGhlIHNpZ25hdHVyZS48L3A+Ci0gIDxwPllvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24gdG8gdW5kZXJzdGFuZCBob3cgYSBzaWduYXR1cmUgaXMgY29uc3RydWN0ZWQuPC9wPgotPC9kaXY+Ci08dWw+Ci0gIDxsaT4KLSAgICA8ZGl2PjxzdHJvbmc+R2xvYmFsIHR5cGVzLjwvc3Ryb25nPiBJZiB0aGUgdHlwZSBoYXMgYSBuYW1lLCBpdCdzIGEgZ2xvYmFsCi0gICAgICB0eXBlLiBUaGUgZm9sbG93aW5nIGZvcm0gaXMgdXNlZDo8L2Rpdj4KLSAgICA8ZGl2PgotICAgICAgPGRpdj4KLSAgICAgICAgPHByZT5UPSZsdDtsb2NhbG5hbWUmZ3Q7QCZsdDt0YXJnZXROYW1lc3BhY2UmZ3Q7PC9wcmU+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgICA8cD5UaGUgJnF1b3Q7VCZxdW90OyBpcyBmb3IgJnF1b3Q7dHlwZSwmcXVvdDsgb2YgY291cnNlLiAmcXVvdDtsb2NhbG5hbWUmcXVvdDsKLSAgICAgIGlzIGEgY29udmVudGlvbiB1c2VkIGJ5IHFuYW1lcyAocXVhbGlmaWVkIG5hbWVzKSwgd2hpY2ggaW5jbHVkZSBhIGxvY2FsCi0gICAgICBuYW1lIGFuZCB0aGUgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gU28gYW4gZXhhbXBsZSBtaWdodCBiZTo8L3A+Ci0gICAgPHByZT5UPWN1c3RvbWVyQG9wZW51cmkub3JnPC9wcmU+Ci0gIDwvbGk+Ci0gIDxsaT48c3Ryb25nPkRvY3VtZW50IHR5cGVzIGFuZCBnbG9iYWwgYXR0cmlidXRlIHR5cGVzLjwvc3Ryb25nPiBUaGVzZSBjb3JyZXNwb25kCi0gICAgdG8gYSBzcGVjaWFsIGFub255bW91cyB0eXBlIGNvbnRhaW5pbmcgb25lIGdsb2JhbCBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gVGhlc2UKLSAgICBzcGVjaWFsIHR5cGVzIGFyZSBnZW5lcmF0ZWQgYnkgWE1MQmVhbnMgdG8gcmVwcmVzZW50IGdsb2JhbCB0eXBlcyBkZWNsYXJlZAotICAgIHdpdGggdGhlICZsdDtlbGVtZW50Jmd0OyBvciAmbHQ7YXR0cmlidXRlJmd0OyB0YWcgaW4gc2NoZW1hLiBCZWNhdXNlIHN1Y2gKLSAgICB0eXBlcyBhcmUgdHlwZXMsIGJ1dCBhcmUgZGVjbGFyZWQgYXMgZWxlbWVudHMgb3IgYXR0cmlidXRlcywgdGhleSByZXF1aXJlCi0gICAgc3BlY2lhbCB0cmVhdG1lbnQuIFRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIGZvcm0gaXMgdXNlZDoKLSAgICA8ZGl2PgotICAgICAgPHByZT4KLUQ9Jmx0O2RvY3VtZW50LWVsZW1lbnQtbmFtZSZndDtAJmx0O3RhcmdldE5hbWVzcGFjZSZndDsKLVI9Jmx0O2F0dHJpYnV0ZS10eXBlLW5hbWUmZ3Q7QCZsdDt0YXJnZXROYW1lc3BhY2UmZ3Q7Ci08L3ByZT4KLSAgICAgIDxkaXY+PC9kaXY+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdj4KLSAgICAgIDxkaXY+Tm90ZSB0aGF0IHRoZXNlIGFyZSBhbHNvIHRoZSBzaWduYXR1cmVzIG9mIGEgdHlwZSByZXR1cm5lZCBieSBhIEZvb0RvY3VtZW50LnR5cGUKLSAgICAgICAgb3IgRm9vQXR0cmlidXRlLnR5cGUgbWV0aG9kIGNhbGwuPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT48c3Ryb25nPkFub255bW91cyB0eXBlcy48L3N0cm9uZz4gSWYgdGhlIHR5cGUgaXMgYW5vbnltb3VzLCBpdCBpcyBkZWZpbmVkCi0gICAgYXMgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUsIG9yIHdpdGhpbiBhIGZ1cnRoZXIgYW5vbnltb3VzIHR5cGUuIEluIHRoaXMgY2FzZSwKLSAgICB0aGUgc2lnbmF0dXJlIGlzIGJ1aWx0IGJ5IGVzdGFibGlzaGluZyB0aGUgbG9jYWwgY29udGV4dCAoaW4gb3JkZXIgd29yZHMsCi0gICAgd2hhdCBpcyB0aGUgYW5vbnltb3VzIHR5cGUgbmVzdGVkIGluPykuIEZyb20gdGhlIGxvY2FsIGNvbnRleHQsIHRoZSBsYXJnZXIKLSAgICBjb250ZXh0IGlzIGJ1aWx0IHJlY3Vyc2l2ZWx5LiBJbiBvdGhlciB3b3JkcywgdGhlIHNpZ25hdHVyZSBpcyBidWlsdCBieSBnaXZpbmcKLSAgICBub3Qgb25seSB0aGUgYW5vbnltb3VzIHR5cGUgaXRzZWxmLCBidXQgYWxzbyBieSBkZXNjcmliaW5nIGl0cyBjb250ZXh0LgotICAgIDxwPiBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSB1c2VkIGZvciBidWlsZGluZyBhIHNpZ25hdHVyZSBmb3IgYW4gYW5vbnltb3VzCi0gICAgICB0eXBlLiA8L3A+Ci0gICAgPHVsPgotICAgICAgPGxpPiBJdCBtaWdodCBiZSBhbiBhbm9ueW1vdXMgdHlwZSBkZWZpbmVkIGluc2lkZSBhIGxvY2FsIGVsZW1lbnQgb3IgYXR0cmlidXRlLAotICAgICAgICB3aGljaCBpbiB0dXJuIGlzIGRlZmluZWQgd2l0aGluIHNvbWV0aGluZyBlbHNlOgotICAgICAgICA8cD5JZiB0aGUgZWxlbWVudCBpcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSIgc3R5bGU9ImxhbmdpbmxpbmUiPmZvcm09JnF1b3Q7cXVhbGlmaWVkJnF1b3Q7PC9zcGFuPgotICAgICAgICAgICh0aGUgdXN1YWwgZGVmYXVsdCk6PC9wPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8ZGl2PgotICAgICAgPHByZT5FPSZsdDtlbHRuYW1lJmd0O3wmbHQ7c2lnbmF0dXJlIG9mIHRoZSB0eXBlIHdpdGhpbiB3aGljaCB0aGUgZWx0IGlzIGRlZmluZWQmZ3Q7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdj5JZiB0aGUgZWxlbWVudCBpcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSIgc3R5bGU9ImxhbmdpbmxpbmUiPmZvcm09JnF1b3Q7dW5xdWFsaWZpZWQmcXVvdDs8L3NwYW4+OjwvZGl2PgotICAgIDxkaXY+Ci0gICAgICA8cHJlPlU9Jmx0O2VsdG5hbWUmZ3Q7fCZsdDtzaWduYXR1cmUgb2YgdGhlIHR5cGUgd2l0aGluIHdoaWNoIHRoZSBlbHQgaXMgZGVmaW5lZCZndDs8L3ByZT4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2PklmIHRoZSBhdHRyaWJ1dGUgaXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiIHN0eWxlPSJsYW5nbGluZSI+Zm9ybT0mcXVvdDt1bnF1YWxpZmllZCZxdW90Ozwvc3Bhbj4KLSAgICAgICh0aGUgdXN1YWwgZGVmYXVsdCk6PC9kaXY+Ci0gICAgPGRpdj4KLSAgICAgIDxwcmU+QT0mbHQ7YXR0cm5hbWUmZ3Q7fCZsdDtzaWduYXR1cmUgb2YgdGhlIHR5cGUgd2l0aGluIHRoZSBhdHRyIGlzIGRlZmluZWQmZ3Q7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdj5pZiB0aGUgYXR0cmlidXRlIGlzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIiBzdHlsZT0ibGFuZ2lubGluZSI+Zm9ybT0mcXVvdDtxdWFsaWZpZWQmcXVvdDs8L3NwYW4+OjwvZGl2PgotICAgIDxkaXY+Ci0gICAgICA8cHJlPlE9Jmx0O2F0dHJuYW1lJmd0O3wmbHQ7c2lnbmF0dXJlIG9mIHRoZSB0eXBlIHdpdGhpbiB0aGUgYXR0ciBpcyBkZWZpbmVkJmd0OzwvcHJlPgotICAgIDwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDx1bD4KLSAgICA8bGk+SXQgbWlnaHQgYmUgYW4gYW5vbnltb3VzIHR5cGUgZGVmaW5lZCBhIHNpbXBsZSByZXN0cmljdGlvbiwgdW5pb24sIG9yCi0gICAgICBsaXN0IGRlZmluaXRpb246PC9saT4KLSAgPC91bD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPGRpdj4KLSAgICAgIDxwcmU+TT0jfCZsdDtzaWduYXR1cmUgb2YgdGhlIGNvbnRhaW5pbmcgdW5pb24gdHlwZSZndDs8L3ByZT4KLSAgICAgIDxwPihUaGUgIyBpcyBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoIHVuaW9uIG1lbWJlciBpdCBpcywgYnkgc291cmNlIG9yZGVyCi0gICAgICAgICYjODIxMjsgc3VjaCBhcyAwLDEsMiwgZXRjLik8L3A+Ci0gICAgICA8cHJlPkI9fCZsdDtzaWduYXR1cmUgb2YgdGhlIGNvbnRhaW5pbmcgYmFzZSB0eXBlIGZvciBhIHJlc3RyaWN0aW9uJmd0OzwvcHJlPgotICAgICAgPHByZT5JPXwmbHQ7c2lnbmF0dXJlIG9mIHRoZSBjb250YWluaW5nIGxpc3QgdHlwZSZndDs8L3ByZT4KLSAgICA8L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8dWw+Ci0gICAgPGxpPgotICAgICAgPGRpdj4gSW4gdGhlIGZ1dHVyZSBpZiBhbm9ueW1vdXMgdHlwZXMgYXJlIGFsbG93ZWQgaW4gc29tZSBvdGhlciBjb250ZXh0LAotICAgICAgICB0aGVyZSBtYXkgYmUgbW9yZSBjb2Rlcy48L2Rpdj4KLSAgICA8L2xpPgotICA8L3VsPgotPC91bD4KLTxoMj5BbiBFeGFtcGxlPC9oMj4KLTxwPlNvLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSB0eXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBsaXN0IGl0ZW1zIHdpdGhpbiBhbgotICBhdHRyaWJ1dGUgb2YgYW4gaW5zdGFuY2UgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgotPGJsb2NrcXVvdGU+Ci0gIDxkaXY+Ci0gICAgPHByZT4gJmx0O3Jvb3QgbXlsaXN0PSZxdW90OzQzMiA5OTkgMTQzIDEyMyZxdW90Oy8mZ3Q7PC9wcmU+Ci0gIDwvZGl2PgotPC9ibG9ja3F1b3RlPgotPGRpdj4gVGhlIHNjaGVtYSwgaWYgZG9uZSB3aXRoIGxvdHMgb2YgbmVzdGVkIHR5cGVzLCBjb3VsZCBsb29rIHNvbWV0aGluZyBsaWtlCi0gIHRoaXM6PC9kaXY+Ci08YmxvY2txdW90ZT4KLSAgPGRpdj4KLSAgICA8cHJlPgotJmx0O3NjaGVtYSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7bXlOYW1lc3BhY2UmcXVvdDsgZWxlbWVudEZvcm1EZWZhdWx0PSZxdW90O3F1YWxpZmllZCZxdW90OyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtlbGVtZW50IG5hbWU9JnF1b3Q7cm9vdCZxdW90OyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtjb21wbGV4VHlwZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtteWxpc3QmcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c2ltcGxlVHlwZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtsaXN0Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3NpbXBsZVR5cGUmZ3Q7ICZsdDshLS1UaGlzIGlzIHRoZSB0eXBlIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyBmb3IgLS0mZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cmVzdHJpY3Rpb24gYmFzZT0mcXVvdDt4czpub25OZWdhdGl2ZUludGVnZXImcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7dG90YWxEaWdpdHMgdmFsdWU9JnF1b3Q7MyZxdW90Oy8mZ3Q7Li4KLTwvcHJlPgotICA8L2Rpdj4KLTwvYmxvY2txdW90ZT4KLTxkaXY+IFRoZSBzaWduYXR1cmUgZm9yIHRoZSBzaW1wbGVUeXBlIGluZGljYXRlZCBpbiB0aGUgZXhhbXBsZSB3b3VsZCBiZTo8L2Rpdj4KLTxibG9ja3F1b3RlPgotICA8cHJlPkk9fEE9bXlsaXN0fEU9cm9vdHxEPXJvb3RAbXlOYW1lc3BhY2U8L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxkaXY+Ci0gIDxwPllvdSBjb3VsZCByZWFkIHRoaXMgYXM6IDwvcD4KLTwvZGl2PgotPGJsb2NrcXVvdGU+Ci0gIDxkaXY+JnF1b3Q7VGhlIHR5cGUgb2YgdGhlIGxpc3QgaXRlbSB8IHdpdGhpbiB0aGUgdHlwZSBvZiB0aGUgbXlsaXN0IGF0dHJpYnV0ZSdzCi0gICAgdHlwZSB8IHdpdGhpbiB0aGUgdHlwZSBvZiB0aGUgcm9vdCBlbGVtZW50IHwgd2l0aGluIHRoZSBkb2N1bWVudCB0eXBlIGZvcgotICAgICZsdDtyb290Jmd0OyBkb2N1bWVudHMgfCBpbiB0aGUgbXlOYW1lc3BhY2UgbmFtZXNwYWNlJnF1b3Q7LjwvZGl2PgotPC9ibG9ja3F1b3RlPgotPGRpdj4KLSAgPHA+Tm90ZSB0aGF0IHRoZSBzaWduYXR1cmUgc3RydWN0dXJlIG1pcnJvcnMgdGhlIEphdmEgY2xhc3Mgc3RydWN0dXJlIGdlbmVyYXRlZAotICAgIGJ5IFhNTEJlYW5zIHdoZW4gY29tcGlsaW5nIHRoZSBzY2hlbWEuIEluIG90aGVyIHdvcmRzLCBpZiB5b3Ugd2VyZSB0byBjb21waWxlCi0gICAgYSBzY2hlbWEgdGhhdCBpbmNsdWRlZCB0aGUgcHJlY2VkaW5nIHNuaXBwZXQsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIGFjY2VzcwotICAgIGFuIGluc3RhbmNlIG9mIHRoZSBzY2hlbWEgd2l0aCBKYXZhIGNvZGUgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD4KLSAgPHByZT5TY2hlbWFUeXBlIHNUeXBlID0gUm9vdERvY3VtZW50LlJvb3QuTXlMaXN0Lkl0ZW0udHlwZTs8L3ByZT4KLTwvZGl2PgotPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgotPHA+PGEgaHJlZj0iY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCI+R2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2E+PC9wPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDIyNzQuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT5KYXZhIFR5cGVzIEdlbmVyYXRlZCBmcm9tIFNjaGVtYTwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci0KLTxtZXRhIG5hbWU9ImNvbXBvbmVudCIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGRlc2NyaXB0aW9uIG1ldGF0YWcsIHBsZWFzZSBwcm92aWRlIGEgQlJJRUYgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiAtLT4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgY29tcG9uZW50IG1ldGF0YWcsIHBsZWFzZSBsaXN0IGtleXdvcmRzIHRoYXQgd2lsbCBoZWxwIGEgdXNlciBzZWFyY2ggZm9yIHRoaXMgdG9waWMuIC0tPgotPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4KLQotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLQotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCi0KLTxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0ieW91ciBuYW1lIj4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iPgotPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9ImtleXdvcmRzIHRvIGhlbHAgaW4gc2VhcmNoZXMiPgotPG1ldGEgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIiBjb250ZW50PSIxMC8yNS8wMiI+Ci08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT48IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgotPGgxPiBKYXZhIFR5cGVzIEdlbmVyYXRlZCBmcm9tIFVzZXItRGVyaXZlZCBTY2hlbWEgVHlwZXM8L2gxPgotPGRpdiBpZD0idG9waWN0ZXh0Ij4KLSAgPHA+V2hlbiB5b3UgY29tcGlsZSBYTUwgc2NoZW1hLCB0aGUgcmVzdWx0aW5nIEFQSSBpcyBtYWRlIHVwIG9mIHR3byBjYXRlZ29yaWVzCi0gICAgb2YgdHlwZXM6IGJ1aWx0LWluIHR5cGVzIHRoYXQgbWlycm9yIHRob3NlIGluIHRoZSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBhbmQKLSAgICBvdGhlcnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZyb20gdXNlci1kZXJpdmVkIHNjaGVtYSB0eXBlcy4gVGhpcyB0b3BpYyBwcm92aWRlcwotICAgIGFuIG92ZXJ2aWV3IG9mIHRoZSBKYXZhIHR5cGVzIGdlbmVyYXRlZCBmb3IgdXNlci1kZXJpdmVkIHR5cGVzLCBkZXNjcmliaW5nCi0gICAgdGhlIG1ldGhvZHMgdGhlIEphdmEgdHlwZXMgcHJvdmlkZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYnVpbHQtaW4gdHlwZXMsCi0gICAgc2VlIDxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0IGZvcgotICAgIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT4uIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWV0aG9kcyBleHBvc2VkCi0gICAgYnkgZ2VuZXJhdGVkIHR5cGVzLCBzZWUgPGEgaHJlZj0iY29uTWV0aG9kc0ZvckdlbmVyYXRlZEphdmFUeXBlcy5odG1sIj5NZXRob2RzCi0gICAgZm9yIEdlbmVyYXRlZCBKYXZhIFR5cGVzPC9hPi48L3A+Ci0gIDxwPkluIGdlbmVyYWwsIGFuIEFQSSBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEgaXMgYW4gaW50dWl0aXZlIG1lYW5zIHRvIGFjY2VzcwotICAgIFhNTCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlIHNjaGVtYS4gWW91J2xsIHByb2JhYmx5IGZpbmQgdGhhdCBmb3IgbW9zdCB1c2VzCi0gICAgaXQncyB1bm5lY2Vzc2FyeSB0byBrbm93IHRoZSBydWxlcyBmb3IgZ2VuZXJhdGluZyBpdCBpbiBvcmRlciB0byB1c2UgaXQuIEhvd2V2ZXIsCi0gICAgZm9yIHRob3NlIGNhc2VzIHdoZW4gaXQncyB1bmNsZWFyIHdoYXQncyBnb2luZyBvbiBiZWhpbmQgdGhlIHNjZW5lcyAob3IgaWYKLSAgICB5b3UncmUganVzdCBjdXJpb3VzKSwgdGhpcyB0b3BpYyBkZXNjcmliZXMgdGhlIHJ1bGVzLjwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBYTUxCZWFucyBBUEkgYWxzbyBwcm92aWRlcyBhCi0gICAgd2F5IGZvciB5b3UgdG8gZ2V0IGluZm9ybWF0aW9uIDxlbT5hYm91dCA8L2VtPnRoZSB0eXBlIHN5c3RlbSBpdHNlbGYgJiM4MjEyOwotICAgIGluIG90aGVyIHdvcmRzLCBhYm91dCB0aGUgQVBJIGFuZCB0aGUgdW5kZXJseWluZyBzY2hlbWEuIEZvciBtb3JlIGluZm9ybWF0aW9uLAotICAgIHNlZSA8YSBocmVmPSJjb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sIj5JbnRyb2R1Y3Rpb24gdG8gU2NoZW1hIFR5cGUKLSAgICBTaWduYXR1cmVzPC9hPi48L3A+Ci0gIDxwPkVhY2ggb2YgdGhlIHR5cGVzIGdlbmVyYXRlZCB3aGVuIHlvdSBjb21waWxlIGEgc2NoZW1hIGlzIGRlc2lnbmVkIHNwZWNpZmljYWxseQotICAgIGZvciBhY2Nlc3MgdG8gWE1MIGluc3RhbmNlcyBjb25mb3JtaW5nIHRvIHRoYXQgcGFydCBvZiB0aGUgc2NoZW1hLiBTdGFydCBieQotICAgIHRha2luZyBhIGxvb2sgYXQgYSBzaW1wbGUgWE1MIGFuZCBzY2hlbWEgZXhhbXBsZS4gVGhlIGZvbGxvd2luZyBzY2hlbWEgZGVzY3JpYmVzCi0gICAgYW4gWE1MIGRvY3VtZW50IHRvIGNvbnRhaW4gYSBzdG9jayBwcmljZSBxdW90ZS48L3A+Ci0gIDxwcmU+Jmx0O3hzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0OwotICAgICZsdDt4czplbGVtZW50IG5hbWU9InByaWNlLXF1b3RlIiZndDsKLSAgICAgICAgJmx0O3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InN0b2NrLXN5bWJvbCIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ic3RvY2stcHJpY2UiIHR5cGU9InhzOmZsb2F0Ii8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICZsdDsveHM6ZWxlbWVudCZndDsKLSZsdDsveHM6c2NoZW1hJmd0OwotPC9wcmU+Ci0gIDxwPlRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBYTUwgdGhhdCBjb25mb3JtcyB0byB0aGlzIHNjaGVtYS48L3A+Ci0gIDxwcmU+Jmx0O3ByaWNlLXF1b3RlJmd0OwotICAgICZsdDtzdG9jay1zeW1ib2wmZ3Q7QkVBUyZsdDsvc3RvY2stc3ltYm9sJmd0OwotICAgICZsdDtzdG9jay1wcmljZSZndDs1OS4yMSZsdDsvc3RvY2stcHJpY2UmZ3Q7Ci0mbHQ7L3ByaWNlLXF1b3RlJmd0OzwvcHJlPgotICA8cD5XaGVuIHlvdSBjb21waWxlIHRoaXMgc2NoZW1hLCB5b3UgZ2V0IHR3byBnZW5lcmF0ZWQgWE1MQmVhbnMgaW50ZXJmYWNlczoKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+IFByaWNlUXVvdGVEb2N1bWVudDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlRG9jdW1lbnQuUHJpY2VRdW90ZTwvc3Bhbj4uPC9wPgotICA8cD5Gcm9tIHRoZSBzY2hlbWEgcG9pbnQgb2YgdmlldywgdGhlIGdlbmVyYXRlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZTwvc3Bhbj4KLSAgICBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgPGVtPmNvbXBsZXggdHlwZTwvZW0+IHlvdSBzZWUgaW5zaWRlIHRoZSBzY2hlbWEncwotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudCBkZWNsYXJhdGlvbi4gTG9va2luZyBhdAotICAgIHRoZSBYTUwgaW5zdGFuY2UsIHlvdSBjYW4gc2VlIHRoYXQgdGhpcyBjb21wbGV4IHR5cGUgdHJhbnNsYXRlcyBpbnRvIGEgc2VxdWVuY2UKLSAgICBvZiB0d28gZWxlbWVudHMsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zdG9jay1zeW1ib2w8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stcHJpY2U8L3NwYW4+LgotICAgIFNvIGl0J3Mgbm90IHN1cnByaXNpbmcgdGhhdCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+Ci0gICAgaW50ZXJmYWNlIGV4cG9zZXMgbWV0aG9kcyBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRTdG9ja1ByaWNlPC9zcGFuPgotICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2V0U3RvY2tQcmljZTwvc3Bhbj4gdG8gc2V0IHRoZSB2YWx1ZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stcHJpY2U8L3NwYW4+Ci0gICAgZWxlbWVudC48L3A+Ci0gIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBpbnRlcmZhY2UsIG9uIHRoZQotICAgIG90aGVyIGhhbmQsIHJlcHJlc2VudHMgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gPGVtPmRvY3VtZW50PC9lbT4KLSAgICB0aGF0IGNvbnRhaW5zIHRoZSByb290IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudC4KLSAgICBYTUxCZWFucyBjcmVhdGVzIGEgc3BlY2lhbCAmcXVvdDtkb2N1bWVudCZxdW90OyB0eXBlIGZvciBnbG9iYWwgZWxlbWVudCB0eXBlcy4KLSAgICBBIGRvY3VtZW50IHR5cGUgcHJvdmlkZXMgYSB3YXkgZm9yIHlvdSB0byBnZXQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcKLSAgICB0eXBlLCBoZXJlIHJlcHJlc2VudGVkIGJ5IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPi4gVGhlCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlLXF1b3RlPC9zcGFuPiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgYSA8ZW0+Z2xvYmFsPC9lbT4KLSAgICBlbGVtZW50IGJlY2F1c2UgaXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSBhbnl3aGVyZSBlbHNlIGluIHRoZSBzY2hlbWEuIEZvcgotICAgIGdsb2JhbCBlbGVtZW50cywgdGhlIFhNTEJlYW5zIHNjaGVtYSBjb21waWxlciBnZW5lcmF0ZXMgYW4gaW50ZXJmYWNlIHdob3NlCi0gICAgbmFtZSBlbmRzIHdpdGggJnF1b3Q7RG9jdW1lbnQuJnF1b3Q7IFRoaXMgaXMgYmVjYXVzZSBhbiBYTUwgc2NoZW1hIGhhcyBubwotICAgIHdheSBvZiBkZWZpbmluZyBhICZxdW90O3Jvb3QmcXVvdDsgZWxlbWVudDsgYW55IGdsb2JhbCBlbGVtZW50IGNhbiBiZSB0aGUKLSAgICByb290LjwvcD4KLSAgPHA+VGhlIGZvbGxvd2luZyBiaXQgb2YgSmF2YSBjb2RlIGlsbHVzdHJhdGVzIGhvdyB5b3UgbWlnaHQgdXNlIHRoZXNlIGludGVyZmFjZXMKLSAgICB0byBnZXQgdGhlIHN0b2NrIHByaWNlIGNvbnRhaW5lZCBpbiB0aGUgWE1MLjwvcD4KLSAgPHByZT4KLXB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0U3RvY2tQcmljZShqYXZhLmlvLkZpbGUgb3JkZXJYTUwpIHRocm93cyBFeGNlcHRpb24KLXsKLSAgICBQcmljZVF1b3RlRG9jdW1lbnQgZG9jWE1MID0gUHJpY2VRdW90ZURvY3VtZW50LkZhY3RvcnkucGFyc2Uob3JkZXJYTUwpOwotICAgIFByaWNlUXVvdGUgcXVvdGVYTUwgPSBkb2NYTUwuZ2V0UHJpY2VRdW90ZSgpOwotICAgIGZsb2F0IHN0b2NrUHJpY2UgPSBxdW90ZVhNTC5nZXRTdG9ja1ByaWNlKCk7Ci0gICAgcmV0dXJuIHN0b2NrUHJpY2U7Ci19Ci08L3ByZT4KLSAgPHA+VGhpcyBjb2RlIGxvYWRzIHRoZSBYTUwgZnJvbSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GaWxlPC9zcGFuPiBvYmplY3QsCi0gICAgY29udmVydGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBhcnNlPC9zcGFuPiBtZXRob2QncyByZXR1cm4gdmFsdWUKLSAgICB0byBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlRG9jdW1lbnQ8L3NwYW4+IGluc3RhbmNlLiBJdCB0aGVuCi0gICAgdXNlcyB0aGlzIGluc3RhbmNlIHRvIGdldCBhbiBpbnN0YW5jZSBvZiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZTwvc3Bhbj4uCi0gICAgV2l0aCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZTwvc3Bhbj4sIHRoZSBjb2RlIGV4dHJhY3RzIHRoZSBzdG9jawotICAgIHByaWNlLiA8L3A+Ci08L2Rpdj4KLTxkaXY+Ci0gIDxkaXYgaWQ9InRvcGljdGV4dCI+Ci0gICAgPHA+VGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbiBwcm92aWRlcyBhIHJpY2ggc2V0IG9mIHJ1bGVzIHRocm91Z2ggd2hpY2gKLSAgICAgIHlvdSBjYW4gZGVyaXZlIG5ldyB0eXBlcy4gV2hlbiB5b3UgZ2VuZXJhdGUgaW50ZXJmYWNlcyBmcm9tIHlvdXIgc2NoZW1hLAotICAgICAgWE1MQmVhbnMgdXNlcyB0aGUgc2NoZW1hJ3MgcnVsZXMgdG8gZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBpbnRlcmZhY2VzLgotICAgICAgVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgc29tZSBvZiB0aGUgZ3VpZGVsaW5lcyBieSB3aGljaCB0aGlzIGlzIGRvbmUuPC9wPgotICAgIDxoMj5OYW1lcyBmb3IgSW50ZXJmYWNlczwvaDI+Ci0gICAgPHA+SW50ZXJmYWNlcyBhcmUgZ2VuZXJhdGVkIGZvciBzY2hlbWEgdHlwZXMgKGJvdGggc2ltcGxlIGFuZCBjb21wbGV4KS4gQW5vbnltb3VzCi0gICAgICBzY2hlbWEgdHlwZXMgcmVzdWx0IGluIGlubmVyIGludGVyZmFjZXMgaW5zaWRlIHRoZSB0eXBlIGludGVyZmFjZSBpbiB3aGljaAotICAgICAgdGhleSBhcmUgZGVmaW5lZC4gVGhlaXIgbmFtZSBjb21lcyBmcm9tIHRoZSBlbGVtZW50IG9yIGF0dHJpYnV0ZSBpbiB3aGljaAotICAgICAgdGhleSBpcyBkZWZpbmVkLjwvcD4KLSAgICA8cD5OYW1lcyBmb3Igc2NoZW1hIHR5cGVzIGJlY29tZSBKYXZhLWZyaWVuZGx5IG5hbWVzIHdoZW4gdGhlIHNjaGVtYSBpcyBjb21waWxlZC4KLSAgICAgIEluIG90aGVyIHdvcmRzLCBuYW1lcyBzdWNoIGFzICJwcmljZS1xdW90ZSIgYmVjb21lICJQcmljZVF1b3RlLiIgSW4gYWRkaXRpb24sCi0gICAgICBhIHNjaGVtYSdzIFhNTCBuYW1lc3BhY2UgVVJJcyBiZWNvbWUgcGFja2FnZSBuYW1lcyBmb3IgWE1MQmVhbiB0eXBlcyBnZW5lcmF0ZWQKLSAgICAgIGZyb20gdGhlIHNjaGVtYS4gVGhlIHdheSB0aGlzIG5hbWUgdHJhbnNsYXRpb24gaXMgZG9uZSBpcyBkZXNjcmliZWQgYnkgc2VjdGlvbgotICAgICAgQyBvZiB0aGUgSmF2YSBBUEkgZm9yIFhNTCBCaW5kaW5nIChKQVhCKSBzcGVjaWZpY2F0aW9uIGF0IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2Rvd25sb2Fkcy9qYXhiLmh0bWwiIHRhcmdldD0iX2JsYW5rIj4KLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIuaHRtbC48L2E+IDwvcD4KLSAgICA8cD5IZXJlIGFyZSBhIGZldyBleGFtcGxlczo8L3A+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+PHN0cm9uZz5TY2hlbWEgVGFyZ2V0IE5hbWVzcGFjZTwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij48c3Ryb25nPlhNTCBMb2NhbG5hbWU8L3N0cm9uZz48L3RkPgotICAgICAgICA8dGQ+PHN0cm9uZz5GdWxseS1RdWFsaWZpZWQgWE1MQmVhbiBUeXBlIE5hbWU8L3N0cm9uZz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPmh0dHA6Ly93d3cubXljb21wYW55LmNvbS8yMDAyL2J1eWVyPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIxNTUiPnB1cmNoYXNlLW9yZGVyLTQ8L3RkPgotICAgICAgICA8dGQ+Y29tLm15Y29tcGFueS54MjAwMi5idXllci5QdXJjaGFzZU9yZGVyNDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+aHR0cDovL215Y28uY29tL3NhbXBsZS5odG1sPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIxNTUiPlNhbXBsZURvY3VtZW50PC90ZD4KLSAgICAgICAgPHRkPmNvbS5teWNvLnNhbXBsZS5TYW1wbGVEb2N1bWVudDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+aHR0cDovL29wZW51cmkub3JnL3Rlc3RfY2FzZV8xPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIxNTUiPnRlc3RfdHlwZTwvdGQ+Ci0gICAgICAgIDx0ZD5vcmcub3BlbnVyaS50ZXN0Q2FzZTEuVGVzdFR5cGU8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxwPldoZW4gdGhlcmUgYXJlIG5hbWUgY29sbGlzaW9ucywgdGhlIGdlbmVyYXRlZCB0eXBlcyB3aWxsIGhhdmUgbmFtZXMgd2l0aAotICAgICAgbnVtZXJhbHMgYXBwZW5kZWQmbmJzcDuXIGZvciBleGFtcGxlLCAiVGVzdFR5cGUyIi48L3A+Ci0gICAgPGgyPkdsb2JhbCBFbGVtZW50cyBhbmQgQXR0cmlidXRlczwvaDI+Ci0gICAgPHA+SW4gc2NoZW1hLCBnbG9iYWwgZWxlbWVudCBhbmQgYXR0cmlidXRlIGRlZmluaXRpb25zIGFyZSB0aG9zZSB0aGF0IGFyZQotICAgICAgZGVjbGFyZWQgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgc2NoZW1hICh0aGF0IGlzLCBpbW1lZGlhdGVseSB3aXRoaW4gdGhlCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2NoZW1hPC9zcGFuPiByb290IGVsZW1lbnQpLiBCZWNhdXNlIHRoZXkgYXJlIGdsb2JhbCwKLSAgICAgIHRoZXkgbWF5IGJlIHJlZmVyZW5jZWQgZnJvbSBpbnNpZGUgdGhlIHNjaGVtYSBieSBuYW1lLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNyZWRpdFJlcG9ydDwvc3Bhbj4KLSAgICAgIChub3QgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jcmVkaXRSZXBvcnRUeXBlPC9zcGFuPiBjb21wbGV4IHR5cGUpCi0gICAgICBlbGVtZW50IGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBzY2hlbWEgaXMgYW4gZXhhbXBsZS48L3A+Ci0gICAgPHByZT4KLSZsdDt4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9zYW1wbGVzL2NyZWRpdFJlcG9ydCZxdW90OwotICAgIHhtbG5zOmNyPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9zYW1wbGVzL2NyZWRpdFJlcG9ydCZxdW90OwotICAgIHhtbG5zOnhzPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJnF1b3Q7Ci0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSZxdW90O3F1YWxpZmllZCZxdW90OwotICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSZxdW90O3VucXVhbGlmaWVkJnF1b3Q7Jmd0OwotICAgICZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSZxdW90O2NyZWRpdFJlcG9ydFR5cGUmcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7YmFua1JlcG9ydCZxdW90OyB0eXBlPSZxdW90O3hzOnN0cmluZyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3RheFJlcG9ydCZxdW90OyB0eXBlPSZxdW90O3hzOnN0cmluZyZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7Ci0gICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsKLSAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2NyZWRpdFJlcG9ydCZxdW90OyB0eXBlPSZxdW90O2NyOmNyZWRpdFJlcG9ydFR5cGUmcXVvdDsvJmd0OwotJmx0Oy94czpzY2hlbWEmZ3Q7PC9wcmU+Ci0gICAgPHA+WE1MQmVhbnMgZ2VuZXJhdGVzIGEgc2VwYXJhdGUgaW50ZXJmYWNlIGZvciBlYWNoIG9mIHRoZXNlLiBBbHNvLCBnbG9iYWwKLSAgICAgIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSB0eXBlcyBhcmUgc29tZXdoYXQgdW5pcXVlIGluIHRoYXQgdGhlIHNjaGVtYSBjb21waWxlcgotICAgICAgd2lsbCBjcmVhdGUgc3BlY2lhbCB0eXBlcyB0byBob2xkIHRoZSBnbG9iYWxseSBkZWZpbmVkIGVsZW1lbnQgb3IgYXR0cmlidXRlLgotICAgICAgVGhlIG5hbWVzIG9mIHRoZXNlIHR5cGVzIHdpbGwgYmUgYXBwZW5kZWQgd2l0aCAmcXVvdDtEb2N1bWVudCZxdW90OyAoZm9yCi0gICAgICBlbGVtZW50cykgb3IgJnF1b3Q7QXR0cmlidXRlJnF1b3Q7IChmb3IgYXR0cmlidXRlcykuIFlvdSBjYW4gcmV0cmlldmUgdGhlCi0gICAgICBlbGVtZW50IG9yIGF0dHJpYnV0ZSBpdHNlbGYgKG9yIGNyZWF0ZSBhIG5ldyBvbmUpIGJ5IGNhbGxpbmcgdGhlIGFjY2Vzc29yCi0gICAgICBtZXRob2RzIHRoYXQgdGhlIHNwZWNpYWwgdHlwZXMgcHJvdmlkZS4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHdvdWxkIGNyZWF0ZQotICAgICAgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNyZWRpdFJlcG9ydCBlbGVtZW50LjwvcD4KLSAgICA8cHJlPgotLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWFsIGRvY3VtZW50IHR5cGUuCi1DcmVkaXRSZXBvcnREb2N1bWVudCByZXBvcnREb2MgPSBDcmVkaXRSZXBvcnREb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0vKgotICogVXNlIHRoZSBkb2N1bWVudCB0eXBlIHRvIGFkZCBhIG5ldyBjcmVkaXRSZXBvcnQgZWxlbWVudCB0byB0aGUgWE1MIGluc3RhbmNlLgotICogTm90ZSB0aGF0IHRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBhZGROZXdDcmVkaXRSZXBvcnQgbWV0aG9kIGlzIHRoZQotICogY3JlZGl0UmVwb3J0VHlwZSBjb21wbGV4IHR5cGUgZGVmaW5lZCBmb3IgaXQgaW4gc2NoZW1hLgotICovCi1DcmVkaXRSZXBvcnRUeXBlIHJlcG9ydCA9IHJlcG9ydERvYy5hZGROZXdDcmVkaXRSZXBvcnQoKTsKLTwvcHJlPgotICAgIDxoMj5HbG9iYWwgVXNlci1EZXJpdmVkIFR5cGVzPC9oMj4KLSAgICA8cD5BIDxlbT51c2VyLWRlcml2ZWQ8L2VtPiB0eXBlIGlzIG9uZSBkZWZpbmVkIHdpdGggYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y29tcGxleFR5cGU8L3NwYW4+Ci0gICAgICBvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2ltcGxlVHlwZTwvc3Bhbj4gZWxlbWVudCBpbiBzY2hlbWEuIFVzZXItZGVyaXZlZAotICAgICAgdHlwZXMgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIHNjaGVtYSBhcmUgZ2xvYmFsLiBYTUxCZWFucyBnZW5lcmF0ZXMgYW4gaW50ZXJmYWNlCi0gICAgICBmb3IgZWFjaCBvZiB0aGVzZSwgYXMgaXQgZG9lcyB3aXRoIGdsb2JhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy4gVGhlc2UKLSAgICAgIGludGVyZmFjZXMgaW5jbHVkZSBtZXRob2RzIHRocm91Z2ggd2hpY2ggeW91IGNhbiBnZXQgYW5kIHNldCB0aGUgdHlwZSdzCi0gICAgICB2YWx1ZXMsIGluY2x1ZGluZyBhbnkgbmVzdGVkIGRlcml2ZWQgdHlwZXMgaXQgbWF5IGNvbnRhaW4uIFRoZSBmb2xsb3dpbmcKLSAgICAgIHNjaGVtYSBzbmlwcGV0IGRlZmluZXMgYSB1c2VyLWRlcml2ZWQgY29tcGxleCB0eXBlIGNhbGxlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+LAotICAgICAgYWxvbmcgd2l0aCBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZVR5cGU8L3NwYW4+IHRoYXQgdXNlcyBpdCBhcyB0aGUKLSAgICAgIHR5cGUgZm9yIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pdGVtPC9zcGFuPiBjaGlsZCBlbGVtZW50LjwvcD4KLSAgICA8cHJlPgotJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7aXRlbVR5cGUmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O25hbWUmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2Ftb3VudCZxdW90OyB0eXBlPSZxdW90O3hzOmludCZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7cHJpY2UmcXVvdDsgdHlwZT0mcXVvdDt4czpkb3VibGUmcXVvdDsvJmd0OwotICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7Ci0mbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7cHJpY2VUeXBlJnF1b3Q7Jmd0OwotICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtpdGVtJnF1b3Q7IHR5cGU9JnF1b3Q7cHM6aXRlbVR5cGUmcXVvdDsgbWluT2NjdXJzPSZxdW90OzAmcXVvdDsgbWF4T2NjdXJzPSZxdW90O3VuYm91bmRlZCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0mbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3ByaWNlJnF1b3Q7IHR5cGU9JnF1b3Q7cHM6cHJpY2VUeXBlJnF1b3Q7LyZndDsKLTwvcHJlPgotICAgIDxwPkJ5IGRlZmF1bHQsIHRoZSBnZW5lcmF0ZWQgSmF2YSB0eXBlIGZvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+Ci0gICAgICB3b3VsZCBiZSBhbiBpbnRlcmZhY2UgY2FsbGVkIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5JdGVtVHlwZTwvc3Bhbj4uIFdpdGgKLSAgICAgIHRoaXMgdHlwZSwgeW91IHdvdWxkIGJlIGFibGUgdG8gZ2V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm5hbWU8L3NwYW4+LAotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmFtb3VudDwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2U8L3NwYW4+Ci0gICAgICBjaGlsZCBlbGVtZW50cy4gSG93ZXZlciwgYSB1c2VyLWRlcml2ZWQgdHlwZSAoYXMgb3Bwb3NlZCB0byBhbiBlbGVtZW50IG9yCi0gICAgICBhdHRyaWJ1dGUpIGlzIGFsd2F5cyBpbnRlbmRlZCBmb3IgdXNlIGFzIHRoZSB0eXBlIHRvIHdoaWNoIGFuIGVsZW1lbnQgb3IKLSAgICAgIGF0dHJpYnV0ZSBpcyBib3VuZC4gSW4gb3RoZXIgd29yZHMsIGl0J3MgY29udGFpbmVkIGJ5IGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLgotICAgICAgV2hpbGUgeW91IGNhbiBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSB1c2VyLWRlcml2ZWQgdHlwZSwgdGhlIG5ldyBpbnN0YW5jZSdzCi0gICAgICB1bmRlcmx5aW5nIFhNTCBpcyBhIGZyYWdtZW50LiBBcyB0aGUgZ2VuZXJhdGVkIEFQSSB3b3VsZCBtYWtlIGNsZWFyLCB0aGUKLSAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pdGVtVHlwZTwvc3Bhbj4gYmVjb21lcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnZXQKLSAgICAgIG1ldGhvZCwgb3IgdGhlIHBhcmFtZXRlciBvZiBhIHNldCBtZXRob2QuPC9wPgotICAgIDxwcmU+Ci0vLyBDcmVhdGUgYSBuZXcgcHJpY2UgZG9jdW1lbnQuCi1QcmljZURvY3VtZW50IHByaWNlRG9jID0gUHJpY2VEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci1QcmljZVR5cGUgcHJpY2UgPSBwcmljZURvYy5nZXRQcmljZSgpOwotCi0vKgotICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEl0ZW1UeXBlIGFuZCBzZXQgdGhlIHZhbHVlcyBvZiBpdHMKLSAqIGNoaWxkIGVsZW1lbnRzLgotICovCi1JdGVtVHlwZSBpdGVtID0gSXRlbVR5cGUuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotaXRlbS5zZXROYW1lKCZxdW90O2JpY3ljbGUmcXVvdDspOwotaXRlbS5zZXRBbW91bnQoMTIpOwotaXRlbS5zZXRQcmljZSg1NjAuMDApOwotCi0vKgotICogVXNlIHRoZSBuZXcgSXRlbVR5cGUgaW5zdGFuY2UgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUKLSAqIHByaWNlIGVsZW1lbnQncyBmaXJzdCBpdGVtIGNoaWxkIGVsZW1lbnQuIE5vdGljZSB0aGF0IHRoZSBzZXQgbWV0aG9kCi0gKiBoZXJlIGlzIGFuICJBcnJheSIgbWV0aG9kLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGl0ZW0gZWxlbWVudAotICogaXMgZGVmaW5lZCB3aXRoIGEgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIGF0dHJpYnV0ZS4gSXQgY2FuIG9jY3VyCi0gKiBtYW55IHRpbWVzIGFzIGEgY2hpbGQgb2YgcHJpY2UuCi0gKi8KLXByaWNlLnNldEl0ZW1BcnJheSgwLCBpdGVtKTsKLTwvcHJlPgotICAgIDxoMj5OZXN0ZWQgRWxlbWVudHMgYW5kIERlcml2ZWQgVHlwZXM8L2gyPgotICAgIDxwPldoZW4geW91ciBzY2hlbWEgaW5jbHVkZXMgbmFtZWQgdHlwZXMgdGhhdCBhcmUgZGVjbGFyZWQgbG9jYWxseZd3aXRoaW4KLSAgICAgIHRoZSBkZWNsYXJhdGlvbiBvZiBhbm90aGVyIGVsZW1lbnQgb3IgdHlwZZd0aGUgc2NoZW1hIHR5cGUncyBnZW5lcmF0ZWQgSmF2YQotICAgICAgaW50ZXJmYWNlIHdpbGwgYmUgYW4gaW5uZXIgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdHlwZSBpdCdzIG5lc3RlZCBpbi48L3A+Ci0gICAgPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2NoZW1hIHNuaXBwZXQgZGVmaW5lcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZTwvc3Bhbj4KLSAgICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2VuZGVyPC9zcGFuPiBlbGVtZW50cyBuZXN0ZWQgd2l0aGluIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBlcnNvbjwvc3Bhbj4KLSAgICAgIGNvbXBsZXggdHlwZS4gSW4gcGFydGljdWxhciwgbm90ZSB0aGF0IHRoZSBnZW5kZXIgZWxlbWVudCBpcyBkZWZpbmVkIGFzCi0gICAgICBkZXJpdmluZyBmcm9tIHRoZSB4czpOTVRPS0VOIGJ1aWx0LWluIHR5cGUuPC9wPgotICAgIDxwcmU+Ci0mbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0icGVyc29uIiZndDsKLSAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJnZW5kZXIiJmd0OwotICAgICAgICAgICAgJmx0O3hzOnNpbXBsZVR5cGUmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iJmd0OwotICAgICAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbGUiLyZndDsKLSAgICAgICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSJmZW1hbGUiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L3hzOnJlc3RyaWN0aW9uJmd0OwotICAgICAgICAgICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwotICAgICAgICAmbHQ7L3hzOmVsZW1lbnQmZ3Q7Ci0gICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci08L3ByZT4KLSAgICA8cD5UaGUgZ2VuZXJhdGVkIGludGVyZmFjZXMgZm9yIHBlcnNvbiBhbmQgZ2VuZGVyIHdvdWxkIGJlIG9yZ2FuaXplZCBpbiBzb3VyY2UKLSAgICAgIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcuIE9mIGNvdXJzZSwgeW91IHdvdWxkbid0IHNlZSB0aGUgc291cmNlLCBidXQKLSAgICAgIHlvdSBjYW4gc2VlIGhlcmUgdGhhdCB0aGUgR2VuZGVyIGludGVyZmFjZSBpcyBuZXN0ZWQgd2l0aCBQZXJzb24uIEFsc28sCi0gICAgICBub3RpY2UgdGhhdCBpdCBleHRlbmRzIFhtbE5NVE9LRU4sIG1pcnJvcmluZyB0aGUgc2NoZW1hLjwvcD4KLSAgICA8cHJlPnB1YmxpYyBpbnRlcmZhY2UgUGVyc29uIGV4dGVuZHMgWG1sT2JqZWN0Ci17Ci0gICAgcHVibGljIGludGVyZmFjZSBHZW5kZXIgZXh0ZW5kcyBYbWxOTVRPS0VOCi0gICAgewotICAgICAgICAvLyBNZXRob2RzIG9taXR0ZWQgZm9yIHRoaXMgZXhhbXBsZQotICAgIH0KLSAgICAvLyBNZXRob2RzIG9taXR0ZWQgZm9yIHRoaXMgZXhhbXBsZQotfQotPC9wcmU+Ci0gICAgPHA+WW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkdlbmRlcjwvc3Bhbj4KLSAgICAgIHR5cGUgaW4gdGhpcyB3YXkgKHRoZXJlIGFyZSBhbHNvIHZhcmlvdXMgYWx0ZXJuYXRpdmVzIHRvIHRoaXMpOjwvcD4KLSAgICA8cHJlPgotLy8gQ3JlYXRlIGEgbmV3IFBlcnNvbiBpbnN0YW5jZS4KLVBlcnNvbiBwZXJzb24gPSBQZXJzb24uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotLyoKLSAqIFNldCB0aGUgZ2VuZGVyIGVsZW1lbnQncyB2YWx1ZSB1c2luZyB0aGUKLSAqIGVudW1lcmF0aW9uIGdlbmVyYXRlZCBmcm9tIHRoZSBzY2hlbWEuCi0gKi8KLXBlcnNvbi5zZXRHZW5kZXIoR2VuZGVyLkZFTUFMRSk7PC9wcmU+Ci0gICAgPGgyPlVzZXItRGVyaXZlZCBTaW1wbGUgVHlwZXM8L2gyPgotICAgIDxwPkluIGFkZGl0aW9uIHRvIHRoZSA0NiBidWlsdC1pbiBzaW1wbGUgdHlwZXMgaW4gWE1MIHNjaGVtYSwgYSBzY2hlbWEgY2FuCi0gICAgICBpbmNsdWRlIGl0cyBvd24gY3VzdG9tIHNpbXBsZSB0eXBlcyB1c2luZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c2ltcGxlVHlwZTwvc3Bhbj4KLSAgICAgIGRlY2xhcmF0aW9ucy4gVGhlc2UgdXNlci1kZXJpdmVkIHNpbXBsZSB0eXBlcyBhcmUgYWx3YXlzIGJhc2VkIG9uIHRoZSBidWlsdC1pbgotICAgICAgWE1MIHNjaGVtYSB0eXBlcy4gVGhlIGJ1aWx0LWluIHR5cGVzIGNhbiBiZSBtb2RpZmllZCBieSA8ZW0+cmVzdHJpY3Rpbmc8L2VtPgotICAgICAgdGhlbSwgdGFraW5nIDxlbT51bmlvbnM8L2VtPiBvZiB0aGVtLCBvciBtYWtpbmcgc3BhY2Utc2VwYXJhdGVkIDxlbT5saXN0czwvZW0+Ci0gICAgICBvZiB0aGVtLiBFYWNoIFhNTCBzaW1wbGUgdHlwZSBpcyB0cmFuc2xhdGVkIGludG8gYSBKYXZhIHR5cGUgdGhhdCBwcm92aWRlcwotICAgICAgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEuPC9wPgotICAgIDxoMz5VbmlvbnM8L2gzPgotICAgIDxwPkluIHNjaGVtYSwgeW91IGNhbiB1c2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnVuaW9uPC9zcGFuPiB0byBzcGVjaWZ5Ci0gICAgICBhIHNpbXBsZSB0eXBlIHRoYXQgaXMgYWxsb3dlZCB0byBjb250YWluIHZhbHVlcyBvZiBhIG51bWJlciBvZiBvdGhlciBzaW1wbGUKLSAgICAgIHR5cGVzLiBYTUxCZWFucyBnZW5lcmF0ZXMgYSB0eXBlIGZvciBhIHVuaW9uLCBqdXN0IGFzIGl0IGdlbmVyYXRlcyBhIHR5cGUKLSAgICAgIGZvciBhbnkgb3RoZXIgc2NoZW1hIHR5cGUuIEF0IHJ1biB0aW1lLCB5b3UgY2FuIGRpc2NvdmVyIHRoZSB1bmRlcmx5aW5nCi0gICAgICB0eXBlIG9mIGFuIGluc3RhbmNlIG9mIGEgdW5pb24gdHlwZSBieSBjYWxsaW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPgotICAgICAgaW50ZXJmYWNlJ3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluc3RhbmNlVHlwZTwvc3Bhbj4gbWV0aG9kLiBPbmNlIHlvdQotICAgICAgaGF2ZSBkZXRlcm1pbmVkIHRoZSB0eXBlLCB5b3UgY2FuIGNhc3QgYW4gaW5zdGFuY2Ugb2YgYSB1bmlvbiB0eXBlIHRvIHRoZQotICAgICAgYWN0dWFsIHVuZGVybHlpbmcgaW5zdGFuY2UgdHlwZS48L3A+Ci0gICAgPHByZT4KLSZsdDt4czpzaW1wbGVUeXBlIG5hbWU9JnF1b3Q7aW50T3JTdHJpbmcmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzOnVuaW9uIG1lbWJlclR5cGVzPSZxdW90O3hzOmludCB4czpzdHJpbmcmcXVvdDsmZ3Q7Ci0mbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7Ci08L3ByZT4KLSAgICA8cD5HaXZlbiB0aGUgcHJlY2VkaW5nIHNjaGVtYSBzbmlwcGV0LCB5b3UgY291bGQgc2V0IHRoZSBpbnRPclN0cmluZyB2YWx1ZQotICAgICAgdG8sIHNheSwgNiBvciAmcXVvdDtzaXgmcXVvdDsuIFRoZSB1bmlvbiBvZiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6aW50PC9zcGFuPgotICAgICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpzdHJpbmc8L3NwYW4+IG1ha2VzIGJvdGggYWxsb3dhYmxlLjwvcD4KLSAgICA8cHJlPgotLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0eXBlLgotSW50T3JTdHJpbmcgaW50T3JTdHJpbmcgPSBJbnRPclN0cmluZy5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci1pbnRPclN0cmluZy5zZXQoJnF1b3Q7NSZxdW90Oyk7Ci0vLyBUaGlzIGNvZGUgcHJpbnRzICJYbWxJbnQiIHRvIHRoZSBjb25zb2xlLgotU3lzdGVtLm91dC5wcmludGxuKGludE9yU3RyaW5nLmluc3RhbmNlVHlwZSgpLmdldFNob3J0SmF2YU5hbWUoKSk7Ci08L3ByZT4KLSAgICA8aDM+UmVzdHJpY3Rpb25zPC9oMz4KLSAgICA8cD5YTUwgc2NoZW1hIHJlc3RyaWN0aW9ucyBvbiBzaW1wbGUgWE1MQmVhbnMgdHlwZXMgYXJlIGVuZm9yY2VkLiBTbywgZm9yCi0gICAgICBleGFtcGxlLCBpdCBpcyBpbGxlZ2FsIHRvIHNldCBhIG51bWJlciBvdXRzaWRlIGl0cyByZXN0cmljdGVkIHJhbmdlLiA8L3A+Ci0gICAgPGg0Pk51bWVyaWMgVHlwZSBSZXN0cmljdGlvbnM8L2g0PgotICAgIDxwPkluIHNjaGVtYSwgeW91IGNhbiByZXN0cmljdCBudW1lcmljIHR5cGVzIHRvIGFsbG93LCBmb3IgZXhhbXBsZSwgb25seSBhCi0gICAgICBwYXJ0aWN1bGFyIHJhbmdlIG9mIHZhbHVlcy4gRm9yIHN1Y2ggYSByZXN0cmljdGlvbiwgWE1MQmVhbnMgdGFpbG9ycyB0aGUKLSAgICAgIHJlc3VsdGluZyBuYXR1cmFsIEphdmEgYWx0ZXJuYXRpdmUuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcKLSAgICAgIGVsZW1lbnQgZGVmaW5lZCBpbiBzY2hlbWE6PC9wPgotICAgIDxwcmU+Ci0mbHQ7eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiJmd0OwotICAgICZsdDt4czpzaW1wbGVUeXBlJmd0OwotICAgICAgICAmbHQ7eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciImZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwMDAwIi8mZ3Q7Ci0gICAgICAgICZsdDsveHM6cmVzdHJpY3Rpb24mZ3Q7Ci0gICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwotJmx0Oy94czplbGVtZW50Jmd0OwotPC9wcmU+Ci0gICAgPHA+VGhlIHR5cGUgaXMgcmVzdHJpY3RlZCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czppbnRlZ2VyPC9zcGFuPiwKLSAgICAgIGJ1dCBiZWNhdXNlIHRoZSBudW1iZXIncyByYW5nZSBpcyBsaW1pdGVkIHRvIGJldHdlZW4gMSBhbmQgMTAwMDAwMCwgaXQgd2lsbAotICAgICAgZml0IGludG8gYSBKYXZhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnQ8L3NwYW4+LiBBIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5sb25nPC9zcGFuPgotICAgICAgb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9zcGFuPiB3b3VsZCBiZSB0b28gYmlnCi0gICAgICBmb3IgdGhlIG5lZWQuIEluIG90aGVyIHdvcmRzLCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldE51bWJlcjwvc3Bhbj4KLSAgICAgIG1ldGhvZCBnZW5lcmF0ZWQgZm9yIHRoaXMgdHlwZSB3aWxsIHJldHVybiBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW50PC9zcGFuPiwKLSAgICAgIHJhdGhlciB0aGFuIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkJpZ0ludGVnZXI8L3NwYW4+IG9yIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxvbmc8L3NwYW4+LjwvcD4KLSAgICA8cD5CeSB0aGUgc2FtZSB0b2tlbiwgYW4gbG9uZyBjYW4gYmUgY29tcGlsZWQgdG8gYW4gaW50IGlmIHRoZSB0b3RhbERpZ2l0cwotICAgICAgYXR0cmlidXRlIGlzICZsdDs9OSwgb3IgdGhlIG1pbiBhbmQgbWF4IGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHdpdGhpbiAzMi1iaXQKLSAgICAgIDJzIGNvbXBsZW1lbnQgcmFuZ2UuPC9wPgotICAgIDxwPlRoZSBzaW5nbGUgcHJpbWl0aXZlIFhNTCB0eXBlIHhzOmRlY2ltYWwgY2FuIGJlIHJlc3RyaWN0ZWQgaW4gc2V2ZXJhbCB3YXlzCi0gICAgICB0aGF0IGluZmx1ZW5jZSB0aGUgcmVzdWx0aW5nIG5hdHVyYWwgSmF2YSB0eXBlLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlOjwvcD4KLSAgPC9kaXY+Ci08L2Rpdj4KLTx1bD4KLSAgPGxpPgotICAgIDxkaXY+Ci0gICAgICA8ZGl2PkNvbXBpbGVkIHRvIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkJpZ0ludGVnZXI8L3NwYW4+IGlmIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZnJhY3Rpb25EaWdpdDwvc3Bhbj4KLSAgICAgICAgYXR0cmlidXRlIGlzIHNldCB0byAwLiA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxkaXY+Ci0gICAgICA8ZGl2PkNvbXBpbGVkIHRvIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxvbmc8L3NwYW4+IGlmIGl0cyB0b3RhbERpZ2l0cwotICAgICAgICBhdHRyaWJ1dGUgaXMgJmx0Oz0xOCwgb3IgdGhlIG1pbiBhbmQgbWF4IGFyZSB3aXRoaW4gNjQtYml0IDJzIGNvbXBsZW1lbnQKLSAgICAgICAgcmFuZ2UuPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvbGk+Ci08L3VsPgotPGRpdj4KLSAgPGRpdj4KLSAgICA8aDM+RW51bWVyYXRpb25zPC9oMz4KLSAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gZGVyaXZlIGEgbmV3IHR5cGUgYnkgcmVzdHJpY3RpbmcgYSBidWlsdC1pbiB0eXBlIHNvCi0gICAgICB0aGF0IG9ubHkgYSBmaW5pdGUgc2V0IG9mIHZhbHVlcyBhcmUgYWxsb3dhYmxlLiBXaGVyZSBzY2hlbWEgZG9lcyB0aGlzIGJ5Ci0gICAgICByZXN0cmljdGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c3RyaW5nPC9zcGFuPiwgWE1MQmVhbnMgZ2VuZXJhdGVzCi0gICAgICBhIHNwZWNpYWwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkVudW08L3NwYW4+IHR5cGUuIFdpdGggYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkVudW08L3NwYW4+LAotICAgICAgeW91IGNhbiBzZWxlY3QgdGhlIGVudW1lcmF0ZWQgdmFsdWUgZWl0aGVyIGJ5IGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+U3RyaW5nPC9zcGFuPgotICAgICAgdmFsdWUgb3IgYnkgYSBudW1lcmljIGluZGV4LiBUaGUgaW5kZXgncyB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZQotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlN0cmluZzwvc3Bhbj4gdmFsdWUncyBvcmRlciBpbiB0aGUgc2NoZW1hLiBIYXZpbmcKLSAgICAgIGFuIGluZGV4IGNhbiBiZSB1c2VmdWwgaW4gSmF2YSBzd2l0Y2ggc3RhdGVtZW50cy48L3A+Ci0gICAgPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhIGRvY3VtZW50IGNvbnRhaW5pbmcgcHJpY2UgZWxlbWVudHMgd2hvc2UKLSAgICAgIHR5cGUgd2FzIHRoZSBwcmljZVR5cGUgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNjaGVtYSBzbmlwcGV0OjwvcD4KLSAgICA8cHJlPiZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSZxdW90O3ByaWNlVHlwZSZxdW90OyZndDsKLSAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7aXRlbSZxdW90OyB0eXBlPSZxdW90O3BzOml0ZW1UeXBlJnF1b3Q7IG1pbk9jY3Vycz0mcXVvdDswJnF1b3Q7Ci0gICAgICAgICAgICAgIG1heE9jY3Vycz0mcXVvdDt1bmJvdW5kZWQmcXVvdDsvJmd0OwotICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7Ci0gICAgJmx0O3hzOmF0dHJpYnV0ZSBuYW1lPSZxdW90O3RocmVzaG9sZCZxdW90OyZndDsKLSAgICAgICAgJmx0O3hzOnNpbXBsZVR5cGUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6cmVzdHJpY3Rpb24gYmFzZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSZxdW90O0JlbG93MTBEb2xsYXJzJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9JnF1b3Q7QmV0d2VlbjEwQW5kMjBEb2xsYXJzJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9JnF1b3Q7QWJvdmUyMERvbGxhcnMmcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0Oy94czpyZXN0cmljdGlvbiZndDsKLSAgICAgICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwotICAgICZsdDsveHM6YXR0cmlidXRlJmd0OwotJmx0Oy94czpjb21wbGV4VHlwZSZndDs8L3ByZT4KLSAgICA8cD5Vc2luZyB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLCB5b3Ugd291bGQgYmUgYWJsZSB0byB3cml0ZSB0aGUgZm9sbG93aW5nCi0gICAgICBKYXZhIGNvZGUgdG8gJnF1b3Q7c3dpdGNoJnF1b3Q7IG9uIHRoZSB0aHJlc2hvbGQgYXR0cmlidXRlJ3MgZW51bWVyYXRpb246PC9wPgotICAgIDxwcmU+Ci0vKgotICogVXNlIHRoZSBpbnRWYWx1ZSBtZXRob2QgcHJvdmlkZWQgYnkgdGhlIEVudW0gdHlwZSB0byBkZXRlcm1pbmUgdGhlIHRocmVzaG9sZAotICogYXR0cmlidXRlJ3MgY3VycmVudCBlbnVtZXJhdGlvbiB2YWx1ZS4KLSAqLwotc3dpdGNoKHByaWNlRWxlbWVudHNbaV0uZ2V0VGhyZXNob2xkKCkuaW50VmFsdWUoKSkKLXsKLSAgICAvLyBVc2UgdGhlIFRocmVzaG9sZCB0eXBlJ3MgZW51bWVyYXRpb24gdmFsdWVzIHRvIHRlc3QgZm9yIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICBjYXNlIFByaWNlVHlwZS5UaHJlc2hvbGQuSU5UX0JFTE9XXzEwX0RPTExBUlM6Ci0gICAgICAgIHplcm9CdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQcmljZVR5cGUuVGhyZXNob2xkLklOVF9CRVRXRUVOXzEwX0FORF8yMF9ET0xMQVJTOgotICAgICAgICB0ZW5CdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQcmljZVR5cGUuVGhyZXNob2xkLklOVF9BQk9WRV8yMF9ET0xMQVJTOgotICAgICAgICB0d2VudHlCdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCZxdW90O1lvISBTb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZCEmcXVvdDspOwotICAgICAgICBicmVhazsKLX08L3ByZT4KLSAgPC9kaXY+Ci0gIDxwIGNsYXNzPSJyZWxhdGVkdG9waWNzIj5SZWxhdGVkIFRvcGljczwvcD4KLSAgPHA+PGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zIFN1cHBvcnQgZm9yCi0gICAgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPjwvcD4KLTwvZGl2PgotIDwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uTWV0aG9kc0ZvckdlbmVyYXRlZEphdmFUeXBlcy5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NjNjZjkuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+TWV0aG9kcyBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotCi0KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KLQotPG1ldGEgbmFtZT0iY29tcG9uZW50IiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgZGVzY3JpcHRpb24gbWV0YXRhZywgcGxlYXNlIHByb3ZpZGUgYSBCUklFRiBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIC0tPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBjb21wb25lbnQgbWV0YXRhZywgcGxlYXNlIGxpc3Qga2V5d29yZHMgdGhhdCB3aWxsIGhlbHAgYSB1c2VyIHNlYXJjaCBmb3IgdGhpcyB0b3BpYy4gLS0+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KLTxkaXYgaWQ9dG9waWN0aXRsZT4KLSAgPHAgY2xhc3M9VGl0bGU+TWV0aG9kcyBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC9wPgotPC9kaXY+Ci08ZGl2IGlkPXRvcGljdGV4dD4KLSAgPHA+QXMgeW91IG1heSBoYXZlIHNlZW4gaW4gPGEgaHJlZj0iY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCI+R2V0dGluZwotICAgIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT4sIHlvdSB1c2UgdGhlIHR5cGVzIGdlbmVyYXRlZCBmcm9tIHNjaGVtYSB0byBhY2Nlc3MKLSAgICBYTUwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBzY2hlbWEuIElmIHlvdSdyZSBmYW1pbGlhciB3aXRoIHRoZSBKYXZhQmVhbnMgdGVjaG5vbG9neSwKLSAgICB0aGUgY29udmVudGlvbnMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIEFQSSB3aWxsIGJlIHJlY29nbml6YWJsZS4gPC9wPgotICA8cD5JbiBnZW5lcmFsLCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgdHJlYXRlZCBhcyAmcXVvdDtwcm9wZXJ0aWVzJnF1b3Q7Ci0gICAgaW4gdGhlIEphdmFCZWFucyBzZW5zZS4gSW4gb3RoZXIgd29yZHMsIGFzIHlvdSB3b3VsZCB3aXRoIEphdmFCZWFucyBwcm9wZXJ0aWVzLAotICAgIHlvdSBtYW5pcHVsYXRlIHBhcnRzIG9mIHRoZSBYTUwgdGhyb3VnaCBhY2Nlc3NvciBtZXRob2RzIHN1Y2ggYXMgZ2V0Q3VzdG9tZXIoKQotICAgICh3aGVyZSB5b3UgaGF2ZSBhICZxdW90O2N1c3RvbWVyJnF1b3Q7IGVsZW1lbnQpLCBzZXRJZChTdHJpbmcpICh3aGVyZSB5b3UKLSAgICBoYXZlIGFuICZxdW90O2lkJnF1b3Q7IGF0dHJpYnV0ZSksIGFuZCBzbyBvbi4gSG93ZXZlciwgYmVjYXVzZSBzY2hlbWEgc3RydWN0dXJlcwotICAgIGNhbiBiZSBzb21ld2hhdCBjb21wbGV4LCBYTUxCZWFucyBwcm92aWRlcyBzZXZlcmFsIG90aGVyIG1ldGhvZCBzdHlsZXMgZm9yCi0gICAgaGFuZGxpbmcgdGhvc2Ugc3RydWN0dXJlcyBpbiBYTUwgaW5zdGFuY2VzLjwvcD4KLSAgPGRpdj4KLSAgICA8aDI+UHJvdG90eXBlcyBmb3IgTWV0aG9kcyBpbiBHZW5lcmF0ZWQgSW50ZXJmYWNlczwvaDI+Ci0gICAgPHA+U2V2ZXJhbCBtZXRob2RzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggZWxlbWVudCBvciBhdHRyaWJ1dGUgd2l0aGluIHRoZQotICAgICAgY29tcGxleCB0eXBlLiBUaGlzIHRvcGljIGxpc3RzIGVhY2ggbWV0aG9kIHRoYXQgY291bGQgYmUgZ2VuZXJhdGVkIGZvciBhCi0gICAgICBnaXZlbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gPC9wPgotICAgIDxwPk5vdGUgdGhhdCB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIG1ldGhvZCBpcyBnZW5lcmF0ZWQgaXMgYmFzZWQgb24gaG93IHRoZQotICAgICAgZWxlbWVudCBvciBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBzY2hlbWEuIEZvciBleGFtcGxlLCBhIGN1c3RvbWVyIGVsZW1lbnQKLSAgICAgIGRlZmluaXRpb24gd2l0aCBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5tYXhPY2N1cnM8L3NwYW4+IGF0dHJpYnV0ZSB2YWx1ZQotICAgICAgb2YgMSB3aWxsIHJlc3VsdCBpbiBhIGdldEN1c3RvbWVyIG1ldGhvZCwgYnV0IG5vdCBhIGdldEN1c3RvbWVyQXJyYXkgbWV0aG9kCi0gICAgICAmIzgyMTI7IGFmdGVyIGFsbCwgb25seSBvbmUgY3VzdG9tZXIgZWxlbWVudCBpcyBwb3NzaWJsZSBpbiBhbiBpbnN0YW5jZQotICAgICAgZG9jdW1lbnQuPC9wPgotICAgIDxwPk5vdGUsIHRvbywgdGhhdCB0aGVyZSBtYXkgYmUgdHdvIHNldHMgb2YgcGFyYWxsZWwgbWV0aG9kczogb25lIHdob3NlIHByb3RvdHlwZQotICAgICAgc3RhcnRzIHdpdGggYW4gJnF1b3Q7eCZxdW90Oy4gQW4gJnF1b3Q7eCZxdW90OyBtZXRob2Qgc3VjaCBhcyB4Z2V0TmFtZSBvcgotICAgICAgeHNldE5hbWUgd291bGQgYmUgZ2VuZXJhdGVkIGZvciBlbGVtZW50cyBvciBhdHRyaWJ1dGUgd2hvc2UgdHlwZSBpcyBhIHNpbXBsZQotICAgICAgdHlwZS4gQSBzaW1wbGUgdHlwZSBtYXkgYmUgb25lIG9mIHRoZSA0NCBidWlsdC1pbiBzaW1wbGUgdHlwZXMgb3IgbWF5IGJlCi0gICAgICBhIHJlc3RyaWN0aW9uIGluIHNjaGVtYSBvZiBvbmUgb2YgdGhvc2UgYnVpbHQtaW4gdHlwZXMuIE9mIGNvdXJzZSwgYW4gYXR0cmlidXRlCi0gICAgICB3aWxsIGFsd2F5cyBiZSBvZiBhIHNpbXBsZSB0eXBlLiBGb3IgYnVpbHQtaW4gc2ltcGxlIHR5cGVzLCBhbiAmcXVvdDt4JnF1b3Q7Ci0gICAgICBtZXRob2Qgd2lsbCBnZXQgb3Igc2V0IG9uZSBvZiB0aGUgdHlwZXMgcHJvdmlkZWQgd2l0aCBYTUxCZWFucywgc3VjaCBhcwotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFN0cmluZy5odG1sIj5YbWxTdHJpbmc8L2E+PC9zcGFuPiwKLSAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmh0bWwiPlhtbEludGVnZXI8L2E+PC9zcGFuPiwKLSAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5Lmh0bWwiPlhtbEdEYXk8L2E+PC9zcGFuPiwKLSAgICAgIGFuZCBzbyBvbi4gRm9yIGRlcml2ZWQgdHlwZXMsIHRoZSAmcXVvdDt4JnF1b3Q7IG1ldGhvZCB3aWxsIGdldCBvciBzZXQgYQotICAgICAgZ2VuZXJhdGVkIHR5cGUuPC9wPgotICAgIDxoMz5TaW5nbGUgT2NjdXJyZW5jZSBNZXRob2RzPC9oMz4KLSAgICA8cD5NZXRob2RzIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFsbG93IGEgc2luZ2xlIG9jY3VycmVuY2UuCi0gICAgICBBbiBlbGVtZW50IGlzIHNpbmd1bGFyIGlmIGl0IHdhcyBkZWNsYXJlZCB3aXRoIG1heE9jY3Vycz0mcXVvdDsxJnF1b3Q7LgotICAgICAgQW4gYXR0cmlidXRlIGlzIHNpbmd1bGFyIGlmIGl0IHdhcyBub3QgZGVjbGFyZWQgd2l0aCB1c2U9JnF1b3Q7cHJvaGliaXRlZCZxdW90Oy48L3A+Ci0gICAgPHByZT4KLVR5cGUgZ2V0Rm9vKCkKLXZvaWQgc2V0Rm9vKFR5cGUgbmV3VmFsdWUpCi08L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSB2YWx1ZSBvZiBGb28uIEdlbmVyYXRlZCB3aGVuIEZvbyBpcyBhbiBhdHRyaWJ1dGUsCi0gICAgICBvciBpcyBhbiBlbGVtZW50IHRoYXQgY2FuIG9jY3VyIG9ubHkgb25jZSBhcyBhIGNoaWxkLjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+Ci0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSB4Z2V0Rm9vKCkKLXZvaWQgeHNldEZvbyhYbWxUeXBlIG5ld1ZhbHVlKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgdGhlIHZhbHVlIG9mIEZvbyBhcyBhbiBYTUxCZWFuIHNpbXBsZSB0eXBlLiBUaGVzZSBtZXRob2RzCi0gICAgICBhcmUgZ2VuZXJhdGVkIGlmIEZvbydzIHR5cGUgaXMgZGVmaW5lZCBpbiBzY2hlbWEgYXMgYSBzaW1wbGVUeXBlLjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+Ci0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+Ym9vbGVhbiBpc05pbEZvbygpCi12b2lkIHNldE5pbEZvbygpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4KLSAgICA8ZGl2PkRldGVybWluZXMgb3Igc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEZvbyBlbGVtZW50IGlzIG5pbCAoaW4gb3RoZXIgd29yZHMsCi0gICAgICAmcXVvdDtudWxsJnF1b3Q7IGluIHNjaGVtYSB0ZXJtcyksIG1lYW5pbmcgaXQgY2FuIGJlIGVtcHR5LiBBIG5pbCBlbGVtZW50Ci0gICAgICBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOjwvZGl2PgotICAgIDxkaXY+Ci0gICAgICA8cHJlPiZsdDtmb28vJmd0OzwvcHJlPgotICAgIDwvZGl2PgotICAgIDxkaXY+VGhlc2UgbWV0aG9kcyBhcmUgb25seSBnZW5lcmF0ZWQgd2hlbiBhbiBlbGVtZW50IHR5cGUgaXMgZGVjbGFyZWQgYXMKLSAgICAgIG5pbGxhYmxlIGluIHNjaGVtYSAmIzgyMTI7IGl0IGhhcyBhIG5pbGxhYmxlPSZxdW90O3RydWUmcXVvdDsgYXR0cmlidXRlLjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+Ci0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSBhZGROZXdGb28oKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPGRpdj5BZGRzIGEgbmV3IEZvbyBhcyBhbiBYTUxCZWFuIHNpbXBsZSB0byB0aGUgZG9jdW1lbnQsIG9yIHJldHVybnMgRm9vJ3MKLSAgICAgIHZhbHVlIGlmIG9uZSBleGlzdHMgYWxyZWFkeS48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PgotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPmJvb2xlYW4gaXNTZXRGb28oKQotdm9pZCB1blNldEZvbygpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4KLSAgICA8ZGl2PkRldGVybWluZXMgd2hldGhlciB0aGUgRm9vIGVsZW1lbnQgb3IgYXR0cmlidXRlIGV4aXN0cyBpbiB0aGUgZG9jdW1lbnQ7Ci0gICAgICByZW1vdmVzIEZvby4gVGhlc2UgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkIGZvciBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB0aGF0Ci0gICAgICBhcmUgb3B0aW9uYWwuIEluIHNjaGVtYSwgYW5kIG9wdGlvbmFsIGVsZW1lbnQgaGFzIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5taW5PY2N1cnM8L3NwYW4+Ci0gICAgICBhdHRyaWJ1dGUgc2V0IHRvICZxdW90OzAmcXVvdDs7IGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSBoYXMgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dXNlPC9zcGFuPgotICAgICAgYXR0cmlidXRlIHNldCB0byAmcXVvdDtvcHRpb25hbCZxdW90Oy48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PgotICAgIDxociBzaXplPSIxIj4KLSAgICA8aDM+TXVsdGlwbGUgT2NjdXJyZW5jZSBNZXRob2RzPC9oMz4KLSAgICA8cD5NZXRob2RzIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgdGhhdCBhbGxvdyBtdWx0aXBsZSBvY2N1cnJlbmNlcy4gPC9wPgotICAgIDxwPkFuIGVsZW1lbnQgbWF5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGlmIGl0IGhhcyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5tYXhPY2N1cnM8L3NwYW4+Ci0gICAgICBhdHRyaWJ1dGUgc2V0IHRvICZxdW90O3VuYm91bmRlZCZxdW90OyBvciBncmVhdGVyIHRoYW4gMS4gQXR0cmlidXRlcyBjYW4ndAotICAgICAgb2NjdXIgbXVsdGlwbGUgdGltZXMuPC9wPgotICAgIDxwcmU+VHlwZVtdIGdldEZvb0FycmF5KCkKLXZvaWQgc2V0Rm9vQXJyYXkoVHlwZVtdIG5ld1ZhbHVlKSA8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIGFsbCBvZiB0aGUgRm9vIGVsZW1lbnRzLiA8L2Rpdj4KLSAgICA8ZGl2PgotICAgICAgPHByZT4KLS8vIEdldCBhbiBhcnJheSBvZiB0aGUgYWxsIG9mIHRoZSBwdXJjaGFzZS1vcmRlciBlbGVtZW50cyBpdGVtIGNoaWxkcmVuLgotSXRlbVtdIGl0ZW1zID0gbXlQTy5nZXRJdGVtQXJyYXkoKTsKLTwvcHJlPgotICAgIDwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+Ci0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+VHlwZSBnZXRGb29BcnJheShpbnQgaW5kZXgpCi12b2lkIHNldEZvb0FycmF5KFR5cGUgbmV3VmFsdWUsIGludCBpbmRleCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSBGb28gY2hpbGQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LjwvZGl2PgotICAgIDxkaXY+Ci0gICAgICA8cHJlPi8vIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aGlyZCBpdGVtIGNoaWxkIGVsZW1lbnQuCi1teVBPLnNldEl0ZW0obmV3SXRlbSwgMik7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4KLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5pbnQgc2l6ZU9mRm9vQXJyYXkoKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPGRpdj5SZXR1cm5zIHRoZSBudW1iZXIgb2YgRm9vIGNoaWxkIGVsZW1lbnRzLjwvZGl2PgotICAgIDxkaXY+Ci0gICAgICA8cHJlPi8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtIGNoaWxkIGVsZW1lbnRzLgotaW50IGl0ZW1Db3VudCA9IG15UE8uc2l6ZU9mSXRlbUFycmF5KCk7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4KLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT52b2lkIHJlbW92ZUZvbyhpbnQgaW5kZXgpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4KLSAgICA8ZGl2PlJlbW92ZXMgdGhlIEZvbyBjaGlsZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4KLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5YbWxUeXBlW10geGdldEZvb0FycmF5KCkKLXZvaWQgeHNldEZvb0FycmF5KFhtbFR5cGVbXSBhcnJheU9mTmV3VmFsdWVzKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgYWxsIG9mIHRoZSBGb28gZWxlbWVudHMgYXMgWE1MQmVhbnMgc2ltcGxlIHR5cGVzLiBHZW5lcmF0ZWQKLSAgICAgIG9ubHkgd2hlbiB0aGUgRm9vIGVsZW1lbnQgaXMgZGVmaW5lZCBhcyBhIHNpbXBsZSB0eXBlLjwvZGl2PgotICAgIDxkaXY+Ci0gICAgICA8cHJlPi8qCi0gKiBSZXR1cm5zIHZhbHVlcyBvZiBhbGwgdGhlIHBob25lIGNoaWxkIGVsZW1lbnRzIG9mIGFuIGVtcGxveWVlIGVsZW1lbnQsCi0gKiB3aGVyZSB0aGUgcGhvbmUgZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGFzIHhzOnN0cmluZy4KLSAqLwotWG1sU3RyaW5nW10gZW1wUGhvbmVzID0gY3VycmVudEVtcGxveWVlLnhHZXRQaG9uZUFycmF5KCk7Ci08L3ByZT4KLSAgICA8L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PgotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPlhtbFR5cGUgeGdldEZvb0FycmF5KGludCBpbmRleCkKLXZvaWQgeHNldEZvb0FycmF5KGludCBpbmRleCwgWG1sVHlwZSBuZXdWYWx1ZSk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSBGb28gZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCB1c2luZyBhbiBYTUxCZWFucwotICAgICAgc2ltcGxlIHR5cGUgdmFsdWUuIEdlbmVyYXRlZCBmb3IgYW4gZWxlbWVudCBkZWZpbmVkIGFzIGEgc2ltcGxlIHR5cGUgaW4KLSAgICAgIHNjaGVtYS48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PgotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPnZvaWQgaW5zZXJ0Rm9vKGludCBpbmRleCwgRm9vVHlwZSBuZXdWYWx1ZSk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxkaXY+SW5zZXJ0cyB0aGUgc3BlY2lmaWVkIEZvbyBjaGlsZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4KLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT52b2lkIGFkZEZvbyhGb29UeXBlIG5ld1ZhbHVlKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPGRpdj5BZGRzIHRoZSBzcGVjaWZpZWQgRm9vIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgRm9vIGNoaWxkIGVsZW1lbnRzLjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+Ci0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSBpbnNlcnROZXdGb28oaW50IGluZGV4KTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPGRpdj5JbnNlcnRzIGEgbmV3IEZvbyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCByZXR1cm5pbmcgYW4gWE1MQmVhbnMgc2ltcGxlCi0gICAgICB0eXBlIHJlcHJlc2VudGluZyB0aGUgbmV3IGVsZW1lbnQ7IHJldHVybnMgdGhlIGV4aXN0aW5nIEZvbyBpZiB0aGVyZSdzIGFscmVhZHkKLSAgICAgIG9uZSBhdCBpbmRleC48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PgotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPlhtbFR5cGUgYWRkTmV3Rm9vKCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxkaXY+QWRkcyBhIG5ldyBGb28gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIEZvbyBjaGlsZCBlbGVtZW50cywKLSAgICAgIHJldHVybmluZyBhbiBYTUxCZWFucyBzaW1wbGUgdHlwZSByZXByZXNlbnRpbmcgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnQuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4KLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5ib29sZWFuIGlzTmlsRm9vQXJyYXkoaW50IGluZGV4KQotdm9pZCBzZXROaWxGb29BcnJheShpbnQgaW5kZXgpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4KLSAgICA8ZGl2PkRldGVybWluZXMgb3Igc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEZvbyBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgIGlzIG5pbC48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PgotICAgIDxociBzaXplPSIxIj4KLSAgPC9kaXY+Ci0gIDxkaXYgaWQ9InRvcGljdGV4dCI+PC9kaXY+Ci0gIDxwIGNsYXNzPXJlbGF0ZWR0b3BpY3M+UmVsYXRlZCBUb3BpY3M8L3A+Ci0gIDxwPjxhIGhyZWY9ImNvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sIj5KYXZhIFR5cGVzIEdlbmVyYXRlZAotICAgIGZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwgYi92MS9kb2NzL2d1aWRlL2Nvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRlOGFlLi4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+TmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotCi0KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KLQotPG1ldGEgY29udGVudD0ieW91ciBuYW1lIiBuYW1lPSJhdXRob3IiPgotPG1ldGEgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIiBuYW1lPSJkZXNjcmlwdGlvbiI+Ci08bWV0YSBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIiBuYW1lPSJrZXl3b3JkcyI+Ci08bWV0YSBjb250ZW50PSIxMC8yNS8wMiIgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+Ci08aDE+IE5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29ycyA8L2gxPgotPGRpdiBpZD0idG9waWN0ZXh0Ij4KLSAgPHA+WE1MIGN1cnNvcnMgYXJlIGEgd2F5IHRvIG5hdmlnYXRlIHRocm91Z2ggYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50LiBPbmNlCi0gICAgeW91IGxvYWQgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIGNyZWF0ZSBhIGN1cnNvciB0byByZXByZXNlbnQgYSBzcGVjaWZpYwotICAgIHBsYWNlIGluIHRoZSBYTUwuIEJlY2F1c2UgeW91IGNhbiB1c2UgYSBjdXJzb3Igd2l0aCBvciB3aXRob3V0IGEgc2NoZW1hIGNvcnJlc3BvbmRpbmcKLSAgICB0byB0aGUgWE1MLCBjdXJzb3JzIGFyZSBhbiBpZGVhbCB3YXkgdG8gaGFuZGxlIFhNTCB3aXRob3V0IGEgc2NoZW1hLjwvcD4KLSAgPHA+V2l0aCBhbiBYTUwgY3Vyc29yLCB5b3UgY2FuOjwvcD4KLTwvZGl2PgotPFVMPgotICA8bGk+Ci0gICAgPGRpdj48YSBocmVmPSJjb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwiPlVzZSB0aGUgdG9rZW4gbW9kZWw8L2E+IHRvIG1vdmUKLSAgICAgIHRocm91Z2ggWE1MIGluIHNtYWxsIGluY3JlbWVudHMsIG9yIGluIGEgbWFubmVyIHNpbWlsYXIgdG8gdXNpbmcgYSBET00tYmFzZWQKLSAgICAgIG1vZGVsLjwvZGl2PgotICA8TEk+Ci0gICAgPERJVj5HZXQgYW5kIHNldCB2YWx1ZXMgd2l0aGluIHRoZSBYTUwuPC9ESVY+Ci0gIDxMST4KLSAgICA8RElWPjxhIGhyZWY9IiNhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyI+Q2hhbmdlIHRoZSBzdHJ1Y3R1cmU8L2E+IG9mIGFuCi0gICAgICBYTUwgZG9jdW1lbnQgYnkgaW5zZXJ0aW5nLCByZW1vdmluZywgYW5kIG1vdmluZyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy48L0RJVj4KLSAgPExJPgotICAgIDxESVY+PGEgaHJlZj0iY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sIj5FeGVjdXRlIFhRdWVyeSBleHByZXNzaW9uczwvYT4KLSAgICAgIGFnYWluc3QgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGUgY3Vyc29yLjwvRElWPgotICA8TEk+Ci0gICAgPERJVj48YSBocmVmPSJjb25Vc2luZ0Jvb2ttYXJrc1RvQW5ub3RhdGVYTUwuaHRtbCI+SW5zZXJ0IGJvb2ttYXJrczwvYT4gdG8KLSAgICAgIG1hcmsgbG9jYXRpb25zIGluIFhNTC48L0RJVj4KLTwvVUw+Ci08UD5XaGVuIHlvdSdyZSBmaW5pc2hlZCB1c2luZyBhIGN1cnNvciwgeW91ciBjb2RlIHNob3VsZCBjYWxsIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZGlzcG9zZTwvc3Bhbj4KLSAgbWV0aG9kLjwvUD4KLTxoMj5DcmVhdGluZyBhbmQgTW92aW5nIGEgQ3Vyc29yPC9oMj4KLTxQPldpdGggYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IGJvdW5kIHRvIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+WG1sT2JqZWN0PC9hPjwvc3Bhbj4KLSAgKG9yIGEgdHlwZSBpbmhlcml0aW5nIGZyb20gaXQpLCB5b3UgY3JlYXRlIGEgbmV3IGN1cnNvciBieSBjYWxsaW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmV3Q3Vyc29yPC9zcGFuPgotICBtZXRob2QuIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPlhtbEN1cnNvcjwvYT48L3NwYW4+Ci0gIGludGVyZmFjZSByZXByZXNlbnRzIGEgY3Vyc29yLiBGcm9tIGEgY3Vyc29yIHN0YW5kcG9pbnQsIGFuIFhNTCBkb2N1bWVudCBpcwotICBhIGNvbGxlY3Rpb24gb2YgPEVNPnRva2VuczwvRU0+IHRoYXQgcmVwcmVzZW50IHRoZSBraW5kcyBvZiB0aGluZ3MgdGhhdCBjYW4KLSAgYXBwZWFyIGluIFhNTC4gVGhlc2UgaW5jbHVkZSZuYnNwO2F0dHJpYnV0ZXMsIHRoZSBzdGFydCBhbmQgZW5kIG9mIGVsZW1lbnRzLAotICBjb21tZW50cywgYW5kIHNvIG9uLiZuYnNwO0VhY2ggcGllY2Ugb2YgaW5mb3JtYXRpb24gaW4gWE1MIGlzIHJlcHJlc2VudGVkIGJ5Ci0gIGEgPGVtPnRva2VuIHR5cGU8L2VtPi48L1A+Ci08UCBjbGFzcz0ibm90ZXBhcmEiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gRm9yIGEgbW9yZSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZgotICBYTUwgdG9rZW5zLCBzZWUgPGEgaHJlZj0iY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIj5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L2E+LjwvUD4KLTxQPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgbG9hZHMgdGhlJm5ic3A7WE1MIGluc3RhbmNlIGRlc2NyaWJlZCBhYm92ZQotICBmcm9tIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkZpbGU8L3NwYW4+IG9iamVjdCwgdGhlbiBjcmVhdGVzIGEgbmV3IGN1cnNvci4KLSAgVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b0ZpcnN0Q2hpbGQ8L3NwYW4+IHRha2VzIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0Ci0gIHRhZyBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJhdGNoV2lkZ2V0T3JkZXI8L3NwYW4+IGRvY3VtZW50IGVsZW1lbnQuCi0gIFRoZSBjb2RlIHRoZW4gcHJpbnRzIHRoZSB0eXBlIGZvciB0aGUgdG9rZW4gYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCBhbG9uZwotICB3aXRoIHRoZSBYTUwgdGhlIGN1cnNvciByZXByZXNlbnRzl2luIG90aGVyIHdvcmRzLCA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPlRva2VuCi0gIHR5cGU6IFNUQVJUIC88L3NwYW4+IGFuZCB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5iYXRjaFdpZGdldE9yZGVyRWxlbWVudDwvc3Bhbj4KLSAgYW5kIGl0cyBjb250ZW50cy48L1A+Ci08cHJlPnB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRDdXJzb3IoRmlsZSBvcmRlckZpbGUpIHRocm93cyBFeGNlcHRpb24KLXsKLSAgICBCYXRjaFdpZGdldE9yZGVyRG9jdW1lbnQgeG1sRG9jID0gQmF0Y2hXaWRnZXRPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2Uob3JkZXJGaWxlKTsKLSAgICBYbWxDdXJzb3Igb3JkZXJDdXJzb3IgPSB4bWxEb2MubmV3Q3Vyc29yKCk7Ci0gICAgb3JkZXJDdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJUb2tlbiB0eXBlOiAiICsgb3JkZXJDdXJzb3IuY3VycmVudFRva2VuVHlwZSgpICsKLSAgICAgICAgIiAvICIgKyBvcmRlckN1cnNvci54bWxUZXh0KCkpOwotfQotPC9wcmU+Ci08cCBjbGFzcz0ibm90ZXBhcmEiPjxTVFJPTkc+Tm90ZTwvU1RST05HPjogVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+Ci0gIGludGVyZmFjZSBwcm92aWRlcyBtYW55IG1ldGhvZHMgeW91IGNhbiB1c2UgdG8gcHV0IGEgY3Vyc29yIHdoZXJlIHlvdSB3YW50IGl0LgotICBGb3IgYSBsaXN0IG9mIHRob3NlIG1ldGhvZHMsIHNlZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yCi0gIEludGVyZmFjZTwvYT4uPC9wPgotPGgyPjxhIG5hbWU9ImFkZGluZ19lbGVtZW50c19hdHRyaWJ1dGVzIiBpZD0iYWRkaW5nX2VsZW1lbnRzX2F0dHJpYnV0ZXMiPjwvYT5BZGRpbmcKLSAgRWxlbWVudHMgYW5kIEF0dHJpYnV0ZXM8L2gyPgotPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZSBwcm92aWRlcyBzZXZlcmFsIG1ldGhvZHMKLSAgeW91IGNhbiB1c2UgdG8gYWRkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHRvIFhNTC4gPC9wPgotPHA+T25lIHdheSB0byBhZGQgbmV3IFhNTCBpcyB3aXRoIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+YmVnaW5FbGVtZW50PC9zcGFuPgotICBtZXRob2QuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGluc2VydCBhIG5ldyBlbGVtZW50IGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiwKLSAgYW5kIGRvIGl0IHNvIHRoZSBjdXJzb3IgZW5kcyB1cCBiZXR3ZWVuIHRoZSBuZXcgZWxlbWVudCdzIFNUQVJUIGFuZCBFTkQgdG9rZW5zLgotICBGcm9tIHRoaXMgcG9zaXRpb24sIHlvdSBjYW4gaW5zZXJ0IGF0dHJpYnV0ZXMgKHRoZXkncmUgYXV0b21hdGljYWxseSBwbGFjZWQKLSAgaW4gdGhlIHN0YXJ0IHRhZywgd2hlcmUgdGhleSBiZWxvbmcpIGFuZCBpbnNlcnQgYSB2YWx1ZS4gSGVyZSdzIGFuIGV4YW1wbGU6PC9wPgotPHByZT4KLS8vIENyZWF0ZSBhIG5ldyBjaHVuayBvZiBYTUwuCi1YbWxPYmplY3QgbmV3WG1sID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLS8qCi0gKiBJbnNlcnQgYSBuZXcgY3Vyc29yIGFuZCBtb3ZlIGl0IHRvIHRoZSBmaXJzdCBTVEFSVCB0b2tlbiAod2hlcmUgdGhlCi0gKiBYTUwgYWN0dWFsbHkgYmVnaW5zLgotICovCi1YbWxDdXJzb3IgY3Vyc29yID0gbmV3WG1sLm5ld0N1cnNvcigpOwotY3Vyc29yLnRvTmV4dFRva2VuKCk7Ci0vLyBCZWdpbiBhIG5ldyBpdGVtIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIFVSSSBpcyAiaHR0cDovL29wZW51cmkub3JnIi4KLWN1cnNvci5iZWdpbkVsZW1lbnQoJnF1b3Q7aXRlbSZxdW90OywgJnF1b3Q7aHR0cDovL29wZW51cmkub3JnLyZxdW90Oyk7Ci0vLyBJbnNlcnQgYW4gSUQgYXR0cmlidXRlIG9uIHRoZSBpdGVtIGVsZW1lbnQsIGFsb25nIHdpdGggYW4gYXR0cmlidXRlIHZhbHVlLgotY3Vyc29yLmluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSgmcXVvdDtpZCZxdW90OywgJnF1b3Q7NDA1NjQwNCZxdW90Oyk7Ci0vLyBJbnNlcnQgImJpY3ljbGUiIGFzIGFuIGVsZW1lbnQgdmFsdWUuCi1jdXJzb3IuaW5zZXJ0Q2hhcnMoJnF1b3Q7YmljeWNsZSZxdW90Oyk7Ci1jdXJzb3IuZGlzcG9zZSgpOwotPC9wcmU+Ci08cD5UaGlzIGV4YW1wbGUgcmVzdWx0cyBpbiBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD4KLTxwcmU+Jmx0O25zMTppdGVtIGlkPSZxdW90OzQwNTY0MDQmcXVvdDsgeG1sbnM6bnMxPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy8mcXVvdDsmZ3Q7YmljeWNsZSZsdDsvbnMxOml0ZW0mZ3Q7Ci08L3ByZT4KLTxoMj4gVXNpbmcgU3RvcmVkIEN1cnNvciBMb2NhdGlvbnMgd2l0aCBwdXNoKCkgYW5kIHBvcCgpPC9oMj4KLTxkaXYgaWQ9InRvcGljdGV4dCI+Ci0gIDxwPldoZW4geW91IHdhbnQgdG8gbW92ZSBhIGN1cnNvciBhcm91bmQsIGJ1dCB3YW50IHRvIGtlZXAgdHJhY2sgb2YgYSBmb3JtZXIKLSAgICBsb2NhdGlvbiwgeW91IGNhbiB1c2UgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZSdzCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPgotICAgIG1ldGhvZHMuIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gbWV0aG9kIHB1c2hlcyB0aGUgY3Vyc29yJ3MKLSAgICBjdXJyZW50IGxvY2F0aW9uIG9udG8gYSBzdGFjayBvZiBsb2NhdGlvbnMgbWFpbnRhaW5lZCBmb3IgdGhhdCBwYXJ0aWN1bGFyCi0gICAgY3Vyc29yOyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gbWV0aG9kIHJlbW92ZXMgdGhlIGxvY2F0aW9uCi0gICAgZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgbW92ZXMgdGhlIGN1cnNvciB0byB0aGF0IGxvY2F0aW9uLjwvcD4KLSAgPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgJmx0O2VtcGxveWVlJmd0OyBlbGVtZW50LCB1c2VkIGluIHRoZQotICAgIGV4YW1wbGUgYmVsb3cuPC9wPgotICA8cHJlPgotJmx0O2VtcGxveWVlJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O25hbWUmZ3Q7R2xhZHlzIEtyYXZpdHombHQ7L25hbWUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YWRkcmVzcyBsb2NhdGlvbj0mcXVvdDtob21lJnF1b3Q7Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0cmVldCZndDsxMzEzIE1vY2tpbmdiaXJkIExhbmUmbHQ7L3N0cmVldCZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtjaXR5Jmd0O1NlYXR0bGUmbHQ7L2NpdHkmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c3RhdGUmZ3Q7V0EmbHQ7L3N0YXRlJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3ppcCZndDs5ODExNSZsdDsvemlwJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9hZGRyZXNzJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FkZHJlc3MgbG9jYXRpb249JnF1b3Q7d29yayZxdW90OyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdHJlZXQmZ3Q7MjAxMSAxNTJuZCBBdmVudWUgTkUmbHQ7L3N0cmVldCZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtjaXR5Jmd0O1JlZG1vbmQmbHQ7L2NpdHkmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c3RhdGUmZ3Q7V0EmbHQ7L3N0YXRlJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3ppcCZndDs5ODA1MiZsdDsvemlwJmd0OwotJm5ic3A7Jm5ic3A7ICZuYnNwOyZsdDsvYWRkcmVzcyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwaG9uZSBsb2NhdGlvbj0mcXVvdDt3b3JrJnF1b3Q7Jmd0Oyg0MjUpIDU1NS02ODk3Jmx0Oy9waG9uZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwaG9uZSBsb2NhdGlvbj0mcXVvdDtob21lJnF1b3Q7Jmd0OygyMDYpIDU1NS02NTk0Jmx0Oy9waG9uZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwaG9uZSBsb2NhdGlvbj0mcXVvdDttb2JpbGUmcXVvdDsmZ3Q7KDIwNikgNTU1LTc4OTQmbHQ7L3Bob25lJmd0OwotJmx0Oy9lbXBsb3llZSZndDsKLTwvcHJlPgotICA8cD5UaGUgZm9sbG93aW5nIEphdmEgY29kZSBpbGx1c3RyYXRlcyBob3cgeW91IGNhbiB1c2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+Ci0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IHRvIHB1dCB0aGUgY3Vyc29yIGJhY2sgdG8gYSBzYXZlZAotICAgIGxvY2F0aW9uIGFmdGVyIGEgYml0IG9mIHRyYXZlbGluZy48L3A+Ci0gIDxwcmU+Ci0vKioKLSAqIFBhc3MgdG8gdGhlIHRyeVNlbGVjdFBhdGggbWV0aG9kIGFuIFhtbE9iamVjdCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCi0gKiB0aGUgWE1MIGFib3ZlLgotICovCi1wdWJsaWMgdm9pZCB0cnlTZWxlY3RQYXRoKFhtbE9iamVjdCB4bWwpCi17Ci0gICAgLyoKLSAgICAgKiBJbnNlcnRzIHRoZSBjdXJzb3IgYXQgdGhlIFNUQVJURE9DIHRva2VuICh0aGUgdmVyeSBiZWdpbm5pbmcsCi0gICAgICogYmVmb3JlIGFueSBlbGVtZW50cykuCi0gICAgICovCi0gICAgWG1sQ3Vyc29yIGN1cnNvciA9IHhtbC5uZXdDdXJzb3IoKTsKLSAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlICZsdDtlbXBsb3llZSZndDsKLSAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0gICAgLy8gUHVzaGVzIHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uIG9udG8gdGhlIHN0YWNrLgotICAgIGN1cnNvci5wdXNoKCk7Ci0gICAgLy8gTW92ZXMgdGhlIGN1cnNvciB0byBqdXN0IGJlZm9yZSB0aGUgJnF1b3Q7d29yayZxdW90OyAmbHQ7cGhvbmUmZ3Q7IGVsZW1lbnQuCi0gICAgY3Vyc29yLnRvQ2hpbGQoMik7Ci0gICAgLy8gTW92ZXMgdGhlIGN1cnNvciB0byBqdXN0IGJlZm9yZSB0aGUgJnF1b3Q7aG9tZSZxdW90OyAmbHQ7cGhvbmUmZ3Q7IGVsZW1lbnQuCi0gICAgY3Vyc29yLnRvTmV4dFNpYmxpbmcoKTsKLSAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIGJhY2sgdG8ganVzdCBiZWZvcmUgJmx0O2VtcGxveWVlJmd0OwotICAgIGN1cnNvci5wb3AoKTsKLX0KLTwvcHJlPgotICA8cD5PZiBjb3Vyc2UsIHlvdSBjYW4gY2FsbCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+Ci0gICAgbXVsdGlwbGUgdGltZXMuIEVhY2ggbmV3IGNhbGwgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPgotICAgIG1ldGhvZCBwdXNoZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb250byB0aGUgc3RhY2suIEFzIHlvdSBjYWxsIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPgotICAgIG1ldGhvZCwgeW91J3JlIGFsd2F5cyBnZXR0aW5nIHdoYXQncyBvbiB0b3Agb2YgdGhlIHN0YWNrLiBTbyBpZiB5b3UgY2FsbGVkCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IHRocmVlIHRpbWVzIGJlZm9yZSBjYWxsaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+Ci0gICAgJiM4MjEyOyAxLCAyLCAzICYjODIxMjsgY2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiB0aHJlZQotICAgIHRpbWVzIHdvdWxkIGdldCB0aG9zZSBsb2NhdGlvbnMgaW4gcmV2ZXJzZSBvcmRlciAmIzgyMTI7IDMsIDIsIDEuPC9wPgotICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPgotICAgIG1ldGhvZHMgY2FuIGJlIGhhbmR5IGFzIGFuIGFsdGVybmF0aXZlIHRvIGNyZWF0aW5nIG5ldyBjdXJzb3JzIHRoYXQgYXJlIGRlc2lnbmVkCi0gICAgc2ltcGx5IHRvIG1hcmsgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIHdoaWxlIHlvdSBtb3ZlIGFub3RoZXIgY3Vyc29yIGFyb3VuZC4KLSAgICBUaGUgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIG1haW50YWluIGEgbG9jYXRpb24gc3RhY2sgdGhyb3VnaCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4KLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gYXJlIGZhciBsZXNzIHRoYW4gdGhvc2UgbmVlZGVkIGJ5Ci0gICAgY3Vyc29ycy4gPC9wPgotICA8SDE+RGlzcG9zaW5nIG9mIGEgQ3Vyc29yPC9IMT4KLSAgPHA+V2hlbiB5b3UncmUgdGhyb3VnaCB3aXRoIGEgY3Vyc29yLCB5b3VyIGNvZGUgc2hvdWxkIGNhbGwgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kaXNwb3NlPC9zcGFuPgotICAgIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC48L3A+Ci0gIDxwIGNsYXNzPSJyZWxhdGVkdG9waWNzIj5SZWxhdGVkIFRvcGljczwvcD4KLSAgPHA+PGEgaHJlZj0iY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIj5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L2E+PC9wPgotICA8cD48YSBocmVmPSJjb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NGEzYzcuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+U2VsZWN0aW5nIFhNTCB3aXRoIFhRdWVyeSBhbmQgWFBhdGg8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBjb250ZW50PSJ5b3VyIG5hbWUiIG5hbWU9ImF1dGhvciI+Ci08bWV0YSBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iIG5hbWU9ImRlc2NyaXB0aW9uIj4KLTxtZXRhIGNvbnRlbnQ9ImtleXdvcmRzIHRvIGhlbHAgaW4gc2VhcmNoZXMiIG5hbWU9ImtleXdvcmRzIj4KLTxtZXRhIGNvbnRlbnQ9IjEwLzI1LzAyIiBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KLTxoMT4gU2VsZWN0aW5nIFhNTCB3aXRoIFhRdWVyeSBhbmQgWFBhdGg8L2gxPgotPGRpdiBpZD0idG9waWN0ZXh0Ij4KLSAgPHA+WW91IGNhbiB1c2UgWFF1ZXJ5IGFuZCBYUGF0aCB0byByZXRyaWV2ZSBzcGVjaWZpYyBwaWVjZXMgb2YgWE1MIGFzIHlvdSBtaWdodAotICAgIHJldHJpZXZlIGRhdGEgZnJvbSBhIGRhdGFiYXNlLiBYUXVlcnkgYW5kIFhQYXRoIHByb3ZpZGUgYSBzeW50YXggZm9yIHNwZWNpZnlpbmcKLSAgICB3aGljaCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB5b3UncmUgaW50ZXJlc3RlZCBpbi4gVGhlIFhNTEJlYW5zIEFQSSBwcm92aWRlcwotICAgIHR3byBtZXRob2RzIGZvciBleGVjdXRpbmcgWFF1ZXJ5IGFuZCBYUGF0aCBleHByZXNzaW9ucywgYW5kIHR3byBkaWZmZXJpbmcKLSAgICB3YXlzIHRvIHVzZSB0aGVtLiBUaGUgbWV0aG9kcyBhcmUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+Ci0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGVjUXVlcnk8L3NwYW4+LCBhbmQgeW91IGNhbiBjYWxsIHRoZW0gZnJvbQotICAgIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5odG1sIj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPjwvYT4KLSAgICAob3IgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBpdCkgb3IgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+PC9hPi4KLSAgICBUaGUgcmVzdWx0cyBmb3IgdGhlIG1ldGhvZHMgZGlmZmVyIHNvbWV3aGF0LiA8L3A+Ci0gIDxoMj5Vc2luZyB0aGUgc2VsZWN0UGF0aCBNZXRob2Q8L2gyPgotPC9kaXY+Ci08ZGl2PgotICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IG1ldGhvZCBpcyB0aGUgbW9zdCBlZmZpY2llbnQKLSAgICB3YXkgdG8gZXhlY3V0ZSBYUGF0aCBleHByZXNzaW9ucy4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPgotICAgIG1ldGhvZCBpcyBvcHRpbWl6ZWQgZm9yIFhQYXRoLiBXaGVuIHlvdSB1c2UgWFBhdGggd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+Ci0gICAgbWV0aG9kLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYW4gYXJyYXkgb2YgdmFsdWVzIGZyb20gdGhlIDxlbT5jdXJyZW50IGRvY3VtZW50PC9lbT4uCi0gICAgSW4gY29udHJhc3QsIHdoZW4geW91IHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiwgdGhlIHZhbHVlCi0gICAgcmV0dXJuZWQgaXMgYSA8ZW0+bmV3IGRvY3VtZW50PC9lbT4uPC9wPgotICA8aDM+Q2FsbGluZyBmcm9tIFhtbE9iamVjdDwvaDM+Ci0gIDxwPldoZW4gY2FsbGVkIGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gKG9yIGEgdHlwZSB0aGF0Ci0gICAgaW5oZXJpdHMgZnJvbSBpdCksIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cy4gSWYgdGhlIGV4cHJlc3Npb24KLSAgICBpcyBleGVjdXRlZCBhZ2FpbnN0IHR5cGVzIGdlbmVyYXRlZCBmcm9tIHNjaGVtYSwgdGhlbiB0aGUgdHlwZSBmb3IgdGhlIHJldHVybmVkCi0gICAgYXJyYXkgaXMgb25lIG9mIHRoZSBKYXZhIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjaGVtYS4gPC9wPgotICA8cD5Gb3IgZXhhbXBsZSwgaW1hZ2luZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIFhNTCBjb250YWluaW5nIGVtcGxveWVlIGluZm9ybWF0aW9uLgotICAgIFlvdSd2ZSBjb21waWxlZCB0aGUgc2NoZW1hIGRlc2NyaWJpbmcgdGhpcyBYTUwgYW5kIHRoZSB0eXBlcyBnZW5lcmF0ZWQgZnJvbQotICAgIHNjaGVtYSBhcmUgYXZhaWxhYmxlIHRvIHlvdXIgY29kZS48L3A+Ci08cHJlPgotJmx0O3hxOmVtcGxveWVlcyB4bWxuczp4cT0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvc2VsZWN0UGF0aCZxdW90OyZndDsKLSAgICAmbHQ7eHE6ZW1wbG95ZWUmZ3Q7Ci0gICAgICAgICZsdDt4cTpuYW1lJmd0O0ZyZWQgSm9uZXMmbHQ7L3hxOm5hbWUmZ3Q7Ci0gICAgICAgICZsdDt4cTphZGRyZXNzIGxvY2F0aW9uPSZxdW90O2hvbWUmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6c3RyZWV0Jmd0OzkwMCBBdXJvcmEgQXZlLiZsdDsveHE6c3RyZWV0Jmd0OwotICAgICAgICAgICAgJmx0O3hxOmNpdHkmZ3Q7U2VhdHRsZSZsdDsveHE6Y2l0eSZndDsKLSAgICAgICAgICAgICZsdDt4cTpzdGF0ZSZndDtXQSZsdDsveHE6c3RhdGUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6emlwJmd0Ozk4MTE1Jmx0Oy94cTp6aXAmZ3Q7Ci0gICAgICAgICZsdDsveHE6YWRkcmVzcyZndDsKLSAgICAgICAgJmx0O3hxOmFkZHJlc3MgbG9jYXRpb249JnF1b3Q7d29yayZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDt4cTpzdHJlZXQmZ3Q7MjAxMSAxNTJuZCBBdmVudWUgTkUmbHQ7L3hxOnN0cmVldCZndDsKLSAgICAgICAgICAgICZsdDt4cTpjaXR5Jmd0O1JlZG1vbmQmbHQ7L3hxOmNpdHkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6c3RhdGUmZ3Q7V0EmbHQ7L3hxOnN0YXRlJmd0OwotICAgICAgICAgICAgJmx0O3hxOnppcCZndDs5ODA1MiZsdDsveHE6emlwJmd0OwotICAgICAgICAmbHQ7L3hxOmFkZHJlc3MmZ3Q7Ci0gICAgICAgICZsdDt4cTpwaG9uZSBsb2NhdGlvbj0mcXVvdDt3b3JrJnF1b3Q7Jmd0Oyg0MjUpNTU1LTU2NjUmbHQ7L3hxOnBob25lJmd0OwotICAgICAgICAmbHQ7eHE6cGhvbmUgbG9jYXRpb249JnF1b3Q7aG9tZSZxdW90OyZndDsoMjA2KTU1NS01NTU1Jmx0Oy94cTpwaG9uZSZndDsKLSAgICAgICAgJmx0O3hxOnBob25lIGxvY2F0aW9uPSZxdW90O21vYmlsZSZxdW90OyZndDsoMjA2KTU1NS00MzIxJmx0Oy94cTpwaG9uZSZndDsKLSAgICAmbHQ7L3hxOmVtcGxveWVlJmd0OwotJmx0Oy94cTplbXBsb3llZXMmZ3Q7Ci08L3ByZT4KLSAgSWYgeW91IHdhbnRlZCB0byBmaW5kIHRoZSBwaG9uZSBudW1iZXJzIHdob3NlIGFyZWEgY29kZSB3YXMgMjA2LCB5b3UgY291bGQgY2FwdHVyZQotICB0aGUgWFBhdGggZXhwcmVzc2lvbiBpbiB0aGlzIHdheToKLSAgPHByZT4KLVN0cmluZyBxdWVyeUV4cHJlc3Npb24gPQotICAgICZxdW90O2RlY2xhcmUgbmFtZXNwYWNlIHhxPSdodHRwOi8vb3BlbnVyaS5vcmcvc2VsZWN0UGF0aCcmcXVvdDsgKwotICAgICZxdW90OyR0aGlzL3hxOmVtcGxveWVlcy94cTplbXBsb3llZS94cTpwaG9uZVtjb250YWlucyguLCAnKDIwNiknKV0mcXVvdDsKLTwvcHJlPgotICA8cD5Ob3RpY2UgaW4gdGhlIHF1ZXJ5IGV4cHJlc3Npb24gdGhhdCB0aGUgdmFyaWFibGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPiR0aGlzPC9zcGFuPgotICAgIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29udGV4dCBub2RlICh0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4KLSAgICB0aGF0IHlvdSBhcmUgcXVlcnlpbmcgZnJvbSkuIEluIHRoaXMgZXhhbXBsZSB5b3UgYXJlIHF1ZXJ5aW5nIGZyb20gdGhlIGRvY3VtZW50Ci0gICAgbGV2ZWwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4uPC9wPgotICA8cD5Zb3UgY291bGQgdGhlbiBwcmludCB0aGUgcmVzdWx0cyB3aXRoIGNvZGUgc3VjaCBhcyB0aGUgZm9sbG93aW5nOjwvcD4KLSAgPHByZT4KLS8qCi0gKiBSZXRyaWV2ZSB0aGUgbWF0Y2hpbmcgcGhvbmUgZWxlbWVudHMgYW5kIGFzc2lnbiB0aGUgcmVzdWx0cyB0byB0aGUgY29ycmVzcG9uZGluZwotICogZ2VuZXJhdGVkIHR5cGUuCi0gKi8KLVBob25lVHlwZVtdIHBob25lcyA9IChQaG9uZVR5cGVbXSllbXBEb2Muc2VsZWN0UGF0aChxdWVyeUV4cHJlc3Npb24pOwotLyoKLSAqIExvb3AgdGhyb3VnaCB0aGUgcmVzdWx0cywgcHJpbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBwaG9uZSBlbGVtZW50LgotICovCi1mb3IgKGludCBpID0gMDsgaSA8IHBob25lcy5sZW5ndGg7IGkrKykKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGhvbmVzW2ldLnN0cmluZ1ZhbHVlKCkpOwotfSAgPC9wcmU+Ci0KLSAgPGgzPkNhbGxpbmcgZnJvbSBYbWxDdXJzb3I8L2gzPgotICA8cD5XaGVuIGNhbGxlZCBmcm9tIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGluc3RhbmNlLCB0aGUKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4gbWV0aG9kIHJldHJpZXZlcyBhIGxpc3Qgb2Ygc2VsZWN0aW9ucywKLSAgICBvciBsb2NhdGlvbnMgaW4gdGhlIFhNTC4gVGhlIHNlbGVjdGlvbnMgYXJlIHJlbWVtYmVyZWQgYnkgdGhlIGN1cnNvciBpbnN0YW5jZS4KLSAgICBZb3UgY2FuIHVzZSBtZXRob2RzIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvTmV4dFNlbGVjdGlvbjwvc3Bhbj4KLSAgICB0byBuYXZpZ2F0ZSBhbW9uZyB0aGVtLjwvcD4KLSAgPGRpdj4KLSAgICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IG1ldGhvZCB0YWtlcyBhbiBYUGF0aCBleHByZXNzaW9uLgotICAgICAgSWYgdGhlIGV4cHJlc3Npb24gcmV0dXJucyBhbnkgcmVzdWx0cywgZWFjaCBvZiB0aG9zZSByZXN1bHRzIGlzIGFkZGVkIGFzCi0gICAgICBhIHNlbGVjdGlvbiB0byB0aGUgY3Vyc29yJ3MgbGlzdCBvZiBzZWxlY3Rpb25zLiBZb3UgY2FuIG1vdmUgdGhyb3VnaCB0aGVzZQotICAgICAgc2VsZWN0aW9ucyBpbiB0aGUgd2F5IHlvdSBtaWdodCB1c2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmphdmEudXRpbC5JdGVyYXRvcjwvc3Bhbj4KLSAgICAgIG1ldGhvZHMgdG8gbW92ZSB0aHJvdWdoIGEgY29sbGVjdGlvbi48L3A+Ci0gICAgPHA+IEZvciBleGFtcGxlLCBmb3IgYSBwYXRoIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPiR0aGlzL2VtcGxveWVlcy9lbXBsb3llZTwvc3Bhbj4sCi0gICAgICB0aGUgcmVzdWx0cyB3b3VsZCBpbmNsdWRlIGEgc2VsZWN0aW9uIGZvciBlYWNoIGVtcGxveWVlIGVsZW1lbnQgZm91bmQgYnkKLSAgICAgIHRoZSBleHByZXNzaW9uLiBOb3RlIHRoYXQgdGhlIHZhcmlhYmxlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpczwvc3Bhbj4KLSAgICAgIGlzIGFsd2F5cyBib3VuZCB0byB0aGUgY3VycmVudCBjb250ZXh0IG5vZGUsIHdoaWNoIGluIHRoaXMgZXhhbXBsZSBpcyB0aGUKLSAgICAgIGRvY3VtZW50LiBBZnRlciBjYWxsaW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4gbWV0aG9kLAotICAgICAgeW91IHdvdWxkIHVzZSB2YXJpb3VzICZxdW90O3NlbGVjdGlvbiZxdW90Oy1yZWxhdGVkIG1ldGhvZHMgdG8gd29yayB3aXRoCi0gICAgICB0aGUgcmVzdWx0cy4gVGhlc2UgbWV0aG9kcyBpbmNsdWRlOjwvcD4KLSAgPC9kaXY+Ci0gIDx1bD4KLSAgICA8bGk+Ci0gICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRTZWxlY3Rpb25Db3VudCgpIDwvc3Bhbj50byByZXRyaWV2ZSB0aGUKLSAgICAgICAgbnVtYmVyIG9mIHNlbGVjdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5LjwvZGl2PgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgPGRpdj4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvTmV4dFNlbGVjdGlvbigpPC9zcGFuPiB0byBtb3ZlIHRoZSBjdXJzb3IKLSAgICAgICAgdG8gdGhlIG5leHQgc2VsZWN0aW9uIGluIHRoZSBsaXN0IChzdWNoIGFzIHRvIHRoZSBvbmUgcG9pbnRpbmcgYXQgdGhlCi0gICAgICAgIG5leHQgZW1wbG95ZWUgZWxlbWVudCBmb3VuZCkuPC9kaXY+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICA8ZGl2PiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9TZWxlY3Rpb24oaW50KTwvc3Bhbj4gdG8gbW92ZSB0aGUgY3Vyc29yCi0gICAgICAgIHRvIHRoZSBzZWxlY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBpbmRleCAoc3VjaCBhcyB0byB0aGUgdGhpcmQgZW1wbG95ZWUKLSAgICAgICAgZWxlbWVudCBpbiB0aGUgc2VsZWN0aW9uKS48L2Rpdj4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIDxkaXY+IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5oYXNOZXh0U2VsZWN0aW9uKCk8L3NwYW4+IHRvIGZpbmQgb3V0IGlmCi0gICAgICAgIHRoZXJlIGFyZSBtb3JlIHNlbGVjdGlvbnMgYWZ0ZXIgdGhlIGN1cnNvcidzIGN1cnJlbnQgcG9zaXRpb24uPC9kaXY+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4gY2xlYXJTZWxlY3Rpb25zKCk8L3NwYW4+IGNsZWFycyB0aGUgc2VsZWN0aW9ucwotICAgICAgICBmcm9tIHRoZSBjdXJyZW50IGN1cnNvci4gVGhpcyBkb2Vzbid0IG1vZGlmeSB0aGUgZG9jdW1lbnQgKGluIG90aGVyIHdvcmRzLAotICAgICAgICBpdCBkb2Vzbid0IGRlbGV0ZSB0aGUgc2VsZWN0ZWQgWE1MKTsgaXQgbWVyZWx5IGNsZWFycyB0aGUgc2VsZWN0aW9uIGxpc3QKLSAgICAgICAgc28gdGhhdCB0aGUgY3Vyc29yIGlzIG5vIGxvbmdlciBrZWVwaW5nIHRyYWNrIG9mIHRob3NlIHBvc2l0aW9ucy48L2Rpdj4KLSAgICA8L2xpPgotICA8L3VsPgotICA8ZGl2PgotICAgIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgeW91IG1pZ2h0IHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4sCi0gICAgICBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+Ci0gICAgICBtZXRob2RzLCB0byBtYW5ldXZlciB0aHJvdWdoIFhNTCwgcmV0cmlldmluZyBzcGVjaWZpYyB2YWx1ZXMuIDwvcD4KLSAgICA8cHJlPgotcHVibGljIHZvaWQgcHJpbnRaaXBzQW5kV29ya1Bob25lcyhYbWxPYmplY3QgeG1sKQotewotICAgIC8vIERlY2xhcmUgdGhlIG5hbWVzcGFjZSB0aGF0IHdpbGwgYmUgdXNlZC4KLSAgICBTdHJpbmcgeHFOYW1lc3BhY2UgPQotICAgICAgICAmcXVvdDtkZWNsYXJlIG5hbWVzcGFjZSB4cT0naHR0cDovL29wZW51cmkub3JnL3NlbGVjdFBhdGgnJnF1b3Q7OwotCi0gICAgLy8gSW5zZXJ0IGEgY3Vyc29yIGFuZCBtb3ZlIGl0IHRvIHRoZSBmaXJzdCBlbGVtZW50LgotICAgIFhtbEN1cnNvciBjdXJzb3IgPSB4bWwubmV3Q3Vyc29yKCk7Ci0gICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgY3Vyc29yJ3MgY3VycmVudCBsb2NhdGlvbiBieSBwdXNoaW5nIGl0Ci0gICAgICogb250byBhIHN0YWNrIG9mIHNhdmVkIGxvY2F0aW9ucy4KLSAgICAgKi8KLSAgICBjdXJzb3IucHVzaCgpOwotICAgIC8vIFF1ZXJ5IGZvciB6aXAgZWxlbWVudHMuCi0gICAgY3Vyc29yLnNlbGVjdFBhdGgoeHFOYW1lc3BhY2UgKyAmcXVvdDskdGhpcy8veHE6emlwJnF1b3Q7KTsKLSAgICAvKgotICAgICAqIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBzZWxlY3Rpb25zLCBnZXR0aW5nIHRoZSB2YWx1ZSBvZgotICAgICAqIGVhY2ggZWxlbWVudC4KLSAgICAgKi8KLSAgICB3aGlsZSAoY3Vyc29yLnRvTmV4dFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGN1cnNvci5nZXRUZXh0VmFsdWUoKSk7Ci0gICAgfQotICAgIC8vIFBvcCB0aGUgc2F2ZWQgbG9jYXRpb24gb2ZmIHRoZSBzdGFjay4KLSAgICBjdXJzb3IucG9wKCk7Ci0gICAgLy8gUXVlcnkgYWdhaW4gZnJvbSB0aGUgdG9wLCB0aGlzIHRpbWUgZm9yIHdvcmsgcGhvbmUgbnVtYmVycy4KLSAgICBjdXJzb3Iuc2VsZWN0UGF0aCh4cU5hbWVzcGFjZSArICZxdW90OyR0aGlzLy94cTpwaG9uZVtAbG9jYXRpb249J3dvcmsnXSZxdW90Oyk7Ci0gICAgLyoKLSAgICAgKiBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IHNlbGVjdGlvbiwgdGhlbSBwcmludCB0aGF0IGVsZW1lbnQncwotICAgICAqIHZhbHVlLgotICAgICAqLwotICAgIGN1cnNvci50b05leHRTZWxlY3Rpb24oKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3Vyc29yLmdldFRleHRWYWx1ZSgpKTsKLSAgICAvLyBEaXNwb3NlIG9mIHRoZSBjdXJzb3IuCi0gICAgY3Vyc29yLmRpc3Bvc2UoKTsKLX0KLTwvcHJlPgotICAgIDxwPlVzaW5nIHNlbGVjdGlvbnMgaXMgc29tZXdoYXQgbGlrZSB0cmFja2luZyB0aGUgbG9jYXRpb25zIG9mIG11bHRpcGxlIGN1cnNvcnMKLSAgICAgIHdpdGggYSBzaW5nbGUgY3Vyc29yLiBUaGlzIGJlY29tZXMgZXNwZWNpYWxseSBjbGVhciB3aGVuIHlvdSByZW1vdmUgdGhlCi0gICAgICBYTUwgYXNzb2NpYXRlZCB3aXRoIGEgc2VsZWN0aW9uLiBXaGVuIHlvdSBkbyBzbyB0aGUgc2VsZWN0aW9uIGl0c2VsZiByZW1haW5zCi0gICAgICBhdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlbW92ZWQgWE1MIHdhcywgYnV0IG5vdyB0aGUgc2VsZWN0aW9uJ3MgbG9jYXRpb24KLSAgICAgIGlzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgWE1MIHRoYXQgd2FzIGFmdGVyIHRoZSBYTUwgeW91IHJlbW92ZWQuIEluIG90aGVyCi0gICAgICB3b3JkcywgcmVtb3ZpbmcgWE1MIGNyZWF0ZWQgYSBraW5kIG9mIHZhY3V1bSB0aGF0IHdhcyBmaWxsZWQgYnkgdGhlIFhNTAotICAgICAgYWZ0ZXIgaXQsIHdoaWNoIHNoaWZ0ZWQgdXAgaW50byB0aGUgc3BhY2UgJiM4MjEyOyB1cCBpbnRvIHBvc2l0aW9uIGltbWVkaWF0ZWx5Ci0gICAgICBhZnRlciB0aGUgc2VsZWN0aW9uIGxvY2F0aW9uLiBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgaWYgdGhlIHNlbGVjdGlvbgotICAgICAgaGFkIGJlZW4gYW5vdGhlciBjdXJzb3IuPC9wPgotICAgIDxwPkZpbmFsbHksIHdoZW4gdXNpbmcgc2VsZWN0aW9ucyBrZWVwIGluIG1pbmQgdGhhdCB0aGUgbGlzdCBvZiBzZWxlY3Rpb25zCi0gICAgICBpcyBpbiBhIHNlbnNlICZxdW90O2xpdmUmcXVvdDsuIFRoZSBjdXJzb3IgeW91J3JlIHdvcmtpbmcgd2l0aCBpcyBrZWVwaW5nCi0gICAgICB0cmFjayBvZiB0aGUgc2VsZWN0aW9ucyBpbiB0aGUgbGlzdC4gSW4gb3RoZXIgd29yZHMsIGJlIHN1cmUgdG8gY2FsbCB0aGUKLSAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jbGVhclNlbGVjdGlvbnM8L3NwYW4+IG1ldGhvZCB3aGVuIHlvdSdyZSBmaW5pc2hlZAotICAgICAgd2l0aCB0aGUgc2VsZWN0aW9ucywganVzdCBhcyB5b3Ugc2hvdWxkIGNhbGwgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3IuZGlzcG9zZSgpPC9zcGFuPgotICAgICAgbWV0aG9kIHdoZW4geW91J3JlIGZpbmlzaGVkIHVzaW5nIHRoZSBjdXJzb3IuPC9wPgotICA8L2Rpdj4KLSAgPGgyPlVzaW5nIHRoZSBleGVjUXVlcnkgTWV0aG9kPC9oMj4KLSAgPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiBtZXRob2QgdG8gZXhlY3V0ZSBYUXVlcnkKLSAgICBleHByZXNzaW9ucyB0aGF0IGFyZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdGhhbiBwYXRocy4gVGhlc2UgZXhwcmVzc2lvbnMgaW5jbHVkZQotICAgIG1vcmUgc29waGlzdGljYXRlZCBsb29wcyBhbmQgRkxXUiAoRm9yLCBMZXQsIFdoZXJlLCBhbmQgUmVzdWx0cykgZXhwcmVzc2lvbnMuCi0gIDwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEJlIHN1cmUgdG8gc2VlIHRoZSBzaW1wbGVFeHByZXNzaW9ucwotICAgIHNhbXBsZSBpbiB0aGUgU2FtcGxlc0FwcCBhcHBsaWNhdGlvbiBmb3IgYSBzYW1wbGluZyBvZiBYUXVlcnkgZXhwcmVzc2lvbnMKLSAgICBpbiB1c2UuPC9wPgotICA8aDM+Q2FsbGluZyBmcm9tIFhtbE9iamVjdDwvaDM+Ci0gIDxwPlVubGlrZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4sIGNhbGxpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4KLSAgICBmcm9tIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IGluc3RhbmNlIHdpbGwgcmV0dXJuIGFuCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gYXJyYXkuIElmIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPgotICAgIGluc3RhbmNlcyByZXN1bHRpbmcgZnJvbSB0aGUgWFF1ZXJ5IG1hdGNoIGEgcmVjb2duaXplZCBYTUxCZWFucyB0eXBlICh0aGUKLSAgICBuYW1lc3BhY2UgYW5kIHRvcCBsZXZlbCBlbGVtZW50IG5hbWUgbWF0Y2ggdXAgd2l0aCBhbiBYTUxCZWFucyB0eXBlKSB0aGVuCi0gICAgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IHdpbGwgYmUgdHlwZWQ7IG90aGVyd2lzZSB0aGUKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiB3aWxsIGJlIHVudHlwZWQuPC9wPgotICA8aDM+Q2FsbGluZyBmcm9tIFhtbEN1cnNvcjwvaDM+Ci08L2Rpdj4KLQotPGRpdj4KLSAgPHA+Q2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiBmcm9tIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+Ci0gICAgaW5zdGFuY2UgcmV0dXJucyBhIG5ldyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnN0YW5jZS4KLSAgICBUaGUgY3Vyc29yIHJldHVybmVkIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyB4bWwgZG9jdW1lbnQgcmVwcmVzZW50aW5nCi0gICAgdGhlIHF1ZXJ5IHJlc3VsdHMsIGFuZCB5b3UgY2FuIHVzZSBpdCB0byBtb3ZlIHRocm91Z2ggdGhlIHJlc3VsdHMsIGN1cnNvci1zdHlsZQotICAgIChmb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImNvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sIj5OYXZpZ2F0aW5nCi0gICAgWE1MIHdpdGggQ3Vyc29yczwvYT4pLiBJZiB0aGUgZG9jdW1lbnQgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5IGV4ZWN1dGlvbgotICAgIHJlcHJlc2VudHMgYSByZWNvZ25pemVkIFhNTEJlYW5zIHR5cGUgKHRoZSBuYW1lc3BhY2UgYW5kIHRvcCBsZXZlbCBlbGVtZW50Ci0gICAgbmFtZSBtYXRjaCB1cCB3aXRoIGFuIFhNTEJlYW5zIHR5cGUpIHRoZW4gdGhlIGRvY3VtZW50IHJlc3VsdGluZyBmcm9tIHRoZQotICAgIHhxdWVyeSB3aWxsIGhhdmUgdGhhdCBKYXZhIHR5cGU7IG90aGVyd2lzZSB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHdpbGwgYmUKLSAgICB1bnR5cGVkLjwvcD4KLSAgPGgyPlJlbGF0ZWQgVG9waWNzPC9oMj4KLTwvZGl2PgotPHA+PGEgaHJlZj0iY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCI+R2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2E+PC9wPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3MmMwNy4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2NvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgotPGRpdiBpZD10b3BpY3RpdGxlPgotICA8cCBjbGFzcz1UaXRsZT5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L3A+Ci08L2Rpdj4KLTxkaXYgaWQ9dG9waWN0ZXh0PgotICA8cD5BbiBYTUwgY3Vyc29yIChhbiBpbnN0YW5jZSBvZiB0aGUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+PC9hPgotICAgIGludGVyZmFjZSkgbW92ZXMgZnJvbSB0b2tlbiB0byB0b2tlbiBhcyB5b3VyIGNvZGUgbW92ZXMgdGhlIGN1cnNvci4gV2hlbiB5b3UKLSAgICBtb3ZlIGEgY3Vyc29yIHVzaW5nIGEgbWV0aG9kIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvUGFyZW50PC9zcGFuPiwKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9GaXJzdEF0dHJpYnV0ZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1ByZXZTaWJsaW5nPC9zcGFuPiwKLSAgICBhbmQgc28gb24sIHRoZSBjdXJzb3IgbW92ZXMgdG8gdGhlIHRva2VuIGZpdHRpbmcgdGhlIGRlc2NyaXB0aW9uLiBJZiB0aGVyZQotICAgIGlzIG5vIGFwcHJvcHJpYXRlIHRva2VuIHRvIG1vdmUgdG8sIHRoZSBjdXJzb3IgcmVtYWlucyB3aGVyZSBpdCBpcywgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5mYWxzZTwvc3Bhbj4KLSAgICBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGRpZG4ndCBtb3ZlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnNvciBpcwotICAgIGF0IHRoZSBFTkRET0MgdG9rZW4gKHRoZSBsYXN0IHRhZyBpbiB0aGUgZG9jdW1lbnQpLCBhIGNhbGwgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b05leHRTaWJsaW5nPC9zcGFuPgotICAgIG1ldGhvZCB3aWxsIG5vdCBtb3ZlIHRoZSBjdXJzb3IgYW5kIHdpbGwgcmV0dXJuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5mYWxzZTwvc3Bhbj4KLSAgICB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtb3ZlIHdhcyB1bnN1Y2Nlc3NmdWwuPC9wPgotICA8cD5Ob3RlIHRoYXQgd2hpbGUgeW91IGNhbiBjYWxsIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yLmN1cnJlbnRUb2tlblR5cGU8L3NwYW4+Ci0gICAgbWV0aG9kIHRvIGZpbmQgb3V0IHdoaWNoIHRva2VuIHR5cGUgdGhlIGN1cnNvciBpcyBhdCwgeW91IG1pZ2h0IGZpbmQgaXQgbW9yZQotICAgIGNvbnZlbmllbnQgdG8gdXNlIGEgbWV0aG9kIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmlzRW5kZG9jPC9zcGFuPi4KLSAgICBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlIHByb3ZpZGVzIHNldmVyYWwgbWV0aG9kcwotICAgIHRoYXQgbWFrZSBpdCBlYXN5IHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIGN1cnNvciB5b3UncmUgbW92aW5nIGlzIGF0IHRoZSB0b2tlbgotICAgIHlvdSdyZSBsb29raW5nIGZvci4gVGhlc2UgbWV0aG9kcywgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXNTdGFydDwvc3Bhbj4sCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmlzQXR0cjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pc1RleHQ8L3NwYW4+LAotICAgIGFuZCBzbyBvbiwgcmV0dXJuIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJvb2xlYW48L3NwYW4+IHZhbHVlIHRoYXQgaW5kaWNhdGVzCi0gICAgd2hldGhlciB0aGUgY3Vyc29yIGlzIGF0IHRoZSB0b2tlbiB0eXBlIGluIHF1ZXN0aW9uLjwvcD4KLSAgPFA+VG9rZW5zIGFyZSByZXByZXNlbnRlZCBieSBjb25zdGFudHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuVG9rZW5UeXBlLmh0bWwiPlRva2VuVHlwZTwvYT48L3NwYW4+Ci0gICAgY2xhc3MsIGFuIGlubmVyIGNsYXNzIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UuCi0gICAgRWFjaCBoYXMgYSBjb25zdGFudCB5b3UgY2FuIHVzZSBpbiBzd2l0Y2ggc3RhdGVtZW50cyB0byBwZXJmb3JtIGJ5LXRva2VuIGFjdGlvbnMuCi0gICAgVGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgdG9rZW4gdHlwZXM6PC9QPgotICA8VEFCTEUgaWQ9IlRhYmxlMSI+Ci0gICAgPFRSPgotICAgICAgPFREPjxTVFJPTkc+VG9rZW4gVHlwZTwvU1RST05HPjwvVEQ+Ci0gICAgICA8VEQ+PFNUUk9ORz5Td2l0Y2ggQ29uc3RhbnQ8L1NUUk9ORz48L1REPgotICAgICAgPFREPjxTVFJPTkc+RGVzY3JpcHRpb248L1NUUk9ORz48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPgotICAgICAgPFREPlNUQVJURE9DPC9URD4KLSAgICAgIDxURD5JTlRfU1RBUlRET0M8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIHRoZSBYTUwuIEFsd2F5cyB0aGUgZmlyc3QgdG9rZW4uIFRoZSBkb2N1bWVudAotICAgICAgICBlbGVtZW50IGl0c2VsZiBpcyByZXByZXNlbnRlZCBieSBhIFNUQVJUIHRva2VuLCBub3QgdGhlIFNUQVJURE9DIHRva2VuLjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+Ci0gICAgICA8VEQ+RU5ERE9DIDwvVEQ+Ci0gICAgICA8VEQ+SU5UX0VORERPQzwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBYTUwuIEFsd2F5cyB0aGUgbGFzdCB0b2tlbi48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPgotICAgICAgPFREPlNUQVJUIDwvVEQ+Ci0gICAgICA8VEQ+SU5UX1NUQVJUPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+Ci0gICAgICA8VEQ+RU5EIDwvVEQ+Ci0gICAgICA8VEQ+SU5UX0VORDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuIFRoZSBFTkQgdG9rZW4gaGFzIG5vIHZhbHVlLCBidXQgbWFya3MKLSAgICAgICAgdGhlIGVsZW1lbnQncyBlbmQuPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4KLSAgICAgIDxURD5URVhUPC9URD4KLSAgICAgIDxURD5JTlRfVEVYVDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyB0ZXh0LjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+Ci0gICAgICA8VEQ+QVRUUiA8L1REPgotICAgICAgPFREPklOVF9BVFRSPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIGFuIGF0dHJpYnV0ZS4gQVRUUiB0b2tlbnMgYXJlIGFsbG93ZWQgdG8gYXBwZWFyIGFmdGVyIGEgU1RBUlRET0MKLSAgICAgICAgb3IgU1RBUlQgdG9rZW4uPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4KLSAgICAgIDxURD5OQU1FU1BBQ0U8L1REPgotICAgICAgPFREPklOVF9OQU1FU1BBQ0U8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgYSBuYW1lc3BhY2UgKHhtbG5zKSBhdHRyaWJ1dGUuIEFsc28gb25seSBhbGxvd2VkIGFmdGVyIFNUQVJUCi0gICAgICAgIG9yIFNUQVJURE9DIHRva2Vucy48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPgotICAgICAgPFREPkNPTU1FTlQgPC9URD4KLSAgICAgIDxURD5JTlRfQ09NTUVOVDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyBhIGNvbW1lbnQuPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4KLSAgICAgIDxURD5QUk9DSU5TVCA8L1REPgotICAgICAgPFREPklOVF9QUk9DSU5TVDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uPC9URD4KLSAgICA8L1RSPgotICA8L1RBQkxFPgotICA8UD5BcyB5b3UgdXNlIGEgY3Vyc29yIHRvIG5hdmlnYXRlIHRocm91Z2ggWE1MLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGNvbnZlbmllbmNlCi0gICAgbWV0aG9kcyBkZXNjcmliZWQgYWJvdmUgdG8gZGlzY292ZXIgd2hldGhlciB5b3UncmUgYXQgdGhlIHRva2VuIHlvdSdyZSBsb29raW5nCi0gICAgZm9yLCBvciB1c2UgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3IuY3VycmVudFRva2VuVHlwZTwvc3Bhbj4mbmJzcDttZXRob2QKLSAgICB0byBkaXNjb3ZlciB0aGUgY3VycmVudCB0b2tlbidzIHR5cGUuIFRoZSBmb2xsb3dpbmcgZmlndXJlIGlsbHVzdHJhdGVzIGV4YW1wbGUKLSAgICBsb2NhdGlvbnMgZm9yIHRva2VuIHR5cGVzOjwvUD4KLSAgPFA+PElNRyBzcmM9Ii4uL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYiIHdpZHRoPSI3MjciIGhlaWdodD0iNTMyIj4KLSAgPGgyPlN3aXRjaGluZyB0byBUZXN0IGZvciBUb2tlbiBUeXBlczwvaDI+Ci0gIDxwPkhlcmUncyBhIGJpdCBvZiBjb2RlIGlsbHVzdHJhdGluZyBob3cgeW91IG1pZ2h0IHVzZSBhIEphdmEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnN3aXRjaDwvc3Bhbj4KLSAgICBzdGF0ZW1lbnQgdG8gdGVzdCBmb3IgdGhlIFNUQVJUIHRva2VuIHR5cGUuPC9wPgotICA8cHJlPgotLy8gVGFrZSBhbiBpbmNvbWluZyBYbWxPYmplY3QgYW5kIGluc2VydCBhIGN1cnNvci4KLVhtbEN1cnNvciBkb2N1bWVudEN1cnNvciA9IHhtbERvYy5uZXdDdXJzb3IoKTsKLQotLyoKLSAqIExvb3AgdGhyb3VnaCB0aGUgZG9jdW1lbnQsIHBhc3NpbmcgdGhlIGN1cnNvciB3aGVuIGl0IHN0b3BzIGF0IGVhY2ggdG9rZW4KLSAqIHRvIGEgZnVuY3Rpb24gZGVzaWduZWQgdG8gZGlzY292ZXIgdGhlIHRva2VuIHR5cGUuIENvbnRpbnVlIHRoZSBsb29wCi0gKiBhcyBsb25nIGF0IHRoZSBjdXJzb3IgaXMgYXQgYSB0b2tlbiAodW50aWwgaXQgcmVhY2hlcyB0aGUgZW5kKS4KLSAqLwotd2hpbGUgKCFkb2N1bWVudEN1cnNvci50b05leHRUb2tlbigpLmlzTm9uZSgpKQotewotICAgIC8qCi0gICAgICogVXNlIHRoZSBpbnRWYWx1ZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBpbnQgY29ycmVzcG9uZGluZyB0byB0aGUKLQkgKiBjdXJyZW50IHRva2VuIHR5cGUuIElmIGl0IGlzIHRoZSB2YWx1ZSBmb3IgSU5UX1NUQVJULAotCSAqIHRoZW4geW91IGhhdmUgYSBtYXRjaC4KLQkgKi8KLSAgICBzd2l0Y2ggKGN1cnNvci5jdXJyZW50VG9rZW5UeXBlKCkuaW50VmFsdWUoKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9TVEFSVDoKLSAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSB0b2tlbiB0eXBlIGFuZCBhIG1lc3NhZ2UuCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuY3VycmVudFRva2VuVHlwZSgpICsKLSAgICAgICAgICAgICI7IGN1cnNvciBpcyBhdCB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotLy8gQmUgc3VyZSB0byBkaXNwb3NlIG9mIGEgY3Vyc29yIHdoZW4geW91J3JlIGZpbmlzaGVkLgotZG9jdW1lbnRDdXJzb3IuZGlzcG9zZSgpOwotPC9wcmU+Ci0gIDxwPlRoZSBzY29wZSBvZiBhbiBYTUwgY3Vyc29yIGlzIHRoZSBYTUwgZG9jdW1lbnQgaW4gd2hpY2ggaXQgaXMgY3JlYXRlZC4gRm9yCi0gICAgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYSBjdXJzb3IgYXQgdGhlIG9yZGVySXRlbSBlbGVtZW50IGluIHRoZSBleGFtcGxlIGVhcmxpZXIKLSAgICBpbiB0aGlzIHRvcGljLiBJZiB5b3UgdGhlbiB1c2UgdGhhdCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPgotICAgIGluc3RhbmNlJ3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvTmV4dFRva2VuPC9zcGFuPiBtZXRob2QgdG8gbW92ZSB0aGUKLSAgICBjdXJzb3IgdW50aWwgaXQgd29uJ3QgbW92ZSBhbnkgZnVydGhlciwgeW91J2xsIGhhdmUgcmVhY2hlZCB0aGUgRU5ERE9DIHRva2VuLgotICAgIEluIHRoaXMgZXhhbXBsZSwgdGhhdCdzIGF0IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Jmx0Oy9iYXRjaFdpZGdldE9yZGVyJmd0Ozwvc3Bhbj4KLSAgICB0YWcuIEluIG90aGVyIHdvcmRzLCB0aGUgY3Vyc29yJ3Mgc2NvcGUgaXMgbm90IGxpbWl0ZWQgdG8gdGhlIGVsZW1lbnQgYXQgd2hpY2gKLSAgICBpdCB3YXMgY3JlYXRlZC48L3A+Ci0gIDxwIGNsYXNzPXJlbGF0ZWR0b3BpY3M+UmVsYXRlZCBUb3BpY3M8L3A+Ci0gIDxwPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5Ub2tlblR5cGUuaHRtbCI+WG1sQ3Vyc29yLlRva2VuVHlwZQotICAgIENsYXNzPC9hPjwvcD4KLSAgPHA+PGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29yczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uVXNpbmdCb29rbWFya3NUb0Fubm90YXRlWE1MLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmM2QzLi4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uVXNpbmdCb29rbWFya3NUb0Fubm90YXRlWE1MLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT5Vc2luZyBCb29rbWFya3MgdG8gQW5ub3RhdGUgWE1MPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotCi0KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KLQotPG1ldGEgbmFtZT0iY29tcG9uZW50IiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgZGVzY3JpcHRpb24gbWV0YXRhZywgcGxlYXNlIHByb3ZpZGUgYSBCUklFRiBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIC0tPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBjb21wb25lbnQgbWV0YXRhZywgcGxlYXNlIGxpc3Qga2V5d29yZHMgdGhhdCB3aWxsIGhlbHAgYSB1c2VyIHNlYXJjaCBmb3IgdGhpcyB0b3BpYy4gLS0+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KLTxkaXYgaWQ9dG9waWN0aXRsZT4KLSAgPHAgY2xhc3M9VGl0bGU+VXNpbmcgQm9va21hcmtzIHRvIEFubm90YXRlIFhNTDwvcD4KLTwvZGl2PgotPGRpdiBpZD10b3BpY3RleHQ+Ci0gIDxwPllvdSBjYW4gdXNlIGEgY3Vyc29yIHRvIGluc2VydCBib29rbWFya3MgdGhhdCBhbm5vdGF0ZSBYTUwgd2l0aCBtYXJrZXJzIGNvbnRhaW5pbmcKLSAgICBpbmZvcm1hdGlvbiB5b3UgZGVzaWduLiBUaGVzZSBib29rbWFya3MgYXJlbid0IHdyaXR0ZW4gaW50byB0aGUgWE1MIGl0c2VsZiwKLSAgICBidXQgaW4gYSBzZW5zZSAiaGFuZyIgZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUgaXQgd2FzIGluc2VydGVkLiBJbiB0aGlzIHdheQotICAgIHlvdSBjYW4gYXNzb2NpYXRlIGFyYml0cmFyeSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gd2l0aCBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUKLSAgICBYTUwuPC9wPgotICA8UD5Zb3UgZGVzaWduIHlvdXIgb3duIGJvb2ttYXJrIGNsYXNzZXMgYnkgZXh0ZW5kaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuWG1sQm9va21hcmsuaHRtbCI+WG1sQm9va21hcms8L2E+PC9zcGFuPiwKLSAgICBhIG5lc3RlZCBjbGFzcyBvZiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPlhtbEN1cnNvcjwvYT48L3NwYW4+LgotICAgIFlvdSBjYW4gZGVzaWduIHlvdXIgYm9va21hcmsgY2xhc3MgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB5b3VyCi0gICAgbmVlZHMuIDwvUD4KLSAgPFA+SW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+T3JkZXJCb29rbWFyazwvc3Bhbj4gaXMKLSAgICBhbiBpbm5lciBjbGFzcyB0aGF0IGV4dGVuZHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvci5YbWxCb29rbWFyazwvc3Bhbj4uCi0gICAgSXQgbWVyZWx5IHN0b3JlcyBhIHBpZWNlIG9mIHRleHQuPC9QPgotICA8UFJFPgotLyoKLSAqIFRoZSBPcmRlckJvb2ttYXJrIGNsYXNzIGluY2x1ZGVzIGEgY29uc3RydWN0b3IgdGhyb3VnaCB3aGljaCB5b3Ugd2lsbAotICogaW5zZXJ0IHlvdXIgYm9va21hcmsncyBjb250ZW50LiBJdCBhbHNvIGluY2x1ZGVzIGdldCBhbmQgc2V0IG1ldGhvZHMKLSAqIHlvdSBjYW4gdXNlIHRvIHJldHJpZXZlIGFuZCBjaGFuZ2UgdGhlIGNvbnRlbnQuCi0gKi8KLXN0YXRpYyBjbGFzcyBPcmRlckJvb2ttYXJrIGV4dGVuZHMgWG1sQ3Vyc29yLlhtbEJvb2ttYXJrIHsKLSAgICBwdWJsaWMgT3JkZXJCb29rbWFyayAoU3RyaW5nIHRleHQpIHsgVEVYVCA9IHRleHQ7IH0KLSAgICBwdWJsaWMgU3RyaW5nIFRFWFQ7Ci0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeyByZXR1cm4gVEVYVDsgfQotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsgVEVYVCA9IG5ld1RleHQ7IH0KLX0KLTwvUFJFPgotICA8cD5Zb3UgY2FuIHVzZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0byBzdG9yZSBib29rbWFya3MgYXQgcGxhY2VzIGluIHlvdXIKLSAgICBYTUwuIFRoZSBmb2xsb3dpbmcgZXhjZXJwdCBvZiBjb2RlIGNyZWF0ZXMgYSBjdXJzb3IgYW5kIGFuIGluc3RhbmNlIG9mIHRoZQotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5PcmRlckJvb2ttYXJrPC9zcGFuPiBjbGFzcy4gVGhlbiBpdCB1c2VzIHRoZSBjdXJzb3IKLSAgICB0byBpbnNlcnQgdGhlIGJvb2ttYXJrIGF0IHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uLjwvcD4KLSAgPHByZT4KLSAgICBYbWxDdXJzb3Igb3JkZXJDdXJzb3IgPSB4bWxEb2MubmV3Q3Vyc29yKCk7Ci0gICAgT3JkZXJCb29rbWFyayB0aGlzQm9va21hcmsgPSBuZXcgT3JkZXJCb29rbWFyaygiZm9vIik7Ci0gICAgb3JkZXJDdXJzb3Iuc2V0Qm9va21hcmsodGhpc0Fubm90YXRpb24pOwotPC9wcmU+Ci0gIDxwIGNsYXNzPXJlbGF0ZWR0b3BpY3M+UmVsYXRlZCBUb3BpY3M8L3A+Ci0gIDxwPjxhIGhyZWY9ImNvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sIj5OYXZpZ2F0aW5nIFhNTCB3aXRoIEN1cnNvcnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2NvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmZGIxNi4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2NvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLTwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KLQotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPkphdmEgVHlwZXMgZm9yIFhNTCBTY2hlbWE8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9InlvdXIgbmFtZSI+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIj4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KLTxtZXRhIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCIgY29udGVudD0iMTAvMjUvMDIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KLTxoMT4gWE1MQmVhbnMgU3VwcG9ydCBmb3IgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9oMT4KLTxwPkp1c3QgYXMgd2l0aCB0eXBlcyBpbiBYTUwgc2NoZW1hLCB0aGUgWE1MQmVhbnMgdHlwZXMgYmFzZWQgb24gc2NoZW1hIGFyZSBhcnJhbmdlZAotICBpbiBhIGhpZXJhcmNoeS4gSW4gZ2VuZXJhbCwgdGhlIGhpZXJhcmNoeSBvZiBYTUxCZWFuIHR5cGVzIG1pcnJvcnMgdGhlIGhpZXJhcmNoeQotICBvZiB0aGUgc2NoZW1hIHR5cGVzIHRoZW1zZWx2ZXMuIFhNTCBzY2hlbWEgdHlwZXMgYWxsIGluaGVyaXQgZnJvbSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6YW55VHlwZTwvc3Bhbj4KLSAgKHdoaWNoIGlzIGF0IHRoZSByb290IG9mIHRoZSBoaWVyYXJjaHkpOyBYTUxCZWFucyB0eXBlcyBpbmhlcml0IGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4uPC9wPgotPHA+SW4gWE1MIHNjaGVtYSwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmFueVR5cGU8L3NwYW4+IGlzIHRoZSByb290IHR5cGUKLSAgZm9yIHR3byB0eXBlIGNhdGVnb3JpZXM6IGJ1aWx0LWluIGFuZCB1c2VyLWRlcml2ZWQuIEJ1aWx0LWluIHNjaGVtYSB0eXBlcyBhcmUKLSAgY29tbW9uIHR5cGVzIGRlZmluZWQgYnkgdGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbi4gVXNlci1kZXJpdmVkIHR5cGVzIGFyZQotICB0aG9zZSB5b3UgZGVmaW5lIGluIHlvdXIgc2NoZW1hLiBUaGlzIHRvcGljIGxpc3RzIHRoZSBidWlsdC1pbiB0eXBlcyBwcm92aWRlZAotICB3aXRoIFhNTEJlYW5zLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdXNlci1kZXJpdmVkIHR5cGVzIGFuZCB0aGUgSmF2YSB0eXBlcyBnZW5lcmF0ZWQKLSAgZnJvbSB0aGVtLCBzZWUgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEgVHlwZXMgR2VuZXJhdGVkCi0gIGZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvYT4uPC9wPgotPHA+VGhlIGZvbGxvd2luZyBmaWd1cmUgaWxsdXN0cmF0ZXMgdGhlIGhpZXJhcmNoeSBvZiB0eXBlcywgc2hvd2luZyBib3RoIGJ1aWx0LWluCi0gIHNjaGVtYSB0eXBlcyBhbmQgdGhlaXIgWE1MQmVhbnMgcGFyYWxsZWxzLiBOb3RpY2UsIHRvbywgdGhhdCBuZWFybHkgYWxsIG9mIHRoZQotICBidWlsdC1pbiB0eXBlcyBhcmUgYWxzbyBhdmFpbGFibGUgYXMgbmF0dXJhbCBKYXZhIHR5cGVzLjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvY29uWE1MVHlwZUhpZXJhcmNoeS5naWYiIHdpZHRoPSI4NjUiIGhlaWdodD0iODg3Ij4gPC9wPgotPGgxPkphdmEgVHlwZXMgUmVwcmVzZW50aW5nIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvaDE+Ci08cD5BcyB5b3UgY2FuIHNlZSBmcm9tIHRoZSBmaWd1cmUgYWJvdmUsIGFsbCA0NiBidWlsdC1pbiBzY2hlbWEgdHlwZXMgYXJlIHJlcHJlc2VudGVkCi0gIGJ5IGFuIFhNTEJlYW4gdHlwZSBwcm92aWRlZCB3aXRoIFhNTEJlYW5zLiBXaGVuIHVzaW5nIGJ1aWx0LWluIFhNTEJlYW4gdHlwZXMsCi0gIGtlZXAgaW4gbWluZCB0aGF0OjwvcD4KLTx1bD4KLSAgPGxpPiBTaW5jZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiBjb3JyZXNwb25kcyB0byB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmFueVR5cGU8L3NwYW4+LAotICAgIGFsbCBKYXZhIFhNTEJlYW4gdHlwZXMgaW5oZXJpdCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LgotICAgIFRoZXJlZm9yZSBhbGwgWE1MQmVhbiB0eXBlcyBzaGFyZSB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4KLSAgICBpbnRlcmZhY2WScyBhYmlsaXR5IHRvIGNyZWF0ZSBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPgotICAgIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LiBUaGV5IGNhbiBhbHNvIHJlbmRlciB0aGUgWE1MIGFzIHN0cmluZ3Mgb3IKLSAgICBzdHJlYW1zLgotICA8bGk+Ci0gICAgPGRpdj5XaGVyZSB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgbmF0dXJhbCBKYXZhIHR5cGUsIHRoZSBYTUxCZWFucyB0eXBlIHByb3ZpZGVzCi0gICAgICBhIHdheSB0byBnZXQgdGhlIHVuZGVybHlpbmcgWE1MJ3MgdmFsdWUgYXMgdGhlIG5hdHVyYWwgdHlwZS4gU2VlIHRoZSB0YWJsZQotICAgICAgaW4gdGhpcyB0b3BpYyBmb3IgaW5mb3JtYXRpb24gb24gaG93IG5hdHVyYWwgSmF2YSB0eXBlcyBtYXAgdG8gWE1MQmVhbnMKLSAgICAgIHR5cGVzLiA8L2Rpdj4KLQotICA8bGk+IFZhbHVlcyBhc3NpZ25lZCB0byBidWlsdC1pbiBYTUxCZWFucyB0eXBlcyBhcmUgdmFsaWRhdGVkIGluIGtlZXBpbmcgd2l0aAotICAgIHRoZSBydWxlcyBvZiB0aGUgc2NoZW1hIHR5cGUgdGhleSByZXByZXNlbnQuIFNvLCBmb3IgZXhhbXBsZSwgYW4gYXR0ZW1wdCB0bwotICAgIGFzc2lnbiBhIG5lZ2F0aXZlIGludGVnZXIgdmFsdWUgdG8gYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbFBvc2l0aXZlSW50ZWdlcjwvc3Bhbj4KLSAgICB3aWxsIHRocm93IGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxWYWx1ZU91dE9mUmFuZ2U8L3NwYW4+IGV4Y2VwdGlvbi48L2xpPgotPC91bD4KLTxkaXY+Ci0gIDxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIGJ1aWx0LWluIHNjaGVtYSB0eXBlcywgYWxvbmcgd2l0aCB0aGVpciBYTUxCZWFucwotICAgIGFuZCBuYXR1cmFsIEphdmEgcGFyYWxsZWxzLiBVbmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCBuYXR1cmFsIEphdmEgdHlwZXMgYXJlCi0gICAgaW4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5qYXZhLmxhbmc8L3NwYW4+IHBhY2thZ2U7IFhNTEJlYW4gdHlwZXMgYXJlCi0gICAgaW4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5vcmcuYXBhY2hlLnhtbGJlYW5zPC9zcGFuPiBwYWNrYWdlLjwvcD4KLTwvZGl2PgotPGRpdiBpZD0idG9waWN0ZXh0Ij4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCB3aWR0aD0iMzAlIj48c3Ryb25nPkJ1aWx0LUluIFNjaGVtYSBUeXBlPC9zdHJvbmc+PC90ZD4KLSAgICAgIDx0ZCB3aWR0aD0iMzElIj48c3Ryb25nPlhNTEJlYW4gVHlwZTwvc3Ryb25nPjwvdGQ+Ci0gICAgICA8dGQgd2lkdGg9IjM5JSI+PHN0cm9uZz5OYXR1cmFsIEphdmEgVHlwZTwvc3Ryb25nPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+eHM6YW55VHlwZTwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0Lmh0bWwiPlhtbE9iamVjdDwvYT48L3RkPgotICAgICAgPHRkPiA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+b3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHQtYW55U2ltcGxlVHlwZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmFueVNpbXBsZVR5cGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlTaW1wbGVUeXBlLmh0bWwiPlhtbEFueVNpbXBsZVR5cGU8L2E+PC90ZD4KLSAgICAgIDx0ZD4gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiIHRhcmdldD0iX2JsYW5rIj54czphbnlVUkk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlVUkkuaHRtbCI+WG1sQW55VVJJPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiIHRhcmdldD0iX2JsYW5rIj54czpiYXNlNjRCaW5hcnk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCYXNlNjRCaW5hcnkuaHRtbCI+WG1sQmFzZTY0QmluYXJ5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+Ynl0ZVtdPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYm9vbGVhbiIgdGFyZ2V0PSJfYmxhbmsiPnhzOmJvb2xlYW48L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmh0bWwiPlhtbEJvb2xlYW48L2E+PC90ZD4KLSAgICAgIDx0ZD5ib29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnl0ZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmJ5dGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCeXRlLmh0bWwiPlhtbEJ5dGU8L2E+PC90ZD4KLSAgICAgIDx0ZD5ieXRlPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9IjE3Ij48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmRhdGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlLmh0bWwiPlhtbERhdGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUiIHRhcmdldD0iX2JsYW5rIj54czpkYXRlVGltZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGVUaW1lLmh0bWwiPlhtbERhdGVUaW1lPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiIHRhcmdldD0iX2JsYW5rIj54czpkZWNpbWFsPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGVjaW1hbC5odG1sIj5YbWxEZWNpbWFsPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvbWF0aC9CaWdEZWNpbWFsLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLm1hdGguQmlnRGVjaW1hbDwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkb3VibGUiIHRhcmdldD0iX2JsYW5rIj54czpkb3VibGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuaHRtbCI+WG1sRG91YmxlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+ZG91YmxlPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24iIHRhcmdldD0iX2JsYW5rIj54czpkdXJhdGlvbjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbER1cmF0aW9uLmh0bWwiPlhtbER1cmF0aW9uPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmh0bWwiPm9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUSUVTIiB0YXJnZXQ9Il9ibGFuayI+eHM6RU5USVRJRVM8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVElFUy5odG1sIj5YbWxFTlRJVElFUzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRZIiB0YXJnZXQ9Il9ibGFuayI+eHM6RU5USVRZPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRZLmh0bWwiPlhtbEVOVElUWTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZmxvYXQiIHRhcmdldD0iX2JsYW5rIj54czpmbG9hdDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEZsb2F0Lmh0bWwiPlhtbEZsb2F0PC9hPjwvdGQ+Ci0gICAgICA8dGQ+ZmxvYXQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnRGF5IiB0YXJnZXQ9Il9ibGFuayI+eHM6Z0RheTwvYT48L3RkPgotICAgICAgPHRkPjxwPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdEYXkuaHRtbCI+WG1sR0RheTwvYT48L3A+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIiB0YXJnZXQ9Il9ibGFuayI+eHM6Z01vbnRoPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoLmh0bWwiPlhtbEdNb250aDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnTW9udGhEYXkiIHRhcmdldD0iX2JsYW5rIj54czpnTW9udGhEYXk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGhEYXkuaHRtbCI+WG1sR01vbnRoRGF5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIiB0YXJnZXQ9Il9ibGFuayI+eHM6Z1llYXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHWWVhci5odG1sIj5YbWxHWWVhcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIiB0YXJnZXQ9Il9ibGFuayI+eHM6Z1llYXJNb250aDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyTW9udGguaHRtbCI+WG1sR1llYXJNb250aDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNoZXhCaW5hcnkiIHRhcmdldD0iX2JsYW5rIj54czpoZXhCaW5hcnk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuaHRtbCI+WG1sSGV4QmluYXJ5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+Ynl0ZVtdPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSUQiIHRhcmdldD0iX2JsYW5rIj54czpJRDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmh0bWwiPlhtbElEPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRiIgdGFyZ2V0PSJfYmxhbmsiPnhzOklEUkVGPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuaHRtbCI+WG1sSURSRUY8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGUyIgdGFyZ2V0PSJfYmxhbmsiPnhzOklEUkVGUzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGUy5odG1sIj5YbWxJRFJFRlM8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmludDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludC5odG1sIj5YbWxJbnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD5pbnQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6aW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuaHRtbCI+WG1sSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbGFuZ3VhZ2UiIHRhcmdldD0iX2JsYW5rIj54czpsYW5ndWFnZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmh0bWwiPlhtbExhbmd1YWdlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsb25nIiB0YXJnZXQ9Il9ibGFuayI+eHM6bG9uZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuaHRtbCI+WG1sTG9uZzwvYT48L3RkPgotICAgICAgPHRkPmxvbmc8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6TmFtZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5hbWUuaHRtbCI+WG1sTmFtZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTkNOYW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6TkNOYW1lPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmh0bWwiPlhtbE5DTkFNRTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbmVnYXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6bmVnYXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmVnYXRpdmVJbnRlZ2VyLmh0bWwiPlhtbE5lZ2F0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTiIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5NVE9LRU48L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOLmh0bWwiPlhtbE5NVE9LRU48L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU5TIiB0YXJnZXQ9Il9ibGFuayI+eHM6Tk1UT0tFTlM8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOUy5odG1sIj5YbWxOTVRPS0VOUzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6bm9uTmVnYXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VyLmh0bWwiPlhtbE5vbk5lZ2F0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uUG9zaXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6bm9uUG9zaXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VyLmh0bWwiPlhtbE5vblBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9ybWFsaXplZFN0cmluZyIgdGFyZ2V0PSJfYmxhbmsiPnhzOm5vcm1hbGl6ZWRTdHJpbmc8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb3JtYWxpemVkU3RyaW5nLmh0bWwiPlhtbE5vcm1hbGl6ZWRTdHJpbmc8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05PVEFUSU9OIiB0YXJnZXQ9Il9ibGFuayI+eHM6Tk9UQVRJT048L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOT1RBVElPTi5odG1sIj5YbWxOT1RBVElPTjwvYT48L3RkPgotICAgICAgPHRkPiBOb3Qgc3VwcG9ydGVkPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jcG9zaXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6cG9zaXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUG9zaXRpdmVJbnRlZ2VyLmh0bWwiPlhtbFBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jUU5hbWUiIHRhcmdldD0iX2JsYW5rIj54czpRTmFtZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFFOYW1lLmh0bWwiPlhtbFFOYW1lPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlLzEuNC9kb2NzL2FwaS9qYXZheC94bWwvbmFtZXNwYWNlL1FOYW1lLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZheC54bWwubmFtZXNwYWNlLlFOYW1lPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Nob3J0IiB0YXJnZXQ9Il9ibGFuayI+eHM6c2hvcnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5odG1sIj5YbWxTaG9ydDwvYT48L3RkPgotICAgICAgPHRkPnNob3J0PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIiB0YXJnZXQ9Il9ibGFuayI+eHM6c3RyaW5nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmh0bWwiPlhtbFN0cmluZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdGltZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOnRpbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxUaW1lLmh0bWwiPlhtbFRpbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iIHRhcmdldD0iX2JsYW5rIj54czp0b2tlbjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuLmh0bWwiPlhtbFRva2VuPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiIHRhcmdldD0iX2JsYW5rIj54czp1bnNpZ25lZEJ5dGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZEJ5dGUuaHRtbCI+WG1sVW5zaWduZWRCeXRlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+c2hvcnQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEludCIgdGFyZ2V0PSJfYmxhbmsiPnhzOnVuc2lnbmVkSW50PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuaHRtbCI+WG1sVW5zaWduZWRJbnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD5sb25nPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRMb25nIiB0YXJnZXQ9Il9ibGFuayI+eHM6dW5zaWduZWRMb25nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRMb25nLmh0bWwiPlhtbFVuc2lnbmVkTG9uZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRTaG9ydCIgdGFyZ2V0PSJfYmxhbmsiPnhzOnVuc2lnbmVkU2hvcnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZFNob3J0Lmh0bWwiPlhtbFVuc2lnbmVkU2hvcnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD5pbnQ8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTxkaXY+Ci0gIDxwIGNsYXNzPSJyZWxhdGVkdG9waWNzIj5SZWxhdGVkIFRvcGljczwvcD4KLSAgPHA+PGEgaHJlZj0iY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCI+R2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYgYi92MS9kb2NzL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjZkMzguLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9pbWFnZXMvY29uQ3Vyc29yVG9rZW5Mb2NhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9pbWFnZXMvY29uWE1MVHlwZUhpZXJhcmNoeS5naWYgYi92MS9kb2NzL2ltYWdlcy9jb25YTUxUeXBlSGllcmFyY2h5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwYzMyNi4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2ltYWdlcy9jb25YTUxUeXBlSGllcmFyY2h5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxL2RvY3Mvc3R5bGVzaGVldC5jc3MgYi92MS9kb2NzL3N0eWxlc2hlZXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFkODAzLi4wMDAwMDAwCi0tLSBhL3YxL2RvY3Mvc3R5bGVzaGVldC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBKYXZhZG9jIHN0eWxlIHNoZWV0ICovCi0KLS8qIERlZmluZSBjb2xvcnMsIGZvbnRzIGFuZCBvdGhlciBzdHlsZSBhdHRyaWJ1dGVzIGhlcmUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzICovCi0KLS8qIFBhZ2UgYmFja2dyb3VuZCBjb2xvciAqLwotYm9keSB7IAkKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGIAotfQotCi1ib2R5IHsKLS8qCXBhZGRpbmc6IDBweCAwcHggMHB4IDE1cHg7ICovCi0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQljb2xvcjogIzAwMDAwOwotCWZvbnQtc2l6ZTogODAlOwotfQotCi0vKiBUYWJsZSBjb2xvcnMgKi8KLS5UYWJsZUhlYWRpbmdDb2xvciAgICAgeyBiYWNrZ3JvdW5kOiAjQ0NDQ0ZGIH0gLyogRGFyayBtYXV2ZSAqLwotLlRhYmxlU3ViSGVhZGluZ0NvbG9yICB7IGJhY2tncm91bmQ6ICNFRUVFRkYgfSAvKiBMaWdodCBtYXV2ZSAqLwotLlRhYmxlUm93Q29sb3IgICAgICAgICB7IGJhY2tncm91bmQ6ICNGRkZGRkYgfSAvKiBXaGl0ZSAqLwotCi0vKiBGb250IHVzZWQgaW4gbGVmdC1oYW5kIGZyYW1lIGxpc3RzICovCi0uRnJhbWVUaXRsZUZvbnQgICB7IGZvbnQtc2l6ZTogMTBwdHM7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW4tc2VyaWYgfQotLkZyYW1lSGVhZGluZ0ZvbnQgeyBmb250LXNpemU6IDEwcHRzOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2FuLXNlcmlmIH0KLS5GcmFtZUl0ZW1Gb250ICAgIHsgZm9udC1zaXplOiAxMHB0czsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbi1zZXJpZiB9Ci0KLS8qIEV4YW1wbGUgb2Ygc21hbGxlciwgc2Fucy1zZXJpZiBmb250IGluIGZyYW1lcyAqLwotLyogLkZyYW1lSXRlbUZvbnQgIHsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9ICovCi0KLS8qIE5hdmlnYXRpb24gYmFyIGZvbnRzIGFuZCBjb2xvcnMgKi8KLS5OYXZCYXJDZWxsMSAgICB7IGJhY2tncm91bmQtY29sb3I6I0VFRUVGRjt9LyogTGlnaHQgbWF1dmUgKi8KLS5OYXZCYXJDZWxsMVJldiB7IGJhY2tncm91bmQtY29sb3I6IzAwMDA4Qjt9LyogRGFyayBCbHVlICovCi0uTmF2QmFyRm9udDEgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMDt9Ci0uTmF2QmFyRm9udDFSZXYgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6I0ZGRkZGRjt9Ci0KLS5OYXZCYXJDZWxsMiAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7fQotLk5hdkJhckNlbGwzICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjt9Ci0KZGlmZiAtLWdpdCBhL3YxL2RvY3MveG1sYmVhbnMuY3NzIGIvdjEvZG9jcy94bWxiZWFucy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjIwNjEuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy94bWxiZWFucy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyogIFRoZSBzdHlsZXMgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZCBhcmU6Ci0JLSBUaXRsZTogVGhlIHRpdGxlIG9mIHRoZSB0b3BpYwotCS0gaDEsIGgyLCBoMzogRmlyc3QsIHNlY29uZCwgYW5kIHRoaXJkLWxldmVsIGhlYWRpbmdzIHdpdGhpbiB0aGUgYm9keSBvZiBhIHRvcGljCi0JLSByZWxhdGVkVG9waWNzOiBSZWxhdGVkIFRvcGljcwotCS0gcHJvY1RpdGxlOiBXaXRoaW4gSG93IERvIEk6Li4uIHRvcGljcywgZm9yIGhlYWRpbmdzIHdpdGhpbiB0aGUgYm9keSBvZiBhIHRvcGljIHRoYXQgYXJlIGZvbGxvd2VkIGJ5Ci0JICBidWxsZXRlZCBwcm9jZWR1cmVzICgiVG8gZG8gdGhpcyIpLgotCS0gcHJlOiBGb3IgY29kZSBibG9ja3MKLQktIGxhbmdpbmxpbmU6IEZvciBjb2RlIGZyYWdtZW50cyB3aXRoaW4gYSAobm9uLWNvZGUpIHJlZ3VsYXIgc2VjdGlvbi4KLQktIG5vdGVwYXJhOiBOb3RlcwkgCi0qLwotaDEsCi1oMiwKLWgzLAotaDQsCi1oNSwKLXAsCi1wcm9jdGl0bGUsCi1yZWxhdGVkdG9waWNzIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzAwMDAwMDsKLX0KLQotLyogVXNlIGgxIGZvciBhbGwgZmlyc3QtbGV2ZWwgaGVhZGluZ3Mgd2l0aGluIHRoZSBib2R5IG9mIGEgdG9waWMuIAotICAgRm9yIHRoZSB0b3BpYyB0aXRsZSwgdXNlIHRoZSBUaXRsZSBzdHlsZS4gKi8KLWgxIHsKLQlmb250LXNpemU6IDEzNSU7Ci0JbWFyZ2luLXRvcDogLjVlbTsKLQltYXJnaW4tYm90dG9tOiAuNWVtOwotfQotCi0vKiBVc2UgaDIgZm9yIGFsbCBzZWNvbmQtbGV2ZWwgaGVhZGluZ3MuICovCi1oMiB7Ci0JZm9udC1zaXplOiAxMjUlOwotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotfQotCi0vKiBVc2UgaDMgZm9yIGFsbCB0aGlyZC1sZXZlbCBoZWFkaW5ncy4gKi8KLWgzIHsKLQlmb250LXNpemU6IDExMCU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci19Ci0KLS8qIFVzZSBoNCBmb3IgYWxsIGZvdXJ0aC1sZXZlbCBoZWFkaW5ncy4gCi0gICBOb3RlOiB0aGlzIHN0eWxlIGxvb2tzIGlkZW50aWNhbCB0byB0aGUgcmVsYXRlZHRvcGljcyBhbmQgcHJvY3RpdGxlIHN0eWxlcy4gKi8KLWg0IHsKLQlmb250LXNpemU6IDEwNSU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci19Ci0KLS8qIFVzZSBoNSBmb3IgYWxsIGZpZnRoLWxldmVsIGhlYWRpbmcuICAKLSAgIEN1cnJlbnRseSwgdGhlcmUgYXJlIG5vIGg1cyBpbiB1c2UgaW4gdGhlIGRvY3VtZW50LiovCi1oNSB7Ci0JZm9udC1zaXplOiAxMDAlOwotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotfQotCi0vKiBVc2UgdGhlIFRpdGxlIHN0eWxlIGZvciB0aGUgdGl0bGUgb2YgYSB0b3BpYy4gKi8KLXAuVGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0MiU7Ci19Ci0KLS8qIFRoaXMgZGVwcmF0ZWQgdGFnIGNyZWF0ZXMgYSBkaXYgdGhhdCBkZXNpZ25hdGVzIHRoZSB0aXRsZS4gKi8KLSN0b3BpY3RpdGxlIHsKLX0KLQotLyogVGhpcyBkZXByZWNhdGVkIHRhZyBjcmVhdGVzIGEgZGl2ZSB0aGF0IGRlc2lnbmF0ZXMgYWxsIGJvZHkgdGV4dC4gKi8KLSN0b3BpY3RleHQgewotfQotCi0vKiBVc2VkIGZvciBmaWd1cmUgY2FwdGlvbnMuKi8KLXAuYXJ0dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBCb2xkOwotfQotICAKLS8qIFRoZSBhdHRyaWJ1dGUgc3R5bGUgcmVzZW1ibGVzIHRoZSBuYXZ0aXRsZSBhbmQgcGFydGRlc2Mgc3R5bGVzIGluIHRoYXQgaXQga2VlcHMgdGhlIG5leHQgcGFyYWdyYXBoIAotICAgZmx1c2ggd2l0aCBpdC4gVXNlIGl0IHdoZW4geW91IGxpc3QgdGhlIGF0dHJpYnV0ZXMgb2Ygc3ludGF4IGluIGEgcmVmZXJlbmNlIHRvcGljLgotICAgVGhlIGFyZ3VtZW50IHN0eWxlIHNob3VsZCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgdGhlIHBhcnRkZXNjIHN0eWxlLiAqLwotcC5hdHRyaWJ1dGUgewotCW1hcmdpbi10b3A6IC42ZW07Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotCWZvbnQtd2VpZ2h0OiBCb2xkOwotCQotfQotCi0vKiBTdGFuZGFyZCBIVE1MIHRhZy4gKi8KLWJvZHkgewotCXBhZGRpbmc6IDBweCAwcHggMHB4IDE1cHg7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQljb2xvcjogIzAwMDAwOwotCWZvbnQtc2l6ZTogODAlOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0vKiBTdGFuZGFyZCBIVE1MIHRhZy4gKi8KLXNwYW4uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotYmxvY2txdW90ZSB7Ci0JbWFyZ2luOiAwZW0gMGVtIDBlbSAyZW07Ci0JcGFkZGluZzogMHB4OwotfQotCi0vKiBVc2UgdGhlIGZpbGVwYXRoIHN0eWxlIHRvIGRlc2lnbmF0ZSBmaWxlIHBhdGhzLiBJdCBpcyBjdXJyZW50bHkgYSBtb25vc3BhY2UgZmlsZS4gKi8KLXNwYW4uZmlsZXBhdGggewotCWZvbnQ6IDEwMCUgQ291cmllciBOZXcgQ291cmllciBtb25vOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBtb25vc3BhY2U7Ci19Ci0KLS8qIFRoZSBsYW5naW5saW5lIHN0eWxlLCBsaWtlIHVzZXJpbnB1dCBhbmQgZmlsZXBhdGgsIGFsc28gcmVuZGVycyB0ZXh0IG1vbm9zcGFjZS4gVXNlIHRoaXMKLSAgIHRvIGRlbm90ZSBhbnkgaW5kaXZpZHVhbCBpbnN0YW5jZSBvZiBjb2RlIGluIHRoZSBjb250ZXh0IG9mIG5vbi1jb2RlZCB0ZXh0LiBGb3IgZXhhbXBsZSwgCi0gICB5b3Ugd291bGQgdXNlIHRoaXMgdG8gZGVub3RlIHRoZSBuYW1lIG9mIGEgY2xhc3Mgd2hlbiB5b3UncmUgZGVzY3JpYmluZyBpdCBpbiB0aGUgcGFyYWdyYXBoIHRoYXQKLSAgIHByZWNlZGVzIGEgY29kZSBzYW1wbGUuIFRvIGRlbm90ZSBhIGNvZGUgc2FtcGxlLCBob3dldmVyLCB1c2UgdGhlIDxwcmU+IHRhZy4gKi8KLXNwYW4ubGFuZ2lubGluZSB7Ci0JZm9udDogMTAwJSBDb3VyaWVyIE5ldyBDb3VyaWVyIG1vbm87Ci0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKLX0KLQotLyogVGhlIGxpc3RwbGFpbiBzdHlsZSBuYXJyb3dzIHRoZSBtYXJnaW4gYmV0d2VlbiB0aGUgZm9ybWF0dGVkIGxpbmUgYW5kIHRoZSBvbmUgYmVmb3JlIGl0LgotICAgSXQgaXMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgc2Vjb25kIHBhcmFncmFwaCBpbiBhIGxpc3QgaXRlbSwgYWxvbmcgd2l0aCB0aGUgaW5kZW50IGFuZAotICAgdW5pbmRlbnQgYnV0dG9ucyBpbiBEcmVhbXdlYXZlci4gKi8KLXAubGlzdHBsYWluIHsKLQltYXJnaW4tdG9wOiAwLjdlbTsKLQltYXJnaW4tYm90dG9tOiAwOwotCXBhZGRpbmc6IDBlbTsKLX0KLQotLyogQWxsIHRleHQgaW4gdGhlIG5hdnRpdGxlIHN0eWxlIHNob3VsZCBpbmNsdWRlIGEgbGluayB0byBhbm90aGVyIHRvcGljLgotICAgVGhlIG5hdnRpdGxlIHN0eWxlIGlzIHVzZWQgaW4gbmF2aWdhdGlvbmFsIG5vZGUgdG9waWNzLCBpbiBDbGFzcyByZWZlcmVuY2UKLSAgIHRvcGljcywgYW5kIGluIE1ldGhvZCByZWZlcmVuY2UgdG9waWNzLiBGb3IgZXhhbXBsZSwgaW4gdGhlICJUb3BpY3MgCi0gICBJbmNsdWRlZCBpbiB0aGlzIFNlY3Rpb24iIHNlY3Rpb24gb2YgYSBuYXZpZ2F0aW9uIHRvcGljLCB5b3UgaW5jbHVkZSB0aGUgbGlua3MgdG8gYWxsIG9mIAotICAgdGhlIHRvcGljcyBpbiB0aGF0IGNoYXB0ZXIsIGFsb25nIHdpdGggYSBicmllZiBkZXNjcmlwdGlvbiBvZiB3aGF0IHlvdSdsbCBmaW5kIGluIGVhY2guIFVzZSB0aGUKLSAgIG5hdnRpdGxlIHN0eWxlIGZvciB0aGUgbGlua2VkIHRleHQuIEl0IGRpZmZlcnMgZnJvbSBhIG5vcm1hbCBwYXJhZ3JhcGggc3R5bGUgaW4gdGhhdCBpdCBkb2VzIG5vdCAKLSAgIGluY2x1ZGUgYW4gZXh0cmEgcGFyYWdyYXBoIGJyZWFrIGJldHdlZW4gdGhlIGxpbmsgYW5kIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0LiAqLwotcC5uYXZ0aXRsZSB7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci19Ci0KLS8qIFRoZSBuYXZkZXNjIHN0eWxlIGlzIHVzZWQgaW4gbmF2aWdhdGlvbmFsIG5vZGUgdG9waWNzLCBpbiBDbGFzcyByZWZlcmVuY2UKLSAgIHRvcGljcywgYW5kIGluIE1ldGhvZCByZWZlcmVuY2UgdG9waWNzLiBGb3IgZXhhbXBsZSwgaW4gdGhlICJUb3BpY3MgSW5jbHVkZWQgaW4gdGhpcyBTZWN0aW9uIiAKLSAgIHNlY3Rpb24gb2YgYSBuYXZpZ2F0aW9uIHRvcGljLCB5b3UgaW5jbHVkZSB0aGUgbGlua3MgdG8gYWxsIG9mIHRoZSB0b3BpY3MgaW4gdGhhdCBjaGFwdGVyLAotICAgYWxvbmcgd2l0aCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgeW91J2xsIGZpbmQgaW4gZWFjaC4gVXNlIHRoaXMgc3R5bGUgZm9yIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0LiAKLSAgIEl0IGluZGVudHMgdGhlIHRleHQgb25lIHRhYiBzdG9wIGFuZCBrZWVwcyB0aGUgbWFyZ2luIGJldHdlZW4gdGhpcyBzdHlsZSBhbmQgdGhlIG5hdnRpdGxlIHN0eWxlIHNtYWxsLiAgKi8KLXAubmF2ZGVzYyB7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCW1hcmdpbi1sZWZ0OiAxLjllbTsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS8qIFRoZSBub3RlcGFyYSBzdHlsZSBpbmRlbnRzIHlvdXIgdGV4dCB0byB0aGUgdGFiIHN0b3AgZm9yIG5vdGUKLSAgIHRleHQuIFlvdSBzaG91bGQgYWx3YXlzIGJlZ2luIE5vdGUgdGV4dCB3aXRoIHRoZSB3b3JkICJOb3RlOiIgaW4KLSAgIGJvbGRmYWNlLiAqLwotcC5ub3RlcGFyYSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLQltYXJnaW4tcmlnaHQ6IDJlbTsKLQltYXJnaW4tYm90dG9tOiAxLjVlbTsKLX0KLQotLyogVGhlIHBhcnRuYW1lIHN0eWxlIHJlc2VtYmxlcyB0aGUgbmF2dGl0bGUgc3R5bGUgaW4gdGhhdCBpdCBrZWVwcyB0aGUgbmV4dCBwYXJhZ3JhcGggZmx1c2ggd2l0aCBpdC4gCi0gICBZb3UgdXNlIGl0IHdoZW4geW91IGxpc3QgdGhlIHBhcmFtZXRlcnMgaW4gYSByZWZlcmVuY2UgdG9waWMuIEl0IGlzIGFsc28gdXNlZCBjdXJyZW50bHkgaW4gdGhlIAotICAgZ2xvc3NhcnkgdG8gZGVzaWduYXRlIGdsb3NzYXJ5IGVudHJpZXMuIEl0IHJlbmRlcnMgdGV4dCBpdGFsaWMuCi0gICBUaGUgcGFydG5hbWUgc3R5bGUgc2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSB0aGUgcGFydGRlc2Mgc3R5bGUuKi8KLXAucGFydG5hbWUgewotCW1hcmdpbi10b3A6IC42ZW07Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLyogVXNlIHRoZSBwYXJ0ZGVzYyBzdHlsZSB3aGVuIHlvdSBkZXNjcmliZSB0aGUgZnVuY3Rpb24gb2YgdGhlIHByb3BlcnRpZXMsIHBhcmFtZXRlcnMsIG9yIGV4Y2VwdGlvbnMgCi0gICBsaXN0ZWQgaW4gYSByZWZlcmVuY2UgdG9waWMuIEl0IGlzIGFsc28gdXNlZCBjdXJyZW50bHkgaW4gdGhlIGdsb3NzYXJ5IHRvIGRlc2lnbmF0ZSBnbG9zc2FyeSAKLSAgIGRlZmluaXRpb25zLiBUaGUgc3R5bGUgaW5kZW50cyB0aGUgZGVzY3JpcHRpb24gc2xpZ2h0bHkuCi0gICBUaGUgcGFydGRlc2Mgc3R5bGUgc2hvdWxkIGFsd2F5cyBmb2xsb3cgdGhlIHBhcnRuYW1lIG9yIGF0dHJpYnV0ZSBzdHlsZS4qLwotcC5wYXJ0ZGVzYyB7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCW1hcmdpbi1sZWZ0OiAxLjllbTsKLQltYXJnaW4tdG9wOiAwZW07Ci0KLX0KLQotLyogVGhlIHBvaW50IG9mIHRoZSBwcm9jdGl0bGUgc3R5bGUgaXMgdGhlIHNhbWUgYXMgdGhlIHBvaW50IG9mIHRoZSByZWxhdGVkdG9waWNzIHN0eWxlLiAgCi0gICBJdCBhcHBsaWVzIHRvIGFsbCBoZWFkaW5ncyB0aGF0IGJlZ2luIHdpdGggIlRvIFtkbyBzb21ldGhpbmddIi4gSXQgbG9va3MgaWRlbnRpY2FsIHRvIHRoZSBoNCBzdHlsZS4gICovCi1wLnByb2N0aXRsZSB7Ci0JZm9udC1zaXplOiAxMTAlOwotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotCWZvbnQtd2VpZ2h0OiBCb2xkOwotCi19Ci0KLS8qIFVzZSB0aGUgcmVsYXRlZHRvcGljcyBzdHlsZSwgZm9yIHRoZSB3b3JkcyAiUmVsYXRlZCBUb3BpY3MiIGF0IHRoZSBlbmQgb2YgYSB0b3BpYy4gCi0gICBJdCBsb29rcyBpZGVudGljYWwgdG8gdGhlIGg0IHN0eWxlLiAqLwotcC5yZWxhdGVkdG9waWNzIHsKLQlmb250LXNpemU6IDEyMCU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci19Ci0KLS8qIFRoZSBzeW50YXggc3R5bGUgcmVuZGVycyB0ZXh0IGJvbGQuIFVzZSBpdCB0byBzdHlsZSBhbGwgc3ludGF4IGxpbmVzIHVuZGVyIHRoZQotICAgU3ludGF4IGhlYWRpbmcgb2YgcmVmZXJlbmNlIHRvcGljcy4gKi8KLXAuc3ludGF4IHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci19Ci0KLS8qIFVzZSB0aGUgc3ludGF4aW5kZW50IHN0eWxlIHRvIGluZGVudCBzdWItcHJvcGVydGllcyBvZiBzeW50YXggZGVjbGFyYXRpb25zLiAqLwotcC5zeW50YXhpbmRlbnQgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JbGluZS1oZWlnaHQ6IG5vcm1hbDsKLQlmb250LXdlaWdodDogQm9sZDsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci0JbWFyZ2luLXRvcDogMGVtOwotCW1hcmdpbi1ib3R0b206IDBweDsKLX0KLQotCi1wLmZpbGV1cmwgewotCWZvbnQtc2l6ZTogOHB0OwotfQotCi1wLm1vZGlmaWVkZGF0ZSB7Ci0JZm9udC1zaXplOiA4cHQ7Ci19Ci0KLS8qIFRoZSBzeW50YXhwYXJ0bmFtZSBjaGFyYWN0ZXIgc3R5bGUgcmVuZGVycyB0ZXh0IGl0YWxpYy4gVXNlIGl0IHRvIGRlc2lnbmF0ZSAKLSAgIHN5bnRheCBlbGVtZW50cyBpbiByZWZlcmVuY2UgdG9waWNzLiovCi1zcGFuLnN5bnRheHBhcnRuYW1lIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLX0KLQotLyogVGhlc2Ugc3BlY2lmaWNhdGlvbnMgZGljdGF0ZSB0aGUgbWFyZ2lucyBhbmQgd2lkdGggb2YgdGFibGVzLiAqLwotdGFibGUgewotCXdpZHRoOiA5MCU7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAuM2VtOwotfQotCi0vKiBUaGUgYmFja2dyb3VuZCBvZiBoZWFkZXIgY2VsbHMgaXMgZ3JleSwgYW5kIHRoZSB0ZXh0IGlzIGJvdHRvbS1hbGlnbmVkLiAqLwotdGggewotCXBhZGRpbmctbGVmdDogOHB4OwotCXBhZGRpbmctcmlnaHQ6IDhweDsKLQliYWNrZ3JvdW5kOiAjY2NjY2NjOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0JZm9udC1zaXplOiA4MCU7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JdmVydGljYWwtYWxpZ246IGJvdHRvbTsKLX0KLQotLyogVGhlIHRleHQgaW4gbm9ybWFsIHRhYmxlIGNlbGxzIGlzIHRvcC1hbGlnbmVkLiAqLwotdGQgewotCXBhZGRpbmctbGVmdDogOHB4OwotCXBhZGRpbmctcmlnaHQ6IDhweDsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCXZlcnRpY2FsLWFsaWduOiB0b3A7Ci0JZm9udC1zaXplOiA4MCU7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLS8qIFRoaXMgc3R5bGUgY3JlYXRlcyBzcGFjZSBhYm92ZSBhbmQgYmVsb3cgdGFibGUgdGV4dCBiZXR3ZWVuIHBhcmFncmFwaCBhbmQgdGhlIHRhYmxlIGJvcmRlcnMuICovCi1wLnRhYmxldGV4dCB7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotfQotCi0vKiBUaGUgZWRpdG9yIHVzZXMgdGhpcyBzdHlsZSB3aGVuIGNyZWF0aW5nIHRlbXBsYXRlIGd1aWRlcyB0byBkZXNpZ25hdGUgYSBzdHlsZSBhbm5vdGF0aW9uLiAKLSAgIFlvdSBwcm9iYWJseSB3b24ndCB3YW50IHRvIHVzZSBpdCBhbnl3aGVyZSBlbHNlIGluIHRoZSBndWlkZS4gKi8KLXNwYW4udGVtcGxhdGUgewotCWNvbG9yOiAjRkYwMEZGOwkKLX0KLQotYS50b2Mtbm9kZSB7Ci0JZm9udC1zaXplOjExcHg7Ci0JY29sb3I6MDAwMDAwOwotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotCW1hcmdpbi1ib3R0b206IDBweDsKLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwotICAgIGZvbnQtZmFtaWx5OiBUYWhvbWE7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOwotICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyAgICAgICAgCi19Ci0KLS8qIFRoZSB1c2VyaW5wdXQgc3R5bGUgcmVuZGVycyB0ZXh0IG1vbm9zcGFjZS5Vc2UgdGhpcyBzdHlsZSB0byBoaWdobGlnaHQgdGV4dCB0aGF0IGEgdXNlciAKLSAgIHR5cGVzIGludG8gYSB0ZXh0IGZpZWxkLiAgKi8KLXNwYW4udXNlcmlucHV0IHsKLQlmb250OiAxMDAlIENvdXJpZXIgTmV3IENvdXJpZXIgbW9ubzsKLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwotfQotCi0vKiBTdGFuZGFyZCBIVE1MIHRhZ3MuICovCi11bCwKLW9sIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOwotCWxpc3Qtc3R5bGUtaW1hZ2U6IG5vbmU7Ci0JbWFyZ2luLXRvcDogMGVtOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLX0KLQotLyogU3RhbmRhcmQgSFRNTCB0YWcuICovCi1vbCB7Ci0JbGlzdC1zdHlsZS10eXBlOiAxOwotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotdWwgewotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotbGkgewotCW1hcmdpbi10b3A6IDEuM2VtOyAKLQltYXJnaW4tYm90dG9tOiAwZW07Ci19Ci0KLWE6bGluayB7Ci0JY29sb3I6ICMzMzY2Q0M7Ci19Ci1hOmhvdmVyIHsKLQl4LXRleHQtdW5kZXJsaW5lOiBub3JtYWw7Ci0JLypiZWdpbiFrYWRvdnt7Ki8gdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IC8qfX1lbmQha2Fkb3YqLyAKLX0KLQotYTphY3RpdmUgewotCXgtdGV4dC11bmRlcmxpbmU6IG5vcm1hbDsKLQkvKmJlZ2luIWthZG92e3sqLyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyp9fWVuZCFrYWRvdiovIAotfQotCi1hOnZpc2l0ZWQgewotCWNvbG9yOiAjODAzMzgwOwotfQotCi1hIHsKLQl4LXRleHQtdW5kZXJsaW5lOiBvZmY7Ci0JeC10ZXh0LW92ZXJsaW5lOiBvZmY7Ci0JeC10ZXh0LWxpbmUtdGhyb3VnaDogb2ZmOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogbm9uZSBub25lIG5vbmU7IC8qfX1lbmQha2Fkb3YqLyAKLX0KLWE6bGluayB7Ci0JY29sb3I6ICMzMzY2Q0M7Ci19Ci0KLWE6aG92ZXIgewotCXgtdGV4dC11bmRlcmxpbmU6IG5vcm1hbDsKLQkvKmJlZ2luIWthZG92e3sqLyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyp9fWVuZCFrYWRvdiovIAotfQotCi1hOmFjdGl2ZSB7Ci0JeC10ZXh0LXVuZGVybGluZTogbm9ybWFsOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKn19ZW5kIWthZG92Ki8gCi19Ci0KLWE6dmlzaXRlZCB7Ci0JY29sb3I6ICMwMDAwNjY7Ci19Ci0KLWRpdi5mb290ZXIgewotfQotCi0uYnV0dG9uY2xhc3MKLXsKLQlmb250LXNpemU6MTBweDsKLQloZWlnaHQ6MjBweDsKLX0KLQotLmZvcm1jbGFzcwotewotCWZvbnQtc2l6ZToxMHB4OwotCWhlaWdodDoxN3B4OwotfQotCi0KLQotCi0vKkRFUFJFQ0FURUQqLwotcC5jb2RlYmxvY2sgewotCWZvbnQtc2l6ZTogMTAwJTsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWxpbmUtaGVpZ2h0OiAxZW07Ci0JeC10ZXh0LXRhYi1zdG9wczogcmVwZWF0IDFpbjsKLQl3aGl0ZS1zcGFjZTogbm93cmFwOwotCWNvbG9yOiAjMDAwMDAwOwotCWN1cnNvcjogdGV4dDsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy10b3A6IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQltYXJnaW4tdG9wOiAwZW07Ci0JeC10ZXh0LXVuZGVybGluZTogT2ZmOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLyp9fWVuZCFrYWRvdiovIAotfQotCi0vKiBERVBSRUNBVEVEICovCi1wLmJ1bGxldGluZGVudDEgewotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDA7Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuYnVsbGV0aW5kZW50MiB7Ci0JbWFyZ2luLWxlZnQ6IDUuMWVtOwotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5idWxsZXRpbmRlbnQzIHsKLQltYXJnaW4tbGVmdDogNC4zZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuaW5kZW50MSB7Ci0JbWFyZ2luLWxlZnQ6IDEuNWVtOwotCW1hcmdpbi1yaWdodDogMS45ZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuaW5kZW50MiB7Ci0JbWFyZ2luLWxlZnQ6IDIuOWVtOwotCW1hcmdpbi1yaWdodDogMS45ZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuaW5kZW50MyB7Ci0JbWFyZ2luLWxlZnQ6IDQuM2VtOwotCW1hcmdpbi1yaWdodDogMS45ZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAubnVtYmVyZWRpbmRlbnQxIHsKLQltYXJnaW4tbGVmdDogMi4yZW07Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotfQotCi0vKiBERVBSRUNBVEVEICovCi1wLm51bWJlcmVkaW5kZW50MiB7Ci0JbWFyZ2luLWxlZnQ6IDYuM2VtOwotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5udW1iZXJlZGluZGVudDMgewotCW1hcmdpbi1sZWZ0OiAxMC41ZW07Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotfQkKLQotLyogREVQUkVDQVRFRCAqLwotcC50YWJsZXRpdGxlIHsKLQltYXJnaW4tbGVmdDogMDsKLQlmb250LXdlaWdodDogQm9sZDsKLX0KLQotCi0vKiBUaGVzZSBzdHlsZXMgYXJlIHVzZWQgYnkgdGhlIHNlYXJjaCByZXN1bHRzIHBhZ2UgKi8KLQotLnNlYXJjaC1ub2RlIHsKLQlmb250LXNpemU6MTBweDsKLQljb2xvcjowMDAwMDA7Ci19Ci0KLWEuc2VhcmNoLW5vZGUgewotCWZvbnQtc2l6ZToxMHB4OwotCWNvbG9yOjAwMDAwMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9kb2NzL3htbGJlYW50YXNrLmh0bWwgYi92MS9kb2NzL3htbGJlYW50YXNrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OWIxY2MuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy94bWxiZWFudGFzay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICAgICAgICAgICAgICAgICAgICAgCi0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KLSAgPHRpdGxlPlhNTEJlYW4gVGFzazwvdGl0bGU+Ci08L2hlYWQ+Ci0gIDxib2R5PgotICAgICAgICAgICAgCi08aDI+PGEgbmFtZT0ieG1sYmVhbiI+WE1MQmVhbjwvYT48L2gyPgotICAgICAgICAgICAKLTxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gICAgICAgICAgICAgIAotPHA+Q29tcGlsZSBhIHNldCBvZiBYU0RzIGFuZC9vciBXU0RMcyBpbnRvIHhiZWFucy4gVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nCi0gYW4gWE1MQmVhbiBqYXIgZnJvbSAuWFNEIGFuZCAuV1NETCBmaWxlcy4gJm5ic3A7VGhlIHRhc2sgY2FuIGFsc28gZ2VuZXJhdGUKLSB0aGUgc291cmNlIGNvZGUgdGhhdCBtYWtlcyB1cCB0aGUgeGJlYW4gdHlwZSBzeXN0ZW0gc3BlY2lmaWVkIGJ5IHRoZSBzY2hlbWEKLSBmaWxlcyBpZiBkZXNpcmVkLjwvcD4KLSAgICAgICAgICAgICAgCi08cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gYW4gZXh0ZXJuYWwgbGlicmFyeSBub3QgaW5jbHVkZWQgaW4KLXRoZSAgQW50IGRpc3RyaWJ1dGlvbiBjYWxsZWQgeGJlYW4uamFyLiAmbmJzcDtJdCBjYW4gYmUgZm91bmQgaW4gdGhlIFhNTEJlYW5zCi0gZGV2ZWxvcGVyIGtpdCBhdCA8YQotIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8iPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy88L2E+LiAKLVRoZSBidWlsZCBzY3JpcHQgd2lsbCBuZWVkIHRvIGluY2x1ZGUgYSB0YXNrZGVmIGZvciB4bWxiZWFuLCB3aGljaCBjb3VsZCBsb29rCi1saWtlIHRoaXM6PGJyPgotIDwvcD4KLSAKLTxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDt0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWE1MQmVhbiIgY2xhc3NwYXRoPSJwYXRoL3RvL3hiZWFuLmphciIvJmd0OzwvcHJlPgotIAotPHA+ICAgPC9wPgotICAgICAgICAgICAKLTxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC4gVGhpcyAKLSAgY2FuIGJlIGRvbmUgd2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+LCA8aT5pbmNsdWRlc2ZpbGU8L2k+LCA8aT5leGNsdWRlczwvaT4sIAotICA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiAKLSAgb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgCi1pbmNsdWRlZCAgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSA8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSAKLWlzICB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIAotd2l0aCAgcGF0dGVybnMuIEFuZCBmaW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgCi1jYW4gc3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gCi0gb24gPGEKLSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5Ci0gYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cKLXRvICB3cml0ZSBwYXR0ZXJucy48L3A+Ci0gICAgICAgICAgIAotPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhCi0gaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiAKLWFuZCBzdXBwb3J0cyBhbGwgICBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDxjb2RlPmRpcjwvY29kZT4gCi0gIGJlY29tZXMgPGNvZGU+YmFzZWRpcjwvY29kZT4pICAgYXMgd2VsbCBhcyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIAotICA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+ICAgYW5kIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgotICAgICAgICAgICAgICAKLTxoMz5QYXJhbWV0ZXJzPC9oMz4KLSAgICAgICAgICAgCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgICAgICA8dGJvZHk+Ci0gICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zY2hlbWE8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlIHRoYXQgcG9pbnRzIHRvIGVpdGhlciBhbiBpbmRpdmlkdWFsIHNjaGVtYQotIGZpbGUgb3IgYSBkaXJlY3Rvcnkgb2YgZmlsZXMuICZuYnNwO05vdCBhIHBhdGggcmVmZXJlbmNlLiAmbmJzcDtJZiBtdWx0aXBsZQotIHNjaGVtYSBmaWxlcyBuZWVkIHRvIGJlIGJ1aWx0IHRvZ2V0aGVyLCB1c2UgYSBuZXh0ZWQgZmlsZXNldCBpbnN0ZWFkIG9mCi1zZXR0aW5nICBzY2hlbWEuPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIGEgZmlsZXNldCBlbGVtZW50IGlzCi0gbmVzdGVkLjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgamFyIGZpbGUgY3JlYXRlZC4mbmJzcDsgCi1Gb3IgaW5zdGFuY2UsICJteVhNTEJlYW4uamFyIiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGlzIHRhc2sgaW50byBhIAotamFyIHdpdGggdGhlIHNhbWUgbmFtZS48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgInhtbHR5cGVzLmphciIuPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZG93bmxvYWQ8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IHRvIHRydWUgdG8gcGVybWl0IHRoZSBjb21waWxlciB0byBkb3dubG9hZCAKLVVSTHMgZm9yIGltcG9ydHMgYW5kIGluY2x1ZGVzLiZuYnNwOyBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBhbGwgaW1wb3J0cyAKLWFuZCBpbmNsdWRlcyBtdXN0IGJlIGNvcGllZCBsb2NhbGx5Ljxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYW50IHRhcmdldAotd2lsbCAgY29udGludWUgaWYgdGhlIFhNTEJlYW4gY3JlYXRpb24gZW5jb3VudGVycyBhIGJ1aWxkIGVycm9yLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIHRydWUuPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2xzIHRoZSBhbW91bnQgb2YgYnVpbGQgbWVzc2FnZSBvdXRwdXQuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIHRydWUuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlc3lzdGVtbmFtZTxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHRoZSBUeXBlU3lzdGVtSG9sZGVyCi1jbGFzcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGluLiZuYnNwOyBOb3JtYWxseSB0aGlzIHNob3VsZCBiZSBsZWZ0IHVuc3BlY2lmaWVkLgotTm9uZSBvZiB0aGUgeG1sIGJlYW5zIGFyZSBnZW5lcmF0ZWQgaW4gdGhpcyBwYWNrYWdlLiBVc2UgLnhzZGNvbmZpZyBmaWxlcwotdG8gbW9kaWZ5IHhtbCBiZWFuIHBhY2thZ2Ugb3IgY2xhc3MgbmFtZXMuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPGJyPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc2dlbmRpcjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSAuY2xhc3MgZmlsZXMgaW50by48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY29ubHk8YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSB2YWx1ZSBvZiB0cnVlIG1lYW5zIHRoYXQgb25seSBzb3VyY2Ugd2lsbCBiZSBnZW5lcmF0ZWQuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjZ2VuZGlyPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCBhIGxvY2F0aW9uIHRvIGdlbmVyYXRlIC5qYXZhIGZpbGVzIGludG8uPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPGJyPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBpZiBzY2hlbWFzIGluIHRoZSBmaWxlc2V0Ci1pbXBvcnQgZGVmaW5pdGlvbnMgdGhhdCBhcmUgc3VwcGxpZWQgYnkgb3RoZXIgY29tcGlsZWQgeG1sIGJlYW5zIEpBUiBmaWxlcywKLW9yIGlmIC5qYXZhIGZpbGVzIGFyZSBpbiB0aGUgc2NoZW1hIGZpbGVzZXQuICBBbHNvIHN1cHBvcnRzIGEgbmVzdGVkIGNsYXNzcGF0aC48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkcyBhIGNsYXNzcGF0aCwgZ2l2ZW4gYXMgPGEKLSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPgotdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZgotZmlsZXMgICB0aGF0IG11c3QgYmUgaW5jbHVkZWQuICAgICAgIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLXRha2VuICAgdG8gYmUgICAgICAgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mCi1maWxlcyAgIHRoYXQgbXVzdCBiZSBleGNsdWRlZC4gICAgICAgTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUKLWV4Y2x1ZGVkICAgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLXRha2VuICAgdG8gYmUgICAgICAgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQKLSAgb3Igbm90ICAgICAgICgieWVzIi8ibm8iKS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWc8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoCi0gICAgICAgICAgZGVidWcgaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIDxjb2RlPm9mZjwvY29kZT4uICBJZiBzZXQgdG8KLSAgICAgICAgICA8Y29kZT5vZmY8L2NvZGU+LCA8Y29kZT4tZzpub25lPC9jb2RlPiB3aWxsIGJlIHBhc3NlZCBvbiB0aGUKLSAgICAgICAgICBjb21tYW5kIGxpbmUgZm9yIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgaXQgKGZvciBvdGhlciBjb21waWxlcnMsIG5vCi0gICAgICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdpbGwgYmUgdXNlZCkuICBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCi0gICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPiBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB0aGUKLSAgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnQuPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWdsZXZlbDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5LZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDxjb2RlPi1nPC9jb2RlPgotICAgICAgICAgICAgY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0Ci0gICAgICAgICAgICA8Y29kZT5tb2Rlcm48L2NvZGU+IGFuZCA8Y29kZT5jbGFzc2ljKHZlciAmZ3Q7PSAxLjIpPC9jb2RlPi4KLSAgICAgICAgICAgIExlZ2FsIHZhbHVlcyBhcmUgPGNvZGU+bm9uZTwvY29kZT4gb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUKLSAgICAgICAgICAgIGZvbGxvd2luZyBrZXl3b3JkczoKLSAgICAgICAgICAgIDxjb2RlPmxpbmVzPC9jb2RlPiwgPGNvZGU+dmFyczwvY29kZT4sIGFuZCA8Y29kZT5zb3VyY2U8L2NvZGU+LgotICAgICAgICAgICAgSWYgPGNvZGU+ZGVidWdsZXZlbDwvY29kZT4gaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwKLSAgICAgICAgICAgIG5vdGhpbmcgd2lsbCBiZQotICAgICAgICAgICAgYXBwZW5kZWQgdG8gPGNvZGU+LWc8L2NvZGU+LiAgSWYgPGNvZGU+ZGVidWc8L2NvZGU+IGlzIG5vdCB0dXJuZWQgb24sCi0gICAgICAgICAgICB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+b3B0aW1pemU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoCi0gICAgICAgICAgICBvcHRpbWl6YXRpb247IGRlZmF1bHRzIHRvIDxjb2RlPm9mZjwvY29kZT4uPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUFudFJ1bnRpbWU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBBbnQgcnVuLXRpbWUgbGlicmFyaWVzIGluIHRoZQotICAgICAgICAgICAgY2xhc3NwYXRoOyBkZWZhdWx0cyB0byA8Y29kZT55ZXM8L2NvZGU+LjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVKYXZhUnVudGltZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlZmF1bHQgcnVuLXRpbWUKLSAgICAgICAgICAgIGxpYnJhcmllcyBmcm9tIHRoZSBleGVjdXRpbmcgVk0gaW4gdGhlIGNsYXNzcGF0aDsKLSAgICAgICAgICAgIGRlZmF1bHRzIHRvIDxjb2RlPm5vPC9jb2RlPi48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JrPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZXhlY3V0ZSA8Y29kZT5qYXZhYzwvY29kZT4gdXNpbmcgdGhlCi0gICAgICAgICAgICBKREsgY29tcGlsZXIgZXh0ZXJuYWxseTsgZGVmYXVsdHMgdG8gPGNvZGU+eWVzPC9jb2RlPi48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZTwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4ZWN1dGFibGU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tcGxldGUgcGF0aCB0byB0aGUgPGNvZGU+amF2YWM8L2NvZGU+Ci0gICAgICAgICAgICBleGVjdXRhYmxlIHRvIHVzZSBpbiBjYXNlIG9mIDxjb2RlPmZvcms9JnF1b3Q7eWVzJnF1b3Q7PC9jb2RlPi4KLSAgICAgICAgICAgIERlZmF1bHRzIHRvIHRoZSBjb21waWxlciBvZiB0aGUgSmF2YSB2ZXJzaW9uIHRoYXQgaXMgY3VycmVudGx5Ci0gICAgICAgICAgICBydW5uaW5nIEFudC4gIElnbm9yZWQgaWYgPGNvZGU+Zm9yaz0mcXVvdDtubyZxdW90OzwvY29kZT48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5tZW1vcnlJbml0aWFsU2l6ZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgaW5pdGlhbCBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNLAotICAgICAgICAgICAgaWYgPGNvZGU+amF2YWM8L2NvZGU+IGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHMKLSAgICAgICAgICAgIHRvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4KLSAgICAgICAgICAgIChFeGFtcGxlczogPGNvZGU+ODM4ODYwODA8L2NvZGU+LCA8Y29kZT44MTkyMGs8L2NvZGU+LCBvcgotICAgICAgICAgICAgPGNvZGU+ODBtPC9jb2RlPik8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5tZW1vcnlNYXhpbXVtU2l6ZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNLAotICAgICAgICAgICAgaWYgPGNvZGU+amF2YWM8L2NvZGU+IGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHMKLSAgICAgICAgICAgIHRvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4KLSAgICAgICAgICAgIChFeGFtcGxlczogPGNvZGU+ODM4ODYwODA8L2NvZGU+LCA8Y29kZT44MTkyMGs8L2NvZGU+LCBvcgotICAgICAgICAgICAgPGNvZGU+ODBtPC9jb2RlPik8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLgotICAgICAgICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIHZhbHVlIG9mIHRoZQotICAgICAgICAgICAgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5LCBpZiBzZXQsIHdpbGwgYmUgdXNlZC4KLSAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IFZNIHdpbGwgYmUgdXNlZC4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlRHVwbGljYXRlc0luTmFtZXNwYWNlczwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBuYW1lc3BhY2VzCi0gICAgICAgICAgaW4gd2hpY2ggZHVwbGljYXRlIGRlZmluaXRpb25zIGFyZSB0byBiZSBpZ25vcmVkLgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIAotICA8L3Rib2R5PiAgICAgCi08L3RhYmxlPgotICAgICAgICAgICAgICAgICAKLTxoMz5FeGFtcGxlPC9oMz4KLSAgICAgICAgICAgCi08YmxvY2txdW90ZT4gICAgICAgICAgICAgICBCZSBzdXJlIHRvIGRlZmluZSB0aGUgdGFzayBpbiB5b3VyIHNjcmlwdCwgbGlrZSAKLXRoaXM6PGJyPgotICAgCi0gIDxwcmU+Jmx0O3Rhc2tkZWYgbmFtZT0ieG1sYmVhbiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIi8mZ3Q7PC9wcmU+Ci0gICAKLSAgPHByZT48YnI+Jmx0O3htbGJlYW4gc2NoZW1hPSJzY2hlbWFzIiBkZXN0ZmlsZT0iU2NoZW1hcy5qYXIiLyZndDs8YnI+PC9wcmU+Ci0gIEJ1aWxkcyBhbGwgdGhlIHNjaGVtYXMgaW4gdGhlIHNjaGVtYXMgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGEgamFyIGNhbGxlZAotICdTY2hlbWFzLmphcicuPGJyPgotICAgICAgICAgICAgICAgICAgICAKLSAgPHByZT4mbHQ7eG1sYmVhbiBzY2hlbWE9InNjaGVtYXMvb3VyU2NoZW1hLnhzZCIgZG93bmxvYWQ9InRydWUiLyZndDs8YnI+PC9wcmU+Ci0gIENvbXBpbGVzIHRoZSBzY2hlbWEgJ291clNoZW1hLnhzZCcgaW50byB0aGUgZGVmYXVsdCBqYXIgJ3htbHR5cGVzLmphcicuIAotJm5ic3A7SWYgJm5ic3A7YW55IGltcG9ydHMgYW5kIGluY2x1ZGVzIGFyZSBkZWZpbmVkIGJ5IHJlbW90ZSBVUkxzLCB0aGV5IGFyZQotZG93bmxvYWRlZCBkdXJpbmcgdGhlIGJ1aWxkLjxicj4KLSAgICAgICAgICAgICAgICAgICAgICAgCi0gIDxoND5Vc2luZyBhIGZpbGVzZXQ8L2g0PgotICAgICAgICAgICAgICAgICAgICAgICAKLSAgPHByZT4mbHQ7eG1sYmVhbiBjbGFzc2dlbmRpcj0iJHtidWlsZC5kaXJ9IiBjbGFzc3BhdGg9IiR7Y2xhc3MucGF0aH0iPGJyPiAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiZndDs8YnI+ICAmbHQ7ZmlsZXNldCBiYXNlZGlyPSJzcmMiIGV4Y2x1ZGVzPSIqKi8qLnhzZCIvJmd0Ozxicj4gICZsdDtmaWxlc2V0IGJhc2VkaXI9InNjaGVtYXMiIGluY2x1ZGVzPSIqKi8qLioiLyZndDs8YnI+Jmx0Oy94bWxiZWFuJmd0Ozxicj48L3ByZT4KLSAgR2F0aGVycyBhbGwgdGhlIGZpbGVzIGluIHRoZSAnc3JjJyBkaXJlY3RvcnkgZXhjZXB0IC54c2QgZmlsZXMsIGFsb25nIHdpdGgKLSBldmVyeSBmaWxlIGluIHRoZSAnc2NoZW1hcycgZGlyZWN0b3J5IGFuZCBjb21waWxlcyB0aGVtLiBUaGUgZmlsZXNldCBjYW4KLWluY2x1ZGUgc2NoZW1hIGZpbGVzIHRoYXQgcmVmZXIgdG8gcHJldmlvdXNseSBjb21waWxlZCBzY2hlbWEgY29tcG9uZW50cy4mbmJzcDsKLVRoZSBmaWxlc2V0IGNhbiBhbHNvIGNvbnRhaW4gLmphdmEgZmlsZXMuJm5ic3A7IFRoZSBjbGFzc3BhdGggcGFyYW1ldGVyIGRlZmluZXMKLXRoZSBjbGFzc3BhdGggbmVjZXNzYXJ5IHRvIHJlc29sdmUgY29tcGlsZWQgc2NoZW1hIGFuZCBqYXZhIHJlZmVyZW5jZXMuPGJyPgotICA8YnI+Ci1UaGUgYnVpbHQgY2xhc3NlcyB3aWxsIGdvIGludG8gJHtidWlsZC5kaXJ9Ljxicj4KLSAgICAgICAgICAgICAgICAgICAgICAgCi0gIDxwcmU+PC9wcmU+Ci0gICAgICAgICAgIDwvYmxvY2txdW90ZT4KLSAgICAgICAgICAgCi08aHI+ICAgICAgCi0gICAgICAgPGJyPgotICAgICAgICA8YnI+Ci0gPGJyPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZXh0ZXJuYWwvbGliL2pheGVuLTEuMS1iZXRhLTItc3JjLnppcCBiL3YxL2V4dGVybmFsL2xpYi9qYXhlbi0xLjEtYmV0YS0yLXNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OGUzYzYuLjAwMDAwMDAKLS0tIGEvdjEvZXh0ZXJuYWwvbGliL2pheGVuLTEuMS1iZXRhLTItc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxL2V4dGVybmFsL2xpYi9qYXhlbi0xLjEtYmV0YS0yLmphciBiL3YxL2V4dGVybmFsL2xpYi9qYXhlbi0xLjEtYmV0YS0yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZmY1ZC4uMDAwMDAwMAotLS0gYS92MS9leHRlcm5hbC9saWIvamF4ZW4tMS4xLWJldGEtMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9leHRlcm5hbC9saWIvanVuaXQuamFyIGIvdjEvZXh0ZXJuYWwvbGliL2p1bml0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlNDNiYi4uMDAwMDAwMAotLS0gYS92MS9leHRlcm5hbC9saWIvanVuaXQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEvZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphciBiL3YxL2V4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmQ2ZTkuLjAwMDAwMDAKLS0tIGEvdjEvZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9DaGFycy5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0NoYXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOWMyNjEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0NoYXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2hhcnMKLXsKLSAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzdHJpbmcgPT0gbnVsbAotICAgICAgICAgICAgICAgID8gYnVmZmVyID09IG51bGwgPyAiIiA6IG5ldyBTdHJpbmcoIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGggKQotICAgICAgICAgICAgICAgIDogc3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nOwotCi0gICAgcHVibGljIGNoYXJbXSBidWZmZXI7Ci0gICAgcHVibGljIGludCAgICBvZmZzZXQ7Ci0gICAgcHVibGljIGludCAgICBsZW5ndGg7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vRW5jb2RpbmdNYXAuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWZmOGFmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ01hcAotewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmEySUFOQU1hcHBpbmcgKCBTdHJpbmcgamF2YSApCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZykgX2phdmFfdG9faWFuYS5nZXQoIGphdmEudG9VcHBlckNhc2UoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJQU5BMkphdmFNYXBwaW5nICggU3RyaW5nIGlhbmEgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9pYW5hX3RvX2phdmEuZ2V0KCBpYW5hLnRvVXBwZXJDYXNlKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVuY29kaW5nTWFwICggKSB7IH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBIYXNoTWFwIF9pYW5hX3RvX2phdmEgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2hNYXAgX2phdmFfdG9faWFuYSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGFkZE1hcHBpbmcgKAotICAgICAgICBTdHJpbmcgamF2YSwgU3RyaW5nIGlhbmEsIGJvb2xlYW4gaXNEZWZhdWx0ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhX2lhbmFfdG9famF2YS5jb250YWluc0tleSggaWFuYSApOwotICAgICAgICBhc3NlcnQgamF2YS50b1VwcGVyQ2FzZSgpLmVxdWFscyggamF2YSApOwotICAgICAgICBhc3NlcnQgaWFuYS50b1VwcGVyQ2FzZSgpLmVxdWFscyggaWFuYSApOwotICAgICAgICAKLSAgICAgICAgX2lhbmFfdG9famF2YS5wdXQoIGlhbmEsIGphdmEgKTsKLQotICAgICAgICBpZiAoaXNEZWZhdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9qYXZhX3RvX2lhbmEuY29udGFpbnNLZXkoIGphdmEgKTsKLSAgICAgICAgICAgIF9qYXZhX3RvX2lhbmEucHV0KCBqYXZhLCBpYW5hICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGNvbXBsZXRlTWFwcGluZ3MgKCApCi0gICAgewotICAgICAgICBIYXNoTWFwIG0gPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfaWFuYV90b19qYXZhLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIG0ucHV0KCBfaWFuYV90b19qYXZhLmdldCggaS5uZXh0KCkgKSwgbnVsbCApOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBtLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGsgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydCBfamF2YV90b19pYW5hLmNvbnRhaW5zS2V5KCBrICk6IGs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIkFOU0lfWDMuNC0xOTg2IiwgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJBU0NJSSIsICAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiQ1AzNjciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIkNTQVNDSUkiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJQk0tMzY3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiSUJNMzY3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIklTTy1JUi02IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJU082NDYtVVMiLCAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiSVNPXzY0Ni5JUlY6MTk5MSIsICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIlVTIiwgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJVUy1BU0NJSSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkJJRzUiLCAgICAgICAgICAiQklHNSIsICAgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJCSUc1IiwgICAgICAgICAgIkNTQklHNSIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJDUDAzNyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiQ1NJQk0wMzciLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkVCQ0RJQy1DUC1DQSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJFQkNESUMtQ1AtTkwiLCAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiRUJDRElDLUNQLVVTIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkVCQ0RJQy1DUC1XVCIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJJQk0tMzciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiSUJNMDM3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwMjYiLCAgICAgICAgIkNQMTAyNiIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDI2IiwgICAgICAgICJDU0lCTTEwMjYiLCAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTAyNiIsICAgICAgICAiSUJNLTEwMjYiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwMjYiLCAgICAgICAgIklCTTEwMjYiLCAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDQ3IiwgICAgICAgICJDUDEwNDciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTA0NyIsICAgICAgICAiSUJNLTEwNDciLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwNDciLCAgICAgICAgIklCTTEwNDciLCAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQwIiwgICAgICAgICJDQ1NJRDAxMTQwIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MCIsICAgICAgICAiQ1AwMTE0MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDAiLCAgICAgICAgIklCTS0xMTQwIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQwIiwgICAgICAgICJJQk0wMTE0MCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MSIsICAgICAgICAiQ0NTSUQwMTE0MSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDEiLCAgICAgICAgIkNQMDExNDEiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQxIiwgICAgICAgICJJQk0tMTE0MSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MSIsICAgICAgICAiSUJNMDExNDEiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDIiLCAgICAgICAgIkNDU0lEMDExNDIiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQyIiwgICAgICAgICJDUDAxMTQyIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MiIsICAgICAgICAiSUJNLTExNDIiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDIiLCAgICAgICAgIklCTTAxMTQyIiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQzIiwgICAgICAgICJDQ1NJRDAxMTQzIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MyIsICAgICAgICAiQ1AwMTE0MyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDMiLCAgICAgICAgIklCTS0xMTQzIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQzIiwgICAgICAgICJJQk0wMTE0MyIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NCIsICAgICAgICAiQ0NTSUQwMTE0NCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDQiLCAgICAgICAgIkNQMDExNDQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ0IiwgICAgICAgICJJQk0tMTE0NCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NCIsICAgICAgICAiSUJNMDExNDQiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDUiLCAgICAgICAgIkNDU0lEMDExNDUiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ1IiwgICAgICAgICJDUDAxMTQ1IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NSIsICAgICAgICAiSUJNLTExNDUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDUiLCAgICAgICAgIklCTTAxMTQ1IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ2IiwgICAgICAgICJDQ1NJRDAxMTQ2IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NiIsICAgICAgICAiQ1AwMTE0NiIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDYiLCAgICAgICAgIklCTS0xMTQ2IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ2IiwgICAgICAgICJJQk0wMTE0NiIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NyIsICAgICAgICAiQ0NTSUQwMTE0NyIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDciLCAgICAgICAgIkNQMDExNDciLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ3IiwgICAgICAgICJJQk0tMTE0NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NyIsICAgICAgICAiSUJNMDExNDciLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDgiLCAgICAgICAgIkNDU0lEMDExNDgiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ4IiwgICAgICAgICJDUDAxMTQ4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OCIsICAgICAgICAiSUJNLTExNDgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDgiLCAgICAgICAgIklCTTAxMTQ4IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ5IiwgICAgICAgICJDQ1NJRDAxMTQ5IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OSIsICAgICAgICAiQ1AwMTE0OSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDkiLCAgICAgICAgIklCTS0xMTQ5IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ5IiwgICAgICAgICJJQk0wMTE0OSIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MCIsICAgICAgICAiV0lORE9XUy0xMjUwIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MSIsICAgICAgICAiV0lORE9XUy0xMjUxIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MiIsICAgICAgICAiV0lORE9XUy0xMjUyIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MyIsICAgICAgICAiV0lORE9XUy0xMjUzIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NCIsICAgICAgICAiV0lORE9XUy0xMjU0IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NSIsICAgICAgICAiV0lORE9XUy0xMjU1IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NiIsICAgICAgICAiV0lORE9XUy0xMjU2IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NyIsICAgICAgICAiV0lORE9XUy0xMjU3IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1OCIsICAgICAgICAiV0lORE9XUy0xMjU4IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjczIiwgICAgICAgICAiQ1AyNzMiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3MyIsICAgICAgICAgIkNTSUJNMjczIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzMiLCAgICAgICAgICJJQk0tMjczIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjczIiwgICAgICAgICAiSUJNMjczIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIkNQMjc3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJDU0lCTTI3NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiRUJDRElDLUNQLURLIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIkVCQ0RJQy1DUC1OTyIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJJQk0tMjc3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiSUJNMjc3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIkNQMjc4IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJDU0lCTTI3OCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiRUJDRElDLUNQLUZJIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIkVCQ0RJQy1DUC1TRSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJJQk0tMjc4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiSUJNMjc4IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIkNQMjgwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODAiLCAgICAgICAgICJDU0lCTTI4MCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjgwIiwgICAgICAgICAiRUJDRElDLUNQLUlUIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIklCTS0yODAiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODAiLCAgICAgICAgICJJQk0yODAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiQ1AyODQiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NCIsICAgICAgICAgIkNTSUJNMjg0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODQiLCAgICAgICAgICJFQkNESUMtQ1AtRVMiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiSUJNLTI4NCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NCIsICAgICAgICAgIklCTTI4NCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJDUDI4NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg1IiwgICAgICAgICAiQ1NJQk0yODUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NSIsICAgICAgICAgIkVCQ0RJQy1DUC1HQiIsICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJJQk0tMjg1IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg1IiwgICAgICAgICAiSUJNMjg1IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIkNQMjkwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTAiLCAgICAgICAgICJDU0lCTTI5MCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjkwIiwgICAgICAgICAiRUJDRElDLUpQLUtBTkEiLCAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIklCTS0yOTAiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTAiLCAgICAgICAgICJJQk0yOTAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiQ1AyOTciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5NyIsICAgICAgICAgIkNTSUJNMjk3IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTciLCAgICAgICAgICJFQkNESUMtQ1AtRlIiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiSUJNLTI5NyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5NyIsICAgICAgICAgIklCTTI5NyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJDUDQyMCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDIwIiwgICAgICAgICAiQ1NJQk00MjAiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyMCIsICAgICAgICAgIkVCQ0RJQy1DUC1BUjEiLCAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJJQk0tNDIwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDIwIiwgICAgICAgICAiSUJNNDIwIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIkNQNDI0IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjQiLCAgICAgICAgICJDU0lCTTQyNCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDI0IiwgICAgICAgICAiRUJDRElDLUNQLUhFIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIklCTS00MjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjQiLCAgICAgICAgICJJQk00MjQiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiNDM3IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQzNyIsICAgICAgICAgIkNQNDM3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MzciLCAgICAgICAgICJDU1BDOENPREVQQUdFNDM3IiwgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiSUJNLTQzNyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQzNyIsICAgICAgICAgIklCTTQzNyIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJDUDUwMCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiQ1NJQk01MDAiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIkVCQ0RJQy1DUC1CRSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJFQkNESUMtQ1AtQ0giLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiSUJNLTUwMCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIklCTTUwMCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A3NzUiLCAgICAgICAgICJDUDc3NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNzc1IiwgICAgICAgICAiQ1NQQzc3NUJBTFRJQyIsICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDc3NSIsICAgICAgICAgIklCTS03NzUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A3NzUiLCAgICAgICAgICJJQk03NzUiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiODUwIiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MCIsICAgICAgICAgIkNQODUwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTAiLCAgICAgICAgICJDU1BDODUwTVVMVElMSU5HVUFMIiwgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiSUJNLTg1MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MCIsICAgICAgICAgIklCTTg1MCIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICI4NTIiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUyIiwgICAgICAgICAiQ1A4NTIiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MiIsICAgICAgICAgIkNTUENQODUyIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICJJQk0tODUyIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUyIiwgICAgICAgICAiSUJNODUyIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIjg1NSIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTUiLCAgICAgICAgICJDUDg1NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU1IiwgICAgICAgICAiQ1NJQk04NTUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIklCTS04NTUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTUiLCAgICAgICAgICJJQk04NTUiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiODU3IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NyIsICAgICAgICAgIkNQODU3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTciLCAgICAgICAgICJDU0lCTTg1NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiSUJNLTg1NyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NyIsICAgICAgICAgIklCTTg1NyIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTgiLCAgICAgICAgICJDQ1NJRDAwODU4IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU4IiwgICAgICAgICAiQ1AwMDg1OCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1OCIsICAgICAgICAgIklCTS04NTgiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTgiLCAgICAgICAgICJJQk0wMDg1OCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiODYwIiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MCIsICAgICAgICAgIkNQODYwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjAiLCAgICAgICAgICJDU0lCTTg2MCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiSUJNLTg2MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MCIsICAgICAgICAgIklCTTg2MCIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICI4NjEiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiQ1AtSVMiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIkNQODYxIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICJDU0lCTTg2MSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiSUJNLTg2MSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIklCTTg2MSIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICI4NjIiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYyIiwgICAgICAgICAiQ1A4NjIiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MiIsICAgICAgICAgIkNTUEM4NjJMQVRJTkhFQlJFVyIsICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICJJQk0tODYyIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYyIiwgICAgICAgICAiSUJNODYyIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIjg2MyIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjMiLCAgICAgICAgICJDUDg2MyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYzIiwgICAgICAgICAiQ1NJQk04NjMiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIklCTS04NjMiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjMiLCAgICAgICAgICJJQk04NjMiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY0IiwgICAgICAgICAiQ1A4NjQiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NCIsICAgICAgICAgIkNTSUJNODY0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjQiLCAgICAgICAgICJJQk0tODY0IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY0IiwgICAgICAgICAiSUJNODY0IiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIjg2NSIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjUiLCAgICAgICAgICJDUDg2NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY1IiwgICAgICAgICAiQ1NJQk04NjUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIklCTS04NjUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjUiLCAgICAgICAgICJJQk04NjUiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiODY2IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NiIsICAgICAgICAgIkNQODY2IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjYiLCAgICAgICAgICJDU0lCTTg2NiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiSUJNLTg2NiIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NiIsICAgICAgICAgIklCTTg2NiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJDUC1BUiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY4IiwgICAgICAgICAiQ1A4NjgiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OCIsICAgICAgICAgIkNTSUJNODY4IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJJQk0tODY4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY4IiwgICAgICAgICAiSUJNODY4IiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIkNQLUdSIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjkiLCAgICAgICAgICJDUDg2OSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY5IiwgICAgICAgICAiQ1NJQk04NjkiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIklCTS04NjkiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjkiLCAgICAgICAgICJJQk04NjkiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiQ1A4NzAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIkNTSUJNODcwIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJFQkNESUMtQ1AtUk9FQ0UiLCAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiRUJDRElDLUNQLVlVIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIklCTS04NzAiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJJQk04NzAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiQ1A4NzEiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MSIsICAgICAgICAgIkNTSUJNODcxIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzEiLCAgICAgICAgICJFQkNESUMtQ1AtSVMiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiSUJNLTg3MSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MSIsICAgICAgICAgIklCTTg3MSIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJDUDkxOCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTE4IiwgICAgICAgICAiQ1NJQk05MTgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkxOCIsICAgICAgICAgIkVCQ0RJQy1DUC1BUjIiLCAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJJQk0tOTE4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTE4IiwgICAgICAgICAiSUJNOTE4IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIkNDU0lEMDA5MjQiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MjQiLCAgICAgICAgICJDUDAwOTI0IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTI0IiwgICAgICAgICAiRUJDRElDLUxBVElOOS0tRVVSTyIsICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIklCTS05MjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MjQiLCAgICAgICAgICJJQk0wMDkyNCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkVVQ0pJUyIsICAgICAgICAiQ1NFVUNQS0RGTVRKQVBBTkVTRSIsICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJFVUNKSVMiLCAgICAgICAgIkVVQy1KUCIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiRVVDSklTIiwgICAgICAgICJFWFRFTkRFRF9VTklYX0NPREVfUEFDS0VEX0ZPUk1BVF9GT1JfSkFQQU5FU0UiLCBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiR0IxODAzMCIsICAgICAgICJHQjE4MDMwIiwgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkdCMjMxMiIsICAgICAgICAiQ1NHQjIzMTIiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJHQjIzMTIiLCAgICAgICAgIkdCMjMxMiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPMjAyMkNOIiwgICAgICJJU08tMjAyMi1DTiIsICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzIwMjJLUiIsICAgICAiQ1NJU08yMDIyS1IiLCAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU08yMDIyS1IiLCAgICAgIklTTy0yMDIyLUtSIiwgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJDUDgxOSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiQ1NJU09MQVRJTjEiLCAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklCTS04MTkiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJJQk04MTkiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiSVNPLTg4NTktMSIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklTTy1JUi0xMDAiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJJU09fODg1OS0xIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiTDEiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIkxBVElOMSIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJDU0lTT0xBVElOMiIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiSVNPLTg4NTktMiIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIklTTy1JUi0xMDEiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJJU09fODg1OS0yIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiTDIiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIkxBVElOMiIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJDU0lTT0xBVElOMyIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiSVNPLTg4NTktMyIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIklTTy1JUi0xMDkiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJJU09fODg1OS0zIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiTDMiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIkxBVElOMyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJDU0lTT0xBVElONCIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiSVNPLTg4NTktNCIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIklTTy1JUi0xMTAiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJJU09fODg1OS00IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiTDQiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIkxBVElONCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJDU0lTT0xBVElOQ1lSSUxMSUMiLCAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNSIsICAgICAiQ1lSSUxMSUMiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzUiLCAgICAgIklTTy04ODU5LTUiLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJJU08tSVItMTQ0IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNSIsICAgICAiSVNPXzg4NTktNSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIkFSQUJJQyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJBU01PLTcwOCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiQ1NJU09MQVRJTkFSQUJJQyIsICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIkVDTUEtMTE0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJJU08tODg1OS02IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiSVNPLUlSLTEyNyIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIklTT184ODU5LTYiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJDU0lTT0xBVElOR1JFRUsiLCAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiRUNNQS0xMTgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIkVMT1RfOTI4IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJHUkVFSyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiR1JFRUs4IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIklTTy04ODU5LTciLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJJU08tSVItMTI2IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiSVNPXzg4NTktNyIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIkNTSVNPTEFUSU5IRUJSRVciLCAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJIRUJSRVciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiSVNPLTg4NTktOCIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIklTTy04ODU5LTgtSSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJJU08tSVItMTM4IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiSVNPXzg4NTktOCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIkNTSVNPTEFUSU41IiwgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJJU08tODg1OS05IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiSVNPLUlSLTE0OCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIklTT184ODU5LTkiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJMNSIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiTEFUSU41IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMiLCAgICAgICAgICAgIkNTSVNPMjAyMkpQIiwgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTIiwgICAgICAgICAgICJJU08tMjAyMi1KUCIsICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDEiLCAgICAgICAiQ1NJU08xM0pJU0M2MjIwSlAiLCAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjAxIiwgICAgICAgIlgwMjAxIiwgICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwOCIsICAgICAgICJDU0lTTzg3SklTWDAyMDgiLCAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDgiLCAgICAgICAiSVNPLUlSLTg3IiwgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjA4IiwgICAgICAgIlgwMjA4IiwgICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwOCIsICAgICAgICJYMDIwOERCSUpJU19YMDIwOC0xOTgzIiwgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMTIiLCAgICAgICAiQ1NJU08xNTlKSVNYMDIxMjE5OTAiLCAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjEyIiwgICAgICAgIklTTy1JUi0xNTkiLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIxMiIsICAgICAgICJYMDIxMiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIktPSThfUiIsICAgICAgICAiQ1NLT0k4UiIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJLT0k4X1IiLCAgICAgICAgIktPSTgtUiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiS1NDNTYwMSIsICAgICAgICJFVUMtS1IiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIk1TOTMyIiwgICAgICAgICAiQ1NXSU5ET1dTMzFKIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJNUzkzMiIsICAgICAgICAgIldJTkRPV1MtMzFKIiwgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiU0pJUyIsICAgICAgICAgICJDU1NISUZUSklTIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIlNKSVMiLCAgICAgICAgICAiTVNfS0FOSkkiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJTSklTIiwgICAgICAgICAgIlNISUZUX0pJUyIsICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiVElTNjIwIiwgICAgICAgICJUSVMtNjIwIiwgICAgICAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiVU5JQ09ERSIsICAgICAgICJVVEYtMTYiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIlVOSUNPREVCSUciLCAgICAiVVRGLTE2QkUiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJVTklDT0RFTElUVExFIiwgIlVURi0xNkxFIiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiVVRGOCIsICAgICAgICAgICJVVEYtOCIsICAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLQotICAgICAgICBhc3NlcnQgY29tcGxldGVNYXBwaW5ncygpOwotICAgIH07Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2VuZXJpY1htbElucHV0U3RyZWFtLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2VuZXJpY1htbElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDRiN2UuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0dlbmVyaWNYbWxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uUmVmZXJlbmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1htbElucHV0U3RyZWFtIGltcGxlbWVudHMgWE1MSW5wdXRTdHJlYW0KLXsKLSAgICBwdWJsaWMgR2VuZXJpY1htbElucHV0U3RyZWFtICggKQotICAgIHsKLSAgICAgICAgX21hc3RlciA9IHRoaXM7Ci0gICAgICAgIF9lbGVtZW50Q291bnQgPSAxOyAvLyBHbyBhbGwgdGhlIHdheQotICAgIH0KLQotICAgIHByaXZhdGUgR2VuZXJpY1htbElucHV0U3RyZWFtICggR2VuZXJpY1htbElucHV0U3RyZWFtIG1hc3RlciApCi0gICAgewotICAgICAgICAoX21hc3RlciA9IG1hc3RlcikuZW5zdXJlSW5pdCgpOwotICAgICAgICBfbmV4dEV2ZW50ID0gbWFzdGVyLl9uZXh0RXZlbnQ7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gVGhlIHNvdXJjZSBmb3IgYWxsIGV2ZW50cwotICAgIC8vCi0KLSAgICBwcm90ZWN0ZWQgWE1MRXZlbnQgbmV4dEV2ZW50ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIm5leHRFdmVudCBub3Qgb3ZlcnJpZGRlbiIgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHByaXZhdGUgY2xhc3MgRXZlbnRJdGVtCi0gICAgewotICAgICAgICBFdmVudEl0ZW0gKCBYTUxFdmVudCBlICkKLSAgICAgICAgewotICAgICAgICAgICAgX2V2ZW50ID0gZTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgICAgIGdldFR5cGUgKCApIHsgcmV0dXJuIF9ldmVudC5nZXRUeXBlKCk7IH0KLSAgICAgICAgYm9vbGVhbiBoYXNOYW1lICggKSB7IHJldHVybiBfZXZlbnQuaGFzTmFtZSgpOyB9Ci0gICAgICAgIFhNTE5hbWUgZ2V0TmFtZSAoICkgeyByZXR1cm4gX2V2ZW50LmdldE5hbWUoKTsgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgWE1MRXZlbnQgX2V2ZW50OwotICAgICAgICAKLSAgICAgICAgRXZlbnRJdGVtIF9uZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJbml0ICggKQotICAgIHsKLSAgICAgICAgaWYgKCFfbWFzdGVyLl9pbml0aWFsaXplZCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX21hc3Rlci5fbmV4dEV2ZW50ID0gZ2V0TmV4dEV2ZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFhNTFN0cmVhbUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBfbWFzdGVyLl9pbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEV2ZW50SXRlbSBnZXROZXh0RXZlbnQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhNTEV2ZW50IGUgPSBuZXh0RXZlbnQoKTsKLQotICAgICAgICByZXR1cm4gZSA9PSBudWxsID8gbnVsbCA6IG5ldyBFdmVudEl0ZW0oIGUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MRXZlbnQgbmV4dCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgRXZlbnRJdGVtIGN1cnJlbnRFdmVudCA9IF9uZXh0RXZlbnQ7Ci0KLSAgICAgICAgaWYgKF9uZXh0RXZlbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuX25leHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfbmV4dEV2ZW50Ll9uZXh0ID0gX21hc3Rlci5nZXROZXh0RXZlbnQoKTsKLQotICAgICAgICAgICAgX25leHRFdmVudCA9IF9uZXh0RXZlbnQuX25leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudEV2ZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoY3VycmVudEV2ZW50LmdldFR5cGUoKSA9PSBYTUxFdmVudC5FTkRfRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKC0tX2VsZW1lbnRDb3VudCA8PSAwKQotICAgICAgICAgICAgICAgIF9uZXh0RXZlbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRFdmVudC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgICAgIF9lbGVtZW50Q291bnQrKzsKLQotICAgICAgICByZXR1cm4gY3VycmVudEV2ZW50Ll9ldmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gX25leHRFdmVudCAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNraXAgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBza2lwRWxlbWVudCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgZm9yICggOyBfbmV4dEV2ZW50ICE9IG51bGwgOyBuZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25leHRFdmVudC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yICggOyBfbmV4dEV2ZW50ICE9IG51bGwgOyBuZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IG5leHQoKS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQgJiYgLS1jb3VudCA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhNTEV2ZW50IHBlZWsgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBfbmV4dEV2ZW50Ll9ldmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBza2lwICggaW50IGV2ZW50VHlwZSApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuZ2V0VHlwZSgpID09IGV2ZW50VHlwZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBza2lwICggWE1MTmFtZSBuYW1lICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgZm9yICggOyBfbmV4dEV2ZW50ICE9IG51bGwgOyBuZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25leHRFdmVudC5oYXNOYW1lKCkgJiYgX25leHRFdmVudC5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2tpcCAoIFhNTE5hbWUgbmFtZSwgaW50IGV2ZW50VHlwZSApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuZ2V0VHlwZSgpID09IGV2ZW50VHlwZSAmJgotICAgICAgICAgICAgICAgICAgX25leHRFdmVudC5oYXNOYW1lKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgX25leHRFdmVudC5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIGdldFN1YlN0cmVhbSAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgR2VuZXJpY1htbElucHV0U3RyZWFtIHN1YlN0cmVhbSA9IG5ldyBHZW5lcmljWG1sSW5wdXRTdHJlYW0oIHRoaXMgKTsKLQotICAgICAgICBzdWJTdHJlYW0uc2tpcCggWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCApOwotCi0gICAgICAgIHJldHVybiBzdWJTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIEJVR0JVRyAtIGNhbiBJIGRvIGFueXRoaW5nIGhlcmUsIHJlYWxseT8KLSAgICAgICAgLy8gU0hvdWxkIEkgY291bnQgdGhlIG51bWJlciBvZiBvcGVuIHN1YiBzdHJlYW1zPwotICAgICAgICAvLyBJIGhhdmUgbm8gZGVzdHJ1Y3RvciwgaG93IGNhbiBJIGNsb3NlIHByb3Blcmx5PwotICAgIH0KLQotICAgIHB1YmxpYyBSZWZlcmVuY2VSZXNvbHZlciBnZXRSZWZlcmVuY2VSZXNvbHZlciAoICkKLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTm90IGltcGwiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlUmVzb2x2ZXIgKCBSZWZlcmVuY2VSZXNvbHZlciByZXNvbHZlciApCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vdCBpbXBsIiApOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgIF9pbml0aWFsaXplZDsKLSAgICBwcml2YXRlIEV2ZW50SXRlbSAgICAgICAgICAgICBfbmV4dEV2ZW50OwotICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgIF9lbGVtZW50Q291bnQ7Ci0gICAgcHJpdmF0ZSBHZW5lcmljWG1sSW5wdXRTdHJlYW0gX21hc3RlcjsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HbG9iYWxMb2NrLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2xvYmFsTG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ4ODliLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HbG9iYWxMb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi0vKioKLSAqIFdoZW5ldmVyIG11bHRpcGxlIGxvY2tzIG11c3QgYmUgYWNxdWlyZWQgd2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgotICogWE1MIEJlYW5zLCB0aGlzIEdsb2JhbExvY2sgaXMgYWNxdWlyZWQgZmlyc3QsIGFuZCB0aGVuIHJlbGVhc2VkIHdoZW4gYWxsCi0gKiB0aGUgYWN1dGFsbHktbmVlZGVkIGxvY2tzIGhhdmUgYmVlbiBhY3F1aXJlZC4gIFRoaXMgcHJldmVudHMgZGVhZGxvY2tzLgotICovIAotcHVibGljIGNsYXNzIEdsb2JhbExvY2sKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNdXRleCBHTE9CQUxfTVVURVggPSBuZXcgTXV0ZXgoKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWNxdWlyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7IEdMT0JBTF9NVVRFWC5hY3F1aXJlKCk7IH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BY3F1aXJlKCkgeyBHTE9CQUxfTVVURVgudHJ5VG9BY3F1aXJlKCk7IH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZSgpIHsgR0xPQkFMX01VVEVYLnJlbGVhc2UoKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc5Y2EwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JT1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci0KLXB1YmxpYyBjbGFzcyBJT1V0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUNvbXBsZXRlbHkoSW5wdXRTdHJlYW0gaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy9pZiBib3RoIGFyZSBmaWxlIHN0cmVhbXMsIHVzZSBjaGFubmVsIElPCi0gICAgICAgIGlmICgob3V0cHV0IGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgJiYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUlucHV0U3RyZWFtKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZUNoYW5uZWwgdGFyZ2V0ID0gKChGaWxlT3V0cHV0U3RyZWFtKSBvdXRwdXQpLmdldENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCBzb3VyY2UgPSAoKEZpbGVJbnB1dFN0cmVhbSkgaW5wdXQpLmdldENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2UudHJhbnNmZXJUbygwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7IC8qIGZhaWxvdmVyIHRvIGJ5dGUgc3RyZWFtIHZlcnNpb24gKi8gfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbODE5Ml07Ci0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gaW5wdXQucmVhZChidWYpOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmLCAwLCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgeyBpbnB1dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9Ci0gICAgICAgIHRyeSB7IG91dHB1dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlDb21wbGV0ZWx5KFVSSSBpbnB1dCwgVVJJIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoaW5wdXQpOwotICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIG5vdEFGaWxlKQotICAgICAgICAgICAge30KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZShvdXRwdXQpOwotICAgICAgICAgICAgRmlsZSBkaXIgPSBvdXQuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgZGlyLm1rZGlycygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbiA9IGlucHV0LnRvVVJMKCkub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGluLCBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGNvcHkgdG8gIiArIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JZGVudGl0eUNvbnN0cmFpbnQuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JZGVudGl0eUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZjgwMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSWRlbnRpdHlDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogSWRlbnRpdHkgY29uc3RyYWludCBlbmdpbmUuIFBlcmZvcm1zIHN0cmVhbWluZyB2YWxpZGF0aW9uIG9mIGlkZW50aXR5IGNvbnN0cmFpbnRzLgotICogVGhpcyBpbmNsdWRlcyBrZXksIGtleXJlZiwgJiB1bmlxdWUsIGFzIHdlbGwgYXMgSUQgJiBJRFJlZi4KLSAqLwotcHVibGljIGNsYXNzIElkZW50aXR5Q29uc3RyYWludCB7Ci0KLSAgICBwcml2YXRlIENvbnN0cmFpbnRTdGF0ZSBfY29uc3RyYWludFN0YWNrOwotICAgIHByaXZhdGUgRWxlbWVudFN0YXRlIF9lbGVtZW50U3RhY2s7Ci0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9lcnJvckxpc3RlbmVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaW52YWxpZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3RyYWNrSWRyZWZzOyAvLyBXZSBvbmx5IHRyYWNrIGlkcmVmcyBpZiB2YWxpZGF0aW5nIGZyb20gdGhlIHJvb3QgZWxlbWVudAotCi0gICAgcHVibGljIElkZW50aXR5Q29uc3RyYWludChDb2xsZWN0aW9uICBlcnJvckxpc3RlbmVyLCBib29sZWFuIHRyYWNrSWRyZWZzKSB7Ci0gICAgICAgIF9lcnJvckxpc3RlbmVyID0gZXJyb3JMaXN0ZW5lcjsKLSAgICAgICAgX3RyYWNrSWRyZWZzID0gdHJhY2tJZHJlZnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZWxlbWVudChFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBpY3MpIHsKLQotICAgICAgICAvLyBDb25zdHJ1Y3QgYSBuZXcgc3RhdGUgZm9yIHRoZSBlbGVtZW50Ci0gICAgICAgIG5ld1N0YXRlKCk7Ci0KLSAgICAgICAgLy8gRmlyc3QgZGlzcGF0Y2ggdGhpcyBlbGVtZW50IGV2ZW50Ci0gICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX2NvbnN0cmFpbnRTdGFjayA7IGNzICE9IG51bGwgOyBjcyA9IGNzLl9uZXh0KQotICAgICAgICAgICAgY3MuZWxlbWVudChlLCBzdCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFNlbGVjdG9yU3RhdGUgZm9yIGVhY2ggbmV3IElkZW50aXR5IENvbnN0cmFpbnQKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGljcyAhPSBudWxsICYmIGkgPCBpY3MubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgbmV3Q29uc3RyYWludFN0YXRlKGljc1tpXSwgZSwgc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoRXZlbnQgZSkgewotICAgICAgICAvLyBQb3AgdGhlIGVsZW1lbnQgc3RhdGUgc3RhY2sgYW5kIGFueSBjb25zdHJhaW50cyBhdCB0aGlzIGRlcHRoCi0gICAgICAgIGlmIChfZWxlbWVudFN0YWNrLl9oYXNDb25zdHJhaW50cykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfY29uc3RyYWludFN0YWNrIDsgY3MgIT0gbnVsbCAmJiBjcyAhPSBfZWxlbWVudFN0YWNrLl9zYXZlUG9pbnQgOyBjcyA9IGNzLl9uZXh0KQotICAgICAgICAgICAgICAgIGNzLnJlbW92ZSggZSApOwotCi0gICAgICAgICAgICBfY29uc3RyYWludFN0YWNrID0gX2VsZW1lbnRTdGFjay5fc2F2ZVBvaW50OwotICAgICAgICB9Ci0KLSAgICAgICAgX2VsZW1lbnRTdGFjayA9IF9lbGVtZW50U3RhY2suX25leHQ7Ci0KLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV2ZW50Ci0gICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX2NvbnN0cmFpbnRTdGFjayA7IGNzICE9IG51bGwgOyBjcyA9IGNzLl9uZXh0KQotICAgICAgICAgICAgY3MuZW5kRWxlbWVudChlKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX2NvbnN0cmFpbnRTdGFjayA7IGNzICE9IG51bGwgOyBjcyA9IGNzLl9uZXh0KQotICAgICAgICAgICAgY3MuYXR0cihlLCBuYW1lLCBzdCwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkgewotICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCkKLSAgICAgICAgICAgIGNzLnRleHQoZSwgc3QsIHZhbHVlLCBlbXB0eUNvbnRlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiAhX2ludmFsaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5ld0NvbnN0cmFpbnRTdGF0ZShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgaWMsIEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpCi0gICAgewotICAgICAgICBpZiAoaWMuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWVJFRikKLSAgICAgICAgICAgIG5ldyBLZXlyZWZTdGF0ZShpYywgZSwgc3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXcgU2VsZWN0b3JTdGF0ZShpYywgZSwgc3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZElkU3RhdGVzKCkKLSAgICB7Ci0gICAgICAgIC8vIENvbnN0cnVjdCBzdGF0ZXMgdG8gaG9sZCB0aGUgdmFsdWVzIGZvciBJRHMgYW5kIElEUmVmcwotICAgICAgICBJZFN0YXRlIGlkcyA9IG5ldyBJZFN0YXRlKCk7Ci0gICAgICAgIGlmIChfdHJhY2tJZHJlZnMpCi0gICAgICAgICAgICBuZXcgSWRSZWZTdGF0ZShpZHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBuZXdTdGF0ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBmaXJzdFRpbWUgPSBfZWxlbWVudFN0YWNrID09IG51bGw7Ci0KLSAgICAgICAgRWxlbWVudFN0YXRlIHN0ID0gbmV3IEVsZW1lbnRTdGF0ZSgpOwotICAgICAgICBzdC5fbmV4dCA9IF9lbGVtZW50U3RhY2s7Ci0gICAgICAgIF9lbGVtZW50U3RhY2sgPSBzdDsKLQotICAgICAgICBpZiAoZmlyc3RUaW1lKQotICAgICAgICAgICAgYnVpbGRJZFN0YXRlcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbWl0RXJyb3IgKCBFdmVudCBldmVudCwgU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICBfaW52YWxpZCA9IHRydWU7Ci0KLSAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBldmVudCAhPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfZXJyb3JMaXN0ZW5lci5hZGQoCi0gICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yQ3Vyc29yKCBtc2csIGV2ZW50LmdldExvY2F0aW9uQXNDdXJzb3IoKSApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0U2F2ZVBvaW50KCBDb25zdHJhaW50U3RhdGUgY3MgKQotICAgIHsKLSAgICAgICAgaWYgKCEgX2VsZW1lbnRTdGFjay5faGFzQ29uc3RyYWludHMpCi0gICAgICAgICAgICBfZWxlbWVudFN0YWNrLl9zYXZlUG9pbnQgPSBjczsKLQotICAgICAgICBfZWxlbWVudFN0YWNrLl9oYXNDb25zdHJhaW50cyA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sT2JqZWN0IG5ld1ZhbHVlKFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc3QubmV3VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGJpdCBoYWNreS4gbmV3VmFsdWUgdGhyb3dzIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiB3aGljaCBpcyAKLSAgICAgICAgICAgIC8vIHVuY2hlY2tlZCBhbmQgZGVjbGFyZWQgaW4gdHlwZWltcGwuIEkgY2FuIG9ubHkgY2F0Y2ggaXRzIHBhcmVudCBjbGFzcywgCi0gICAgICAgICAgICAvLyB0eXBlaW1wbCBpcyBidWlsdCBhZnRlciBjb21tb24uCi0KLSAgICAgICAgICAgIC8vIElnbm9yZSB0aGVzZSBleGNlcHRpb25zLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhlbS4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzaW1wbGUgdHlwZSBmb3Igc2NoZW1hIHR5cGUuIElmIHRoZSBzY2hlbWEgdHlwZSBpcyBhbHJlYWR5Ci0gICAgICogc2ltcGxlLCBqdXN0IHJldHVybiBpdC4gSWYgaXQgaXMgYSBjb21wbGV4IHR5cGUgd2l0aCBzaW1wbGUgY29udGVudCwKLSAgICAgKiByZXR1cm4gdGhlIHNpbXBsZSB0eXBlIGl0IGV4dGVuZHMuCi0gICAgICovCi0gICAgc3RhdGljIFNjaGVtYVR5cGUgZ2V0U2ltcGxlVHlwZShTY2hlbWFUeXBlIHN0KSAKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzdC5pc1NpbXBsZVR5cGUoKSB8fCBzdC5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQgOiAKLSAgICAgICAgICAgIHN0ICsgIiBkb2VzIG5vdCBoYXZlIHNpbXBsZSBjb250ZW50LiI7Ci0KLSAgICAgICAgd2hpbGUgKCEgc3QuaXNTaW1wbGVUeXBlKCkgKQotICAgICAgICAgICAgc3QgPSBzdC5nZXRCYXNlVHlwZSgpOwotCi0gICAgICAgIHJldHVybiBzdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBoYXNTaW1wbGVDb250ZW50KFNjaGVtYVR5cGUgc3QpCi0gICAgewotICAgICAgICByZXR1cm4gc3QuaXNTaW1wbGVUeXBlKCkgfHwgc3QuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25zdHJhaW50U3RhdGUgewotICAgICAgICBDb25zdHJhaW50U3RhdGUgX25leHQ7Ci0KLSAgICAgICAgQ29uc3RyYWludFN0YXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0U2F2ZVBvaW50KF9jb25zdHJhaW50U3RhY2spOwotICAgICAgICAgICAgX25leHQgPSBfY29uc3RyYWludFN0YWNrOwotICAgICAgICAgICAgX2NvbnN0cmFpbnRTdGFjayA9IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBhYnN0cmFjdCB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCk7Ci0gICAgICAgIGFic3RyYWN0IHZvaWQgZW5kRWxlbWVudChFdmVudCBlKTsKLSAgICAgICAgYWJzdHJhY3Qgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSk7Ci0gICAgICAgIGFic3RyYWN0IHZvaWQgdGV4dChFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZW1wdHlDb250ZW50KTsKLSAgICAgICAgYWJzdHJhY3Qgdm9pZCByZW1vdmUoRXZlbnQgZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgU2VsZWN0b3JTdGF0ZSBleHRlbmRzIENvbnN0cmFpbnRTdGF0ZSB7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBfY29uc3RyYWludDsKLSAgICAgICAgU2V0IF92YWx1ZXMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgICBYUGF0aC5FeGVjdXRpb25Db250ZXh0IF9jb250ZXh0OwotCi0gICAgICAgIFNlbGVjdG9yU3RhdGUoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQsIEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpIHsKLSAgICAgICAgICAgIF9jb25zdHJhaW50ID0gY29uc3RyYWludDsKLSAgICAgICAgICAgIF9jb250ZXh0ID0gbmV3IFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIF9jb250ZXh0LmluaXQoKFhQYXRoKV9jb25zdHJhaW50LmdldFNlbGVjdG9yUGF0aCgpKTsKLQotICAgICAgICAgICAgaWYgKCAoIF9jb250ZXh0LnN0YXJ0KCkgJiBYUGF0aC5FeGVjdXRpb25Db250ZXh0LkhJVCApICE9IDAgKQotICAgICAgICAgICAgICAgIGNyZWF0ZUZpZWxkU3RhdGUoZSwgc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRGaWVsZHMoWG1sT2JqZWN0TGlzdCBmaWVsZHMsIEV2ZW50IGUpIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2NvbnN0cmFpbnQuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWVJFRikKLSAgICAgICAgICAgICAgICBfdmFsdWVzLmFkZChmaWVsZHMpOwotICAgICAgICAgICAgZWxzZSBpZiAoX3ZhbHVlcy5jb250YWlucyhmaWVsZHMpKSAKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIkR1cGxpY2F0ZSBrZXkgJyIgKyBmaWVsZHMgKyAiJyBmb3Iga2V5IG9yIHVuaXF1ZSBjb25zdHJhaW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoX2NvbnN0cmFpbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoZmllbGRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZWxlbWVudChFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCAoIF9jb250ZXh0LmVsZW1lbnQoZS5nZXROYW1lKCkpICYgWFBhdGguRXhlY3V0aW9uQ29udGV4dC5ISVQpICE9IDAgKQotICAgICAgICAgICAgICAgIGNyZWF0ZUZpZWxkU3RhdGUoZSwgc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpIAotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dC5lbmQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY3JlYXRlRmllbGRTdGF0ZShFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7Ci0gICAgICAgICAgICBuZXcgRmllbGRTdGF0ZSh0aGlzLCBlLCBzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlbW92ZShFdmVudCBlKSB7Ci0gICAgICAgICAgICAvLyBCdWJibGUgdXAga2V5LCB1bmlxdWUgdmFsdWVzIHRvIGtleXJlZnMKLSAgICAgICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX25leHQgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNzIGluc3RhbmNlb2YgS2V5cmVmU3RhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBLZXlyZWZTdGF0ZSBrciA9IChLZXlyZWZTdGF0ZSljczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtyLl9jb25zdHJhaW50LmdldFJlZmVyZW5jZWRLZXkoKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICAgICAga3IuYWRkS2V5VmFsdWVzKF92YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpIHt9Ci0gICAgICAgIHZvaWQgdGV4dChFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZW1wdHlDb250ZW50KSB7fQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBLZXlyZWZTdGF0ZSBleHRlbmRzIFNlbGVjdG9yU3RhdGUgewotICAgICAgICBTZXQgX2tleVZhbHVlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgS2V5cmVmU3RhdGUoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQsIEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnN0cmFpbnQsIGUsIHN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRkS2V5VmFsdWVzKGZpbmFsIFNldCB2YWx1ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEJVRzogcmVtb3ZlIGR1cGxpY2F0ZXMKLSAgICAgICAgICAgIF9rZXlWYWx1ZXMuYWRkQWxsKHZhbHVlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlbW92ZShFdmVudCBlKSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGtleXMgYXQgdGhlIHNhbWUgc3RhY2sgbGV2ZWwgYXMgdGhpcwotICAgICAgICAgICAgLy8gdGhhdCBtYXkgY29udHJpYnV0ZSBrZXkgdmFsdWVzIHRvIG1lCi0gICAgICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9uZXh0IDsgY3MgIT0gbnVsbCAmJiBjcyAhPSBfZWxlbWVudFN0YWNrLl9zYXZlUG9pbnQgOyBjcyA9IGNzLl9uZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjcyBpbnN0YW5jZW9mIFNlbGVjdG9yU3RhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZWxlY3RvclN0YXRlIHNlbCA9IChTZWxlY3RvclN0YXRlKWNzOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsLl9jb25zdHJhaW50ID09IF9jb25zdHJhaW50LmdldFJlZmVyZW5jZWRLZXkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleVZhbHVlcyhzZWwuX3ZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIC8vIHZhbGlkYXRlIGFsbCB2YWx1ZXMgaGF2ZSBiZWVuIHNlZW4KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBfdmFsdWVzLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBYbWxPYmplY3RMaXN0IGZpZWxkcyA9IChYbWxPYmplY3RMaXN0KWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGRzLnVuZmlsbGVkKCkgPCAwICYmICEgX2tleVZhbHVlcy5jb250YWlucyhmaWVsZHMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJLZXkgJyIgKyBmaWVsZHMgKyAiJyBub3QgZm91bmQgKGtleVJlZiAiICsgUU5hbWVIZWxwZXIucHJldHR5KF9jb25zdHJhaW50LmdldE5hbWUoKSkgKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEZpZWxkU3RhdGUgZXh0ZW5kcyBDb25zdHJhaW50U3RhdGUgewotICAgICAgICBTZWxlY3RvclN0YXRlIF9zZWxlY3RvcjsKLSAgICAgICAgWFBhdGguRXhlY3V0aW9uQ29udGV4dFtdIF9jb250ZXh0czsKLSAgICAgICAgYm9vbGVhbltdIF9uZWVkc1ZhbHVlOwotICAgICAgICBYbWxPYmplY3RMaXN0IF92YWx1ZTsKLQotICAgICAgICBGaWVsZFN0YXRlKFNlbGVjdG9yU3RhdGUgc2VsZWN0b3IsIEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpIHsKLQotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBuZXcgRmllbGQgU3RhdGUgZm9yOiAiICsgZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBfc2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBpYyA9IHNlbGVjdG9yLl9jb25zdHJhaW50OwotCi0gICAgICAgICAgICBpbnQgZmllbGRDb3VudCA9IGljLmdldEZpZWxkcygpLmxlbmd0aDsKLSAgICAgICAgICAgIF9jb250ZXh0cyA9IG5ldyBYUGF0aC5FeGVjdXRpb25Db250ZXh0W2ZpZWxkQ291bnRdOwotICAgICAgICAgICAgX25lZWRzVmFsdWUgPSBuZXcgYm9vbGVhbltmaWVsZENvdW50XTsKLSAgICAgICAgICAgIF92YWx1ZSA9IG5ldyBYbWxPYmplY3RMaXN0KGZpZWxkQ291bnQpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBmaWVsZENvdW50IDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZXh0c1tpXSA9IG5ldyBYUGF0aC5FeGVjdXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgX2NvbnRleHRzW2ldLmluaXQoKFhQYXRoKWljLmdldEZpZWxkUGF0aChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCAoIF9jb250ZXh0c1tpXS5zdGFydCgpICYgWFBhdGguRXhlY3V0aW9uQ29udGV4dC5ISVQgKSAhPSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGl0IGZvciBlbGVtZW50OiAiICsgZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaGFzU2ltcGxlQ29udGVudChzdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIklkZW50aXR5IGNvbnN0cmFpbnQgZmllbGQgbXVzdCBoYXZlIHNpbXBsZSBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9uZWVkc1ZhbHVlW2ldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZWxlbWVudChFdmVudCBlLCBTY2hlbWFUeXBlIHN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfY29udGV4dHMubGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9uZWVkc1ZhbHVlW2ldKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJZGVudGl0eSBjb25zdHJhaW50IGZpZWxkIG11c3QgaGF2ZSBzaW1wbGUgY29udGVudCIpOwotICAgICAgICAgICAgICAgICAgICBfbmVlZHNWYWx1ZVtpXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX2NvbnRleHRzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICggKCBfY29udGV4dHNbaV0uZWxlbWVudChlLmdldE5hbWUoKSkgJiBYUGF0aC5FeGVjdXRpb25Db250ZXh0LkhJVCkgIT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoISBoYXNTaW1wbGVDb250ZW50KHN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiSWRlbnRpdHkgY29uc3RyYWludCBmaWVsZCBtdXN0IGhhdmUgc2ltcGxlIGNvbnRlbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgX25lZWRzVmFsdWVbaV0gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpIHsKLQotICAgICAgICAgICAgLy8gTnVsbCB2YWx1ZSBpbmRpY2F0ZXMgcHJldmlvdXNseSByZXBvcnRlZCB2YWxpZGF0aW9uIHByb2JsZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9jb250ZXh0cy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIF9jb250ZXh0c1tpXS5hdHRyKG5hbWUpICkgewotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QgbyA9IG5ld1ZhbHVlKHN0LCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V0ID0gX3ZhbHVlLnNldChvLCBpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoISBzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIk11bHRpcGxlIGluc3RhbmNlcyBvZiBmaWVsZCB3aXRoIHhwYXRoOiAnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9zZWxlY3Rvci5fY29uc3RyYWludC5nZXRGaWVsZHMoKVtpXSArICInIGZvciBhIHNlbGVjdG9yIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHZvaWQgdGV4dChFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZW1wdHlDb250ZW50KSB7Ci0KLSAgICAgICAgICAgIC8vIE51bGwgdmFsdWUgaW5kaWNhdGVzIHByZXZpb3VzbHkgcmVwb3J0ZWQgdmFsaWRhdGlvbiBwcm9ibGVtCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhZW1wdHlDb250ZW50KSByZXR1cm47Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9jb250ZXh0cy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIF9uZWVkc1ZhbHVlW2ldICkgewotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eUNvbnRlbnQgfHwgIWhhc1NpbXBsZUNvbnRlbnQoc3QpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIklkZW50aXR5IGNvbnN0cmFpbnQgZmllbGQgbXVzdCBoYXZlIHNpbXBsZSBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHNpbXBsZVR5cGUgPSBnZXRTaW1wbGVUeXBlKHN0KTsKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IG8gPSBuZXdWYWx1ZShzaW1wbGVUeXBlLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V0ID0gX3ZhbHVlLnNldChvLCBpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoISBzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIk11bHRpcGxlIGluc3RhbmNlcyBvZiBmaWVsZCB3aXRoIHhwYXRoOiAnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9zZWxlY3Rvci5fY29uc3RyYWludC5nZXRGaWVsZHMoKVtpXSArICInIGZvciBhIHNlbGVjdG9yIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vIHJlc2V0IGFueSAgX25lZWRzVmFsdWUgZmxhZ3MgCi0gICAgICAgICAgICAvLyBhc3N1bWUgdGhhdCBpZiB3ZSBkaWRuJ3Qgc2VlIHRoZSB0ZXh0LCBpdCB3YXMgYmVjYXVzZSBvZiBhbm90aGVyIHZhbGlkYXRpb24KLSAgICAgICAgICAgIC8vIGVycm9yLCBzbyBkb24ndCBlbWl0IGFub3RoZXIgb25lLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX25lZWRzVmFsdWUubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZXh0c1tpXS5lbmQoKTsKLSAgICAgICAgICAgICAgICBfbmVlZHNWYWx1ZVtpXSA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlbW92ZShFdmVudCBlKSAKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiAoX3NlbGVjdG9yLl9jb25zdHJhaW50LmdldENvbnN0cmFpbnRDYXRlZ29yeSgpID09IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVkgJiYKLSAgICAgICAgICAgICAgICBfdmFsdWUudW5maWxsZWQoKSA+PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBrZXlzIG11c3QgaGF2ZSBhbGwgdmFsdWVzIHN1cHBsaWVkCi0gICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJLZXkgIiArIFFOYW1lSGVscGVyLnByZXR0eShfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0TmFtZSgpKSArICIgaXMgbWlzc2luZyBmaWVsZCB3aXRoIHhwYXRoOiAnIiArIF9zZWxlY3Rvci5fY29uc3RyYWludC5nZXRGaWVsZHMoKVtfdmFsdWUudW5maWxsZWQoKV0gKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEZpbmlzaGVkLiBBZGQgdGhlc2UgZmllbGRzIHRvIHRoZSBzZWxlY3RvciBzdGF0ZQotICAgICAgICAgICAgICAgIF9zZWxlY3Rvci5hZGRGaWVsZHMoX3ZhbHVlLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIElkU3RhdGUgZXh0ZW5kcyBDb25zdHJhaW50U3RhdGUKLSAgICB7Ci0gICAgICAgIFNldCBfdmFsdWVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQotICAgICAgICBJZFN0YXRlKCkgeyB9Ci0KLSAgICAgICAgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlVmFsdWUoZSwgc3QsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGV4dChFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZW1wdHlDb250ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW1wdHlDb250ZW50KQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaGFuZGxlVmFsdWUoZSwgc3QsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVWYWx1ZShFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLy8gTnVsbCB2YWx1ZSBpbmRpY2F0ZXMgcHJldmlvdXNseSByZXBvcnRlZCB2YWxpZGF0aW9uIHByb2JsZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmIChzdCA9PSBudWxsIHx8IHN0LmlzTm9UeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChYbWxJRC50eXBlLmlzQXNzaWduYWJsZUZyb20oc3QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbE9iamVjdExpc3QgeG1sVmFsdWUgPSBuZXcgWG1sT2JqZWN0TGlzdCgxKTsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3QgbyA9IG5ld1ZhbHVlKFhtbElELnR5cGUsIHZhbHVlKTsKLQotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCi0gICAgICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgeG1sVmFsdWUuc2V0KG8sIDApOwotCi0gICAgICAgICAgICAgICAgaWYgKF92YWx1ZXMuY29udGFpbnMoeG1sVmFsdWUpKQotICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIkR1cGxpY2F0ZSBJRCB2YWx1ZSAnIiArIHZhbHVlICsgIiciKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuYWRkKHhtbFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZWxlbWVudChFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7fQotICAgICAgICB2b2lkIGVuZEVsZW1lbnQoRXZlbnQgZSl7fQotICAgICAgICB2b2lkIHJlbW92ZShFdmVudCBlKXt9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgSWRSZWZTdGF0ZSBleHRlbmRzIENvbnN0cmFpbnRTdGF0ZQotICAgIHsKLSAgICAgICAgSWRTdGF0ZSBfaWRzOwotICAgICAgICBMaXN0IF92YWx1ZXM7Ci0KLSAgICAgICAgSWRSZWZTdGF0ZShJZFN0YXRlIGlkcykKLSAgICAgICAgewotICAgICAgICAgICAgX2lkcyA9IGlkczsKLSAgICAgICAgICAgIF92YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVmFsdWUoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOdWxsIHZhbHVlIGluZGljYXRlcyBwcmV2aW91c2x5IHJlcG9ydGVkIHZhbGlkYXRpb24gcHJvYmxlbQotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKHN0ID09IG51bGwgfHwgc3QuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChYbWxJRFJFRlMudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHN0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxJRFJFRlMgbHYgPSAoWG1sSURSRUZTKW5ld1ZhbHVlKFhtbElEUkVGUy50eXBlLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQotICAgICAgICAgICAgICAgIGlmIChsdiA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBMaXN0IGwgPSBsdi54Z2V0TGlzdFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgb25lIHZhbHVlIGZvciBlYWNoIGlkcmVmIGluIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbC5zaXplKCkgOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3RMaXN0IHhtbFZhbHVlID0gbmV3IFhtbE9iamVjdExpc3QoMSk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbElEUkVGIGlkcmVmID0gKFhtbElEUkVGKWwuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICB4bWxWYWx1ZS5zZXQoaWRyZWYsIDApOwotICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLmFkZCh4bWxWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoWG1sSURSRUYudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHN0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3RMaXN0IHhtbFZhbHVlID0gbmV3IFhtbE9iamVjdExpc3QoMSk7Ci0gICAgICAgICAgICAgICAgWG1sSURSRUYgaWRyZWYgPSAoWG1sSURSRUYpc3QubmV3VmFsdWUodmFsdWUpOwotCi0gICAgICAgICAgICAgICAgLy8gSWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKLSAgICAgICAgICAgICAgICBpZiAoaWRyZWYgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgeG1sVmFsdWUuc2V0KGlkcmVmLCAwKTsKLSAgICAgICAgICAgICAgICBfdmFsdWVzLmFkZCh4bWxWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlVmFsdWUoZSwgc3QsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbXB0eUNvbnRlbnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBoYW5kbGVWYWx1ZShlLCBzdCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgcmVtb3ZlKEV2ZW50IGUpIAotICAgICAgICB7IAotICAgICAgICAgICAgLy8gVmFsaWRhdGUgZWFjaCByZWYgaGFzIGEgY29ycmVzcG9uZGluZyBJRAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IF92YWx1ZXMuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoISBfaWRzLl92YWx1ZXMuY29udGFpbnMobykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIklEIG5vdCBmb3VuZCBmb3IgSURSZWYgdmFsdWUgJyIgKyBvICsgIiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBlbGVtZW50KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpIHsgfQotICAgICAgICB2b2lkIGVuZEVsZW1lbnQoRXZlbnQgZSkgeyB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWxlbWVudFN0YXRlIHsKLSAgICAgICAgRWxlbWVudFN0YXRlIF9uZXh0OwotICAgICAgICBib29sZWFuIF9oYXNDb25zdHJhaW50czsKLSAgICAgICAgQ29uc3RyYWludFN0YXRlIF9zYXZlUG9pbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0xldmVuc2h0ZWluLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTGV2ZW5zaHRlaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2MGIwZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTGV2ZW5zaHRlaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLXB1YmxpYyBjbGFzcyBMZXZlbnNodGVpbgotewotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIEdldCBtaW5pbXVtIG9mIHRocmVlIHZhbHVlcwotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1pbmltdW0oaW50IGEsIGludCBiLCBpbnQgYykKLSAgICB7Ci0gICAgICAgIGludCBtaSA9IGE7Ci0gICAgICAgIGlmIChiIDwgbWkpCi0gICAgICAgICAgICBtaSA9IGI7Ci0gICAgICAgIGlmIChjIDwgbWkpCi0gICAgICAgICAgICBtaSA9IGM7Ci0gICAgICAgIHJldHVybiBtaTsKLSAgICB9Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gQ29tcHV0ZSBMZXZlbnNodGVpbiBkaXN0YW5jZQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBwdWJsaWMgc3RhdGljIGludCBkaXN0YW5jZShTdHJpbmcgcywgU3RyaW5nIHQpCi0gICAgewotICAgICAgICBpbnQgZFtdW107IC8vIG1hdHJpeAotICAgICAgICBpbnQgbjsgLy8gbGVuZ3RoIG9mIHMKLSAgICAgICAgaW50IG07IC8vIGxlbmd0aCBvZiB0Ci0gICAgICAgIGludCBpOyAvLyBpdGVyYXRlcyB0aHJvdWdoIHMKLSAgICAgICAgaW50IGo7IC8vIGl0ZXJhdGVzIHRocm91Z2ggdAotICAgICAgICBjaGFyIHNfaTsgLy8gaXRoIGNoYXJhY3RlciBvZiBzCi0gICAgICAgIGNoYXIgdF9qOyAvLyBqdGggY2hhcmFjdGVyIG9mIHQKLSAgICAgICAgaW50IGNvc3Q7IC8vIGNvc3QKLQotICAgICAgICAvLyBTdGVwIDEKLSAgICAgICAgbiA9IHMubGVuZ3RoKCk7Ci0gICAgICAgIG0gPSB0Lmxlbmd0aCgpOwotICAgICAgICBpZiAobiA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIGlmIChtID09IDApCi0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgZCA9IG5ldyBpbnRbbisxXVttKzFdOwotCi0gICAgICAgIC8vIFN0ZXAgMgotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG47IGkrKykKLSAgICAgICAgICAgIGRbaV1bMF0gPSBpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDw9IG07IGorKykKLSAgICAgICAgICAgIGRbMF1bal0gPSBqOwotCi0gICAgICAgIC8vIFN0ZXAgMwotICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc19pID0gcy5jaGFyQXQgKGkgLSAxKTsKLQotICAgICAgICAgICAgLy8gU3RlcCA0Ci0gICAgICAgICAgICBmb3IgKGogPSAxOyBqIDw9IG07IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0X2ogPSB0LmNoYXJBdChqIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTdGVwIDUKLSAgICAgICAgICAgICAgICBpZiAoc19pID09IHRfaikKLSAgICAgICAgICAgICAgICAgICAgY29zdCA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjb3N0ID0gMTsKLQotICAgICAgICAgICAgICAgIC8vIFN0ZXAgNgotICAgICAgICAgICAgICAgIGRbaV1bal0gPSBtaW5pbXVtKGRbaS0xXVtqXSsxLCBkW2ldW2otMV0rMSwgZFtpLTFdW2otMV0gKyBjb3N0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0ZXAgNwotICAgICAgICByZXR1cm4gZFtuXVttXTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9NdXRleC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL011dGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OGU5MGMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL011dGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgY2xhc3MgTXV0ZXgKLXsKLSAgICBwcml2YXRlIFRocmVhZCAgb3duZXIgICAgICA9IG51bGw7ICAvLyBPd25lciBvZiBtdXRleCwgbnVsbCBpZiBub2JvZHkKLSAgICBwcml2YXRlIGludCAgICAgbG9ja19jb3VudCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBY3F1aXJlIHRoZSBtdXRleC4gVGhlIG11dGV4IGNhbiBiZSBhY3F1aXJlZCBtdWx0aXBsZSB0aW1lcwotICAgICAqIGJ5IHRoZSBzYW1lIHRocmVhZCwgcHJvdmlkZWQgdGhhdCBpdCBpcyByZWxlYXNlZCBhcyBtYW55Ci0gICAgICogdGltZXMgYXMgaXQgaXMgYWNxdWlyZWQuIFRoZSBjYWxsaW5nIHRocmVhZCBibG9ja3MgdW50aWwKLSAgICAgKiBpdCBoYXMgYWNxdWlyZWQgdGhlIG11dGV4LiAoVGhlcmUgaXMgbm8gdGltZW91dCkuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjcXVpcmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHdoaWxlICh0cnlUb0FjcXVpcmUoKSA9PSBmYWxzZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53YWl0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBhY3F1aXJlIHRoZSBtdXRleC4gUmV0dXJucyBmYWxzZSAoYW5kIGRvZXMgbm90Ci0gICAgICogYmxvY2spIGlmIGl0IGNhbid0IGdldCBpdC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB0cnlUb0FjcXVpcmUoKQotICAgIHsKLSAgICAgICAgLy8gVHJ5IHRvIGdldCB0aGUgbXV0ZXguIFJldHVybiB0cnVlIGlmIHlvdSBnb3QgaXQuCi0KLSAgICAgICAgaWYoIG93bmVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvd25lciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0gICAgICAgICAgICBsb2NrX2NvdW50ID0gMTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG93bmVyID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICArK2xvY2tfY291bnQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSBtdXRleC4gVGhlIG11dGV4IGhhcyB0byBiZSByZWxlYXNlZCBhcyBtYW55IHRpbWVzCi0gICAgICogYXMgaXQgd2FzIGFjcXVpcmVkIHRvIGFjdHVhbGx5IHVubG9jayB0aGUgcmVzb3VyY2UuIFRoZSBtdXRleAotICAgICAqIG11c3QgYmUgcmVsZWFzZWQgYnkgdGhlIHRocmVhZCB0aGF0IGFjcXVpcmVkIGl0Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAoYSBSdW50aW1lRXhjZXB0aW9uKSBpZiBhIHRocmVhZAotICAgICAqICAgICAgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBvd25lciB0cmllcyB0byByZWxlYXNlIHRoZSBtdXRleC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkKLSAgICB7Ci0gICAgICAgIGlmIChvd25lciAhPSBUaHJlYWQuY3VycmVudFRocmVhZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhyZWFkIGNhbGxpbmcgcmVsZWFzZSgpIGRvZXNuJ3Qgb3duIG11dGV4Iik7Ci0KLSAgICAgICAgaWYgKC0tbG9ja19jb3VudCA8PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBvd25lciA9IG51bGw7Ci0gICAgICAgICAgICBub3RpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL05hbWVVdGlsLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzZmY0ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgTmFtZVV0aWwKLXsKLSAgICAvLyBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIEhZUEhFTiA9ICdcdTAwMkQnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBQRVJJT0QgPSAnXHUwMDJFJzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgQ09MT04gID0gJ1x1MDAzQSc7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIFVTQ09SRSA9ICdcdTAwNUYnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBET1QgICAgPSAnXHUwMEI3JzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgVEVMRUlBID0gJ1x1MDM4Nyc7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIEFZQUggICA9ICdcdTA2REQnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBFTEhJWkIgPSAnXHUwNkRFJzsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldCBqYXZhV29yZHMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgewotICAgICAgICAgICAgICAiYWJzdHJhY3QiLAotICAgICAgICAgICAgICAiYm9vbGVhbiIsCi0gICAgICAgICAgICAgICJicmVhayIsCi0gICAgICAgICAgICAgICJieXRlIiwKLSAgICAgICAgICAgICAgImNhc2UiLAotICAgICAgICAgICAgICAiY2F0Y2giLAotICAgICAgICAgICAgICAiY2hhciIsCi0gICAgICAgICAgICAgICJjbGFzcyIsCi0gICAgICAgICAgICAgICJjb25zdCIsCi0gICAgICAgICAgICAgICJjb250aW51ZSIsCi0gICAgICAgICAgICAgICJkZWZhdWx0IiwKLSAgICAgICAgICAgICAgImRvIiwKLSAgICAgICAgICAgICAgImRvdWJsZSIsCi0gICAgICAgICAgICAgICJlbHNlIiwKLSAgICAgICAgICAgICAgImV4dGVuZHMiLAotICAgICAgICAgICAgICAiZmFsc2UiLCAvLyBub3QgYSBrZXl3b3JkCi0gICAgICAgICAgICAgICJmaW5hbCIsCi0gICAgICAgICAgICAgICJmaW5hbGx5IiwKLSAgICAgICAgICAgICAgImZsb2F0IiwKLSAgICAgICAgICAgICAgImZvciIsCi0gICAgICAgICAgICAgICJnb3RvIiwKLSAgICAgICAgICAgICAgImlmIiwKLSAgICAgICAgICAgICAgImltcGxlbWVudHMiLAotICAgICAgICAgICAgICAiaW1wb3J0IiwKLSAgICAgICAgICAgICAgImluc3RhbmNlb2YiLAotICAgICAgICAgICAgICAiaW50IiwKLSAgICAgICAgICAgICAgImludGVyZmFjZSIsCi0gICAgICAgICAgICAgICJsb25nIiwKLSAgICAgICAgICAgICAgIm5hdGl2ZSIsCi0gICAgICAgICAgICAgICJuZXciLAotICAgICAgICAgICAgICAibnVsbCIsIC8vIG5vdCBhIGtleXdvcmQKLSAgICAgICAgICAgICAgInBhY2thZ2UiLAotICAgICAgICAgICAgICAicHJpdmF0ZSIsCi0gICAgICAgICAgICAgICJwcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAicHVibGljIiwKLSAgICAgICAgICAgICAgInJldHVybiIsCi0gICAgICAgICAgICAgICJzaG9ydCIsCi0gICAgICAgICAgICAgICJzdGF0aWMiLAotICAgICAgICAgICAgICAic3VwZXIiLAotICAgICAgICAgICAgICAic3dpdGNoIiwKLSAgICAgICAgICAgICAgInN5bmNocm9uaXplZCIsCi0gICAgICAgICAgICAgICJ0aGlzIiwKLSAgICAgICAgICAgICAgInRocmVhZHNhZmUiLAotICAgICAgICAgICAgICAidGhyb3ciLAotICAgICAgICAgICAgICAidGhyb3dzIiwKLSAgICAgICAgICAgICAgInRyYW5zaWVudCIsCi0gICAgICAgICAgICAgICJ0cnVlIiwgLy8gbm90IGEga2V5d29yZAotICAgICAgICAgICAgICAidHJ5IiwKLSAgICAgICAgICAgICAgInZvaWQiLAotICAgICAgICAgICAgICAidm9sYXRpbGUiLAotICAgICAgICAgICAgICAid2hpbGUiLAotICAgICAgICB9Ci0gICAgKSk7Ci0KLSAgICAvKgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldCBqYXZhTmFtZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgewotICAgICAgICAgICAgIkNoYXJTZXF1ZW5jZSIsCi0gICAgICAgICAgICAiQ2xvbmVhYmxlIiwKLSAgICAgICAgICAgICJDb21wYXJhYmxlIiwKLSAgICAgICAgICAgICJSdW5uYWJsZSIsCi0KLSAgICAgICAgICAgICJCb29sZWFuIiwKLSAgICAgICAgICAgICJCeXRlIiwKLSAgICAgICAgICAgICJDaGFyYWN0ZXIiLAotICAgICAgICAgICAgIkNsYXNzIiwKLSAgICAgICAgICAgICJDbGFzc0xvYWRlciIsCi0gICAgICAgICAgICAiQ29tcGlsZXIiLAotICAgICAgICAgICAgIkRvdWJsZSIsCi0gICAgICAgICAgICAiRmxvYXQiLAotICAgICAgICAgICAgIkluaGVyaXRhYmxlVGhyZWFkTG9jYWwiLAotICAgICAgICAgICAgIkludGVnZXIiLAotICAgICAgICAgICAgIkxvbmciLAotICAgICAgICAgICAgIk1hdGgiLAotICAgICAgICAgICAgIk51bWJlciIsCi0gICAgICAgICAgICAiT2JqZWN0IiwKLSAgICAgICAgICAgICJQYWNrYWdlIiwKLSAgICAgICAgICAgICJQcm9jZXNzIiwKLSAgICAgICAgICAgICJSdW50aW1lIiwKLSAgICAgICAgICAgICJSdW50aW1lUGVybWlzc2lvbiIsCi0gICAgICAgICAgICAiU2VjdXJpdHlNYW5hZ2VyIiwKLSAgICAgICAgICAgICJTaG9ydCIsCi0gICAgICAgICAgICAiU3RhY2tUcmFjZUVsZW1lbnQiLAotICAgICAgICAgICAgIlN0cmljdE1hdGgiLAotICAgICAgICAgICAgIlN0cmluZyIsCi0gICAgICAgICAgICAiU3RyaW5nQnVmZmVyIiwKLSAgICAgICAgICAgICJTeXN0ZW0iLAotICAgICAgICAgICAgIlRocmVhZCIsCi0gICAgICAgICAgICAiVGhyZWFkR3JvdXAiLAotICAgICAgICAgICAgIlRocmVhZExvY2FsIiwKLSAgICAgICAgICAgICJUaHJvd2FibGUiLAotICAgICAgICAgICAgIlZvaWQiLAotCi0gICAgICAgICAgICAiQXJpdGhtZXRpY0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJBcnJheVN0b3JlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbGFzc0Nhc3RFeGNlcHRpb24iLAotICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLAotICAgICAgICAgICAgIkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24iLAotICAgICAgICAgICAgIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAotICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24iLAotICAgICAgICAgICAgIkludGVycnVwdGVkRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTm9TdWNoRmllbGRFeGNlcHRpb24iLAotICAgICAgICAgICAgIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTnVsbFBvaW50ZXJFeGNlcHRpb24iLAotICAgICAgICAgICAgIk51bWJlckZvcm1hdEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiUnVudGltZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb24iLAotICAgICAgICAgICAgIlN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAotICAgICAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIiwKLQotICAgICAgICAgICAgIkFic3RyYWN0TWV0aG9kRXJyb3IiLAotICAgICAgICAgICAgIkFzc2VydGlvbkVycm9yIiwKLSAgICAgICAgICAgICJDbGFzc0NpcmN1bGFyaXR5RXJyb3IiLAotICAgICAgICAgICAgIkNsYXNzRm9ybWF0RXJyb3IiLAotICAgICAgICAgICAgIkVycm9yIiwKLSAgICAgICAgICAgICJFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IiLAotICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFcnJvciIsCi0gICAgICAgICAgICAiSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciIsCi0gICAgICAgICAgICAiSW5zdGFudGlhdGlvbkVycm9yIiwKLSAgICAgICAgICAgICJJbnRlcm5hbEVycm9yIiwKLSAgICAgICAgICAgICJMaW5rYWdlRXJyb3IiLAotICAgICAgICAgICAgIk5vQ2xhc3NEZWZGb3VuZEVycm9yIiwKLSAgICAgICAgICAgICJOb1N1Y2hGaWVsZEVycm9yIiwKLSAgICAgICAgICAgICJOb1N1Y2hNZXRob2RFcnJvciIsCi0gICAgICAgICAgICAiT3V0T2ZNZW1vcnlFcnJvciIsCi0gICAgICAgICAgICAiU3RhY2tPdmVyZmxvd0Vycm9yIiwKLSAgICAgICAgICAgICJUaHJlYWREZWF0aCIsCi0gICAgICAgICAgICAiVW5rbm93bkVycm9yIiwKLSAgICAgICAgICAgICJVbnNhdGlzZmllZExpbmtFcnJvciIsCi0gICAgICAgICAgICAiVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvciIsCi0gICAgICAgICAgICAiVmVyaWZ5RXJyb3IiLAotICAgICAgICAgICAgIlZpcnR1YWxNYWNoaW5lRXJyb3IiLAotICAgICAgICB9Ci0gICAgKSk7Ci0gICAgKi8KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldCBqYXZhTmFtZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgewotICAgICAgICAgICAgLy8gMS4gYWxsIHRoZSBKYXZhLmxhbmcgY2xhc3NlcyBbMS40LjEgSkRLXS4KLSAgICAgICAgICAgICJDaGFyU2VxdWVuY2UiLAotICAgICAgICAgICAgIkNsb25lYWJsZSIsCi0gICAgICAgICAgICAiQ29tcGFyYWJsZSIsCi0gICAgICAgICAgICAiUnVubmFibGUiLAotCi0gICAgICAgICAgICAiQm9vbGVhbiIsCi0gICAgICAgICAgICAiQnl0ZSIsCi0gICAgICAgICAgICAiQ2hhcmFjdGVyIiwKLSAgICAgICAgICAgICJDbGFzcyIsCi0gICAgICAgICAgICAiQ2xhc3NMb2FkZXIiLAotICAgICAgICAgICAgIkNvbXBpbGVyIiwKLSAgICAgICAgICAgICJEb3VibGUiLAotICAgICAgICAgICAgIkZsb2F0IiwKLSAgICAgICAgICAgICJJbmhlcml0YWJsZVRocmVhZExvY2FsIiwKLSAgICAgICAgICAgICJJbnRlZ2VyIiwKLSAgICAgICAgICAgICJMb25nIiwKLSAgICAgICAgICAgICJNYXRoIiwKLSAgICAgICAgICAgICJOdW1iZXIiLAotICAgICAgICAgICAgIk9iamVjdCIsCi0gICAgICAgICAgICAiUGFja2FnZSIsCi0gICAgICAgICAgICAiUHJvY2VzcyIsCi0gICAgICAgICAgICAiUnVudGltZSIsCi0gICAgICAgICAgICAiUnVudGltZVBlcm1pc3Npb24iLAotICAgICAgICAgICAgIlNlY3VyaXR5TWFuYWdlciIsCi0gICAgICAgICAgICAiU2hvcnQiLAotICAgICAgICAgICAgIlN0YWNrVHJhY2VFbGVtZW50IiwKLSAgICAgICAgICAgICJTdHJpY3RNYXRoIiwKLSAgICAgICAgICAgICJTdHJpbmciLAotICAgICAgICAgICAgIlN0cmluZ0J1ZmZlciIsCi0gICAgICAgICAgICAiU3lzdGVtIiwKLSAgICAgICAgICAgICJUaHJlYWQiLAotICAgICAgICAgICAgIlRocmVhZEdyb3VwIiwKLSAgICAgICAgICAgICJUaHJlYWRMb2NhbCIsCi0gICAgICAgICAgICAiVGhyb3dhYmxlIiwKLSAgICAgICAgICAgICJWb2lkIiwKLQotICAgICAgICAgICAgIkFyaXRobWV0aWNFeGNlcHRpb24iLAotICAgICAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQXJyYXlTdG9yZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQ2xhc3NDYXN0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24iLAotICAgICAgICAgICAgIk5vU3VjaEZpZWxkRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOb1N1Y2hNZXRob2RFeGNlcHRpb24iLAotICAgICAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOdW1iZXJGb3JtYXRFeGNlcHRpb24iLAotICAgICAgICAgICAgIlJ1bnRpbWVFeGNlcHRpb24iLAotICAgICAgICAgICAgIlNlY3VyaXR5RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsCi0KLSAgICAgICAgICAgICJBYnN0cmFjdE1ldGhvZEVycm9yIiwKLSAgICAgICAgICAgICJBc3NlcnRpb25FcnJvciIsCi0gICAgICAgICAgICAiQ2xhc3NDaXJjdWxhcml0eUVycm9yIiwKLSAgICAgICAgICAgICJDbGFzc0Zvcm1hdEVycm9yIiwKLSAgICAgICAgICAgICJFcnJvciIsCi0gICAgICAgICAgICAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXJyb3IiLAotICAgICAgICAgICAgIkluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IiLAotICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FcnJvciIsCi0gICAgICAgICAgICAiSW50ZXJuYWxFcnJvciIsCi0gICAgICAgICAgICAiTGlua2FnZUVycm9yIiwKLSAgICAgICAgICAgICJOb0NsYXNzRGVmRm91bmRFcnJvciIsCi0gICAgICAgICAgICAiTm9TdWNoRmllbGRFcnJvciIsCi0gICAgICAgICAgICAiTm9TdWNoTWV0aG9kRXJyb3IiLAotICAgICAgICAgICAgIk91dE9mTWVtb3J5RXJyb3IiLAotICAgICAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvciIsCi0gICAgICAgICAgICAiVGhyZWFkRGVhdGgiLAotICAgICAgICAgICAgIlVua25vd25FcnJvciIsCi0gICAgICAgICAgICAiVW5zYXRpc2ZpZWRMaW5rRXJyb3IiLAotICAgICAgICAgICAgIlVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IiLAotICAgICAgICAgICAgIlZlcmlmeUVycm9yIiwKLSAgICAgICAgICAgICJWaXJ0dWFsTWFjaGluZUVycm9yIiwKLQotICAgICAgICAgICAgLy8gMi4gb3RoZXIgY2xhc3NlcyB1c2VkIGFzIHByaW1pdGl2ZSB0eXBlcyBieSB4bWwgYmVhbnMKLSAgICAgICAgICAgICJCaWdJbnRlZ2VyIiwKLSAgICAgICAgICAgICJCaWdEZWNpbWFsIiwKLSAgICAgICAgICAgICJFbnVtIiwKLSAgICAgICAgICAgICJEYXRlIiwKLSAgICAgICAgICAgICJHRGF0ZSIsCi0gICAgICAgICAgICAiR0R1cmF0aW9uIiwKLSAgICAgICAgICAgICJRTmFtZSIsCi0gICAgICAgICAgICAiTGlzdCIsCi0KLSAgICAgICAgICAgIC8vIDMuIHRoZSB0b3AgZmV3IG9yZy5hcGFjaGUueG1sYmVhbnMgbmFtZXMKLSAgICAgICAgICAgICJYbWxPYmplY3QiLAotICAgICAgICAgICAgIlhtbEN1cnNvciIsCi0gICAgICAgICAgICAiWG1sQmVhbnMiLAotICAgICAgICAgICAgIlNjaGVtYVR5cGUiLAotICAgICAgICB9Ci0gICAgKSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEphdmFJZGVudGlmaWVyKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIGlmIChpZCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWQgY2Fubm90IGJlIG51bGwiKTsKLQotICAgICAgICBpbnQgbGVuID0gaWQubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoamF2YVdvcmRzLmNvbnRhaW5zKGlkKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoaWQuY2hhckF0KDApKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChpZC5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SkFYUlBDQ2xhc3NOYW1lKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKTsKLSAgICAgICAgbmFtZSA9IHVwcGVyY2FzZUZpcnN0TGV0dGVyKCBuYW1lICk7Ci0KLSAgICAgICAgaWYgKGlzVmFsaWRKYXZhSWRlbnRpZmVyKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiXyIgKyBuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SkFYUlBDTWV0aG9kTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy4nLCdfJyk7Ci0gICAgICAgIG5hbWUgPSBsb3dlcmNhc2VGaXJzdExldHRlcihuYW1lKTsKLQotICAgICAgICBpZiAoaXNWYWxpZEphdmFJZGVudGlmZXIobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJfIiArIG5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTE5hbWUgZ2V0WE1MTmFtZUZyb21DbGFzcyhDbGFzcyBjbGF6eikKLSAgICB7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBOYW1lVXRpbC5nZXROYW1lc3BhY2VGcm9tUGFja2FnZShjbGF6eik7Ci0gICAgICAgIFN0cmluZyBsbmFtZSA9IE5hbWVVdGlsLmdldFJvb3RDbGFzc05hbWVGcm9tQ2xhc3MoY2xhenouZ2V0TmFtZSgpKTsKLSAgICAgICAgWE1MTmFtZSB4c2RfbmFtZSA9IG5ldyBOYW1lKHVyaSwgbG5hbWUpOwotICAgICAgICByZXR1cm4geHNkX25hbWU7Ci0gICAgfQotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWVGcm9tUU5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgamF2YV90eXBlID0gdXBwZXJDYW1lbENhc2UocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIFN0cmluZyB1cmkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIGphdmFfcGtnID0gbnVsbDsKLQotICAgICAgICBqYXZhX3BrZyA9IGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKHVyaSk7Ci0KLSAgICAgICAgaWYgKGphdmFfcGtnICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gamF2YV9wa2cgKyAiLiIgKyBqYXZhX3R5cGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBqYXZhX3R5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTlNfUFJFRklYPSJqYXZhOiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfUFJFRklYID0gImphdmEuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZUZyb21QYWNrYWdlKGZpbmFsIENsYXNzIGNsYXp6KQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3Vycl9jbGF6eiA9IGNsYXp6OwotCi0gICAgICAgIHdoaWxlIChjdXJyX2NsYXp6LmlzQXJyYXkoKSkKLSAgICAgICAgICAgIGN1cnJfY2xhenogPSBjdXJyX2NsYXp6LmdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7Ci0gICAgICAgIGludCBsYXN0ZG90ID0gZnVsbG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgU3RyaW5nIHBrZ19uYW1lID0gbGFzdGRvdCA8IDAgPyAiIiA6IGZ1bGxuYW1lLnN1YnN0cmluZygwLCBsYXN0ZG90KTsKLQotICAgICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgYnVpbHRpbiB0eXBlcwotICAgICAgICAvKgotICAgICAgICBpZiAoY3Vycl9jbGF6ei5pc1ByaW1pdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwa2dfbmFtZSA9IGMuZ2V0SmF2YUxhbmd1YWdlTmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGtnX25hbWUuc3RhcnRzV2l0aChMQU5HX1BSRUZJWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZW1fc3RyID0gcGtnX25hbWUuc3Vic3RyaW5nKExBTkdfUFJFRklYLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIHBrZ19uYW1lID0gYy5nZXRKYXZhTGFuZ3VhZ2VOYW1lc3BhY2VVcmkoKSArICIuIiArIHJlbV9zdHI7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIEpBVkFfTlNfUFJFRklYICsgcGtnX25hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VyaVNjaGVtZUNoYXIoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY2ggPj0gJ2EnICYmIGNoIDw9J3onIHx8Ci0gICAgICAgICAgICBjaCA+PSAnQScgJiYgY2ggPD0nWicgfHwKLSAgICAgICAgICAgIGNoID49ICcwJyAmJiBjaCA8PSc5JyB8fAotICAgICAgICAgICAgY2ggPT0gJy0nIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnKycpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcmlBbHBoYUNoYXIoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY2ggPj0gJ2EnICYmIGNoIDw9J3onIHx8IGNoID49ICdBJyAmJiBjaCA8PSAnWicpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kU2NoZW1lQ29sb24oU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGludCBsZW4gPSB1cmkubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKCFpc1VyaUFscGhhQ2hhcih1cmkuY2hhckF0KDApKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIGlmICghaXNVcmlTY2hlbWVDaGFyKHVyaS5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoaSA9PSBsZW4pCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmICh1cmkuY2hhckF0KGkpICE9ICc6JykKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGpsczc3U3RyaW5nKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChidWYuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBidWYuc2V0Q2hhckF0KGksICdfJyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA9PSAwIHx8ICFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGJ1Zi5jaGFyQXQoMCkpKQotICAgICAgICAgICAgYnVmLmluc2VydCgwLCAnXycpOwotICAgICAgICBpZiAoaXNKYXZhUmVzZXJ2ZWRXb3JkKG5hbWUpKQotICAgICAgICAgICAgYnVmLmFwcGVuZCgnXycpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBzcGxpdEROUyhTdHJpbmcgZG5zKQotICAgIHsKLSAgICAgICAgLy8gSkFYQiBzYXlzOiBvbmx5IHNwbGl0K3JldmVyc2UgRE5TIGlmIFRMRCBtYXRjaGVzIGtub3duIFRMRHMgb3IgSVNPIDMxNjYKLSAgICAgICAgLy8gV2UgYXJlIGlnbm9yaW5nIHRoaXMgbm93IChUSCkKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpbnQgZW5kID0gZG5zLmxlbmd0aCgpOwotICAgICAgICBpbnQgYmVnaW4gPSBkbnMubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgZm9yICggOyBiZWdpbiAhPSAtMSA7IGJlZ2luLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkbnMuY2hhckF0KGJlZ2luKSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGpsczc3U3RyaW5nKGRucy5zdWJzdHJpbmcoYmVnaW4gKyAxLCBlbmQpKSk7Ci0gICAgICAgICAgICAgICAgZW5kID0gYmVnaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFkZChqbHM3N1N0cmluZyhkbnMuc3Vic3RyaW5nKDAsIGVuZCkpKTsKLQotICAgICAgICAvLyBKQVhCIGRyYWZ0IGV4YW1wbGUgaW1wbGllcyByZW1vdmFsIG9mIHd3dwotICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA+PSAzICYmCi0gICAgICAgICAgICAgICAgKChTdHJpbmcpcmVzdWx0LmdldChyZXN1bHQuc2l6ZSgpIC0gMSkpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ3d3ciKSkKLSAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUocmVzdWx0LnNpemUoKSAtIDEpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICAvLyBKQVhCIHNheXM6IHN0cmlwIDIgb3IgMyBsZXR0ZXIgZXh0ZW5zaW9uIG9yICIuaHRtbCIKLQotICAgICAgICBpbnQgaSA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChpID4gMCAmJiAoCi0gICAgICAgICAgICAgICAgaSArIDEgKyAyID09IGZpbGVuYW1lLmxlbmd0aCgpIHx8Ci0gICAgICAgICAgICAgICAgaSArIDEgKyAzID09IGZpbGVuYW1lLmxlbmd0aCgpIHx8Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpID09ICJodG1sIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogbm8gbmFtZXNwYWNlIC0+IHBhY2thZ2UgIm5vTmFtZXNwYWNlIgotICAgICAgICBpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIm5vTmFtZXNwYWNlIjsKLQotICAgICAgICAvLyBhcHBseSBkcmFmdCBKQVhCIHJ1bGVzCi0gICAgICAgIGludCBsZW4gPSB1cmkubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpID0gZmluZFNjaGVtZUNvbG9uKHVyaSk7Ci0gICAgICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoIGkgPj0gMCAmJiB1cmkuc3Vic3RyaW5nKDAsIGkpLmVxdWFscygiamF2YSIpKQotICAgICAgICAgICAgcmVzdWx0ID0gIEFycmF5cy5hc0xpc3QodXJpLnN1YnN0cmluZyhpICsgMSkuc3BsaXQoIlxcLiIpKTsKLQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG91dGVyOiBmb3IgKGkgPSBpICsgMTsgaSA8IGxlbjsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICh1cmkuY2hhckF0KGkpID09ICcvJykKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW4pIGJyZWFrIG91dGVyOwotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHVyaS5jaGFyQXQoaSkgIT0gJy8nKQotICAgICAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbikgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IGk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCh1cmkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpID4gMSkKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHJlc3VsdC5zaXplKCkgLSAxLCBwcm9jZXNzRmlsZW5hbWUoKFN0cmluZylyZXN1bHQuZ2V0KHJlc3VsdC5zaXplKCkgLSAxKSkpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBzcGxpdGRucyA9IHNwbGl0RE5TKChTdHJpbmcpcmVzdWx0LmdldCgwKSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnJlbW92ZSgwKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKDAsIHNwbGl0ZG5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQobm9uSmF2YUtleXdvcmQobG93ZXJDYW1lbENhc2UoKFN0cmluZylpdC5uZXh0KCkpKSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCcuJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi5zdWJzdHJpbmcoMCwgYnVmLmxlbmd0aCgpIC0gMSk7IC8vIGNob3Agb2ZmIGV4dHJhIGRvdAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odXBwZXJDYXNlVW5kZXJiYXIoYXJnc1tpXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB1cHBlci1jYXNlLWFuZC11bmRlcmJhciBzdHJpbmcgdXNpbmcgdGhlIEpBWEIgcnVsZXMuCi0gICAgICogQWx3YXlzIHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgdGhhdCBpcyBhIHZhbGlkCi0gICAgICogamF2YSBpZGVudGlmaWVyIHN0YXJ0LiAoSWYgSkFYQiBydWxlcyBkb24ndCBwcm9kdWNlCi0gICAgICogb25lLCB0aGVuICJYXyIgaXMgcHJlcGVuZGVkLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1cHBlckNhc2VVbmRlcmJhcihTdHJpbmcgeG1sX25hbWUpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBMaXN0IHdvcmRzID0gc3BsaXRXb3Jkcyh4bWxfbmFtZSk7Ci0KLSAgICAgICAgZmluYWwgaW50IHN6ID0gd29yZHMuc2l6ZSgpIC0gMTsKLSAgICAgICAgaWYgKHN6ID49IDAgJiYgIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKChTdHJpbmcpd29yZHMuZ2V0KDApKS5jaGFyQXQoMCkpKQotICAgICAgICAgICAgYnVmLmFwcGVuZCgiWF8iKTsKLQotICAgICAgICBmb3IoaW50IGkgPSAwIDsgaSA8IHN6IDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKChTdHJpbmcpd29yZHMuZ2V0KGkpKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoVVNDT1JFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzeiA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKChTdHJpbmcpd29yZHMuZ2V0KHN6KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3VwY2FzZSBlbnRpcmUgYnVmZmVyCi0gICAgICAgIGZpbmFsIGludCBsZW4gPSBidWYubGVuZ3RoKCk7Ci0gICAgICAgIGZvcihpbnQgaiA9IDAgOyBqIDwgbGVuIDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBidWYuY2hhckF0KGopOwotICAgICAgICAgICAgYnVmLnNldENoYXJBdChqLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjYW1lbC1jYXNlZCBzdHJpbmcgdXNpbmcgdGhlIEpBWEIgcnVsZXMuCi0gICAgICogQWx3YXlzIHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgdGhhdCBpcyBhIHZhbGlkCi0gICAgICogamF2YSBpZGVudGlmaWVyIHN0YXJ0LiAoSWYgSkFYQiBydWxlcyBkb24ndCBwcm9kdWNlCi0gICAgICogb25lLCB0aGVuICJYIiBpcyBwcmVwZW5kZWQuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwcGVyQ2FtZWxDYXNlKFN0cmluZyB4bWxfbmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIExpc3Qgd29yZHMgPSBzcGxpdFdvcmRzKHhtbF9uYW1lKTsKLQotICAgICAgICBpZiAod29yZHMuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KCgoU3RyaW5nKXdvcmRzLmdldCgwKSkuY2hhckF0KDApKSkKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJYIik7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHdvcmRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZShpdHIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKFN0cmluZylpdHIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNhbWVsLWNhc2VkIHN0cmluZyB1c2luZyB0aGUgSkFYQiBydWxlcywKLSAgICAgKiB3aGVyZSB0aGUgZmlyc3QgY29tcG9uZW50IGlzIGxvd2VyY2FzZWQuIE5vdGUgdGhhdAotICAgICAqIGlmIHRoZSBmaXJzdCBjb21wb25lbnQgaXMgYW4gYWNyb255bSwgdGhlIHdob2xlCi0gICAgICogdGhpZ25zIGdldHMgbG93ZXJjYXNlZC4KLSAgICAgKiBBbHdheXMgc3RhcnRzIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIHRoYXQgaXMgYSB2YWxpZAotICAgICAqIGphdmEgaWRlbnRpZmllciBzdGFydC4gKElmIEpBWEIgcnVsZXMgZG9uJ3QgcHJvZHVjZQotICAgICAqIG9uZSwgdGhlbiAieCIgaXMgcHJlcGVuZGVkLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsb3dlckNhbWVsQ2FzZShTdHJpbmcgeG1sX25hbWUpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBMaXN0IHdvcmRzID0gc3BsaXRXb3Jkcyh4bWxfbmFtZSk7Ci0KLSAgICAgICAgaWYgKHdvcmRzLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaXJzdCA9ICgoU3RyaW5nKXdvcmRzLmdldCgwKSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIGNoYXIgZiA9IGZpcnN0LmNoYXJBdCgwKTsKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChmKSkKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJ4Iik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKGZpcnN0KTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gd29yZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGl0ci5uZXh0KCk7IC8vIHNraXAgYWxyZWFkeS1sb3dlcmNhc2VkIHdvcmQKLSAgICAgICAgICAgIHdoaWxlKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoU3RyaW5nKWl0ci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1cHBlckNhc2VGaXJzdExldHRlcihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChzLmxlbmd0aCgpID09IDAgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHMuY2hhckF0KDApKSkKLSAgICAgICAgICAgIHJldHVybiBzOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHMpOwotICAgICAgICBidWYuc2V0Q2hhckF0KDAsIENoYXJhY3Rlci50b1VwcGVyQ2FzZShidWYuY2hhckF0KDApKSk7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAgIHNwbGl0IGFuIHhtbCBuYW1lIGludG8gd29yZHMgdmlhIEpBWEIgYXBwcm9hY2gsIHVwY2FzaW5nIGZpcnN0Ci0gICAgICAgbGV0dGVyIG9mIGVhY2ggd29yZCBhcyBuZWVkZWQsIGlmIHVwY2FzZSBpcyB0cnVlCi0KLSAgICAgICBuY25hbWUgaXMgeG1sIG5jbmFtZSAoaS5lLiBubyBjb2xvbnMpLgotICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDYXBwZWQoTGlzdCBsaXN0LCBTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgaWYgKHN0ci5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBsaXN0LmFkZCh1cHBlckNhc2VGaXJzdExldHRlcihzdHIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Qgc3BsaXRXb3JkcyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGxlbiA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGludCBwcmVmaXggPSBTVEFSVDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGN1cnJlbnQgPSBnZXRDaGFyQ2xhc3MobmFtZS5jaGFyQXQoaSkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBQVU5DVCAmJiBjdXJyZW50ID09IFBVTkNUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZENhcHBlZChsaXN0LCBuYW1lLnN1YnN0cmluZyhzdGFydCwgaSkpOwotICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudCA9IGdldENoYXJDbGFzcyhuYW1lLmNoYXJBdChpKSkpID09IFBVTkNUKQotICAgICAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbikgcmV0dXJuIGxpc3Q7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKHByZWZpeCA9PSBESUdJVCkgIT0gKGN1cnJlbnQgPT0gRElHSVQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAocHJlZml4ID09IExPV0VSICYmIGN1cnJlbnQgIT0gTE9XRVIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoaXNMZXR0ZXIocHJlZml4KSAhPSBpc0xldHRlcihjdXJyZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkQ2FwcGVkKGxpc3QsIG5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocHJlZml4ID09IFVQUEVSICYmIGN1cnJlbnQgPT0gTE9XRVIgJiYgaSA+IHN0YXJ0ICsgMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRDYXBwZWQobGlzdCwgbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGkgLSAxKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZWZpeCA9IGN1cnJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkQ2FwcGVkKGxpc3QsIG5hbWUuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8vY2hhciBjbGFzc2VzCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVJUID0gMDsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUFVOQ1QgPSAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBESUdJVCA9IDI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BUksgPSAzOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBVUFBFUiA9IDQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExPV0VSPSA1OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBOT0NBU0U9IDY7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDaGFyQ2xhc3MoY2hhciBjKQotICAgIHsKLSAgICAgICAgLy9vcmRlcmluZyBpcyBpbXBvcnRhbnQgaGVyZS4KLSAgICAgICAgaWYgKGlzUHVuY3R1YXRpb24oYykpCi0gICAgICAgICAgICByZXR1cm4gUFVOQ1Q7Ci0gICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMpKQotICAgICAgICAgICAgcmV0dXJuIERJR0lUOwotICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYykpCi0gICAgICAgICAgICByZXR1cm4gVVBQRVI7Ci0gICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkKLSAgICAgICAgICAgIHJldHVybiBMT1dFUjsKLSAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGMpKQotICAgICAgICAgICAgcmV0dXJuIE5PQ0FTRTsKLSAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotICAgICAgICAgICAgcmV0dXJuIE1BUks7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBQVU5DVDsgLy8gbm90IGNvdmVyZWQgYnkgSkFYQjogdHJlYXQgaXQgYXMgcHVuY3R1YXRpb24KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyKGludCBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoc3RhdGU9PVVQUEVSCi0gICAgICAgICAgICAgIHx8IHN0YXRlPT1MT1dFUgotICAgICAgICAgICAgICB8fCBzdGF0ZT09Tk9DQVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdW5jdHVhdGlvbihjaGFyIGMpCi0gICAgewotICAgICAgICByZXR1cm4gKGMgPT0gSFlQSEVOCi0gICAgICAgICAgICAgIHx8IGMgPT0gUEVSSU9ECi0gICAgICAgICAgICAgIHx8IGMgPT0gQ09MT04KLSAgICAgICAgICAgICAgfHwgYyA9PSBVU0NPUkUKLSAgICAgICAgICAgICAgfHwgYyA9PSBET1QKLSAgICAgICAgICAgICAgfHwgYyA9PSBURUxFSUEKLSAgICAgICAgICAgICAgfHwgYyA9PSBBWUFICi0gICAgICAgICAgICAgIHx8IGMgPT0gRUxISVpCKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlbmRlZCB0byBiZSBhcHBsaWVkIHRvIGEgbG93ZXJjYXNlLXN0YXJ0aW5nIGlkZW50aWZpZXIgdGhhdAotICAgICAqIG1heSBjb2xsaWRlIHdpdGggYSBKYXZhIGtleXdvcmQuICBJZiBpdCBkb2VzIGNvbGxpZGUsIHRoaXMKLSAgICAgKiBwcmVwZW5kcyB0aGUgbGV0dGVyICJ4Ii4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub25KYXZhS2V5d29yZChTdHJpbmcgd29yZCkKLSAgICB7Ci0gICAgICAgIGlmIChpc0phdmFSZXNlcnZlZFdvcmQod29yZCkpCi0gICAgICAgICAgICByZXR1cm4gJ3gnICsgd29yZDsKLSAgICAgICAgcmV0dXJuIHdvcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZW5kZWQgdG8gYmUgYXBwbGllZCB0byBhbiB1cHBlcmNhc2Utc3RhcnRpbmcgaWRlbnRpZmllciB0aGF0Ci0gICAgICogbWF5IGNvbGxpZGUgd2l0aCBhIGphdmEubGFuZy4qIGNsYXNzbmFtZS4gIElmIGl0IGRvZXMgY29sbGlkZSwgdGhpcwotICAgICAqIHByZXBlbmRzIHRoZSBsZXR0ZXIgIlgiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vbkphdmFDb21tb25DbGFzc05hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoaXNKYXZhQ29tbW9uQ2xhc3NOYW1lKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuICJYIiArIG5hbWU7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKYXZhUmVzZXJ2ZWRXb3JkKFN0cmluZyB3b3JkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzSmF2YVJlc2VydmVkV29yZCh3b3JkLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YVJlc2VydmVkV29yZChTdHJpbmcgd29yZCwgYm9vbGVhbiBpZ25vcmVfY2FzZSkKLSAgICB7Ci0gICAgICAgIGlmIChpZ25vcmVfY2FzZSkKLSAgICAgICAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIHJldHVybiBqYXZhV29yZHMuY29udGFpbnMod29yZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUNvbW1vbkNsYXNzTmFtZShTdHJpbmcgd29yZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBqYXZhTmFtZXMuY29udGFpbnMod29yZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1BhcnNlVXRpbC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1BhcnNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkwZTdlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QYXJzZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLS8qKgotICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQotICogRGF0ZTogTm92IDI1LCAyMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVV0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltSW5pdGlhbFBsdXMoU3RyaW5nIHhtbCkKLSAgICB7Ci0gICAgICAgIGlmICh4bWwhPW51bGwgJiYgeG1sLmNoYXJBdCgwKSA9PSAnKycpIHsKLSAgICAgICAgICAgIHJldHVybiB4bWwuc3Vic3RyaW5nKDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHhtbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QcmVmaXhSZXNvbHZlci5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ByZWZpeFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYWY1MjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ByZWZpeFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZpeFJlc29sdmVyCi17Ci0gICAgLyoqCi0gICAgICogQ2FsZWQgd2hlbiB0aGUgdXNlciBoYXMgYSBwcmVmaXggYW5kIG5lZWRzIHRvIGxvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBuYW1lc3BhY2UgVVJJLiBJZiB0aGUgcHJlZml4IGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgY29udGV4dCwgdGhlbiB0aGlzCi0gICAgICogbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gIFRoZSBuby1uYW1lc3BhY2UgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGVtcHR5Ci0gICAgICogc3RyaW5nIHJldHVybiByZXN1bHQuCi0gICAgICogCi0gICAgICogSWYgdGhlIHByZWZpeCBpcyBudWxsIG9yICIiLCB0aGVuIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBpcyBiZWluZwotICAgICAqIHJlcXVlc3RlZC4gIFRvIGNvbmZvcm0gd2l0aCB0aGUgWE1MIHNwZWMsIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB3aWxsCi0gICAgICogcmV0dXJuIHRoZSBuby1uYW1lc3BhY2UgKCIiKSBpZiBpdCBpcyBub3QgbWFwcGVkLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUHVzaGVkSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QdXNoZWRJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA2Njc3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QdXNoZWRJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFB1c2hlZElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVmYXVsdEJ1ZmZlclNpemUgPSAyMDQ4OwotICAgIHByb3RlY3RlZCBieXRlIGJ1ZltdOwotICAgIHByb3RlY3RlZCBpbnQgd3JpdGVwb3M7Ci0gICAgcHJvdGVjdGVkIGludCByZWFkcG9zOwotICAgIHByb3RlY3RlZCBpbnQgbWFya3BvcyA9IC0xOwotICAgIHByb3RlY3RlZCBpbnQgbWFya2xpbWl0OwotICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEludGVybmFsT3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBtb3JlIGJ5dGVzIG5lZWQgdG8gYmUgd3JpdHRlbiBpbnRvIHRoaXMgc3RyZWFtCi0gICAgICogKGFzIGFuIE91dHB1dFN0cmVhbSkuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IHdyaXRlIGF0IGxlYXN0IG9uZSBieXRlIGlmIHRoZSBzdHJlYW0gaXMKLSAgICAgKiBub3QgZW5kZWQsIGFuZCBpdCBtdXN0IG5vdCB3cml0ZSBhbnkgYnl0ZXMgaWYgdGhlIHN0cmVhbSBoYXMKLSAgICAgKiBhbHJlYWR5IGVuZGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGwoaW50IHJlcXVlc3RlZEJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaW5rZWQgb3V0cHV0IHN0cmVhbS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgdGhlIG91dHB1dCBzdHJlYW0gdGhhdCBtdXN0IGJlIHdyaXR0ZW4gdG8gd2hlbmV2ZXIKLSAgICAgKiB0aGUgZmlsbCBtZXRob2QgaXMgY2FsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIFB1c2hlZElucHV0U3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIHRoaXMoZGVmYXVsdEJ1ZmZlclNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQdXNoZWRJbnB1dFN0cmVhbShpbnQgc2l6ZSkKLSAgICB7Ci0gICAgICAgIGlmIChzaXplIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVnYXRpdmUgaW5pdGlhbCBidWZmZXIgc2l6ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHJvb20gZm9yIGNiIG1vcmUgYnl0ZXMgb2YgZGF0YQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzaGlmdChpbnQgY2IpCi0gICAgewotICAgICAgICBpbnQgc2F2ZXBvcyA9IHJlYWRwb3M7Ci0gICAgICAgIGlmIChtYXJrcG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlYWRwb3MgLSBtYXJrcG9zID4gbWFya2xpbWl0KQotICAgICAgICAgICAgICAgIG1hcmtwb3MgPSAtMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzYXZlcG9zID0gbWFya3BvczsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplID0gd3JpdGVwb3MgLSBzYXZlcG9zOwotCi0gICAgICAgIGlmIChzYXZlcG9zID4gMCAmJiBidWYubGVuZ3RoIC0gc2l6ZSA+PSBjYiAmJiBzaXplIDw9IGNiKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1Ziwgc2F2ZXBvcywgYnVmLCAwLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuZXdjb3VudCA9IHNpemUgKyBjYjsKLSAgICAgICAgICAgIGJ5dGUgbmV3YnVmW10gPSBuZXcgYnl0ZVtNYXRoLm1heChidWYubGVuZ3RoIDw8IDEsIG5ld2NvdW50KV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1Ziwgc2F2ZXBvcywgbmV3YnVmLCAwLCBzaXplKTsKLSAgICAgICAgICAgIGJ1ZiA9IG5ld2J1ZjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYXZlcG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhZHBvcyAtPSBzYXZlcG9zOwotICAgICAgICAgICAgaWYgKG1hcmtwb3MgPiAwKQotICAgICAgICAgICAgICAgIG1hcmtwb3MgLT0gc2F2ZXBvczsKLSAgICAgICAgICAgIHdyaXRlcG9zIC09IHNhdmVwb3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAocmVhZHBvcyA+PSB3cml0ZXBvcykKLSAgICAgICAgewotICAgICAgICAgICAgZmlsbCgxKTsKLSAgICAgICAgICAgIGlmIChyZWFkcG9zID49IHdyaXRlcG9zKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmW3JlYWRwb3MrK10gJiAweGZmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgY2hhcmFjdGVycyBpbnRvIGEgcG9ydGlvbiBvZiBhbiBhcnJheSwgcmVhZGluZyBmcm9tIHRoZSB1bmRlcmx5aW5nCi0gICAgICogc3RyZWFtIGF0IG1vc3Qgb25jZSBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnQgYXZhaWwgPSB3cml0ZXBvcyAtIHJlYWRwb3M7Ci0gICAgICAgIGlmIChhdmFpbCA8IGxlbikKLSAgICAgICAgewotICAgICAgICAgICAgZmlsbChsZW4gLSBhdmFpbCk7Ci0gICAgICAgICAgICBhdmFpbCA9IHdyaXRlcG9zIC0gcmVhZHBvczsKLSAgICAgICAgICAgIGlmIChhdmFpbCA8PSAwKSByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGNudCA9IChhdmFpbCA8IGxlbikgPyBhdmFpbCA6IGxlbjsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHJlYWRwb3MsIGIsIG9mZiwgY250KTsKLSAgICAgICAgcmVhZHBvcyArPSBjbnQ7Ci0gICAgICAgIHJldHVybiBjbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChuIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBsb25nIGF2YWlsID0gd3JpdGVwb3MgLSByZWFkcG9zOwotCi0gICAgICAgIGlmIChhdmFpbCA8IG4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZpbGwgaW4gYnVmZmVyIHRvIHNhdmUgYnl0ZXMgZm9yIHJlc2V0Ci0gICAgICAgICAgICBsb25nIHJlcSA9IG4gLSBhdmFpbDsKLSAgICAgICAgICAgIGlmIChyZXEgPiBJbnRlZ2VyLk1BWF9WQUxVRSkKLSAgICAgICAgICAgICAgICByZXEgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgIGZpbGwoKGludClyZXEpOwotICAgICAgICAgICAgYXZhaWwgPSB3cml0ZXBvcyAtIHJlYWRwb3M7Ci0gICAgICAgICAgICBpZiAoYXZhaWwgPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgc2tpcHBlZCA9IChhdmFpbCA8IG4pID8gYXZhaWwgOiBuOwotICAgICAgICByZWFkcG9zICs9IHNraXBwZWQ7Ci0gICAgICAgIHJldHVybiBza2lwcGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGF2YWlsYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gd3JpdGVwb3MgLSByZWFkcG9zOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpCi0gICAgewotICAgICAgICBtYXJrbGltaXQgPSByZWFkbGltaXQ7Ci0gICAgICAgIG1hcmtwb3MgPSByZWFkcG9zOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKG1hcmtwb3MgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZXNldHRpbmcgdG8gaW52YWxpZCBtYXJrIik7Ci0gICAgICAgIHJlYWRwb3MgPSBtYXJrcG9zOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbQotICAgIHsKLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHdyaXRlcG9zICsgMSA+IGJ1Zi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hpZnQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZbd3JpdGVwb3NdID0gKGJ5dGUpYjsKLSAgICAgICAgICAgIHdyaXRlcG9zICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgob2ZmIDwgMCkgfHwgKG9mZiA+IGIubGVuZ3RoKSB8fCAobGVuIDwgMCkgfHwKLSAgICAgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKHdyaXRlcG9zICsgbGVuID4gYnVmLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBzaGlmdChsZW4pOwotCi0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgYnVmLCB3cml0ZXBvcywgbGVuKTsKLSAgICAgICAgICAgIHdyaXRlcG9zICs9IGxlbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9RTmFtZUhlbHBlci5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1FOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Yjg1MmYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1FOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci0KLXB1YmxpYyBjbGFzcyBRTmFtZUhlbHBlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBXRUxMX0tOT1dOX1BSRUZJWEVTID0gYnVpbGRXS1AoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MTmFtZSBnZXRYTUxOYW1lKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHFuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gWE1MTmFtZUhlbHBlci5mb3JMTlMoIHFuYW1lLmdldExvY2FsUGFydCgpLCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZm9yTE5TKFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICAgICAgICB1cmkgPSAiIjsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh1cmksIGxvY2FsbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBmb3JMTihTdHJpbmcgbG9jYWxuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiIiwgbG9jYWxuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGZvclByZXR0eShTdHJpbmcgcHJldHR5LCBpbnQgb2Zmc2V0KQotICAgIHsKLSAgICAgICAgaW50IGF0ID0gcHJldHR5LmluZGV4T2YoJ0AnLCBvZmZzZXQpOwotICAgICAgICBpZiAoYXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiIiwgcHJldHR5LnN1YnN0cmluZyhvZmZzZXQpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShwcmV0dHkuc3Vic3RyaW5nKGF0ICsgMSksIHByZXR0eS5zdWJzdHJpbmcob2Zmc2V0LCBhdCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXR0eShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0KLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGRpZ2l0cyA9IG5ldyBjaGFyW10KLSAgICAgICAgeycwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJ307Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FmZShpbnQgYykKLSAgICB7Ci0gICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHByb2R1Y2VzIGEgc3RyaW5nIHdoaWNoIGlzIGEgc2FmZSBmaWxlbmFtZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgcy4KLSAgICAvLyBUbyBtYWtlIGl0IGEgc2FmZSBmaWxlbmFtZSwgdGhlIGZvbGxvd2luZyB0d28gdHJhbnNmb3JtYXRpb25zIGFyZSBhcHBsaWVkOgotICAgIC8vCi0gICAgLy8gMS4gRmlyc3QgYWxsIG5vbi1hc2NpaS1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZwotICAgIC8vICAgIHRoZWlyIFVURjggYnl0ZSBzZXF1ZW5jZSwgaW4gdGhlIGZvcm0gX3h4X3h4X3h4LCBmb3IgZXhhbXBsZSwKLSAgICAvLyAgICAiSGVsbG9fMjBUaGVyZSIgZm9yICJIZWxsbyBUaGVyZSIuICAoT2J2aW91c2x5LCBhIHNpbmdsZSB1bmljb2RlCi0gICAgLy8gICAgY2hhcmFjdGVyIG1heSBleHBhbmQgaW50byBhcyBtYW55IGFzIHRocmVlIGVzY2FwZSBwYXR0ZXJucy4pCi0gICAgLy8gICAgSWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgNjQgY2hhcmFjdGVycyBvciBmZXdlciwgdGhhdCdzIHRoZSByZXN1bHQuCi0gICAgLy8KLSAgICAvLyAyLiBJZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzLCB0aGVuIGl0IGlzCi0gICAgLy8gICAgZGlzY2FyZGVkLiAgSW5zdGVhZCwgdGhlIFNIQTEgYWxnb3JpdGhtIGlzIHJ1biBvbiB0aGUgb3JpZ2luYWwKLSAgICAvLyAgICBzdHJpbmcncyBVVEY4IHJlcHJlc2VudGF0aW9uLCBhbmQgdGhlbiB0aGUgcmVzdWx0aW5nIDIwLWJ5dGUgbWVzc2FnZQotICAgIC8vICAgIGRpZ2VzdCBpcyB0dXJuZWQgaW50byBhIDQwLWNoYXJhY3RlciBoZXggc3RyaW5nOyB0aGVuICJVUklfU0hBXzFfIiBpcwotICAgIC8vICAgIHByZXBlbmRlZC4KLSAgICAvLwotICAgIC8vIFRoZSByZWFzb24gZm9yIHRoZSAic2hvcnRlbmluZyIgaXMgdG8gYXZvaWQgZmlsZW5hbWVzIGxvbmdlciB0aGFuIGFib3V0Ci0gICAgLy8gMjU2IGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBwcm9oaWJpdGVkIG9uIFdpbmRvd3MgTlQuCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTkFNRV9MRU5HVEggPSA2NDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGlzU2FmZShjaCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHV0ZjggPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXRmOCA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB1dGY4Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdfJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhleGRpZ2l0c1sodXRmOFtqXSA+PiA0KSAmIDB4Rl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbdXRmOFtqXSAmIDB4Rl0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGkgYWx3YXlzIHN1cHBvcnRlZAotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJfQkFEX1VURjhfQ0hBUiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNob3J0IGVub3VnaD8gRG9uZSEKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA8PSBNQVhfTkFNRV9MRU5HVEgpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgLy8gdG9vIGxvbmc/IHVzZSBTSEExCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBNZXNzYWdlRGlnZXN0IG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIik7Ci0gICAgICAgICAgICBieXRlW10gaW5wdXRCeXRlcyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dEJ5dGVzID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgaW5wdXRCeXRlcyA9IG5ldyBieXRlWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGRpZ2VzdCA9IG1kLmRpZ2VzdChpbnB1dEJ5dGVzKTsKLSAgICAgICAgICAgIGFzc2VydChkaWdlc3QubGVuZ3RoID09IDIwKTsgLy8gU0hBMSAxNjAgYml0cyA9PSAyMCBieXRlcwotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiVVJJX1NIQV8xXyIpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaWdlc3QubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbKGRpZ2VzdFtqXSA+PiA0KSAmIDB4Rl0pOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaGV4ZGlnaXRzW2RpZ2VzdFtqXSAmIDB4Rl0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNpbmcgaW4gYSBKREsgd2l0aG91dCBhbiBTSEEgaW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmVkaXIoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICJfbm9ucy8iICsgaGV4c2FmZShuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgcmV0dXJuIGhleHNhZmUobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkgKyAiLyIgKyBoZXhzYWZlKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZFdLUCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgInhtbCIpOwotICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4cyIpOwotICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLCAid3NkbCIpOwotICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsICJzb2FwZW5jIik7Ci0gICAgICAgIHJlc3VsdC5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwgInNvYXBlbnYiKTsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gcmVhZGFibGUoc1R5cGUsIFdFTExfS05PV05fUFJFRklYRVMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlKFNjaGVtYVR5cGUgc1R5cGUsIE1hcCBuc1ByZWZpeCkKLSAgICB7Ci0gICAgICAgIGlmIChzVHlwZS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlYWRhYmxlKHNUeXBlLmdldE5hbWUoKSwgbnNQcmVmaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gImF0dHJpYnV0ZSB0eXBlICIgKyByZWFkYWJsZShzVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpLCBuc1ByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJkb2N1bWVudCB0eXBlICIgKyByZWFkYWJsZShzVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCksIG5zUHJlZml4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZS5pc05vVHlwZSgpIHx8IHNUeXBlLmdldE91dGVyVHlwZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiaW52YWxpZCB0eXBlIjsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUgb3V0ZXJUeXBlID0gc1R5cGUuZ2V0T3V0ZXJUeXBlKCk7Ci0gICAgICAgIFNjaGVtYUZpZWxkIGNvbnRhaW5lciA9IHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCk7Ci0KLSAgICAgICAgaWYgKG91dGVyVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJ0eXBlIG9mIGF0dHJpYnV0ZSAiICsgcmVhZGFibGUoY29udGFpbmVyLmdldE5hbWUoKSwgbnNQcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG91dGVyVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gInR5cGUgb2YgZWxlbWVudCAiICsgcmVhZGFibGUoY29udGFpbmVyLmdldE5hbWUoKSwgbnNQcmVmaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udGFpbmVyLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0eXBlIG9mICIgKyBjb250YWluZXIuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgIiBhdHRyaWJ1dGUgaW4gIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAidHlwZSBvZiAiICsgY29udGFpbmVyLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIgZWxlbWVudCBpbiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0ZXJUeXBlLmdldEJhc2VUeXBlKCkgPT0gc1R5cGUpCi0gICAgICAgICAgICByZXR1cm4gImJhc2UgdHlwZSBvZiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7Ci0gICAgICAgIGVsc2UgaWYgKG91dGVyVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgcmV0dXJuICJpdGVtIHR5cGUgb2YgIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOwotICAgICAgICBlbHNlIGlmIChvdXRlclR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgICAgICByZXR1cm4gIm1lbWJlciB0eXBlICIgKyBzVHlwZS5nZXRBbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWwoKSArICIgb2YgIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gImlubmVyIHR5cGUgaW4gIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gcmVhZGFibGUobmFtZSwgV0VMTF9LTk9XTl9QUkVGSVhFUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZGFibGUoUU5hbWUgbmFtZSwgTWFwIHByZWZpeGVzKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZylwcmVmaXhlcy5nZXQobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICIgaW4gbmFtZXNwYWNlICIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1Z2dlc3RQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKVdFTExfS05PV05fUFJFRklYRVMuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgaW50IGxlbiA9IG5hbWVzcGFjZS5sZW5ndGgoKTsKLSAgICAgICAgaW50IGkgPSBuYW1lc3BhY2UubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgaWYgKGkgPiAwICYmIGkgPT0gbmFtZXNwYWNlLmxlbmd0aCgpIC0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgbGVuID0gaTsKLSAgICAgICAgICAgIGkgPSBuYW1lc3BhY2UubGFzdEluZGV4T2YoJy8nLCBpIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpICs9IDE7IC8vIHNraXAgJy8nLCBhbHNvIGNvdmVycyAtMSBjYXNlLgotCi0gICAgICAgIGlmIChuYW1lc3BhY2Uuc3RhcnRzV2l0aCgid3d3LiIsIGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpICs9IDQ7IC8vICJ3d3cuIi5sZW5ndGgoKQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGkgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTkNOYW1lU3RhcnQobmFtZXNwYWNlLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBlbmQgPSBpICsgMTsgZW5kIDwgbGVuOyBlbmQgKz0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzTkNOYW1lKG5hbWVzcGFjZS5jaGFyQXQoZW5kKSkgfHwgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQobmFtZXNwYWNlLmNoYXJBdChlbmQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBlbmQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcmVmaXhlcyBzdGFydGluZyB3aXRoICJ4bWwiIGFyZSBmb3JiaWRkZW4sIHNvIGNoYW5nZSAieG1scyIgLT4gInhzIgotICAgICAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCgpID49IGkgKyAzICYmIHN0YXJ0c1dpdGhYbWwobmFtZXNwYWNlLCBpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA+PSBpICsgNCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIngiICsgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVzcGFjZS5jaGFyQXQoaSArIDMpKTsKLSAgICAgICAgICAgIHJldHVybiAibnMiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbiAtIGkgPiA0KSAvLyBmb3VyIG9yIGxlc3M/IGxlYXZlIGl0LgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNWb3dlbChuYW1lc3BhY2UuY2hhckF0KGkgKyAyKSkgJiYgIWlzVm93ZWwobmFtZXNwYWNlLmNoYXJBdChpICsgMykpKQotICAgICAgICAgICAgICAgIGxlbiA9IGkgKyA0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxlbiA9IGkgKyAzOyAvLyBtb3JlIHRoYW4gZm91cj8gdHJ1bmNhdGUgdG8gMy4KLSAgICAgICAgfQotCi0gICAgICAgIGludCBuOwotCi0gICAgICAgIGlmIChsZW4gLSBpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIm5zIjsKLQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlLnN1YnN0cmluZyhpLCBsZW4pLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoWG1sKFN0cmluZyBzLCBpbnQgaSkKLSAgICB7Ci0gICAgICAgIGlmIChzLmxlbmd0aCgpIDwgaSArIDMpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHMuY2hhckF0KGkpICE9ICdYJyAmJiBzLmNoYXJBdChpKSAhPSAneCcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChzLmNoYXJBdChpICsgMSkgIT0gJ00nICYmIHMuY2hhckF0KGkgKyAxKSAhPSAnbScpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChzLmNoYXJBdChpICsgMikgIT0gJ0wnICYmIHMuY2hhckF0KGkgKyAyKSAhPSAnbCcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Zvd2VsKGNoYXIgY2gpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICBjYXNlICdvJzoKLSAgICAgICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgY2FzZSAnTyc6Ci0gICAgICAgICAgICBjYXNlICdVJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICB3aGlsZSAoc1R5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUeXBlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBzVHlwZS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAoc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSAhPSBudWxsICYmIHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBzVHlwZSA9IHNUeXBlLmdldE91dGVyVHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUmVhZGVySW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9SZWFkZXJJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVkOGQ2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9SZWFkZXJJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVhZGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBQdXNoZWRJbnB1dFN0cmVhbQotewotICAgIHByaXZhdGUgUmVhZGVyIHJlYWRlcjsKLSAgICBwcml2YXRlIFdyaXRlciB3cml0ZXI7Ci0gICAgcHJpdmF0ZSBjaGFyW10gYnVmOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGRlZmF1bHRCdWZmZXJTaXplID0gMjA0ODsKLQotICAgIHB1YmxpYyBSZWFkZXJJbnB1dFN0cmVhbShSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzKHJlYWRlciwgZW5jb2RpbmcsIGRlZmF1bHRCdWZmZXJTaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVhZGVySW5wdXRTdHJlYW0oUmVhZGVyIHJlYWRlciwgU3RyaW5nIGVuY29kaW5nLCBpbnQgYnVmZmVyU2l6ZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChidWZmZXJTaXplIDw9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdWZmZXIgc2l6ZSA8PSAwIik7Ci0KLSAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgICAgIHRoaXMud3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihnZXRPdXRwdXRTdHJlYW0oKSwgZW5jb2RpbmcpOwotICAgICAgICBidWYgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWxsKGludCByZXF1ZXN0ZWRCeXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2hhcnMgPSByZWFkZXIucmVhZChidWYpOwotICAgICAgICAgICAgaWYgKGNoYXJzIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZShidWYsIDAsIGNoYXJzKTsKLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChhdmFpbGFibGUoKSA8PSAwKTsgLy8gbG9vcCBmb3Igc2FmZXR5LCBpbiBjYXNlIGVuY29kaW5nIGRpZG4ndCBwcm9kdWNlIGFueSBieXRlcyB5ZXQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbElucHV0U3RyZWFtLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMWFmOTIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci0KLXB1YmxpYyBjbGFzcyBTbmlmZmVkWG1sSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtCi17Ci0gICAgLy8gV2UgZG9uJ3Qgc25pZmYgbW9yZSB0aGFuIDE5MiBieXRlcy4KLSAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfU05JRkZFRF9CWVRFUyA9IDE5MjsKLQotICAgIHB1YmxpYyBTbmlmZmVkWG1sSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyKHN0cmVhbSk7Ci0KLSAgICAgICAgLy8gcmVhZCBieXRlIG9yZGVyIG1hcmtzIGFuZCBkZXRlY3QgRUJDRElDIGV0YwotICAgICAgICBfZW5jb2RpbmcgPSBzbmlmZkZvdXJCeXRlcygpOwotCi0gICAgICAgIGlmIChfZW5jb2RpbmcgIT0gbnVsbCAmJiBfZW5jb2RpbmcuZXF1YWxzKCJJQk0wMzciKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRmlyc3QgZm91ciBieXRlcyBzdWdnZXN0IEVCQ0RJQyB3aXRoIDw/eG0gYXQgc3RhcnQKLSAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHNuaWZmRm9yWG1sRGVjbChfZW5jb2RpbmcpOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX2VuY29kaW5nID0gZW5jb2Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX2VuY29kaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEhhdmVuJ3QgeWV0IGRldGVybWluZWQgZW5jb2Rpbmc6IHNuaWZmIGZvciA8P3htbCBlbmNvZGluZz0iLi4uIj8+Ci0gICAgICAgICAgICAvLyBhc3N1bWluZyB3ZSBjYW4gcmVhZCBpdCBhcyBVVEYtOC4KLSAgICAgICAgICAgIF9lbmNvZGluZyA9IHNuaWZmRm9yWG1sRGVjbCgiVVRGLTgiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIFhNTCBzcGVjIHNheXMgdGhlc2UgdHdvIHRoaW5nczoKLQotICAgICAgICAgICAgLy8gKDEpICJJbiB0aGUgYWJzZW5jZSBvZiBleHRlcm5hbCBjaGFyYWN0ZXIgZW5jb2RpbmcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIC8vIChzdWNoIGFzIE1JTUUgaGVhZGVycyksIHBhcnNlZCBlbnRpdGllcyB3aGljaCBhcmUgc3RvcmVkIGluIGFuCi0gICAgICAgICAgICAvLyBlbmNvZGluZyBvdGhlciB0aGFuIFVURi04IG9yIFVURi0xNiBtdXN0IGJlZ2luIHdpdGggYSB0ZXh0Ci0gICAgICAgICAgICAvLyBkZWNsYXJhdGlvbiAoc2VlIDQuMy4xIFRoZSBUZXh0IERlY2xhcmF0aW9uKSBjb250YWluaW5nIGFuCi0gICAgICAgICAgICAvLyBlbmNvZGluZyBkZWNsYXJhdGlvbjoiCi0KLSAgICAgICAgICAgIC8vICgyKSAiSW4gdGhlIGFic2VuY2Ugb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgYW4gZXh0ZXJuYWwKLSAgICAgICAgICAgIC8vIHRyYW5zcG9ydCBwcm90b2NvbCAoZS5nLiBIVFRQIG9yIE1JTUUpLCBpdCBpcyBhbiBlcnJvcgotICAgICAgICAgICAgLy8gZm9yIGFuIGVudGl0eSBpbmNsdWRpbmcgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24gdG8gYmUKLSAgICAgICAgICAgIC8vIHByZXNlbnRlZCB0byB0aGUgWE1MIHByb2Nlc3NvciBpbiBhbiBlbmNvZGluZyBvdGhlciB0aGFuCi0gICAgICAgICAgICAvLyB0aGF0IG5hbWVkIGluIHRoZSBkZWNsYXJhdGlvbiwgb3IgZm9yIGFuIGVudGl0eSB3aGljaCBiZWdpbnMKLSAgICAgICAgICAgIC8vIHdpdGggbmVpdGhlciBhIEJ5dGUgT3JkZXIgTWFyayBub3IgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24KLSAgICAgICAgICAgIC8vIHRvIHVzZSBhbiBlbmNvZGluZyBvdGhlciB0aGFuIFVURi04LiIKLQotICAgICAgICAgICAgLy8gU2luY2Ugd2UncmUgdXNpbmcgYSBzbmlmZmVkIHN0cmVhbSwgd2UgZG8gbm90IGhhdmUgZXh0ZXJuYWwKLSAgICAgICAgICAgIC8vIGNoYXJhY3RlciBlbmNvZGluZyBpbmZvcm1hdGlvbi4KLQotICAgICAgICAgICAgLy8gU2luY2Ugd2UncmUgaGVyZSwgd2UgYWxzbyBkb24ndCBoYXZlIGEgcmVjb2duaXplZCBieXRlIG9yZGVyCi0gICAgICAgICAgICAvLyBtYXJrIG9yIGFuIGV4cGxpY2l0IGVuY29kaW5nIGRlY2xhcmF0aW9uIHRoYXQgY2FuIGJlIHJlYWQgaW4KLSAgICAgICAgICAgIC8vIGVpdGhlciBBU0NJSSBvciBFQkRJQyBzdHlsZS4KLQotICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBtdXN0IHVzZSBVVEYtOC4KLQotICAgICAgICAgICAgX2VuY29kaW5nID0gIlVURi04IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJlYWRBc011Y2hBc1Bvc3NpYmxlKGJ5dGVbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCB0b3RhbCA9IDA7Ci0gICAgICAgIHdoaWxlICh0b3RhbCA8IGxlbikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZChidWYsIHN0YXJ0QXQgKyB0b3RhbCwgbGVuIC0gdG90YWwpOwotICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHRvdGFsICs9IGNvdW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzbmlmZkZvdXJCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFyayg0KTsKLSAgICAgICAgaW50IHNraXAgPSAwOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzRdOwotICAgICAgICAgICAgaWYgKHJlYWRBc011Y2hBc1Bvc3NpYmxlKGJ1ZiwgMCwgNCkgPCA0KQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgbG9uZyByZXN1bHQgPSAweEZGMDAwMDAwICYgKGJ1ZlswXSA8PCAyNCkgfCAweDAwRkYwMDAwICYgKGJ1ZlsxXSA8PCAxNikgfCAweDAwMDBGRjAwICYgKGJ1ZlsyXSA8PCA4KSB8IDB4MDAwMDAwRkYgJiBidWZbM107Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMHgwMDAwRkVGRikKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVDUy00IjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweEZGRkUwMDAwKQotICAgICAgICAgICAgICAgIHJldHVybiAiVUNTLTQiOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IDB4MDAwMDAwM0MpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJVQ1MtNEJFIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDNDMDAwMDAwKQotICAgICAgICAgICAgICAgIHJldHVybiAiVUNTLTRMRSI7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHgwMDNDMDAzRikKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNkJFIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDNDMDAzRjAwKQotICAgICAgICAgICAgICAgIHJldHVybiAiVVRGLTE2TEUiOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IDB4M0MzRjc4NkQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGxvb2tzIGxpa2UgVVMtQVNDSUkgd2l0aCA8P3htbDogc25pZmYKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDRDNkZBNzk0KQotICAgICAgICAgICAgICAgIHJldHVybiAiSUJNMDM3IjsgLy8gU25pZmYgZm9yIGViZGljIGNvZGVwYWdlCi0gICAgICAgICAgICBlbHNlIGlmICgocmVzdWx0ICYgMHhGRkZGMDAwMCkgPT0gMHhGRUZGMDAwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNiI7Ci0gICAgICAgICAgICBlbHNlIGlmICgocmVzdWx0ICYgMHhGRkZGMDAwMCkgPT0gMHhGRkZFMDAwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNiI7Ci0gICAgICAgICAgICBlbHNlIGlmICgocmVzdWx0ICYgMHhGRkZGRkYwMCkgPT0gMHhFRkJCQkYwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi04IjsKLSAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQlVHQlVHIGluIEpESzogQ2hhcnNldC5mb3JOYW1lIGlzIG5vdCB0aHJlYWRzYWZlLCBzbyB3ZSdsbCBwcmltZSBpdAotICAgIC8vIHdpdGggdGhlIGNvbW1vbiBjaGFyc2V0cy4KLQotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkxID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkyID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTYiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MyA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2QkUiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NCA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2TEUiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NSA9IENoYXJzZXQuZm9yTmFtZSgiSVNPLTg4NTktMSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk2ID0gQ2hhcnNldC5mb3JOYW1lKCJVUy1BU0NJSSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk3ID0gQ2hhcnNldC5mb3JOYW1lKCJDcDEyNTIiKTsKLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc25pZmZGb3JYbWxEZWNsKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtYXJrKE1BWF9TTklGRkVEX0JZVEVTKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlYnVmID0gbmV3IGJ5dGVbTUFYX1NOSUZGRURfQllURVNdOwotICAgICAgICAgICAgaW50IGJ5dGVsaW1pdCA9IHJlYWRBc011Y2hBc1Bvc3NpYmxlKGJ5dGVidWYsIDAsIE1BWF9TTklGRkVEX0JZVEVTKTsKLQotICAgICAgICAgICAgLy8gQlVHQlVHIGluIEpESzogQ2hhcnNldC5mb3JOYW1lIGlzIG5vdCB0aHJlYWRzYWZlLgotICAgICAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKTsKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVidWYsIDAsIGJ5dGVsaW1pdCksIGNoYXJzZXQpOwotICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2J5dGVsaW1pdF07Ci0gICAgICAgICAgICBpbnQgbGltaXQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGxpbWl0IDwgYnl0ZWxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWRlci5yZWFkKGJ1ZiwgbGltaXQsIGJ5dGVsaW1pdCAtIGxpbWl0KTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBsaW1pdCArPSBjb3VudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RYbWxEZWNsRW5jb2RpbmcoYnVmLCAwLCBsaW1pdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2VuY29kaW5nOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2VuY29kaW5nOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBleHRyYWN0WG1sRGVjbEVuY29kaW5nKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBzaXplKQotICAgIHsKLSAgICAgICAgaW50IGxpbWl0ID0gb2Zmc2V0ICsgc2l6ZTsKLSAgICAgICAgaW50IHhtbHBpID0gZmlyc3RJbmRleE9mKCI8P3htbCIsIGJ1Ziwgb2Zmc2V0LCBsaW1pdCk7Ci0gICAgICAgIGlmICh4bWxwaSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaSA9IHhtbHBpICsgNTsKLSAgICAgICAgICAgIFNjYW5uZWRBdHRyaWJ1dGUgYXR0ciA9IG5ldyBTY2FubmVkQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IGxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkgPSBzY2FuQXR0cmlidXRlKGJ1ZiwgaSwgbGltaXQsIGF0dHIpOwotICAgICAgICAgICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZS5lcXVhbHMoImVuY29kaW5nIikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLnZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaXJzdEluZGV4T2YoU3RyaW5nIHMsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCi0gICAgewotICAgICAgICBhc3NlcnQocy5sZW5ndGgoKSA+IDApOwotICAgICAgICBjaGFyW10gbG9va0ZvciA9IHMudG9DaGFyQXJyYXkoKTsKLQotICAgICAgICBjaGFyIGZpcnN0Y2hhciA9IGxvb2tGb3JbMF07Ci0gICAgICAgIHNlYXJjaGluZzogZm9yIChsaW1pdCAtPSBsb29rRm9yLmxlbmd0aDsgc3RhcnRBdCA8IGxpbWl0OyBzdGFydEF0KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChidWZbc3RhcnRBdF0gPT0gZmlyc3RjaGFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbG9va0Zvci5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWZbc3RhcnRBdCArIGldICE9IGxvb2tGb3JbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNlYXJjaGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dE5vbm1hdGNoaW5nQnl0ZShjaGFyW10gbG9va0ZvciwgY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsaW1pdCkKLSAgICB7Ci0gICAgICAgIHNlYXJjaGluZzogZm9yICg7IHN0YXJ0QXQgPCBsaW1pdDsgc3RhcnRBdCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdGhpc2NoYXIgPSBidWZbc3RhcnRBdF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb2tGb3IubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHRoaXNjaGFyID09IGxvb2tGb3JbaV0pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNlYXJjaGluZzsKLSAgICAgICAgICAgIHJldHVybiBzdGFydEF0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dE1hdGNoaW5nQnl0ZShjaGFyW10gbG9va0ZvciwgY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsaW1pdCkKLSAgICB7Ci0gICAgICAgIHNlYXJjaGluZzogZm9yICg7IHN0YXJ0QXQgPCBsaW1pdDsgc3RhcnRBdCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdGhpc2NoYXIgPSBidWZbc3RhcnRBdF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb2tGb3IubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHRoaXNjaGFyID09IGxvb2tGb3JbaV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEF0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dE1hdGNoaW5nQnl0ZShjaGFyIGxvb2tGb3IsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCi0gICAgewotICAgICAgICBzZWFyY2hpbmc6IGZvciAoOyBzdGFydEF0IDwgbGltaXQ7IHN0YXJ0QXQrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZltzdGFydEF0XSA9PSBsb29rRm9yKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEF0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIFdISVRFU1BBQ0UgPSBuZXcgY2hhcltdIHsgJyAnLCAnXHInLCAnXHQnLCAnXG4nIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIE5PVE5BTUUgPSBuZXcgY2hhcltdIHsgJz0nLCAnICcsICdccicsICdcdCcsICdcbicsICc/JywgJz4nLCAnPCcsICdcJycsICdcIicgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjYW5uZWRBdHRyaWJ1dGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2NhbkF0dHJpYnV0ZShjaGFyW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxpbWl0LCBTY2FubmVkQXR0cmlidXRlIGF0dHIpCi0gICAgewotICAgICAgICBpbnQgbmFtZVN0YXJ0ID0gbmV4dE5vbm1hdGNoaW5nQnl0ZShXSElURVNQQUNFLCBidWYsIHN0YXJ0QXQsIGxpbWl0KTsKLSAgICAgICAgaWYgKG5hbWVTdGFydCA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCBuYW1lRW5kID0gbmV4dE1hdGNoaW5nQnl0ZShOT1ROQU1FLCBidWYsIG5hbWVTdGFydCwgbGltaXQpOwotICAgICAgICBpZiAobmFtZUVuZCA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCBlcXVhbHMgPSBuZXh0Tm9ubWF0Y2hpbmdCeXRlKFdISVRFU1BBQ0UsIGJ1ZiwgbmFtZUVuZCwgbGltaXQpOwotICAgICAgICBpZiAoZXF1YWxzIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGJ1ZltlcXVhbHNdICE9ICc9JykKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaW50IHZhbFF1b3RlID0gbmV4dE5vbm1hdGNoaW5nQnl0ZShXSElURVNQQUNFLCBidWYsIGVxdWFscyArIDEsIGxpbWl0KTsKLSAgICAgICAgaWYgKGJ1Zlt2YWxRdW90ZV0gIT0gJ1wnJyAmJiBidWZbdmFsUXVvdGVdICE9ICdcIicpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCB2YWxFbmRxdW90ZSA9IG5leHRNYXRjaGluZ0J5dGUoYnVmW3ZhbFF1b3RlXSwgYnVmLCB2YWxRdW90ZSArIDEsIGxpbWl0KTsKLSAgICAgICAgaWYgKHZhbEVuZHF1b3RlIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgYXR0ci5uYW1lID0gbmV3IFN0cmluZyhidWYsIG5hbWVTdGFydCwgbmFtZUVuZCAtIG5hbWVTdGFydCk7Ci0gICAgICAgIGF0dHIudmFsdWUgPSBuZXcgU3RyaW5nKGJ1ZiwgdmFsUXVvdGUgKyAxLCB2YWxFbmRxdW90ZSAtIHZhbFF1b3RlIC0gMSk7Ci0gICAgICAgIHJldHVybiB2YWxFbmRxdW90ZSArIDE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxSZWFkZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTc4MTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotCi1wdWJsaWMgY2xhc3MgU25pZmZlZFhtbFJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyCi17Ci0gICAgLy8gV2UgZG9uJ3Qgc25pZmYgbW9yZSB0aGFuIDE5MiBieXRlcy4KLSAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfU05JRkZFRF9DSEFSUyA9IDE5MjsKLQotICAgIHB1YmxpYyBTbmlmZmVkWG1sUmVhZGVyKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIocmVhZGVyKTsKLSAgICAgICAgX2VuY29kaW5nID0gc25pZmZGb3JYbWxEZWNsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcmVhZEFzTXVjaEFzUG9zc2libGUoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgd2hpbGUgKHRvdGFsIDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSByZWFkKGJ1Ziwgc3RhcnRBdCArIHRvdGFsLCBsZW4gLSB0b3RhbCk7Ci0gICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgdG90YWwgKz0gY291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvdGFsOwotICAgIH0KLQotICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZSwgc28gd2UnbGwgcHJpbWUgaXQKLSAgICAvLyB3aXRoIHRoZSBjb21tb24gY2hhcnNldHMuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MSA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MiA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTMgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkJFIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTQgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkxFIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTUgPSBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NiA9IENoYXJzZXQuZm9yTmFtZSgiVVMtQVNDSUkiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NyA9IENoYXJzZXQuZm9yTmFtZSgiQ3AxMjUyIik7Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNuaWZmRm9yWG1sRGVjbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFyayhNQVhfU05JRkZFRF9DSEFSUyk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbTUFYX1NOSUZGRURfQ0hBUlNdOwotICAgICAgICAgICAgaW50IGxpbWl0ID0gcmVhZEFzTXVjaEFzUG9zc2libGUoYnVmLCAwLCBNQVhfU05JRkZFRF9DSEFSUyk7Ci0gICAgICAgICAgICByZXR1cm4gU25pZmZlZFhtbElucHV0U3RyZWFtLmV4dHJhY3RYbWxEZWNsRW5jb2RpbmcoYnVmLCAwLCBsaW1pdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2VuY29kaW5nOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2VuY29kaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljM2QwNjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25Db250ZXh0Ci17Ci0gICAgcHVibGljIHZvaWQgaW52YWxpZCAoIFN0cmluZyBtZXNzYWdlICk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ZhbGlkYXRvckxpc3RlbmVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdG9yTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhM2U1MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdG9yTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIEZpcnN0IGV2ZW50IG11c3QgYmUgYSBCRUdJTiB3aXRoIG5vIG5hbWUgKHRvIGNvbW11bmljYXRlIGFueSB4c2kKLSAqIGluZm9ybWF0aW9uKS4gIEJFR0lOIGFuZCBFTkQgbmVlZCB0byBtYXRjaC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRvckxpc3RlbmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU4gICAgPSAxOyAvLyBCZWdpbiBlbGVtZW50Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EICAgICAgPSAyOyAvLyBFbmQgZWxlbWVudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFQgICAgID0gMzsgLy8gVGV4dAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFIgICAgID0gNDsgLy8gQXR0ciAobm9uLW5hbWVzcGFjZXMsIG5vbiB4c2kgb25seSkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRBVFRSUyA9IDU7IC8vIGFmdGVyIEJFR0lOLCBhZnRlciBhdHRycwotCi0gICAgdm9pZCBuZXh0RXZlbnQgKCBpbnQga2luZCwgRXZlbnQgZXZlbnQgKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEV2ZW50IGV4dGVuZHMgUHJlZml4UmVzb2x2ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFUlZFID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRSAgPSAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xMQVBTRSA9IDM7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGdldExvY2F0aW9uQXNDdXJzb3IgKCApOwotCi0gICAgICAgIGJvb2xlYW4gZ2V0WHNpVHlwZSAgKCBDaGFycyBjaGFycyApOyAvLyBCRUdJTiB4c2k6dHlwZQotICAgICAgICBib29sZWFuIGdldFhzaU5pbCAgICggQ2hhcnMgY2hhcnMgKTsgLy8gQkVHSU4geHNpOm5pbAotICAgICAgICBib29sZWFuIGdldFhzaUxvYyAgICggQ2hhcnMgY2hhcnMgKTsgLy8gQkVHSU4geHNpOnNjaGVtYUxvY2F0aW9uCi0gICAgICAgIGJvb2xlYW4gZ2V0WHNpTm9Mb2MgKCBDaGFycyBjaGFycyApOyAvLyBCRUdJTiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbgotICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBPbiBTVEFSVCBhbmQgQVRUUgotICAgICAgICBRTmFtZSBnZXROYW1lICggKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE9uIFRFWFQgYW5kIEFUVFIKLSAgICAgICAgdm9pZCBnZXRUZXh0ICggQ2hhcnMgY2hhcnMgKTsKLSAgICAgICAgdm9pZCBnZXRUZXh0ICggQ2hhcnMgY2hhcnMsIGludCB3c3IgKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gdGV4dElzV2hpdGVzcGFjZSAoICk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YQmVhbkRlYnVnLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWEJlYW5EZWJ1Zy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQ2N2EwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YQmVhbkRlYnVnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWEJlYW5EZWJ1ZwotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUNFX1NDSEVNQV9MT0FESU5HID0gMHgwMDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYWNlUHJvcCA9ICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuZGVidWciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRQcm9wID0gIiI7IC8vICJUUkFDRV9TQ0hFTUFfTE9BRElORyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgX2VuYWJsZWQgPSBpbml0aWFsaXplQml0c0Zyb21Qcm9wZXJ0eSgpOwotICAgIHByaXZhdGUgc3RhdGljIGludCBfaW5kZW50ID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2luZGVudHNwYWNlID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBpbml0aWFsaXplQml0c0Zyb21Qcm9wZXJ0eSgpCi0gICAgewotICAgICAgICBpbnQgYml0cyA9IDA7Ci0gICAgICAgIFN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KHRyYWNlUHJvcCwgZGVmYXVsdFByb3ApOwotICAgICAgICBpZiAocHJvcC5pbmRleE9mKCJUUkFDRV9TQ0hFTUFfTE9BRElORyIpID49IDApCi0gICAgICAgICAgICBiaXRzIHw9IFRSQUNFX1NDSEVNQV9MT0FESU5HOwotICAgICAgICByZXR1cm4gYml0czsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZShpbnQgYml0cykKLSAgICB7Ci0gICAgICAgIF9lbmFibGVkID0gX2VuYWJsZWQgfCBiaXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlKGludCBiaXRzKQotICAgIHsKLSAgICAgICAgX2VuYWJsZWQgPSBfZW5hYmxlZCAmIH5iaXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShpbnQgYml0cywgU3RyaW5nIG1lc3NhZ2UsIGludCBpbmRlbnQpCi0gICAgewotICAgICAgICBpZiAodGVzdChiaXRzKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChYQmVhbkRlYnVnLmNsYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpbmRlbnQgPCAwKQotICAgICAgICAgICAgICAgICAgICBfaW5kZW50ICs9IGluZGVudDsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzcGFjZXMgPSBfaW5kZW50IDwgMCA/ICIiIDogX2luZGVudCA+IF9pbmRlbnRzcGFjZS5sZW5ndGgoKSA/IF9pbmRlbnRzcGFjZSA6IF9pbmRlbnRzcGFjZS5zdWJzdHJpbmcoMCwgX2luZGVudCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvZ21lc3NhZ2UgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICI6ICIgKyBzcGFjZXMgKyBtZXNzYWdlICsgIlxuIjsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KGxvZ21lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZGVudCA+IDApCi0gICAgICAgICAgICAgICAgICAgIF9pbmRlbnQgKz0gaW5kZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoaW50IGJpdHMpCi0gICAgewotICAgICAgICByZXR1cm4gKF9lbmFibGVkICYgYml0cykgIT0gMDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFByaW50U3RyZWFtIF9lcnI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nKFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgbG9nKG1lc3NhZ2UsIG51bGwpOwotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nU3RhY2tUcmFjZShTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGxvZyhtZXNzYWdlLCBuZXcgVGhyb3dhYmxlKCkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZyBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBzdGFja1RyYWNlKQotICAgIHsKLSAgICAgICAgaWYgKF9lcnIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBkaWFnbm9zdGljRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInhtbGJlYW5kZWJ1ZyIsICIubG9nIik7Ci0gICAgICAgICAgICAgICAgX2VyciA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkaWFnbm9zdGljRmlsZSkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGlhZ25vc3RpYyBYTUwgQmVhbiBkZWJ1ZyBsb2cgZmlsZSBjcmVhdGVkOiAiICsgZGlhZ25vc3RpY0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2VyciA9IFN5c3RlbS5lcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX2Vyci5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICBpZiAoc3RhY2tUcmFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGFja1RyYWNlLnByaW50U3RhY2tUcmFjZShfZXJyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgbG9nRXhjZXB0aW9uKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgICAgbG9nKHQuZ2V0TWVzc2FnZSgpLCB0KTsKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hNTENoYXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxDaGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NmI2ZDkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hNTENoYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMgWE1MIGNoYXJhY3RlciBwcm9wZXJ0aWVzLiBUaGUgZGF0YQotICogaW4gdGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNoYXJhY3RlciBpcyBhIHZhbGlkCi0gKiBYTUwgY2hhcmFjdGVyIG9yIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzcGFjZSwgbmFtZSBzdGFydCwgb3IgbmFtZQotICogY2hhcmFjdGVyLgotICogPHA+Ci0gKiBBIHNlcmllcyBvZiBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBzdXBwbGllZCB0byBlYXNlIHRoZSBidXJkZW4KLSAqIG9mIHRoZSBkZXZlbG9wZXIuIEJlY2F1c2UgaW5saW5pbmcgdGhlIGNoZWNrcyBjYW4gaW1wcm92ZSBwZXIKLSAqIGNoYXJhY3RlciBwZXJmb3JtYW5jZSwgdGhlIHRhYmxlcyBvZiBjaGFyYWN0ZXIgcHJvcGVydGllcyBhcmUKLSAqIHB1YmxpYy4gVXNpbmcgdGhlIGNoYXJhY3RlciBhcyBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5DSEFSUzwvY29kZT4KLSAqIGFycmF5IGFuZCBhcHBseWluZyB0aGUgYXBwcm9wcmlhdGUgbWFzayBmbGFnIChlLmcuCi0gKiA8Y29kZT5NQVNLX1ZBTElEPC9jb2RlPiksIHlpZWxkcyB0aGUgc2FtZSByZXN1bHRzIGFzIGNhbGxpbmcgdGhlCi0gKiBjb252ZW5pZW5jZSBtZXRob2RzLiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uOiBjaGVjayB0aGUgY29tbWVudHMKLSAqIGZvciB0aGUgPGNvZGU+aXNWYWxpZDwvY29kZT4gbWV0aG9kIGZvciBkZXRhaWxzLgotICoKLSAqIEBhdXRob3IgR2xlbm4gTWFyY3ksIElCTQotICogQGF1dGhvciBBbmR5IENsYXJrLCBJQk0KLSAqIEBhdXRob3IgRXJpYyBZZSwgSUJNCi0gKiBAYXV0aG9yIEFybmF1ZCAgTGUgSG9ycywgSUJNCi0gKiBAYXV0aG9yIFJhaHVsIFNyaXZhc3RhdmEsIFN1biBNaWNyb3N5c3RlbXMgSW5jLgotICoKLSAqIEB2ZXJzaW9uICRJZDogWE1MQ2hhci5qYXZhLHYgMS4zIDIwMDQvMDIvMTIgMjA6MDU6NTQgZXJpY3ZhcyBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2hhciB7Ci0KLSAgICAvLwotICAgIC8vIENvbnN0YW50cwotICAgIC8vCi0KLSAgICAvKiogQ2hhcmFjdGVyIGZsYWdzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDSEFSUyA9IG5ldyBieXRlWzEgPDwgMTZdOwotCi0gICAgLyoqIFZhbGlkIGNoYXJhY3RlciBtYXNrLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfVkFMSUQgPSAweDAxOwotCi0gICAgLyoqIFNwYWNlIGNoYXJhY3RlciBtYXNrLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfU1BBQ0UgPSAweDAyOwotCi0gICAgLyoqIE5hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FX1NUQVJUID0gMHgwNDsKLQotICAgIC8qKiBOYW1lIGNoYXJhY3RlciBtYXNrLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkFNRSA9IDB4MDg7Ci0KLSAgICAvKiogUHViaWQgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19QVUJJRCA9IDB4MTA7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIENvbnRlbnQgY2hhcmFjdGVyIG1hc2suIFNwZWNpYWwgY2hhcmFjdGVycyBhcmUgdGhvc2UgdGhhdCBjYW4KLSAgICAgKiBiZSBjb25zaWRlcmVkIHRoZSBzdGFydCBvZiBtYXJrdXAsIHN1Y2ggYXMgJyZsdDsnIGFuZCAnJmFtcDsnLiAKLSAgICAgKiBUaGUgdmFyaW91cyBuZXdsaW5lIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgc3BlY2lhbCBhcyB3ZWxsLgotICAgICAqIEFsbCBvdGhlciB2YWxpZCBYTUwgY2hhcmFjdGVycyBjYW4gYmUgY29uc2lkZXJlZCBjb250ZW50LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGZvciB0aGUgaW5uZXIgbG9vcCBvZiBjaGFyYWN0ZXIgc2Nhbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19DT05URU5UID0gMHgyMDsKLQotICAgIC8qKiBOQ05hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQ05BTUVfU1RBUlQgPSAweDQwOwotCi0gICAgLyoqIE5DTmFtZSBjaGFyYWN0ZXIgbWFzay4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05DTkFNRSA9IDB4ODA7Ci0KLSAgICAvLwotICAgIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbgotICAgIC8vCi0KLSAgICBzdGF0aWMgewotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gfAotICAgICAgICAvLyAgICAgICAgICAgICAgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGNoYXJSYW5nZVtdID0geyAKLSAgICAgICAgICAgIDB4MDAwOSwgMHgwMDBBLCAweDAwMEQsIDB4MDAwRCwgMHgwMDIwLCAweEQ3RkYsIDB4RTAwMCwgMHhGRkZELAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFszXSBTIDo6PSAoI3gyMCB8ICN4OSB8ICN4RCB8ICN4QSkrCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IHNwYWNlQ2hhcltdID0geyAKLSAgICAgICAgICAgIDB4MDAyMCwgMHgwMDA5LCAweDAwMEQsIDB4MDAwQSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbmFtZUNoYXJbXSA9IHsgCi0gICAgICAgICAgICAweDAwMkQsIDB4MDAyRSwgLy8gJy0nIGFuZCAnLicKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbmFtZVN0YXJ0Q2hhcltdID0geyAKLSAgICAgICAgICAgIDB4MDAzQSwgMHgwMDVGLCAvLyAnOicgYW5kICdfJwotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgMHhEIHwgMHhBIHwgW2EtekEtWjAtOV0gfCBbLScoKSssLi86PT87ISojQCRfJV0KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgcHViaWRDaGFyW10gPSB7Ci0gICAgICAgICAgICAweDAwMEEsIDB4MDAwRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAzRCwKLSAgICAgICAgICAgIDB4MDA1RgotICAgICAgICB9OwotCi0gICAgICAgIGludCBwdWJpZFJhbmdlW10gPSB7Ci0gICAgICAgICAgICAweDAwMjcsIDB4MDAzQiwgMHgwMDNGLCAweDAwNUEsIDB4MDA2MSwgMHgwMDdBCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzg0XSBMZXR0ZXIgOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbGV0dGVyUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgIC8vIEJhc2VDaGFyCi0gICAgICAgICAgICAweDAwNDEsIDB4MDA1QSwgMHgwMDYxLCAweDAwN0EsIDB4MDBDMCwgMHgwMEQ2LCAweDAwRDgsIDB4MDBGNiwKLSAgICAgICAgICAgIDB4MDBGOCwgMHgwMTMxLCAweDAxMzQsIDB4MDEzRSwgMHgwMTQxLCAweDAxNDgsIDB4MDE0QSwgMHgwMTdFLAotICAgICAgICAgICAgMHgwMTgwLCAweDAxQzMsIDB4MDFDRCwgMHgwMUYwLCAweDAxRjQsIDB4MDFGNSwgMHgwMUZBLCAweDAyMTcsCi0gICAgICAgICAgICAweDAyNTAsIDB4MDJBOCwgMHgwMkJCLCAweDAyQzEsIDB4MDM4OCwgMHgwMzhBLCAweDAzOEUsIDB4MDNBMSwKLSAgICAgICAgICAgIDB4MDNBMywgMHgwM0NFLCAweDAzRDAsIDB4MDNENiwgMHgwM0UyLCAweDAzRjMsIDB4MDQwMSwgMHgwNDBDLAotICAgICAgICAgICAgMHgwNDBFLCAweDA0NEYsIDB4MDQ1MSwgMHgwNDVDLCAweDA0NUUsIDB4MDQ4MSwgMHgwNDkwLCAweDA0QzQsCi0gICAgICAgICAgICAweDA0QzcsIDB4MDRDOCwgMHgwNENCLCAweDA0Q0MsIDB4MDREMCwgMHgwNEVCLCAweDA0RUUsIDB4MDRGNSwKLSAgICAgICAgICAgIDB4MDRGOCwgMHgwNEY5LCAweDA1MzEsIDB4MDU1NiwgMHgwNTYxLCAweDA1ODYsIDB4MDVEMCwgMHgwNUVBLAotICAgICAgICAgICAgMHgwNUYwLCAweDA1RjIsIDB4MDYyMSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0QSwgMHgwNjcxLCAweDA2QjcsCi0gICAgICAgICAgICAweDA2QkEsIDB4MDZCRSwgMHgwNkMwLCAweDA2Q0UsIDB4MDZEMCwgMHgwNkQzLCAweDA2RTUsIDB4MDZFNiwKLSAgICAgICAgICAgIDB4MDkwNSwgMHgwOTM5LCAweDA5NTgsIDB4MDk2MSwgMHgwOTg1LCAweDA5OEMsIDB4MDk4RiwgMHgwOTkwLAotICAgICAgICAgICAgMHgwOTkzLCAweDA5QTgsIDB4MDlBQSwgMHgwOUIwLCAweDA5QjYsIDB4MDlCOSwgMHgwOURDLCAweDA5REQsCi0gICAgICAgICAgICAweDA5REYsIDB4MDlFMSwgMHgwOUYwLCAweDA5RjEsIDB4MEEwNSwgMHgwQTBBLCAweDBBMEYsIDB4MEExMCwKLSAgICAgICAgICAgIDB4MEExMywgMHgwQTI4LCAweDBBMkEsIDB4MEEzMCwgMHgwQTMyLCAweDBBMzMsIDB4MEEzNSwgMHgwQTM2LAotICAgICAgICAgICAgMHgwQTM4LCAweDBBMzksIDB4MEE1OSwgMHgwQTVDLCAweDBBNzIsIDB4MEE3NCwgMHgwQTg1LCAweDBBOEIsCi0gICAgICAgICAgICAweDBBOEYsIDB4MEE5MSwgMHgwQTkzLCAweDBBQTgsIDB4MEFBQSwgMHgwQUIwLCAweDBBQjIsIDB4MEFCMywKLSAgICAgICAgICAgIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LAotICAgICAgICAgICAgMHgwQjJBLCAweDBCMzAsIDB4MEIzMiwgMHgwQjMzLCAweDBCMzYsIDB4MEIzOSwgMHgwQjVDLCAweDBCNUQsCi0gICAgICAgICAgICAweDBCNUYsIDB4MEI2MSwgMHgwQjg1LCAweDBCOEEsIDB4MEI4RSwgMHgwQjkwLCAweDBCOTIsIDB4MEI5NSwKLSAgICAgICAgICAgIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLAotICAgICAgICAgICAgMHgwQkFFLCAweDBCQjUsIDB4MEJCNywgMHgwQkI5LCAweDBDMDUsIDB4MEMwQywgMHgwQzBFLCAweDBDMTAsCi0gICAgICAgICAgICAweDBDMTIsIDB4MEMyOCwgMHgwQzJBLCAweDBDMzMsIDB4MEMzNSwgMHgwQzM5LCAweDBDNjAsIDB4MEM2MSwKLSAgICAgICAgICAgIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLAotICAgICAgICAgICAgMHgwQ0I1LCAweDBDQjksIDB4MENFMCwgMHgwQ0UxLCAweDBEMDUsIDB4MEQwQywgMHgwRDBFLCAweDBEMTAsCi0gICAgICAgICAgICAweDBEMTIsIDB4MEQyOCwgMHgwRDJBLCAweDBEMzksIDB4MEQ2MCwgMHgwRDYxLCAweDBFMDEsIDB4MEUyRSwKLSAgICAgICAgICAgIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LAotICAgICAgICAgICAgMHgwRTk0LCAweDBFOTcsIDB4MEU5OSwgMHgwRTlGLCAweDBFQTEsIDB4MEVBMywgMHgwRUFBLCAweDBFQUIsCi0gICAgICAgICAgICAweDBFQUQsIDB4MEVBRSwgMHgwRUIyLCAweDBFQjMsIDB4MEVDMCwgMHgwRUM0LCAweDBGNDAsIDB4MEY0NywKLSAgICAgICAgICAgIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLAotICAgICAgICAgICAgMHgxMTA1LCAweDExMDcsIDB4MTEwQiwgMHgxMTBDLCAweDExMEUsIDB4MTExMiwgMHgxMTU0LCAweDExNTUsCi0gICAgICAgICAgICAweDExNUYsIDB4MTE2MSwgMHgxMTZELCAweDExNkUsIDB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwKLSAgICAgICAgICAgIDB4MTFCNywgMHgxMUI4LCAweDExQkMsIDB4MTFDMiwgMHgxRTAwLCAweDFFOUIsIDB4MUVBMCwgMHgxRUY5LAotICAgICAgICAgICAgMHgxRjAwLCAweDFGMTUsIDB4MUYxOCwgMHgxRjFELCAweDFGMjAsIDB4MUY0NSwgMHgxRjQ4LCAweDFGNEQsCi0gICAgICAgICAgICAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywKLSAgICAgICAgICAgIDB4MUZDMiwgMHgxRkM0LCAweDFGQzYsIDB4MUZDQywgMHgxRkQwLCAweDFGRDMsIDB4MUZENiwgMHgxRkRCLAotICAgICAgICAgICAgMHgxRkUwLCAweDFGRUMsIDB4MUZGMiwgMHgxRkY0LCAweDFGRjYsIDB4MUZGQywgMHgyMTJBLCAweDIxMkIsCi0gICAgICAgICAgICAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywKLSAgICAgICAgICAgIDB4QUMwMCwgMHhEN0EzLAotICAgICAgICAgICAgLy8gSWRlb2dyYXBoaWMKLSAgICAgICAgICAgIDB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKLSAgICAgICAgfTsKLSAgICAgICAgaW50IGxldHRlckNoYXJbXSA9IHsKLSAgICAgICAgICAgIC8vIEJhc2VDaGFyCi0gICAgICAgICAgICAweDAzODYsIDB4MDM4QywgMHgwM0RBLCAweDAzREMsIDB4MDNERSwgMHgwM0UwLCAweDA1NTksIDB4MDZENSwKLSAgICAgICAgICAgIDB4MDkzRCwgMHgwOUIyLCAweDBBNUUsIDB4MEE4RCwgMHgwQUJELCAweDBBRTAsIDB4MEIzRCwgMHgwQjlDLAotICAgICAgICAgICAgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsCi0gICAgICAgICAgICAweDBFQkQsIDB4MTEwMCwgMHgxMTA5LCAweDExM0MsIDB4MTEzRSwgMHgxMTQwLCAweDExNEMsIDB4MTE0RSwKLSAgICAgICAgICAgIDB4MTE1MCwgMHgxMTU5LCAweDExNjMsIDB4MTE2NSwgMHgxMTY3LCAweDExNjksIDB4MTE3NSwgMHgxMTlFLAotICAgICAgICAgICAgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsCi0gICAgICAgICAgICAweDFGNUQsIDB4MUZCRSwgMHgyMTI2LCAweDIxMkUsCi0gICAgICAgICAgICAvLyBJZGVvZ3JhcGhpYwotICAgICAgICAgICAgMHgzMDA3LAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs4N10gQ29tYmluaW5nQ2hhciA6Oj0gLi4uCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJSYW5nZVtdID0gewotICAgICAgICAgICAgMHgwMzAwLCAweDAzNDUsIDB4MDM2MCwgMHgwMzYxLCAweDA0ODMsIDB4MDQ4NiwgMHgwNTkxLCAweDA1QTEsCi0gICAgICAgICAgICAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwKLSAgICAgICAgICAgIDB4MDZENiwgMHgwNkRDLCAweDA2REQsIDB4MDZERiwgMHgwNkUwLCAweDA2RTQsIDB4MDZFNywgMHgwNkU4LAotICAgICAgICAgICAgMHgwNkVBLCAweDA2RUQsIDB4MDkwMSwgMHgwOTAzLCAweDA5M0UsIDB4MDk0QywgMHgwOTUxLCAweDA5NTQsCi0gICAgICAgICAgICAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwKLSAgICAgICAgICAgIDB4MDlDQiwgMHgwOUNELCAweDA5RTIsIDB4MDlFMywgMHgwQTQwLCAweDBBNDIsIDB4MEE0NywgMHgwQTQ4LAotICAgICAgICAgICAgMHgwQTRCLCAweDBBNEQsIDB4MEE3MCwgMHgwQTcxLCAweDBBODEsIDB4MEE4MywgMHgwQUJFLCAweDBBQzUsCi0gICAgICAgICAgICAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywKLSAgICAgICAgICAgIDB4MEI0NywgMHgwQjQ4LCAweDBCNEIsIDB4MEI0RCwgMHgwQjU2LCAweDBCNTcsIDB4MEI4MiwgMHgwQjgzLAotICAgICAgICAgICAgMHgwQkJFLCAweDBCQzIsIDB4MEJDNiwgMHgwQkM4LCAweDBCQ0EsIDB4MEJDRCwgMHgwQzAxLCAweDBDMDMsCi0gICAgICAgICAgICAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwKLSAgICAgICAgICAgIDB4MEM4MiwgMHgwQzgzLCAweDBDQkUsIDB4MENDNCwgMHgwQ0M2LCAweDBDQzgsIDB4MENDQSwgMHgwQ0NELAotICAgICAgICAgICAgMHgwQ0Q1LCAweDBDRDYsIDB4MEQwMiwgMHgwRDAzLCAweDBEM0UsIDB4MEQ0MywgMHgwRDQ2LCAweDBENDgsCi0gICAgICAgICAgICAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwKLSAgICAgICAgICAgIDB4MEVCQiwgMHgwRUJDLCAweDBFQzgsIDB4MEVDRCwgMHgwRjE4LCAweDBGMTksIDB4MEY3MSwgMHgwRjg0LAotICAgICAgICAgICAgMHgwRjg2LCAweDBGOEIsIDB4MEY5MCwgMHgwRjk1LCAweDBGOTksIDB4MEZBRCwgMHgwRkIxLCAweDBGQjcsCi0gICAgICAgICAgICAweDIwRDAsIDB4MjBEQywgMHgzMDJBLCAweDMwMkYsCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJDaGFyW10gPSB7Ci0gICAgICAgICAgICAweDA1QkYsIDB4MDVDNCwgMHgwNjcwLCAweDA5M0MsIDB4MDk0RCwgMHgwOUJDLCAweDA5QkUsIDB4MDlCRiwKLSAgICAgICAgICAgIDB4MDlENywgMHgwQTAyLCAweDBBM0MsIDB4MEEzRSwgMHgwQTNGLCAweDBBQkMsIDB4MEIzQywgMHgwQkQ3LAotICAgICAgICAgICAgMHgwRDU3LCAweDBFMzEsIDB4MEVCMSwgMHgwRjM1LCAweDBGMzcsIDB4MEYzOSwgMHgwRjNFLCAweDBGM0YsCi0gICAgICAgICAgICAweDBGOTcsIDB4MEZCOSwgMHgyMEUxLCAweDMwOTksIDB4MzA5QSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbODhdIERpZ2l0IDo6PSAuLi4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgZGlnaXRSYW5nZVtdID0gewotICAgICAgICAgICAgMHgwMDMwLCAweDAwMzksIDB4MDY2MCwgMHgwNjY5LCAweDA2RjAsIDB4MDZGOSwgMHgwOTY2LCAweDA5NkYsCi0gICAgICAgICAgICAweDA5RTYsIDB4MDlFRiwgMHgwQTY2LCAweDBBNkYsIDB4MEFFNiwgMHgwQUVGLCAweDBCNjYsIDB4MEI2RiwKLSAgICAgICAgICAgIDB4MEJFNywgMHgwQkVGLCAweDBDNjYsIDB4MEM2RiwgMHgwQ0U2LCAweDBDRUYsIDB4MEQ2NiwgMHgwRDZGLAotICAgICAgICAgICAgMHgwRTUwLCAweDBFNTksIDB4MEVEMCwgMHgwRUQ5LCAweDBGMjAsIDB4MEYyOSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbODldIEV4dGVuZGVyIDo6PSAuLi4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgZXh0ZW5kZXJSYW5nZVtdID0gewotICAgICAgICAgICAgMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgZXh0ZW5kZXJDaGFyW10gPSB7Ci0gICAgICAgICAgICAweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBTcGVjaWFsQ2hhciA6Oj0gJzwnLCAnJicsICdcbicsICdccicsICddJwotICAgICAgICAvLwotCi0gICAgICAgIGludCBzcGVjaWFsQ2hhcltdID0gewotICAgICAgICAgICAgJzwnLCAnJicsICdcbicsICdccicsICddJywKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBJbml0aWFsaXplCi0gICAgICAgIC8vCi0KLSAgICAgICAgLy8gc2V0IHZhbGlkIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBjaGFyUmFuZ2VbaV07IGogPD0gY2hhclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19WQUxJRCB8IE1BU0tfQ09OVEVOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFsQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbc3BlY2lhbENoYXJbaV1dID0gKGJ5dGUpKENIQVJTW3NwZWNpYWxDaGFyW2ldXSAmIH5NQVNLX0NPTlRFTlQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHNwYWNlIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFjZUNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW3NwYWNlQ2hhcltpXV0gfD0gTUFTS19TUEFDRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBuYW1lIHN0YXJ0IGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lU3RhcnRDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tuYW1lU3RhcnRDaGFyW2ldXSB8PSBNQVNLX05BTUVfU1RBUlQgfCBNQVNLX05BTUUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXR0ZXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGxldHRlclJhbmdlW2ldOyBqIDw9IGxldHRlclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV0dGVyQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbbGV0dGVyQ2hhcltpXV0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgbmFtZSBjaGFyYWN0ZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZUNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW25hbWVDaGFyW2ldXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0UmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBkaWdpdFJhbmdlW2ldOyBqIDw9IGRpZ2l0UmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbWJpbmluZ0NoYXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGNvbWJpbmluZ0NoYXJSYW5nZVtpXTsgaiA8PSBjb21iaW5pbmdDaGFyUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbWJpbmluZ0NoYXJDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tjb21iaW5pbmdDaGFyQ2hhcltpXV0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlclJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gZXh0ZW5kZXJSYW5nZVtpXTsgaiA8PSBleHRlbmRlclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlckNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW2V4dGVuZGVyQ2hhcltpXV0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgJzonIGZyb20gYWxsb3dhYmxlIE1BU0tfTkNOQU1FX1NUQVJUIGFuZCBNQVNLX05DTkFNRSBjaGFycwotICAgICAgICBDSEFSU1snOiddICY9IH4oTUFTS19OQ05BTUVfU1RBUlQgfCBNQVNLX05DTkFNRSk7Ci0KLSAgICAgICAgLy8gc2V0IFB1YmlkIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJpZENoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW3B1YmlkQ2hhcltpXV0gfD0gTUFTS19QVUJJRDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmlkUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBwdWJpZFJhbmdlW2ldOyBqIDw9IHB1YmlkUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX1BVQklEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IC8vIDxjbGluaXQ+KCkKLQotICAgIC8vCi0gICAgLy8gUHVibGljIHN0YXRpYyBtZXRob2RzCi0gICAgLy8KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBsZW1lbnRhbChpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPj0gMHgxMDAwMCAmJiBjIDw9IDB4MTBGRkZGKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgKiBzdXJyb2dhdGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGggVGhlIGhpZ2ggc3Vycm9nYXRlLgotICAgICAqIEBwYXJhbSBsIFRoZSBsb3cgc3Vycm9nYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHN1cHBsZW1lbnRhbChjaGFyIGgsIGNoYXIgbCkgewotICAgICAgICByZXR1cm4gKGggLSAweEQ4MDApICogMHg0MDAgKyAobCAtIDB4REMwMCkgKyAweDEwMDAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3VwcGxlbWVudGFsIGNoYXJhY3RlcgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgdG8gInNwbGl0Ii4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNoYXIgaGlnaFN1cnJvZ2F0ZShpbnQgYykgewotICAgICAgICByZXR1cm4gKGNoYXIpICgoKGMgLSAweDAwMDEwMDAwKSA+PiAxMCkgKyAweEQ4MDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvdyBzdXJyb2dhdGUgb2YgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciB0byAic3BsaXQiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2hhciBsb3dTdXJyb2dhdGUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjaGFyKSAoKChjIC0gMHgwMDAxMDAwMCkgJiAweDNGRikgKyAweERDMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGEgaGlnaCBzdXJyb2dhdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGlnaFN1cnJvZ2F0ZShpbnQgYykgewotICAgICAgICByZXR1cm4gKDB4RDgwMCA8PSBjICYmIGMgPD0gMHhEQkZGKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIGxvdyBzdXJyb2dhdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoMHhEQzAwIDw9IGMgJiYgYyA8PSAweERGRkYpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIHZhbGlkLiBUaGlzIG1ldGhvZAotICAgICAqIGFsc28gY2hlY2tzIHRoZSBzdXJyb2dhdGUgY2hhcmFjdGVyIHJhbmdlIGZyb20gMHgxMDAwMCB0byAweDEwRkZGRi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcHJvZ3JhbSBjaG9vc2VzIHRvIGFwcGx5IHRoZSBtYXNrIGRpcmVjdGx5IHRvIHRoZQotICAgICAqIDxjb2RlPkNIQVJTPC9jb2RlPiBhcnJheSwgdGhlbiB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcKLSAgICAgKiB0aGUgc3Vycm9nYXRlIGNoYXJhY3RlciByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1ZBTElEKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKDB4MTAwMDAgPD0gYyAmJiBjIDw9IDB4MTBGRkZGKTsKLSAgICB9IC8vIGlzVmFsaWQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChpbnQgYykgewotICAgICAgICByZXR1cm4gIWlzVmFsaWQoYyk7Ci0gICAgfSAvLyBpc0ludmFsaWQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY2FuIGJlIGNvbnNpZGVyZWQgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGVudChpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfQ09OVEVOVCkgIT0gMCkgfHwKLSAgICAgICAgICAgICAgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7Ci0gICAgfSAvLyBpc0NvbnRlbnQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY2FuIGJlIGNvbnNpZGVyZWQgbWFya3VwLgotICAgICAqIE1hcmt1cCBjaGFyYWN0ZXJzIGluY2x1ZGUgJyZsdDsnLCAnJmFtcDsnLCBhbmQgJyUnLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXJrdXAoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPT0gJzwnIHx8IGMgPT0gJyYnIHx8IGMgPT0gJyUnOwotICAgIH0gLy8gaXNNYXJrdXAoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBjaGFyYWN0ZXIKLSAgICAgKiBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzNdIGluIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1NQQUNFKSAhPSAwOwotICAgIH0gLy8gaXNTcGFjZShpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHNwYWNlIGNoYXJhY3RlcgotICAgICAqIGFzIGFtZGVuZGVkIGluIHRoZSBYTUwgMS4xIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hNTDExU3BhY2UoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1NQQUNFKSAhPSAwKSB8fAotICAgICAgICAgICAgYyA9PSAweDg1IHx8IGMgPT0gMHgyMDI4OwotICAgIH0gLy8gaXNYTUwxMVNwYWNlKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZSBzdGFydAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIHRoZSBYTUwgMS4wCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZVN0YXJ0KGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05BTUVfU1RBUlQpICE9IDA7Ci0gICAgfSAvLyBpc05hbWVTdGFydChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIG5hbWUKLSAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs0XSBpbiB0aGUgWE1MIDEuMAotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hbWUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRSkgIT0gMDsKLSAgICB9IC8vIGlzTmFtZShpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZSBzdGFydAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIE5hbWVzcGFjZXMgaW4gWE1MCi0gICAgICogcmVjb21tZW5kYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZVN0YXJ0KGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05DTkFNRV9TVEFSVCkgIT0gMDsKLSAgICB9IC8vIGlzTkNOYW1lU3RhcnQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBOQ05hbWUKLSAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs1XSBpbiBOYW1lc3BhY2VzIGluIFhNTAotICAgICAqIHJlY29tbWVuZGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOQ05hbWUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FKSAhPSAwOwotICAgIH0gLy8gaXNOQ05hbWUoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBQdWJpZAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzEzXSBpbiB0aGUgWE1MIDEuMAotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmlkKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1BVQklEKSAhPSAwOwotICAgIH0gLy8gaXNQdWJpZChpbnQpOmJvb2xlYW4KLQotICAgIC8qCi0gICAgICogWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIChOYW1lQ2hhcikqCi0gICAgICovCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTmFtZSBhY2NvcmRpbmcgdG8gWzVdCi0gICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHN0cmluZyB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIGlmKCBpc05hbWVTdGFydChjaCkgPT0gZmFsc2UpCi0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgIGNoID0gbmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgIGlmKCBpc05hbWUoIGNoICkgPT0gZmFsc2UgKXsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KLSAgICAKLQotICAgIC8qCi0gICAgICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYwotICAgICAqIFs0XSBOQ05hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOQ05hbWVDaGFyKSoKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs0XQotICAgICAqIGZyb20gdGhlIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgc3RyaW5nIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5DTmFtZShTdHJpbmcgbmNOYW1lKSB7Ci0gICAgICAgIGlmIChuY05hbWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2hhciBjaCA9IG5jTmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIGlmKCBpc05DTmFtZVN0YXJ0KGNoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG5jTmFtZS5sZW5ndGgoKTsgaSsrICkgewotICAgICAgICAgICBjaCA9IG5jTmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgIGlmKCBpc05DTmFtZSggY2ggKSA9PSBmYWxzZSApewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IC8vIGlzVmFsaWROQ05hbWUoU3RyaW5nKTpib29sZWFuCi0KLSAgICAvKgotICAgICAqIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKwotICAgICAqLwotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5tdG9rZW4gYWNjb3JkaW5nIHRvIFs3XQotICAgICAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm10b2tlbiBzdHJpbmcgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm10b2tlbiBpcyBhIHZhbGlkIE5tdG9rZW4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRObXRva2VuKFN0cmluZyBubXRva2VuKSB7Ci0gICAgICAgIGlmIChubXRva2VuLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm10b2tlbi5sZW5ndGgoKTsgaSsrICkgewotICAgICAgICAgICBjaGFyIGNoID0gbm10b2tlbi5jaGFyQXQoaSk7Ci0gICAgICAgICAgIGlmKCAgISBpc05hbWUoIGNoICkgKXsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KLQotCi0KLQotCi0gICAgLy8gZW5jb2RpbmdzCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBJQU5BIGVuY29kaW5nLgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKLSAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KLSAgICAgKiBJQU5BIGVuY29kaW5nIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWFuYUVuY29kaW5nIFRoZSBJQU5BIGVuY29kaW5nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nIGlhbmFFbmNvZGluZykgewotICAgICAgICBpZiAoaWFuYUVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBpYW5hRW5jb2RpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9IGlhbmFFbmNvZGluZy5jaGFyQXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gaWFuYUVuY29kaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYyA8ICdBJyB8fCBjID4gJ1onKSAmJiAoYyA8ICdhJyB8fCBjID4gJ3onKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBKYXZhIGVuY29kaW5nLgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKLSAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KLSAgICAgKiBKYXZhIGVuY29kaW5nIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhRW5jb2RpbmcoU3RyaW5nIGphdmFFbmNvZGluZykgewotICAgICAgICBpZiAoamF2YUVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBqYXZhRW5jb2RpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gamF2YUVuY29kaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoYyA8ICcwJyB8fCBjID4gJzknKSAmJiBjICE9ICcuJyAmJiBjICE9ICdfJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAvLyBpc1ZhbGlkSUFOQUVuY29kaW5nKFN0cmluZyk6Ym9vbGVhbgotCi19IC8vIGNsYXNzIFhNTENoYXIKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxOYW1lSGVscGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWE1MTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGY2OGQxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MTmFtZUhlbHBlcgotewotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UU5hbWUoWE1MTmFtZSB4bWxOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHhtbE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBRTmFtZUhlbHBlci5mb3JMTlMoIHhtbE5hbWUuZ2V0TG9jYWxOYW1lKCksIHhtbE5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTE5hbWUgZm9yTE5TKFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICAgICAgICB1cmkgPSAiIjsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbCh1cmksIGxvY2FsbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYTUxOYW1lIGZvckxOKFN0cmluZyBsb2NhbG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCIiLCBsb2NhbG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MTmFtZSBmb3JQcmV0dHkoU3RyaW5nIHByZXR0eSwgaW50IG9mZnNldCkKLSAgICB7Ci0gICAgICAgIGludCBhdCA9IHByZXR0eS5pbmRleE9mKCdAJywgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGF0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTmFtZUltcGwoIiIsIHByZXR0eS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sTmFtZUltcGwocHJldHR5LnN1YnN0cmluZyhhdCArIDEpLCBwcmV0dHkuc3Vic3RyaW5nKG9mZnNldCwgYXQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV0dHkoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0KLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgPT0gbnVsbCB8fCBuYW1lLmdldE5hbWVzcGFjZVVyaSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbE5hbWUoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGRpZ2l0cyA9IG5ldyBjaGFyW10KLSAgICAgICAgeycwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJ307Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FmZShpbnQgYykKLSAgICB7Ci0gICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoZXhzYWZlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChpc1NhZmUoY2gpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSB1dGY4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHV0ZjggPSBzLnN1YnN0cmluZyhpLCBpICsgMSkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdXRmOC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXycpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbKHV0Zjhbal0gPj4gNCkgJiAweEZdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaGV4ZGlnaXRzW3V0Zjhbal0gJiAweEZdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIl9CQURfVVRGOF9DSEFSIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoZXhzYWZlZGlyKFhNTE5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVyaSgpID09IG51bGwgfHwgbmFtZS5nZXROYW1lc3BhY2VVcmkoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICJfbm9ucy8iICsgaGV4c2FmZShuYW1lLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIGhleHNhZmUobmFtZS5nZXROYW1lc3BhY2VVcmkoKSkgKyAiLyIgKyBoZXhzYWZlKG5hbWUuZ2V0TG9jYWxOYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YUGF0aC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwN2ViMGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxDaGFyOwotCi1wdWJsaWMgY2xhc3MgWFBhdGgKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBleHRlbmRzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWFBhdGhDb21waWxlRXhjZXB0aW9uICggWG1sRXJyb3IgZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGVjdXRpb25Db250ZXh0Ci0gICAgewotICAgICAgICBwdWJsaWMgRXhlY3V0aW9uQ29udGV4dCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElUICAgICA9IDB4MTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTQ0VORCA9IDB4MjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUlMgICA9IDB4NDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQgKCBYUGF0aCB4cGF0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfeHBhdGggIT0geHBhdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3hwYXRoID0geHBhdGg7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX3BhdGhzID0gbmV3IFBhdGhDb250ZXh0IFsgeHBhdGguX3NlbGVjdG9yLl9wYXRocy5sZW5ndGggXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX3BhdGhzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIF9wYXRoc1sgaSBdID0gbmV3IFBhdGhDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9zdGFjay5jbGVhcigpOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX3BhdGhzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgX3BhdGhzWyBpIF0uaW5pdCggeHBhdGguX3NlbGVjdG9yLl9wYXRoc1sgaSBdICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHN0YXJ0ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBfcGF0aHNbIGkgXS5zdGFydCgpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGVsZW1lbnQgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX3N0YWNrLmFkZCggbmFtZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBfcGF0aHNbIGkgXS5lbGVtZW50KCBuYW1lICk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGF0dHIgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBoaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgICAgIGhpdCA9IGhpdCB8IF9wYXRoc1sgaSBdLmF0dHIoIG5hbWUgKTsKLQotICAgICAgICAgICAgcmV0dXJuIGhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0YWNrLnJlbW92ZSggX3N0YWNrLnNpemUoKSAtIDEgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgICAgIF9wYXRoc1sgaSBdLmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFBhdGhDb250ZXh0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFBhdGhDb250ZXh0ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wcmV2ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB2b2lkIGluaXQgKCBTdGVwIHN0ZXBzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY3VyciA9IHN0ZXBzOwotICAgICAgICAgICAgICAgIF9wcmV2LmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgUU5hbWUgdG9wICggaW50IGkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoUU5hbWUpIEV4ZWN1dGlvbkNvbnRleHQudGhpcy5fc3RhY2suZ2V0KCBfc3RhY2suc2l6ZSgpIC0gMSAtIGkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGJhY2t0cmFjayAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2N1cnIgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoX2N1cnIuX2hhc0JhY2t0cmFjaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9jdXJyID0gX2N1cnIuX2JhY2t0cmFjazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFzc2VydCAhX2N1cnIuX2RlZXA7Ci0KLSAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLl9wcmV2OwotCi0gICAgICAgICAgICAgICAgc2VhcmNoOiBmb3IgKCA7ICFfY3Vyci5fZGVlcCA7IF9jdXJyID0gX2N1cnIuX3ByZXYgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHQgPSAwOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yICggU3RlcCBzID0gX2N1cnIgOyAhcy5fZGVlcCA7IHMgPSBzLl9wcmV2ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLm1hdGNoKCB0b3AoIHQrKyApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzZWFyY2g7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBzdGFydCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2N1cnIgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2N1cnIuX3ByZXYgPT0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmIChfY3Vyci5fbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnIuX2ZsYWdzOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0ZXBzIGNvbnNpc3Qgb24gb25seSBhIHRlcm1pbmF0b3IsIHRoZW4gdGhlIHBhdGggY2FuCi0gICAgICAgICAgICAgICAgLy8gb25seSBiZSAnLicuICBJbiB0aGlzIGNhc2UsIHdlIGdldCBhIGhpdCwgYnV0IHRoZXJlIGlzCi0gICAgICAgICAgICAgICAgLy8gbm90aGluZyBlbHNlIHRvIG1hdGNoLiAgTm8gbmVlZCB0byBiYWNrdHJhY2suCi0KLSAgICAgICAgICAgICAgICBfY3VyciA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gSElUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgZWxlbWVudCAoIFFOYW1lIG5hbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wcmV2LmFkZCggX2N1cnIgKTsKLQotICAgICAgICAgICAgICAgIGlmIChfY3VyciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBfY3Vyci5fbmFtZSAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKCFfY3Vyci5fYXR0ciAmJiBfY3Vyci5tYXRjaCggbmFtZSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChfY3VyciA9IF9jdXJyLl9uZXh0KS5fbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyLl9mbGFnczsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJhY2t0cmFjaygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyID09IG51bGwgPyBISVQgOiBISVQgfCBfY3Vyci5fZmxhZ3M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJhY2t0cmFjaygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfY3VyciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLm1hdGNoKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gX2N1cnIuX25leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5fZGVlcCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnIuX2ZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIGF0dHIgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnIgIT0gbnVsbCAmJiBfY3Vyci5fYXR0ciAmJiBfY3Vyci5tYXRjaCggbmFtZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkIGVuZCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY3VyciA9IChTdGVwKSBfcHJldi5yZW1vdmUoIF9wcmV2LnNpemUoKSAtIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJpdmF0ZSBTdGVwIF9jdXJyOwotICAgICAgICAgICAgcHJpdmF0ZSBMaXN0IF9wcmV2OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBYUGF0aCAgICAgICAgIF94cGF0aDsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgICAgIF9zdGFjazsKLSAgICAgICAgcHJpdmF0ZSBQYXRoQ29udGV4dFtdIF9wYXRoczsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgWFBhdGggY29tcGlsZVhQYXRoICggU3RyaW5nIHhwYXRoICkKLSAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVYUGF0aCggeHBhdGgsICIkdGhpcyIsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBYUGF0aCBjb21waWxlWFBhdGggKCBTdHJpbmcgeHBhdGgsIFN0cmluZyBjdXJyZW50Tm9kZVZhciApCi0gICAgICAgIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlWFBhdGgoIHhwYXRoLCBjdXJyZW50Tm9kZVZhciwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWFBhdGggY29tcGlsZVhQYXRoICggU3RyaW5nIHhwYXRoLCBNYXAgbmFtZXNwYWNlcyApCi0gICAgICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGlsZVhQYXRoKCB4cGF0aCwgIiR0aGlzIiwgbmFtZXNwYWNlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFhQYXRoIGNvbXBpbGVYUGF0aCAoCi0gICAgICAgIFN0cmluZyB4cGF0aCwgU3RyaW5nIGN1cnJlbnROb2RlVmFyLCBNYXAgbmFtZXNwYWNlcyApCi0gICAgICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIG5ldyBDb21waWxhdGlvbkNvbnRleHQoIG5hbWVzcGFjZXMsIGN1cnJlbnROb2RlVmFyICkuCi0gICAgICAgICAgICAgICAgY29tcGlsZSggeHBhdGggKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21waWxhdGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIENvbXBpbGF0aW9uQ29udGV4dCAoIE1hcCBuYW1lc3BhY2VzLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICBfY3VycmVudE5vZGVWYXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBfY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICk7Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVZhciA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZVZhciA9ICIkdGhpcyI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyID0gY3VycmVudE5vZGVWYXI7Ci0KLSAgICAgICAgICAgIF9uYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2V4dGVybmFsTmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcyA9PSBudWxsID8gbmV3IEhhc2hNYXAoKSA6IG5hbWVzcGFjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBYUGF0aCBjb21waWxlICggU3RyaW5nIGV4cHIgKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9vZmZzZXQgPSAwOwotICAgICAgICAgICAgX2xpbmUgPSAxOwotICAgICAgICAgICAgX2NvbHVtbiA9IDE7Ci0gICAgICAgICAgICBfZXhwciA9IGV4cHI7Ci0KLSAgICAgICAgICAgIHJldHVybiB0b2tlbml6ZVhQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBjdXJyQ2hhciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGN1cnJDaGFyKCAwICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBjdXJyQ2hhciAoIGludCBvZmZzZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBfb2Zmc2V0ICsgb2Zmc2V0ID49IF9leHByLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgID8gLTEKLSAgICAgICAgICAgICAgICAgICAgOiBfZXhwci5jaGFyQXQoIF9vZmZzZXQgKyBvZmZzZXQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBhZHZhbmNlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX29mZnNldCA8IF9leHByLmxlbmd0aCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfZXhwci5jaGFyQXQoIF9vZmZzZXQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfb2Zmc2V0Kys7Ci0gICAgICAgICAgICAgICAgX2NvbHVtbisrOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9saW5lKys7Ci0gICAgICAgICAgICAgICAgICAgIF9jb2x1bW4gPSAxOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfb2Zmc2V0ICsgMSA8IF9leHByLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IF9leHByLmNoYXJBdCggX29mZnNldCArIDEgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXh0Q2ggPT0gJ1xyJyB8fCBuZXh0Q2ggPT0gJ1xuJykgJiYgY2ggIT0gbmV4dENoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vZmZzZXQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWR2YW5jZSAoIGludCBjb3VudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBjb3VudCA+PSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoIGNvdW50LS0gPiAwICkKLSAgICAgICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc1doaXRlc3BhY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpc1doaXRlc3BhY2UoIDAgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc1doaXRlc3BhY2UgKCBpbnQgb2Zmc2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNoID0gY3VyckNoYXIoIG9mZnNldCApOwotICAgICAgICAgICAgcmV0dXJuIGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJzsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNOQ05hbWVTdGFydCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgY3VyckNoYXIoKSA9PSAtMQotICAgICAgICAgICAgICAgICAgICA/IGZhbHNlIDoKLSAgICAgICAgICAgICAgICAgICAgWE1MQ2hhci5pc05DTmFtZVN0YXJ0KCBjdXJyQ2hhcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNOQ05hbWUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGN1cnJDaGFyKCkgPT0gLTEKLSAgICAgICAgICAgICAgICAgICAgPyBmYWxzZSA6Ci0gICAgICAgICAgICAgICAgICAgIFhNTENoYXIuaXNOQ05hbWUoIGN1cnJDaGFyKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBzdGFydHNXaXRoICggU3RyaW5nIHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnRzV2l0aCggcywgMCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHN0YXJ0c1dpdGggKCBTdHJpbmcgcywgaW50IG9mZnNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfb2Zmc2V0ICsgb2Zmc2V0ID49IF9leHByLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIF9leHByLnN0YXJ0c1dpdGgoIHMsIF9vZmZzZXQgKyBvZmZzZXQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgWFBhdGhDb21waWxlRXhjZXB0aW9uIG5ld0Vycm9yICggU3RyaW5nIG1zZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTG9jYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1zZywgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIF9saW5lLCBfY29sdW1uLCBfb2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbmV3IFhQYXRoQ29tcGlsZUV4Y2VwdGlvbiggZXJyICk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbG9va3VwUHJlZml4ICggU3RyaW5nIHByZWZpeCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCBwcmVmaXggKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgX25hbWVzcGFjZXMuZ2V0KCBwcmVmaXggKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKF9leHRlcm5hbE5hbWVzcGFjZXMuY29udGFpbnNLZXkoIHByZWZpeCApKQotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBfZXh0ZXJuYWxOYW1lc3BhY2VzLmdldCggcHJlZml4ICk7Ci0KLSAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCAieG1sIiApKQotICAgICAgICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyggInhzIiApKQotICAgICAgICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCAieHNpIiApKQotICAgICAgICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCAiZm4iICkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudzMub3JnLzIwMDIvMTEveHF1ZXJ5LWZ1bmN0aW9ucyI7Ci0KLSAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiVW5kZWZpbmVkIHByZWZpeDogIiArIHByZWZpeCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlV2hpdGVzcGFjZSAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHNhd1NwYWNlID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICBzYXdTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzYXdTcGFjZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVG9rZW5pemluZyB3aWxsIGNvbnN1bWUgd2hpdGVzcGFjZSBmb2xsb3dlZCBieSB0aGUgdG9rZW5zLCBzZXBhcmF0ZWQKLSAgICAgICAgLy8gYnkgd2hpdGVzcGFjZS4gIFRoZSB3aGl0ZXNwYWNlIGZvbGxvd2luZyB0aGUgbGFzdCB0b2tlbiBpcyBub3QKLSAgICAgICAgLy8gY29uc3VtZWQuCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICBwcml2YXRlIGJvb2xlYW4gdG9rZW5pemUgKCBTdHJpbmcgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzLmxlbmd0aCgpID4gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aCggcywgb2Zmc2V0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBvZmZzZXQgKz0gcy5sZW5ndGgoKTsKLQotICAgICAgICAgICAgYWR2YW5jZSggb2Zmc2V0ICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRva2VuaXplICggU3RyaW5nIHMxLCBTdHJpbmcgczIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgczEubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgYXNzZXJ0IHMyLmxlbmd0aCgpID4gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aCggczEsIG9mZnNldCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb2Zmc2V0ICs9IHMxLmxlbmd0aCgpOwotCi0gICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgIG9mZnNldCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMyLCBvZmZzZXQgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBvZmZzZXQgKz0gczIubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGFkdmFuY2UoIG9mZnNldCApOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB0b2tlbml6ZSAoIFN0cmluZyBzMSwgU3RyaW5nIHMyLCBTdHJpbmcgczMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgczEubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgYXNzZXJ0IHMyLmxlbmd0aCgpID4gMDsKLSAgICAgICAgICAgIGFzc2VydCBzMy5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgIG9mZnNldCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMxLCBvZmZzZXQgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBzMS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMiwgb2Zmc2V0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgb2Zmc2V0ICs9IHMyLmxlbmd0aCgpOwotCi0gICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgIG9mZnNldCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMzLCBvZmZzZXQgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9mZnNldCArPSBzMy5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFkdmFuY2UoIG9mZnNldCApOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRva2VuaXplTkNOYW1lICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWlzTkNOYW1lU3RhcnQoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkV4cGVjdGVkIG5vbi1jb2xvbml6ZWQgbmFtZSIgKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBzYi5hcHBlbmQoIChjaGFyKSBjdXJyQ2hhcigpICk7Ci0KLSAgICAgICAgICAgIGZvciAoIGFkdmFuY2UoKSA7IGlzTkNOYW1lKCkgOyBhZHZhbmNlKCkgKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggKGNoYXIpIGN1cnJDaGFyKCkgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFFOYW1lIGdldEFueVFOYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCAiIiwgIiIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBRTmFtZSB0b2tlbml6ZVFOYW1lICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0b2tlbml6ZSggIioiICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFueVFOYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBuY05hbWUgPSB0b2tlbml6ZU5DTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoIXRva2VuaXplKCAiOiIgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCBsb29rdXBQcmVmaXgoICIiICksIG5jTmFtZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFByZWZpeCggbmNOYW1lICksCi0gICAgICAgICAgICAgICAgICAgIHRva2VuaXplKCAiKiIgKSA/ICIiIDogdG9rZW5pemVOQ05hbWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyB0b2tlbml6ZVF1b3RlZFVyaSAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIHF1b3RlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodG9rZW5pemUoICJcIiIgKSkKLSAgICAgICAgICAgICAgICBxdW90ZSA9ICciJzsKLSAgICAgICAgICAgIGVsc2UgIGlmICh0b2tlbml6ZSggIiciICkpCi0gICAgICAgICAgICAgICAgcXVvdGUgPSAnXCcnOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiRXhwZWN0ZWQgcXVvdGUgKFwiIG9yICcpIiApOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJDaGFyKCkgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiUGF0aCB0ZXJtaW5hdGVkIGluIFVSSSBsaXRlcmFsIiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjdXJyQ2hhcigpID09IHF1b3RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJDaGFyKCkgIT0gcXVvdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAoY2hhcikgY3VyckNoYXIoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0ZXAgYWRkU3RlcCAoIGJvb2xlYW4gZGVlcCwgYm9vbGVhbiBhdHRyLCBRTmFtZSBuYW1lLCBTdGVwIHN0ZXBzICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RlcCBzdGVwID0gbmV3IFN0ZXAoIGRlZXAsIGF0dHIsIG5hbWUgKTsKLQotICAgICAgICAgICAgaWYgKHN0ZXBzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXA7Ci0KLSAgICAgICAgICAgIFN0ZXAgcyA9IHN0ZXBzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoIHN0ZXBzLl9uZXh0ICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHN0ZXBzID0gc3RlcHMuX25leHQ7Ci0KLSAgICAgICAgICAgIHN0ZXBzLl9uZXh0ID0gc3RlcDsKLSAgICAgICAgICAgIHN0ZXAuX3ByZXYgPSBzdGVwczsKLQotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0ZXAgdG9rZW5pemVTdGVwcyAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG9rZW5pemUoICIvIiApKQotICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiQWJzb2x1dGUgcGF0aHMgdW5zdXBwb3J0ZWQiICk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZGVlcDsKLQotICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiJCIsIF9jdXJyZW50Tm9kZVZhciwgIi8vIiApIHx8IHRva2VuaXplKCAiLiIsICIvLyIgKSkKLSAgICAgICAgICAgICAgICBkZWVwID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuaXplKCAiJCIsIF9jdXJyZW50Tm9kZVZhciwgIi8iICkgfHwgdG9rZW5pemUoICIuIiwgIi8iICkpCi0gICAgICAgICAgICAgICAgZGVlcCA9IGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5pemUoICIkIiwgX2N1cnJlbnROb2RlVmFyICkgfHwgdG9rZW5pemUoICIuIiApKQotICAgICAgICAgICAgICAgIHJldHVybiBhZGRTdGVwKCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZWVwID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIFN0ZXAgc3RlcHMgPSBudWxsOwotCi0gICAgICAgICAgICAvLyBDb21waWxlIHRoZSBzdGVwcyByZW1vdmluZyAvLiBhbmQgbWVyZ2luZCAvLy4gd2l0aCB0aGUgbmV4dCBzdGVwCi0KLSAgICAgICAgICAgIGJvb2xlYW4gZGVlcERvdCA9IGZhbHNlOwotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZSggImF0dHJpYnV0ZSIsICI6OiIgKSB8fCB0b2tlbml6ZSggIkAiICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IGFkZFN0ZXAoIGRlZXAsIHRydWUsIHRva2VuaXplUU5hbWUoKSwgc3RlcHMgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodG9rZW5pemUoICIuIiApKQotICAgICAgICAgICAgICAgICAgICBkZWVwRG90ID0gZGVlcERvdCB8fCBkZWVwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuaXplKCAiY2hpbGQiLCAiOjoiICkgJiYgKG5hbWUgPSB0b2tlbml6ZVFOYW1lKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHN0ZXBzID0gYWRkU3RlcCggZGVlcCwgZmFsc2UsIG5hbWUsIHN0ZXBzICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKG5hbWUgPSB0b2tlbml6ZVFOYW1lKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHN0ZXBzID0gYWRkU3RlcCggZGVlcCwgZmFsc2UsIG5hbWUsIHN0ZXBzICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodG9rZW5pemUoICIvLyIgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBkZWVwRG90ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuaXplKCAiLyIgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWVwRG90KQotICAgICAgICAgICAgICAgICAgICAgICAgZGVlcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIC8vLiBhdCB0aGUgZW5kIG9mIHRoIHBhdGgsIHRoZW4gd2UgbmVlZCB0byBtYWtlCi0gICAgICAgICAgICAvLyB0d28gcGF0aHMsIG9uZSB3aXRoICogYXQgdGhlIGVuZCBhbmQgYW5vdGhlciB3aXRoIEAqIGF0IHRoZSBlbmQuCi0KLSAgICAgICAgICAgIGlmICgoX2xhc3REZWVwRG90ID0gZGVlcERvdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2xhc3REZWVwRG90ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzdGVwcyA9IGFkZFN0ZXAoIHRydWUsIGZhbHNlLCBnZXRBbnlRTmFtZSgpLCBzdGVwcyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgc2VudGluYWwgc3RlcCAoX25hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGFkZFN0ZXAoIGZhbHNlLCBmYWxzZSwgbnVsbCwgc3RlcHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlQmFja3RyYWNrICggU3RlcCBzdGVwcyApCi0gICAgICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBDb21wdXRlIHN0YXRpYyBiYWNrdHJhY2sgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgSSB1c2UgdGhlIGZhY3QgdGhhdCBfaGFzQmFja3RyYWNrIGlzIGluaXRpYWxpemVkIHRvCi0gICAgICAgICAgICAvLyBmYWxzZSBhbmQgX2JhY2t0cmFjayB0byBudWxsIGluIHRoZSBmb2xsb3dpbmcgY29kZS4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIFN0ZXAgcywgdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggcyA9IHN0ZXBzIDsgcyAhPSBudWxsIDsgcyA9IHQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHNlZ21lbnQgZnJvbSBbIHMsIHQgKQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIHQgPSBzLl9uZXh0IDsgdCAhPSBudWxsICYmICF0Ll9kZWVwIDsgKQotICAgICAgICAgICAgICAgICAgICB0ID0gdC5fbmV4dDsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWdtZW50IGlzIE5PVCByb290ZWQgYXQgLy8sIHRoZW4gdGhlIGJhY2t0cmFjayBpcwotICAgICAgICAgICAgICAgIC8vIG51bGwgZm9yIHRoZSBlbnRpcmUgc2VnbWVudCwgaW5jbHVkaW5nIHBvc3NpYmxlIGF0dHIgYW5kL29yCi0gICAgICAgICAgICAgICAgLy8gc2VudGluYWwKLQotICAgICAgICAgICAgICAgIGlmICghcy5fZGVlcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIFN0ZXAgdSA9IHMgOyB1ICE9IHQgOyB1ID0gdS5fbmV4dCApCi0gICAgICAgICAgICAgICAgICAgICAgICB1Ll9oYXNCYWNrdHJhY2sgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHNlcXVlbmNlIFsgcywgdSApIG9mIGxlbmd0aCBuIHdoaWNoIGNvbnRhaW4gbm8KLSAgICAgICAgICAgICAgICAvLyB3aWxkIHN0ZXBzLgotCi0gICAgICAgICAgICAgICAgaW50IG4gPSAwOwotICAgICAgICAgICAgICAgIFN0ZXAgdSA9IHM7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIHUgIT0gdCAmJiB1Ll9uYW1lICE9IG51bGwgJiYgIXUuaXNXaWxkKCkgJiYgIXUuX2F0dHIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgICAgICAgICB1ID0gdS5fbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3csIGFwcGx5IEtNUCB0byBbIHMsIHUgKSBmb3IgZmFzdCBiYWNrdHJhY2tpbmcKLQotICAgICAgICAgICAgICAgIFFOYW1lIFtdIHBhdHRlcm4gPSBuZXcgUU5hbWUgWyBuICsgMSBdOwotICAgICAgICAgICAgICAgIGludCBbXSBrbXAgPSBuZXcgaW50IFsgbiArIDEgXTsKLQotICAgICAgICAgICAgICAgIFN0ZXAgdiA9IHM7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVyblsgaSBdID0gdi5fbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgdiA9IHYuX25leHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGF0dGVyblsgbiBdID0gZ2V0QW55UU5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IGttcFsgMCBdID0gLTE7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIGkgPCBuICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICggaiA+IC0xICYmICFwYXR0ZXJuWyBpIF0uZXF1YWxzKCBwYXR0ZXJuWyBqIF0gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICBqID0ga21wWyBqIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5bICsraSBdLmVxdWFscyggcGF0dGVyblsgKytqIF0gKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGttcFsgaSBdID0ga21wWyBqIF07Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGttcFsgaSBdID0gajsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKCB2ID0gcyA7IHYgIT0gdSA7IHYgPSB2Ll9uZXh0ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHYuX2hhc0JhY2t0cmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHYuX2JhY2t0cmFjayA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0ga21wWyBpIF0gOyBqID4gMCA7IGotLSApCi0gICAgICAgICAgICAgICAgICAgICAgICB2Ll9iYWNrdHJhY2sgPSB2Ll9iYWNrdHJhY2suX25leHQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc3VjY2VzcyBiYWNrdHJhY2sgYW5kIHN0dWZmIGl0IGludG8gYW4gYXR0ciBhbmQKLSAgICAgICAgICAgICAgICAvLyBzZW50aW5hbCBpZiB0aGV5IGV4aXN0IGZvciB0aGlzIHNlZ21lbnQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2ID0gczsKLQotICAgICAgICAgICAgICAgIGlmIChuID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSBrbXBbIG4gLSAxIF0gOyBqID4gMCA7IGotLSApCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5fbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodSAhPSB0ICYmIHUuX2F0dHIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1Ll9oYXNCYWNrdHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB1Ll9iYWNrdHJhY2sgPSB2OwotICAgICAgICAgICAgICAgICAgICB1ID0gdS5fbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodSAhPSB0ICYmIHUuX25hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHUuX2hhc0JhY2t0cmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHUuX2JhY2t0cmFjayA9IHY7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgb2YgYSBkZWVwIHNlZ21lbnQgYWx3YXlzIGJhY2t0cmFja3MgdG8gaXRzZWxmCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuX2RlZXA7Ci0KLSAgICAgICAgICAgICAgICBzLl9oYXNCYWNrdHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgIHMuX2JhY2t0cmFjayA9IHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdG9rZW5pemVQYXRoICggQXJyYXlMaXN0IHBhdGhzICkKLSAgICAgICAgICAgIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX2xhc3REZWVwRG90ID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0ZXAgc3RlcHMgPSB0b2tlbml6ZVN0ZXBzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbXB1dGVCYWNrdHJhY2soIHN0ZXBzICk7Ci0KLSAgICAgICAgICAgIHBhdGhzLmFkZCggc3RlcHMgKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgcGF0aCBlbmRlZCBpbiAvLy4sIHRoYXQgcGF0aCB3aWxsIG1hdGNoIGFsbAotICAgICAgICAgICAgLy8gZWxlbWVudHMsIGhlcmUgSSBtYWtlIGEgcGF0aCB3aGljaCBtYXRjaGVzIGFsbCBhdHRyaWJ1dGVzLgotCi0gICAgICAgICAgICBpZiAoX2xhc3REZWVwRG90KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zYXdEZWVwRG90ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdGVwIHMgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yICggU3RlcCB0ID0gc3RlcHMgOyB0ICE9IG51bGwgOyB0ID0gdC5fbmV4dCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodC5fbmV4dCAhPSBudWxsICYmIHQuX25leHQuX25leHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBhZGRTdGVwKCB0Ll9kZWVwLCB0cnVlLCB0Ll9uYW1lLCBzICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBhZGRTdGVwKCB0Ll9kZWVwLCB0Ll9hdHRyLCB0Ll9uYW1lLCBzICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29tcHV0ZUJhY2t0cmFjayggcyApOwotCi0gICAgICAgICAgICAgICAgcGF0aHMuYWRkKCBzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgU2VsZWN0b3IgdG9rZW5pemVTZWxlY3RvciAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIHRva2VuaXplUGF0aCggcGF0aHMgKTsKLQotICAgICAgICAgICAgd2hpbGUgKCB0b2tlbml6ZSggInwiICkgKQotICAgICAgICAgICAgICAgIHRva2VuaXplUGF0aCggcGF0aHMgKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvciggKFN0ZXBbXSkgcGF0aHMudG9BcnJheSggbmV3IFN0ZXAgWyAwIF0gKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBYUGF0aCB0b2tlbml6ZVhQYXRoICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiZGVjbGFyZSIsICJuYW1lc3BhY2UiICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlV2hpdGVzcGFjZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJFeHBlY3RlZCBwcmVmaXggYWZ0ZXIgJ2RlY2xhcmUgbmFtZXNwYWNlJyIgKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdG9rZW5pemVOQ05hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXRva2VuaXplKCAiPSIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiRXhwZWN0ZWQgJz0nIiApOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSB0b2tlbml6ZVF1b3RlZFVyaSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCBwcmVmaXggKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZGVmaW5pdGlvbiBvZiBuYW1lc3BhY2UgcHJlZml4OiAiICsgcHJlZml4ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcy5wdXQoIHByZWZpeCwgdXJpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZSggImRlZmF1bHQiLCAiZWxlbWVudCIsICJuYW1lc3BhY2UiICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXRva2VuaXplKCAiPSIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiRXhwZWN0ZWQgJz0nIiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHRva2VuaXplUXVvdGVkVXJpKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVzcGFjZXMuY29udGFpbnNLZXkoICIiICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWRlZmluaXRpb24gb2YgZGVmYXVsdCBlbGVtZW50IG5hbWVzcGFjZSIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzLnB1dCggIiIsIHVyaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHRoZSBkZWZhdWx0IHByZWZpeCBtYXBwaW5nIGlmIGl0IGhhcyBub3QgYmVlbiByZWRlZmluZWQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFfbmFtZXNwYWNlcy5jb250YWluc0tleSggIiIgKSkKLSAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcy5wdXQoICIiLCAiIiApOwotCi0gICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IHRva2VuaXplU2VsZWN0b3IoKTsKLQotICAgICAgICAgICAgcGFyc2VXaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjdXJyQ2hhcigpICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKAotICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjaGFyICciICsgKGNoYXIpIGN1cnJDaGFyKCkgKyAiJyIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYUGF0aCggc2VsZWN0b3IsIF9zYXdEZWVwRG90ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBfZXhwcjsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX3Nhd0RlZXBEb3Q7ICAvLyBTYXcgb25lIG92ZXJhbGwKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9sYXN0RGVlcERvdDsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBfY3VycmVudE5vZGVWYXI7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIE1hcCBfbmFtZXNwYWNlczsKLSAgICAgICAgcHJpdmF0ZSBNYXAgX2V4dGVybmFsTmFtZXNwYWNlczsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgaW50IF9vZmZzZXQ7Ci0gICAgICAgIHByaXZhdGUgaW50IF9saW5lOwotICAgICAgICBwcml2YXRlIGludCBfY29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFN0ZXAKLSAgICB7Ci0gICAgICAgIFN0ZXAgKCBib29sZWFuIGRlZXAsIGJvb2xlYW4gYXR0ciwgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLQotICAgICAgICAgICAgX2RlZXAgPSBkZWVwOwotICAgICAgICAgICAgX2F0dHIgPSBhdHRyOwotCi0gICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOwotCi0gICAgICAgICAgICBpZiAoX2RlZXAgfHwgIV9hdHRyKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEV4ZWN1dGlvbkNvbnRleHQuREVTQ0VORDsKLQotICAgICAgICAgICAgaWYgKF9hdHRyKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEV4ZWN1dGlvbkNvbnRleHQuQVRUUlM7Ci0KLSAgICAgICAgICAgIF9mbGFncyA9IGZsYWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1dpbGQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbmFtZS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA9PSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBtYXRjaCAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBfbmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgICAgaWYgKGxvY2FsLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IF9uYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB1cmkuZXF1YWxzKCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBfbmFtZS5lcXVhbHMoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gX2F0dHI7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gX2RlZXA7Ci0KLSAgICAgICAgaW50IF9mbGFnczsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFFOYW1lIF9uYW1lOwotCi0gICAgICAgIFN0ZXAgX25leHQsIF9wcmV2OwotCi0gICAgICAgIGJvb2xlYW4gX2hhc0JhY2t0cmFjazsKLSAgICAgICAgU3RlcCAgICBfYmFja3RyYWNrOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdG9yCi0gICAgewotICAgICAgICBTZWxlY3RvciAoIFN0ZXBbXSBwYXRocyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXRocyA9IHBhdGhzOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RlcFtdIF9wYXRoczsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLSAgICAKLSAgICBwcml2YXRlIFhQYXRoICggU2VsZWN0b3Igc2VsZWN0b3IsIGJvb2xlYW4gc2F3RGVlcERvdCApCi0gICAgewotICAgICAgICBfc2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICAgICAgX3Nhd0RlZXBEb3QgPSBzYXdEZWVwRG90OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNhd0RlZXBEb3QgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3Nhd0RlZXBEb3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBfc2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuICBfc2F3RGVlcERvdDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRW5jb2RpbmdTbmlmZmVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRW5jb2RpbmdTbmlmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNGJiZmUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVuY29kaW5nU25pZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBYbWxFbmNvZGluZ1NuaWZmZXIKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgIF94bWxlbmNvZGluZzsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgIF9qYXZhZW5jb2Rpbmc7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBfc3RyZWFtOwotICAgIHByaXZhdGUgUmVhZGVyICAgICAgX3JlYWRlcjsKLQotICAgIC8qKgotICAgICAqIFNuaWZmcyB0aGUgZ2l2ZW4gWE1MIHN0cmVhbSBmb3IgZW5jb2RpbmcgaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBBZnRlciBhIHNuaWZmZXIgaXMgY29uc3RydWN0ZWQsIGl0IGNhbiByZXR1cm4gZWl0aGVyIGEgc3RyZWFtCi0gICAgICogKHdoaWNoIGlzIGEgYnVmZmVyZWQgc3RyZWFtIHdyYXBwZXIgb2YgdGhlIG9yaWdpbmFsKSBvciBhIHJlYWRlcgotICAgICAqICh3aGljaCBhcHBsaWVzIHRoZSBwcm9wZXIgZW5jb2RpbmcpLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmVhbSAgICAgICAgICAgVGhlIHN0cmVhbSB0byBzbmlmZgotICAgICAqIEBwYXJhbSBlbmNvZGluZ092ZXJyaWRlIFRoZSBYTUwgKElBTkEpIG5hbWUgZm9yIHRoZSBvdmVycmlkaW5nIGVuY29kaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBYbWxFbmNvZGluZ1NuaWZmZXIoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmdPdmVycmlkZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfc3RyZWFtID0gc3RyZWFtOwotICAgICAgICAKLSAgICAgICAgaWYgKGVuY29kaW5nT3ZlcnJpZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoZW5jb2RpbmdPdmVycmlkZSk7Ci0KLSAgICAgICAgaWYgKF94bWxlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgX3htbGVuY29kaW5nID0gZW5jb2RpbmdPdmVycmlkZTsKLQotICAgICAgICBpZiAoX3htbGVuY29kaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNuaWZmZWRYbWxJbnB1dFN0cmVhbSBzbmlmZmVkID0gbmV3IFNuaWZmZWRYbWxJbnB1dFN0cmVhbShfc3RyZWFtKTsKLSAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IHNuaWZmZWQuZ2V0WG1sRW5jb2RpbmcoKTsKLSAgICAgICAgICAgIGFzc2VydChfeG1sZW5jb2RpbmcgIT0gbnVsbCk7Ci0gICAgICAgICAgICBfc3RyZWFtID0gc25pZmZlZDsKLSAgICAgICAgfQotCi0gICAgICAgIF9qYXZhZW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRJQU5BMkphdmFNYXBwaW5nKF94bWxlbmNvZGluZyk7Ci0gICAgICAgIAotICAgICAgICAvLyB3ZSBhbGxvdyB5b3UgdG8gdXNlIEphdmEncyBlbmNvZGluZyBuYW1lcyBpbiBYTUwgZXZlbiB0aG91Z2ggeW91J3JlCi0gICAgICAgIC8vIG5vdCBzdXBwb3NlZCB0by4KLSAgICAgICAgCi0gICAgICAgIGlmIChfamF2YWVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICBfamF2YWVuY29kaW5nID0gX3htbGVuY29kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNuaWZmcyB0aGUgZ2l2ZW4gWE1MIHN0cmVhbSBmb3IgZW5jb2RpbmcgaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBBZnRlciBhIHNuaWZmZXIgaXMgY29uc3RydWN0ZWQsIGl0IGNhbiByZXR1cm4gZWl0aGVyIGEgcmVhZGVyCi0gICAgICogKHdoaWNoIGlzIGEgYnVmZmVyZWQgc3RyZWFtIHdyYXBwZXIgb2YgdGhlIG9yaWdpbmFsKSBvciBhIHN0cmVhbQotICAgICAqICh3aGljaCBhcHBsaWVzIHRoZSBwcm9wZXIgZW5jb2RpbmcpLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlciAgICAgICAgICAgVGhlIHJlYWRlciB0byBzbmlmZgotICAgICAqIEBwYXJhbSBlbmNvZGluZ0RlZmF1bHQgIFRoZSBKYXZhIG5hbWUgZm9yIHRoZSBkZWZhdWx0IGVuY29kaW5nIHRvIGFwcGx5LCBVVEYtOCBpZiBudWxsLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sRW5jb2RpbmdTbmlmZmVyKFJlYWRlciByZWFkZXIsIFN0cmluZyBlbmNvZGluZ0RlZmF1bHQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChlbmNvZGluZ0RlZmF1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIGVuY29kaW5nRGVmYXVsdCA9ICJVVEYtOCI7Ci0gICAgICAgIAotICAgICAgICBTbmlmZmVkWG1sUmVhZGVyIHNuaWZmZWRSZWFkZXIgPSBuZXcgU25pZmZlZFhtbFJlYWRlcihyZWFkZXIpOwotICAgICAgICBfcmVhZGVyID0gc25pZmZlZFJlYWRlcjsKLSAgICAgICAgX3htbGVuY29kaW5nID0gc25pZmZlZFJlYWRlci5nZXRYbWxFbmNvZGluZygpOwotCi0gICAgICAgIGlmIChfeG1sZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3htbGVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SmF2YTJJQU5BTWFwcGluZyhlbmNvZGluZ0RlZmF1bHQpOwotICAgICAgICAgICAgaWYgKF94bWxlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgIF9qYXZhZW5jb2RpbmcgPSBlbmNvZGluZ0RlZmF1bHQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX3htbGVuY29kaW5nID0gZW5jb2RpbmdEZWZhdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF94bWxlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgX3htbGVuY29kaW5nID0gIlVURi04IjsKLSAgICAgICAgCi0gICAgICAgIC8vIHdlIGFsbG93IHlvdSB0byB1c2UgSmF2YSdzIGVuY29kaW5nIG5hbWVzIGluIFhNTCBldmVuIHRob3VnaCB5b3UncmUKLSAgICAgICAgLy8gbm90IHN1cHBvc2VkIHRvLgotICAgICAgICAKLSAgICAgICAgX2phdmFlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoX3htbGVuY29kaW5nKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChfamF2YWVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICBfamF2YWVuY29kaW5nID0gX3htbGVuY29kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF94bWxlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2phdmFlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkKLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3N0cmVhbSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IF9zdHJlYW07Ci0gICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBpczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfcmVhZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKCBfcmVhZGVyLCBfamF2YWVuY29kaW5nICk7Ci0gICAgICAgICAgICBfcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBpczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIgKCApCi0gICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3JlYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gX3JlYWRlcjsKLSAgICAgICAgICAgIF9yZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfc3RyZWFtICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIF9zdHJlYW0sIF9qYXZhZW5jb2RpbmcgKTsKLSAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvckNvbnRleHQuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2MzcwMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sRXJyb3JDb250ZXh0Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0xPQURfWFNEX0ZJTEUgICAgICAgICAgICAgID0gICAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk5PVF9MT0FEX1hTRF9DT05GSUdfRklMRSAgICAgICA9ICAgMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TQ0hFTUFfRUxFTUVOVCAgICAgICAgICAgICAgICAgPSAgIDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTTUFUQ0hFRF9UQVJHRVRfTkFNRVNQQUNFICAgICAgID0gICA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTF9UWVBFX01JU1NJTkdfTkFNRSAgICAgICAgICA9ICAgNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgPSAgIDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVEVU5EQU5UX05FU1RFRF9UWVBFICAgICAgICAgICAgID0gICA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfTUlTU0lOR19OQU1FICAgICAgICAgICAgICA9ICAgODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURVTkRBTlRfREVGQVVMVF9GSVhFRCAgICAgICAgICAgPSAgIDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfR1JPVVBfTUlTU0lOR19OQU1FICAgICAgICAgID0gIDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9NSVNTSU5HX05BTUUgICAgICAgICAgICA9ICAxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVBfTUlTU0lOR19OQU1FICAgICAgPSAgMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1lDTElDX0RFUEVOREVOQ1kgICAgICAgICAgICAgICAgID0gIDEzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOSU9OX01FTUJFUl9OT1RfU0lNUExFICAgICAgICAgICA9ICAxNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUUklDVElPTl9SRURVTkRBTlRfQkFTRSAgICAgICAgPSAgMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVFJJQ1RJT05fTUlTU0lOR19CQVNFICAgICAgICAgID0gIDE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRV9SRVNUUklDVElPTl9OT1RfU0lNUExFICAgICA9ICAxNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9ET0VTX05PVF9BUFBMWSAgICAgICAgICAgICAgPSAgMTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfRFVQTElDQVRFRCAgICAgICAgICAgICAgICAgID0gIDE5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1ZBTFVFX01BTEZPUk1FRCAgICAgICAgICAgICA9ICAyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgPSAgMjE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEX05VTUJFUiAgICAgICAgICAgICAgICAgID0gIDIxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfTUlTU0lOR19JVEVNICAgICAgICAgICAgICAgICA9ICAyMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUX0lURU1fTk9UX1NJTVBMRSAgICAgICAgICAgICAgPSAgMjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9PRl9MSVNUICAgICAgICAgICAgICAgICAgICAgID0gIDI0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfV0hJVEVTUEFDRSAgICAgICAgICAgICAgICAgICA9ICAyNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURVTkRBTlRfQ09OVEVOVF9NT0RFTCAgICAgICAgICAgPSAgMjY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNUUklDVElPTl9PUl9FWFRFTlNJT04gID0gIDI3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfQkFTRSAgICAgICAgICAgICAgICAgICAgICA9ICAyODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1JFRl9OT1RfRk9VTkQgICAgICAgICAgICAgPSAgMjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9FWFRSQV9SRUYgICAgICAgICAgICAgICAgID0gIDMwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9DT05URU5UUyAgICAgICAgICAgICAgICAgICAgICA9ICAzMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBMSUNJVF9HUk9VUF9ORUVERUQgICAgICAgICAgICAgPSAgMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfTUlTU0lOR19SRUYgICAgICAgICAgICAgICAgID0gIDMzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0dST1VQX05PVF9GT1VORCAgICAgICAgICAgICA9ICAzNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fTUFYX09DQ1VSUyAgICAgICAgICAgICAgICAgICAgPSAgMzU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX1JFRl9OT1RfRk9VTkQgICAgICAgICAgID0gIDM2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSAgICAgICAgICA9ICAzNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfQU5ZX0FUVFJJQlVURSAgICAgICAgICAgPSAgMzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0dST1VQX01JU1NJTkdfUkVGICAgICAgID0gIDM5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9HUk9VUF9OT1RfRk9VTkQgICAgICAgICA9ICA0MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX0JBU0VfTk9UX0NPTVBMRVggICAgICAgICAgPSAgNDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0VYVEVORF9BTEwgICAgICAgICAgICAgICAgID0gIDQyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRV9CQVNFX05PVF9TSU1QTEUgICAgICAgICAgICA9ICA0MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFUlZFRF9UWVBFX05BTUUgICAgICAgICAgICAgICAgPSAgNDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUxMRUdBTF9SRVNUUklDVElPTiAgICAgICAgICAgICAgID0gIDQ1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0NIRU1BICAgICAgICAgICAgICAgICAgICA9ICA0NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfR0xPQkFMX0VMRU1FTlQgICAgICAgICAgPSAgNDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVQTElDQVRFX0dMT0JBTF9BVFRSSUJVVEUgICAgICAgID0gIDQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9HTE9CQUxfVFlQRSAgICAgICAgICAgICA9ICA0OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNPTlNJU1RFTlRfVFlQRSAgICAgICAgICAgICAgICAgPSAgNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TVVBQT1JURURfRkVBVFVSRSAgICAgICAgICAgICAgID0gIDUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTEZPUk1FRF9TSU1QTEVfVFlQRV9ERUZOICAgICAgICA9ICA1MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX05BTUUgICAgICAgICAgICAgICAgICAgICAgPSAgNTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0RFUklWRV9GSU5BTCAgICAgICAgICAgICAgID0gIDU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEQ19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICA9ICA1NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5OT1RfRklORF9SRVNPVVJDRSAgICAgICAgICAgICAgPSAgNTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OREVURVJNSU5JU1RJQ19NT0RFTCAgICAgICAgICAgID0gIDU3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUgICAgICAgICA9ICA1ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUklDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgPSAgNjA7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTg4YWMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1wdWJsaWMgY2xhc3MgWG1sRXJyb3JQcmludGVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ub2lzeTsKLSAgICBwcml2YXRlIFVSSSBfYmFzZVVSSTsKLQotICAgIHB1YmxpYyBYbWxFcnJvclByaW50ZXIoYm9vbGVhbiBub2lzeSwgVVJJIGJhc2VVUkkpCi0gICAgewotICAgICAgICBfbm9pc3kgPSBub2lzeTsKLSAgICAgICAgX2Jhc2VVUkkgPSBiYXNlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sRXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IChYbWxFcnJvcilvOwotICAgICAgICAgICAgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SIHx8Ci0gICAgICAgICAgICAgICAgZXJyLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfV0FSTklORykKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChfbm9pc3kpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVyci50b1N0cmluZyhfYmFzZVVSSSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JXYXRjaGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDI1OTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxFcnJvcldhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24KLXsKLSAgICBwcml2YXRlIENvbGxlY3Rpb24gX3VuZGVybHlpbmc7Ci0gICAgcHJpdmF0ZSBYbWxFcnJvciBfZmlyc3RFcnJvcjsKLQotICAgIHB1YmxpYyBYbWxFcnJvcldhdGNoZXIoQ29sbGVjdGlvbiB1bmRlcmx5aW5nKQotICAgIHsKLSAgICAgICAgX3VuZGVybHlpbmcgPSB1bmRlcmx5aW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmIChfZmlyc3RFcnJvciA9PSBudWxsICYmIG8gaW5zdGFuY2VvZiBYbWxFcnJvciAmJiAoKFhtbEVycm9yKW8pLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpCi0gICAgICAgICAgICBfZmlyc3RFcnJvciA9IChYbWxFcnJvcilvOwotICAgICAgICBpZiAoX3VuZGVybHlpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIF91bmRlcmx5aW5nLmFkZChvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKF91bmRlcmx5aW5nID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCi0gICAgICAgIHJldHVybiBfdW5kZXJseWluZy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpCi0gICAgewotICAgICAgICBpZiAoX3VuZGVybHlpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHJldHVybiBfdW5kZXJseWluZy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9maXJzdEVycm9yICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVycm9yIGZpcnN0RXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9maXJzdEVycm9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFdmVudEJhc2UuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFdmVudEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3NzFkMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXZlbnRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uZXZlbnRzLkVsZW1lbnRUeXBlTmFtZXM7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSB0eXBlIHBhcnQgWE1MRXZlbnQuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbEV2ZW50QmFzZSBpbXBsZW1lbnRzIFhNTEV2ZW50Ci17Ci0gICAgcHVibGljIFhtbEV2ZW50QmFzZSAoICkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYbWxFdmVudEJhc2UgKCBpbnQgdHlwZSApCi0gICAgewotICAgICAgICBfdHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZSAoIGludCB0eXBlICkKLSAgICB7Ci0gICAgICAgIF90eXBlID0gdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRUeXBlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFzU3RyaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlTmFtZXMuZ2V0TmFtZSggX3R5cGUgKTsKLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRW50aXR5UmVmZXJlbmNlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LkVOVElUWV9SRUZFUkVOQ0U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRQcmVmaXhNYXBwaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZFByZWZpeE1hcHBpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuRU5EX1BSRUZJWF9NQVBQSU5HOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZVByZWZpeE1hcHBpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NpbmdJbnN0cnVjdGlvbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlckRhdGEgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuQ0hBUkFDVEVSX0RBVEE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3BhY2UgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuU1BBQ0U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5OVUxMX0VMRU1FTlQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnREb2N1bWVudCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmREb2N1bWVudCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5FTkRfRE9DVU1FTlQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgX3R5cGU7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sTmFtZUltcGwuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxOYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzk3MGNjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxOYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZTsKLQotcHVibGljIGNsYXNzIFhtbE5hbWVJbXBsIGltcGxlbWVudHMgWE1MTmFtZSB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVXJpPW51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZT1udWxsOwotICBwcml2YXRlIFN0cmluZyBwcmVmaXg9bnVsbDsKLSAgcHJpdmF0ZSBpbnQgaGFzaCA9IDA7Ci0KLSAgcHVibGljIFhtbE5hbWVJbXBsICgpIHt9Ci0gIHB1YmxpYyBYbWxOYW1lSW1wbCAoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICB9Ci0gIHB1YmxpYyBYbWxOYW1lSW1wbCAoU3RyaW5nIG5hbWVzcGFjZVVyaSxTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgc2V0TmFtZXNwYWNlVXJpKG5hbWVzcGFjZVVyaSk7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gIH0KLSAgcHVibGljIFhtbE5hbWVJbXBsIChTdHJpbmcgbmFtZXNwYWNlVXJpLAotICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXgpIHsKLSAgICBzZXROYW1lc3BhY2VVcmkobmFtZXNwYWNlVXJpKTsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCkgeyByZXR1cm4gbmFtZXNwYWNlVXJpOyB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeyByZXR1cm4gbG9jYWxOYW1lOyB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeyByZXR1cm4gcHJlZml4OyB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVXJpKFN0cmluZyBuYW1lc3BhY2VVcmkpIHsKLSAgICBoYXNoID0gMDsKLSAgICBpZiAobmFtZXNwYWNlVXJpICE9IG51bGwgJiYgbmFtZXNwYWNlVXJpLmVxdWFscygiIikpIHJldHVybjsKLSAgICB0aGlzLm5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZVVyaTsgCi0gIH0KLSAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBsb2NhbE5hbWUpIHsgCi0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7IAotICAgIGhhc2ggPSAwOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7IHRoaXMucHJlZml4ID0gcHJlZml4OyB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIGxvY2FsTmFtZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbG9jYWxOYW1lOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgaWYgKGdldE5hbWVzcGFjZVVyaSgpICE9IG51bGwpCi0gICAgICByZXR1cm4gIlsnIitnZXROYW1lc3BhY2VVcmkoKSsiJ106IitnZXRRdWFsaWZpZWROYW1lKCk7Ci0gICAgZWxzZSAKLSAgICAgIHJldHVybiBnZXRRdWFsaWZpZWROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotICAgIGludCB0bXBfaGFzaCA9IGhhc2g7Ci0gICAgaWYgKHRtcF9oYXNoID09IDApIHsKLSAgICAgIHRtcF9oYXNoID0gMTc7Ci0gICAgICBpZiAobmFtZXNwYWNlVXJpICE9IG51bGwpIHsKLQl0bXBfaGFzaCA9IDM3KnRtcF9oYXNoICsgbmFtZXNwYWNlVXJpLmhhc2hDb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobG9jYWxOYW1lICE9IG51bGwpIHsKLQl0bXBfaGFzaCA9IDM3KnRtcF9oYXNoICsgbG9jYWxOYW1lLmhhc2hDb2RlKCk7Ci0gICAgICB9Ci0gICAgICBoYXNoID0gdG1wX2hhc2g7Ci0gICAgfQotICAgIHJldHVybiB0bXBfaGFzaDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgaWYgKG9iaiA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChvYmogaW5zdGFuY2VvZiBYTUxOYW1lKSB7Ci0gICAgICBmaW5hbCBYTUxOYW1lIG5hbWU9IChYTUxOYW1lKSBvYmo7Ci0KLSAgICAgIGZpbmFsIFN0cmluZyBsbmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgIGlmICghKGxuYW1lPT1udWxsID8gbmFtZS5nZXRMb2NhbE5hbWUoKT09bnVsbCA6IAotCSAgICBsbmFtZS5lcXVhbHMobmFtZS5nZXRMb2NhbE5hbWUoKSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IG5hbWVzcGFjZVVyaTsKLSAgICAgIHJldHVybiAodXJpPT1udWxsID8gbmFtZS5nZXROYW1lc3BhY2VVcmkoKT09bnVsbCA6Ci0JICAgICAgdXJpLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVyaSgpKSk7Ci0JCi0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE9iamVjdExpc3QuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxPYmplY3RMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTZlNzcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE9iamVjdExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLQotLyoqCi0gKiBBIGNsYXNzIHRvIGhvbGQgYW5kIGNvbXBhcmUgYSBsaXN0IG9mIFhtbE9iamVjdHMgZm9yIHVzZSBieSBrZXlzCi0gKiBrZXlyZWZzIGR1cmluZyB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWG1sT2JqZWN0TGlzdAotewotICAgIHByaXZhdGUgZmluYWwgWG1sT2JqZWN0W10gX29iamVjdHM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgb2JqZWN0IGxpc3Qgb2YgdGhlIGdpdmVuIGZpeGVkIHNpemUuCi0gICAgICovCi0gICAgcHVibGljIFhtbE9iamVjdExpc3QoaW50IG9iamVjdENvdW50KSB7Ci0gICAgICAgIF9vYmplY3RzID0gbmV3IFhtbE9iamVjdFtvYmplY3RDb3VudF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFuIG9iamVjdCBieSBpbmRleCB1bmxlc3MgYSB2YWx1ZSBoYXMgYmVlbiBwcmV2aW91c2x5Ci0gICAgICogc2V0IGF0IHRoYXQgbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgc2V0LCBmYWxzZSBpZiB0aGUgdmFsdWUgaGFzCi0gICAgICogYWxyZWFkeSBiZWVuIHNldAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldChYbWxPYmplY3QgbywgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgaWYgKF9vYmplY3RzW2luZGV4XSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIF9vYmplY3RzW2luZGV4XSA9IG87Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYWxsIHZhbHVlcyBoYXZlIGJlZW4gc2V0LiBOZWVkZWQgZm9yIGtleXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmlsbGVkKCkgewotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBpZiAoX29iamVjdHNbaV0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGFsbCB2YWx1ZXMgaGF2ZSBiZWVuIHNldC4gTmVlZGVkIGZvciBrZXlzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdW5maWxsZWQoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX29iamVjdHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgaWYgKF9vYmplY3RzW2ldID09IG51bGwpIHJldHVybiBpOwotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKCEoIG8gaW5zdGFuY2VvZiBYbWxPYmplY3RMaXN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBYbWxPYmplY3RMaXN0IG90aGVyID0gKFhtbE9iamVjdExpc3QpbzsKLQotICAgICAgICBpZiAob3RoZXIuX29iamVjdHMubGVuZ3RoICE9IHRoaXMuX29iamVjdHMubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9vYmplY3RzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgLy8gSWdub3JlIG1pc3NpbmcgdmFsdWVzCi0gICAgICAgICAgICBpZiAoX29iamVjdHNbaV0gPT0gbnVsbCB8fCBvdGhlci5fb2JqZWN0c1tpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCEgX29iamVjdHNbaV0udmFsdWVFcXVhbHMob3RoZXIuX29iamVjdHNbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgaW50IGggPSAwOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9vYmplY3RzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIGlmIChfb2JqZWN0c1tpXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGggPSAzMSAqIGggKyBfb2JqZWN0c1tpXS52YWx1ZUhhc2hDb2RlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGg7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmV0dHl0cmltKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaW50IGVuZDsKLSAgICAgICAgZm9yIChlbmQgPSBzLmxlbmd0aCgpOyBlbmQgPiAwOyBlbmQgLT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzU3BhY2Uocy5jaGFyQXQoZW5kIC0gMSkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGludCBzdGFydDsKLSAgICAgICAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZShzLmNoYXJBdChzdGFydCkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpICE9IDApIGIuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICBiLmFwcGVuZChwcmV0dHl0cmltKCgoU2ltcGxlVmFsdWUpX29iamVjdHNbaV0pLnN0cmluZ1ZhbHVlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxXaGl0ZXNwYWNlLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sV2hpdGVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2JkNzY2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxXaGl0ZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbFdoaXRlc3BhY2UKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19VTlNQRUNJRklFRCA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfUFJFU0VSVkUgPSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1JFUExBQ0UgPSBTY2hlbWFUeXBlLldTX1JFUExBQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfQ09MTEFQU0UgPSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGNoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjaCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FsbFNwYWNlKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaXNTcGFjZSh2LmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxhcHNlKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbGxhcHNlKHYsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBhbGdvcml0aG0gdXNlZCBieSBhcHBseV93c2Nhbm9uOiBzb21ldGltZXMgdXNlZCBpbiBpbXBscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2xsYXBzZShTdHJpbmcgdiwgaW50IHdzcikKLSAgICB7Ci0gICAgICAgIGlmICh3c3IgPT0gU2NoZW1hVHlwZS5XU19QUkVTRVJWRSB8fCB3c3IgPT0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIGlmICh2LmluZGV4T2YoJ1xuJykgPj0gMCkKLSAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1xuJywgJyAnKTsKLSAgICAgICAgaWYgKHYuaW5kZXhPZignXHQnKSA+PSAwKQotICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXHQnLCAnICcpOwotICAgICAgICBpZiAodi5pbmRleE9mKCdccicpID49IDApCi0gICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdccicsICcgJyk7Ci0KLSAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1JFUExBQ0UpCi0gICAgICAgICAgICByZXR1cm4gdjsKLQotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGludCBsZW4gPSB2Lmxlbmd0aCgpOwotICAgICAgICBpZiAobGVuID09IDApCi0gICAgICAgICAgICByZXR1cm4gdjsKLQotICAgICAgICBpbnQgaTsKLQotICAgICAgICAvKiBhIHRyaWNrOiBleGFtaW5lIGV2ZXJ5IG90aGVyIGNoYXJhY3RlciBsb29raW5nIGZvciBwYWlycyBvZiBzcGFjZXMgKi8KLSAgICAgICAgaWYgKHYuY2hhckF0KDApICE9ICcgJykKLSAgICAgICAgewotICAgICAgICAgICAgZXhhbWluZTogewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDI7IGogPCBsZW47IGogKz0gMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqIC0gMSkgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5jaGFyQXQoaikgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gbGVuICYmIHYuY2hhckF0KGogLSAxKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBqIGlzIHBvaW50aW5nIGF0IHRoZSBmaXJzdCB3cyB0byBiZSByZW1vdmVkLCBvciBwYXN0IGVuZCAqLwotICAgICAgICAgICAgaSA9IGo7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIGogaXMgcG9pbnRpbmcgYXQgdGhlIGxhc3Qgd2hpdGVzcGFjZSBpbiB0aGUgaW5pdGlhbCBydW4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgd2hpbGUgKGogKyAxIDwgdi5sZW5ndGgoKSAmJiB2LmNoYXJBdChqICsgMSkgPT0gJyAnKQotICAgICAgICAgICAgICAgIGogKz0gMTsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhcltdIGNoID0gdi50b0NoYXJBcnJheSgpOwotCi0gICAgICAgIHNoaWZ0ZXI6IGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaiB3YXMgd3Mgb3IgcGFzdCBlbmQgKi8KLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgaWYgKGogPj0gbGVuKQotICAgICAgICAgICAgICAgICAgICBicmVhayBzaGlmdGVyOwotICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqKSAhPSAnICcpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBqIHdhcyBub253cyAqLwotICAgICAgICAgICAgICAgIGNoW2krK10gPSBjaFtqKytdOwotICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2hpZnRlcjsKLSAgICAgICAgICAgICAgICBpZiAoY2hbal0gPT0gJyAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hbaSsrXSA9IGNoW2orK107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaFtqXSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaCwgMCwgKGkgPT0gMCB8fCBjaFtpIC0gMV0gIT0gJyAnKSA/IGkgOiBpIC0gMSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vcmVhZG1lLnR4dCBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI1MTQzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1UaGVyZSBhcmUgaXNvbGF0ZWQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdGFrZW4gZnJvbSB0aGUgQXBhY2hlCi1YZXJjZXMtSiAyLjAgcHJvamVjdAotCi1JdCBjb250YWlucyB2ZXJ5IG1pbm9yIG1vZGlmaWNhdGlvbnMgaW5jbHVkaW5nIGEgY2hhbmdlIGluIG5hbWVzcGFjZS4KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEveG1sY29uZmlnLnhzZCBiL3YxL3NyYy9jb25maWdzY2hlbWEvc2NoZW1hL3htbGNvbmZpZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMTAwZDguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEveG1sY29uZmlnLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnhiPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94YmVhbi9jb25maWciCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3hiZWFuL2NvbmZpZyIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgCi0gIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIvPiAKLQotICA8eHM6ZWxlbWVudCBuYW1lPSJjb25maWciPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY29uZmlnIGVsZW1lbnQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IGZvciBhbiAueHNkY29uZmlnIGZpbGUuCi0gICAgICAgICBJdCBjb250YWlucyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRoYXQgZ3VpZGVzIHRoZSB4c2QgY29tcGlsZXIKLSAgICAgICAgIHdoZW4gaXQgZ2VuZXJhdGVzIEphdmEgY2xhc3Nlcy4gWW91IGNhbiBzcGVjaWZ5IHBhY2thZ2UgbmFtZXMgdG8KLSAgICAgICAgIGJlIHVzZWQgZm9yIHdob2xlIHhtbCBuYW1lc3BhY2VzOyB5b3UgY2FuIHNwZWNpZnkgY2xhc3MgbmFtZXMKLSAgICAgICAgIHRvIHVzZSBmb3IgaW5kaXZpZHVhbCBzY2hlbWEgdHlwZXM7IGFuZCB5b3UgY2FuIHN1cHBseSBleHRlbnNpb24KLSAgICAgICAgIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9ucyB0byBiZSBleHRlbmRlZCBieSB0aGUgZ2VuZXJhdGVkCi0gICAgICAgICBKYXZhIGNsYXNzZXMuCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4Yjpuc2NvbmZpZyI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZXNwYWNlLgotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czplbGVtZW50PgotCi0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InFuYW1lIiB0eXBlPSJ4YjpxbmFtZWNvbmZpZyI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgU3BlY2lmaWVzIGphdmEgbWFwcGluZyBmb3IgYSBxbmFtZS4KLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLQotICAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuc2NvbmZpZyI+Ci0KLSAgICA8eHM6c2VxdWVuY2U+Ci0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHVzZWQgZm9yIHR5cGVzIGdlbmVyYXRlZCBpbiB0aGlzCi0gICAgICAgICAgICBuYW1lc3BhY2UuCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDx4czplbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgcHJlZml4IHRvIGJlIHVzZWQgdG8gcHJlcGVuZCB0byB0b3AtbGV2ZWwgSmF2YSB0eXBlIG5hbWVzCi0gICAgICAgICAgICBnZW5lcmF0ZWQgaW4gdGhpcyBuYW1lc3BhY2UuICAoVGhlIHByZWZpeCBpcyBub3QgdXNlZCBmb3IKLSAgICAgICAgICAgIGlubmVyIEphdmEgdHlwZSBkZWZpbml0aW9ucy4pCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InN1ZmZpeCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgc3VmZml4IHRvIGJlIHVzZWQgdG8gYXBwZW5kIHRvIHRvcC1sZXZlbCBKYXZhIHR5cGUgbmFtZXMKLSAgICAgICAgICAgIGdlbmVyYXRlZCBpbiB0aGlzIG5hbWVzcGFjZS4gKFRoZSBzdWZmaXggaXMgbm90IHVzZWQgZm9yCi0gICAgICAgICAgICBpbm5lciBKYXZhIHR5cGUgZGVmaW5pdGlvbnMuKQotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czplbGVtZW50PgotCi0gICAgPC94czpzZXF1ZW5jZT4KLQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJ4czpuYW1lc3BhY2VMaXN0Ij4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICBBIGxpc3Qgb2YgYW55IG51bWJlciBvZiBuYW1lc3BhY2UgVVJJcyBvciAjI2xvY2FsIGZvciB0aGUgbm8tbmFtZXNwYWNlLAotICAgICAgICAgIG9yICMjYW55IGZvciBhbGwgbmFtZXNwYWNlcy4KLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lY29uZmlnIj4KLSAgICA8eHM6c2VxdWVuY2UvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmFuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1lc3BhY2VMaXN0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgIEEgbGlzdCBvZiBuYW1lc3BhY2UgVVJJcywgd2l0aCAjI2xvY2FsIGZvciBuby11cmk7IG9yICMjYW55IGZvciBhbGwgVVJJcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6dW5pb24+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmxpc3Q+Ci0gICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6YW55VVJJIj4KLSAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNsb2NhbCIvPgotICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDwveHM6dW5pb24+Ci0gICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPC94czpsaXN0PgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czp1bmlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy9saWNlbnNlL0xJQ0VOU0UudHh0IGIvdjEvc3JjL2xpY2Vuc2UvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMDA1MGIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2xpY2Vuc2UvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQURESVRJT05BTCBMSUNFTlNFUyBDT1ZFUklORyBQQVJUUyBPRiBUSElTIERJU1RSSUJVVElPTjoKLQotVGhpcyBkaXN0cmlidXRpb24gaW5jbHVkZXMgVzNDIFhNTCBTY2hlbWEgZG9jdW1lbnRzIENvcHlyaWdodCAoYykgMjAwMS0yMDAzCi1Xb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLiAgVGhlc2Ugc2NoZW1hcyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIFczQwotU29mdHdhcmUgTGljZW5zZSwgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzY2hlbWFzLgotVGhlIGxpY2Vuc2UgY2FuIGFsc28gYmUgZm91bmQgYXQ6Ci1odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxLgotCmRpZmYgLS1naXQgYS92MS9zcmMvbGljZW5zZS9OT1RJQ0UudHh0IGIvdjEvc3JjL2xpY2Vuc2UvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1NzhkYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvbGljZW5zZS9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLWluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLUluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSAKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotCi1Bc2lkZSBmcm9tIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIEFwYWNoZSBYTUxCZWFucyBwcm9qZWN0LCB0aGlzIAotc29mdHdhcmUgYWxzbyBpbmNsdWRlczoKLQotLSBvbmUgb3IgbW9yZSBzb3VyY2UgZmlsZXMgZnJvbSB0aGUgQXBhY2hlIFhlcmNlcy1KIGFuZCBBcGFjaGUgCi1BeGlzIHByb2R1Y3RzLCBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0tIGpheGVuLCBDb3B5cmlnaHQgMjAwMyAoYykgVGhlIFdlcmtlbiBDb21wYW55LgotCi0tIFczQyBYTUwgU2NoZW1hIGRvY3VtZW50cyBDb3B5cmlnaHQgMjAwMS0yMDAzIChjKSBXb3JsZCBXaWRlIAotV2ViIENvbnNvcnRpdW0gIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBFdXJvcGVhbiAKLVJlc2VhcmNoIENvbnNvcnRpdW0gIGZvciBJbmZvcm1hdGljcyBhbmQgTWF0aGVtYXRpY3MsIEtlaW8gCi1Vbml2ZXJzaXR5KQotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgotCmRpZmYgLS1naXQgYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL0VkaXRCdWlsZFNjcmlwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYxNmU4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL0VkaXRCdWlsZFNjcmlwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgcmVwYWNrYWdlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgRWRpdEJ1aWxkU2NyaXB0Ci17Ci0gICAgLy8KLSAgICAvLyB1c2dhZTogZWRpdCBidWlsZGZpbGUgdG9rZW4gbmV3LXZhbHVlCi0gICAgLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAzKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiICk7Ci0KLSAgICAgICAgYXJnc1sgMCBdID0gYXJnc1sgMCBdLnJlcGxhY2UoICcvJywgRmlsZS5zZXBhcmF0b3JDaGFyICk7Ci0KLSAgICAgICAgRmlsZSBidWlsZEZpbGUgPSBuZXcgRmlsZSggYXJnc1sgMCBdICk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gcmVhZEZpbGUoIGJ1aWxkRmlsZSApOwotCi0gICAgICAgIFN0cmluZyB0b2tlblN0ciA9ICI8cHJvcGVydHkgbmFtZT1cIiIgKyBhcmdzWyAxIF0gKyAiXCIgdmFsdWU9XCIiOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgaSA9IHNiLmluZGV4T2YoIHRva2VuU3RyICk7Ci0KLSAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNhbid0IGZpbmQgdG9rZW46ICIgKyB0b2tlblN0ciApOwotCi0gICAgICAgIGludCBqID0gaSArIHRva2VuU3RyLmxlbmd0aCgpOwotCi0gICAgICAgIHdoaWxlICggc2IuY2hhckF0KCBqICkgIT0gJyInICkKLSAgICAgICAgICAgIGorKzsKLQotICAgICAgICBzYi5yZXBsYWNlKCBpICsgdG9rZW5TdHIubGVuZ3RoKCksIGosIGFyZ3NbIDIgXSApOwotCi0gICAgICAgIHdyaXRlRmlsZSggYnVpbGRGaWxlLCBzYiApOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nQnVmZmVyIHJlYWRGaWxlICggRmlsZSBmICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGYgKTsKLSAgICAgICAgUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluICk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0gICAgICAgIGNvcHkoIHIsIHcgKTsKLQotICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIHIuY2xvc2UoKTsKLSAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICByZXR1cm4gdy5nZXRCdWZmZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgd3JpdGVGaWxlICggRmlsZSBmLCBTdHJpbmdCdWZmZXIgY2hhcnMgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOwotICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG91dCApOwotICAgICAgICBSZWFkZXIgciA9IG5ldyBTdHJpbmdSZWFkZXIoIGNoYXJzLnRvU3RyaW5nKCkgKTsKLQotICAgICAgICBjb3B5KCByLCB3ICk7Ci0KLSAgICAgICAgci5jbG9zZSgpOwotICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBjb3B5ICggUmVhZGVyIHIsIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXIgWyAxMDI0ICogMTYgXTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHIucmVhZCggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdy53cml0ZSggYnVmZmVyLCAwLCBuICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2UuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTE1ZTVkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHJlcGFja2FnZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLQotcHVibGljIGNsYXNzIFJlcGFja2FnZQotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5ldyBSZXBhY2thZ2UoKS5yZXBhY2thZ2UoIGFyZ3MgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVwYWNrYWdlICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyIHx8ICFhcmdzWzBdLmVxdWFscyggIi1yZXBhY2thZ2UiICkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVzYWdlOiByZXBhY2thZ2UgLXJlcGFja2FnZSBbc3BlY10iICk7Ci0gICAgICAgIAotICAgICAgICBfcmVwYWNrYWdlciA9IG5ldyBSZXBhY2thZ2VyKCBhcmdzWyAxIF0gKTsKLQotICAgICAgICBfZnJvbVBhY2thZ2VzID0gX3JlcGFja2FnZXIuZ2V0RnJvbVBhY2thZ2VzKCk7Ci0gICAgICAgIF90b1BhY2thZ2VzID0gX3JlcGFja2FnZXIuZ2V0VG9QYWNrYWdlcygpOwotICAgICAgICAKLSAgICAgICAgX3BhY2thZ2VQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSggIl5cXHMqcGFja2FnZVxccysoKD86XFx3fFxcLikqKVxccyo7IiwgUGF0dGVybi5NVUxUSUxJTkUgKTsKLSAgICAgICAgCi0gICAgICAgIF9tb3ZlQWxvbmdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgX21vdmVkRGlycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgICAgICBGaWxlIGN1cnJlbnREaXIgICA9IG5ldyBGaWxlKCAiLiIgKTsKLSAgICAgICAgRmlsZSBidWlsZERpciAgICAgPSBuZXcgRmlsZSggY3VycmVudERpciwgImJ1aWxkIiApOwotICAgICAgICBGaWxlIHJlcGFja2FnZURpciA9IG5ldyBGaWxlKCBidWlsZERpciwgInJlcGFja2FnZSIgKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEZWxldGluZyByZXBhY2thZ2UgZGlyIC4uLiIgKTsKLSAgICAgICAgCi0gICAgICAgIHJlY3Vyc2l2ZURlbGV0ZSggcmVwYWNrYWdlRGlyICk7Ci0KLSAgICAgICAgcmVwYWNrYWdlRGlyLm1rZGlycygpOwotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZpbGxGaWxlcyggZmlsZXMsIGN1cnJlbnREaXIgKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlJlcGFja2FnaW5nICIgKyBmaWxlcy5zaXplKCkgKyAiIGZpbGVzIC4uLiIgKTsKLQotICAgICAgICBpbnQgcHJlZml4TGVuZ3RoID0gY3VycmVudERpci5nZXRDYW5vbmljYWxQYXRoKCkubGVuZ3RoKCk7Ci0KLSAgICAgICAgX3NvdXJjZUJhc2UgPSBjdXJyZW50RGlyOwotICAgICAgICBfdGFyZ2V0QmFzZSA9IHJlcGFja2FnZURpcjsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZmlsZXMuc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmcm9tID0gKEZpbGUpIGZpbGVzLmdldCggaSApOwotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZyb20uZ2V0Q2Fub25pY2FsUGF0aCgpLnN1YnN0cmluZyggcHJlZml4TGVuZ3RoICsgMSApOwotCi0gICAgICAgICAgICByZXBhY2thZ2VGaWxlKCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmlzaE1vdmluZ0ZpbGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVwYWNrYWdlRmlsZSAoIFN0cmluZyBuYW1lICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCggIi5qYXZhIiApKQotICAgICAgICAgICAgcmVwYWNrYWdlSmF2YUZpbGUoIG5hbWUgKTsKLSAgICAgICAgZWxzZSBpZiAobmFtZS5lbmRzV2l0aCggIi54c2Rjb25maWciICkpCi0gICAgICAgICAgICByZXBhY2thZ2VOb25KYXZhRmlsZSggbmFtZSApOwotICAgICAgICBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoICJiaW4iICsgRmlsZS5zZXBhcmF0b3JDaGFyICkpCi0gICAgICAgICAgICByZXBhY2thZ2VOb25KYXZhRmlsZSggbmFtZSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtb3ZlQWxvbmdXaXRoSmF2YUZpbGVzKCBuYW1lICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZUFsb25nV2l0aEphdmFGaWxlcyggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgX21vdmVBbG9uZ0ZpbGVzLmFkZChuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmluaXNoTW92aW5nRmlsZXMgKCApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9tb3ZlQWxvbmdGaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRvTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBzcmNEaXIgPSBSZXBhY2thZ2VyLmRpckZvclBhdGgoIG5hbWUgKTsKLSAgICAgICAgICAgIFN0cmluZyB0b0RpciA9IChTdHJpbmcpIF9tb3ZlZERpcnMuZ2V0KCBzcmNEaXIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRvRGlyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdG9OYW1lID0gbmV3IEZpbGUoIHRvRGlyLCBuZXcgRmlsZSggbmFtZSApLmdldE5hbWUoKSApLnRvU3RyaW5nKCk7IAotCi0gICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCggIi5odG1sIiApKQotICAgICAgICAgICAgICAgIHJlcGFja2FnZU5vbkphdmFGaWxlKCBuYW1lLCB0b05hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb3B5RmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBuYW1lICksIG5ldyBGaWxlKCBfdGFyZ2V0QmFzZSwgdG9OYW1lICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcGFja2FnZU5vbkphdmFGaWxlICggU3RyaW5nIG5hbWUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIG5hbWUgKSApOwotCi0gICAgICAgIF9yZXBhY2thZ2VyLnJlcGFja2FnZSggc2IgKTsKLSAgICAgICAgCi0gICAgICAgIHdyaXRlRmlsZSggbmV3IEZpbGUoIF90YXJnZXRCYXNlLCBuYW1lICksIHNiICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlcGFja2FnZU5vbkphdmFGaWxlICggU3RyaW5nIHNvdXJjZU5hbWUsIFN0cmluZyB0YXJnZXROYW1lICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSByZWFkRmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBzb3VyY2VOYW1lICkgKTsKLQotICAgICAgICBfcmVwYWNrYWdlci5yZXBhY2thZ2UoIHNiICk7Ci0gICAgICAgIAotICAgICAgICB3cml0ZUZpbGUoIG5ldyBGaWxlKCBfdGFyZ2V0QmFzZSwgdGFyZ2V0TmFtZSApLCBzYiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2VKYXZhRmlsZSAoIFN0cmluZyBuYW1lICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSByZWFkRmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBuYW1lICkgKTsKLQotICAgICAgICBNYXRjaGVyIHBhY2thZ2VNYXRjaGVyID0gX3BhY2thZ2VQYXR0ZXJuLm1hdGNoZXIoIHNiICk7Ci0KLSAgICAgICAgaWYgKHBhY2thZ2VNYXRjaGVyLmZpbmQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBrZyA9IHBhY2thZ2VNYXRjaGVyLmdyb3VwKCAxICk7Ci0gICAgICAgICAgICBpbnQgcGtnU3RhcnQgPSBwYWNrYWdlTWF0Y2hlci5zdGFydCggMSApOwotICAgICAgICAgICAgaW50IHBrZ0VuZCA9IHBhY2thZ2VNYXRjaGVyLmVuZCggMSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocGFja2FnZU1hdGNoZXIuZmluZCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVHdvIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbnMgZm91bmQ6ICIgKyBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgZmlsZVBhdGggPSBSZXBhY2thZ2VyLnNwbGl0UGF0aCggbmFtZSwgRmlsZS5zZXBhcmF0b3JDaGFyICk7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjRGlyID0gUmVwYWNrYWdlci5kaXJGb3JQYXRoKCBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNvcnQgdGhlIHJlcGFja2FnZSBzcGVjIHNvIHRoYXQgbG9uZ2VyIGZyb20ncyBhcmUgZmlyc3QgdG8gbWF0Y2gKLSAgICAgICAgICAgIC8vIGxvbmdlc3QgcGFja2FnZSBmaXJzdAotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3dhcHBlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAxIDsgaSA8IGZpbGVQYXRoLnNpemUoKSA7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3BlYzEgPSAoU3RyaW5nKSBmaWxlUGF0aC5nZXQoIGkgLSAxICk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMiA9IChTdHJpbmcpIGZpbGVQYXRoLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzcGVjMS5pbmRleE9mKCAnOicgKSA8IHNwZWMyLmluZGV4T2YoICc6JyApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5zZXQoIGkgLSAxLCBzcGVjMiApOwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGguc2V0KCBpLCBzcGVjMSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghc3dhcHBlZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3QgcGtnUGF0aCA9IFJlcGFja2FnZXIuc3BsaXRQYXRoKCBwa2csICcuJyApOwotCi0gICAgICAgICAgICBpbnQgZiA9IGZpbGVQYXRoLnNpemUoKSAtIDI7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gcGtnUGF0aC5zaXplKCkgLSAxIDsgaSA+PSAwIDsgaS0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBrZ1BhdGguZ2V0KCBpICkuZXF1YWxzKCBmaWxlUGF0aC5nZXQoIGYtLSApICkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiUGFja2FnZSBzcGVjIGRpZmZlcnMgZnJvbSBmaWxlIHBhdGg6ICIgKyBuYW1lICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3QgY2hhbmdlVG8gPSBudWxsOwotICAgICAgICAgICAgTGlzdCBjaGFuZ2VGcm9tID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZnJvbToKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZnJvbVBhY2thZ2VzLnNpemUoKSA7IGkgKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3QgZnJvbSA9IChMaXN0KSBfZnJvbVBhY2thZ2VzLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGZyb20uc2l6ZSgpIDw9IHBrZ1BhdGguc2l6ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggaW50IGogPSAwIDsgaiA8IGZyb20uc2l6ZSgpIDsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnJvbS5nZXQoIGogKS5lcXVhbHMoIHBrZ1BhdGguZ2V0KCBqICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGZyb207Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlRnJvbSA9IGZyb207Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZVRvID0gKExpc3QpIF90b1BhY2thZ2VzLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoYW5nZVRvICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1BrZyA9ICIiOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gIiI7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgY2hhbmdlVG8uc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGtnICs9ICIuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgKz0gRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuZXdQa2cgKz0gY2hhbmdlVG8uZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld05hbWUgKz0gY2hhbmdlVG8uZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gZmlsZVBhdGguc2l6ZSgpIC0gcGtnUGF0aC5zaXplKCkgLSAyIDsgaSA+PSAwIDsgaS0tICkKLSAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSA9IChTdHJpbmcpIGZpbGVQYXRoLmdldCggaSApICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgbmV3TmFtZTsKLQotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gY2hhbmdlRnJvbS5zaXplKCkgOyBpIDwgcGtnUGF0aC5zaXplKCkgOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSArPSBGaWxlLnNlcGFyYXRvckNoYXIgKyAoU3RyaW5nKSBwa2dQYXRoLmdldCggaSApOwotICAgICAgICAgICAgICAgICAgICBuZXdQa2cgKz0gJy4nICsgKFN0cmluZykgcGtnUGF0aC5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuZXdOYW1lICs9IEZpbGUuc2VwYXJhdG9yQ2hhciArIChTdHJpbmcpIGZpbGVQYXRoLmdldCggZmlsZVBhdGguc2l6ZSgpIC0gMSApOwotCi0gICAgICAgICAgICAgICAgc2IucmVwbGFjZSggcGtnU3RhcnQsIHBrZ0VuZCwgbmV3UGtnICk7Ci0KLSAgICAgICAgICAgICAgICBuYW1lID0gbmV3TmFtZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3RGlyID0gUmVwYWNrYWdlci5kaXJGb3JQYXRoKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFzcmNEaXIuZXF1YWxzKG5ld0RpcikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbW92ZWREaXJzLnB1dChzcmNEaXIsIG5ld0Rpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgX3JlcGFja2FnZXIucmVwYWNrYWdlKCBzYiApOwotICAgICAgICAKLSAgICAgICAgd3JpdGVGaWxlKCBuZXcgRmlsZSggX3RhcmdldEJhc2UsIG5hbWUgKSwgc2IgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHdyaXRlRmlsZSAoIEZpbGUgZiwgU3RyaW5nQnVmZmVyIGNoYXJzICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOwotICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG91dCApOwotICAgICAgICBSZWFkZXIgciA9IG5ldyBTdHJpbmdSZWFkZXIoIGNoYXJzLnRvU3RyaW5nKCkgKTsKLQotICAgICAgICBjb3B5KCByLCB3ICk7Ci0KLSAgICAgICAgci5jbG9zZSgpOwotICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmdCdWZmZXIgcmVhZEZpbGUgKCBGaWxlIGYgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZiApOwotICAgICAgICBSZWFkZXIgciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaW4gKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgY29weSggciwgdyApOwotCi0gICAgICAgIHcuY2xvc2UoKTsKLSAgICAgICAgci5jbG9zZSgpOwotICAgICAgICBpbi5jbG9zZSgpOwotCi0gICAgICAgIHJldHVybiB3LmdldEJ1ZmZlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZSAoIEZpbGUgZnJvbSwgRmlsZSB0byApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdG8uZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZnJvbSApOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCB0byApOwotCi0gICAgICAgIGNvcHkoIGluLCBvdXQgKTsKLSAgICAgICAgCi0gICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICBpbi5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5ICggSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZSBbIDEwMjQgKiAxNiBdOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gaW4ucmVhZCggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgb3V0LndyaXRlKCBidWZmZXIsIDAsIG4gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5ICggUmVhZGVyIHIsIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXIgWyAxMDI0ICogMTYgXTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHIucmVhZCggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdy53cml0ZSggYnVmZmVyLCAwLCBuICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmlsbEZpbGVzICggQXJyYXlMaXN0IGZpbGVzLCBGaWxlIGZpbGUgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlcy5hZGQoIGZpbGUgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4Y2x1ZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeQotCi0gICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoICJidWlsZCIgKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4Y2x1ZGUgQ1ZTIGRpcmVjdG9yaWVzCi0gICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoICJDVlMiICkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nW10gZW50cmllcyA9IGZpbGUubGlzdCgpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBlbnRyaWVzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICBmaWxsRmlsZXMoIGZpbGVzLCBuZXcgRmlsZSggZmlsZSwgZW50cmllc1sgaSBdICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWN1cnNpdmVEZWxldGUgKCBGaWxlIGZpbGUgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0gZmlsZS5saXN0KCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBlbnRyaWVzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgcmVjdXJzaXZlRGVsZXRlKCBuZXcgRmlsZSggZmlsZSwgZW50cmllc1sgaSBdICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGUuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIF9zb3VyY2VCYXNlOwotICAgIHByaXZhdGUgRmlsZSBfdGFyZ2V0QmFzZTsKLQotICAgIHByaXZhdGUgTGlzdCBfZnJvbVBhY2thZ2VzOwotICAgIHByaXZhdGUgTGlzdCBfdG9QYWNrYWdlczsKLSAgICAKLSAgICBwcml2YXRlIFBhdHRlcm4gX3BhY2thZ2VQYXR0ZXJuOwotCi0gICAgcHJpdmF0ZSBSZXBhY2thZ2VyIF9yZXBhY2thZ2VyOwotICAgIAotICAgIHByaXZhdGUgTWFwIF9tb3ZlZERpcnM7Ci0gICAgcHJpdmF0ZSBMaXN0IF9tb3ZlQWxvbmdGaWxlczsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZXIuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0NzNkZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgcmVwYWNrYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBSZXBhY2thZ2VyCi17Ci0gICAgcHVibGljIFJlcGFja2FnZXIgKCBTdHJpbmcgcmVwYWNrYWdlU3BlY3MgKQotICAgIHsKLSAgICAgICAgX2Zyb21QYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgX3RvUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJlcGFja2FnZXMgPSBzcGxpdFBhdGgoIHJlcGFja2FnZVNwZWNzLCAnOycgKTsKLQotICAgICAgICAvLyBTb3J0IHRoZSByZXBhY2thZ2Ugc3BlYyBzbyB0aGF0IGxvbmdlciBmcm9tJ3MgYXJlIGZpcnN0IHRvIG1hdGNoCi0gICAgICAgIC8vIGxvbmdlc3QgcGFja2FnZSBmaXJzdAotICAgICAgICAKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBzd2FwcGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMSA7IGkgPCByZXBhY2thZ2VzLnNpemUoKSA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNwZWMxID0gKFN0cmluZykgcmVwYWNrYWdlcy5nZXQoIGkgLSAxICk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNwZWMyID0gKFN0cmluZykgcmVwYWNrYWdlcy5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3BlYzEuaW5kZXhPZiggJzonICkgPCBzcGVjMi5pbmRleE9mKCAnOicgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFja2FnZXMuc2V0KCBpIC0gMSwgc3BlYzIgKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwYWNrYWdlcy5zZXQoIGksIHNwZWMxICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzd2FwcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc3dhcHBlZCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCByZXBhY2thZ2VzLnNpemUoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzcGVjID0gKFN0cmluZykgcmVwYWNrYWdlcy5nZXQoIGkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGogPSBzcGVjLmluZGV4T2YoICc6JyApOwotCi0gICAgICAgICAgICBpZiAoaiA8IDAgfHwgc3BlYy5pbmRleE9mKCAnOicsIGogKyAxICkgPj0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIklsbGVnYWwgcmVwYWNrYWdlIHNwZWNpZmljYXRpb246ICIgKyBzcGVjICk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBmcm9tID0gc3BlYy5zdWJzdHJpbmcoIDAsIGogKTsKLSAgICAgICAgICAgIFN0cmluZyB0byA9IHNwZWMuc3Vic3RyaW5nKCBqICsgMSApOwotCi0gICAgICAgICAgICBfZnJvbVBhY2thZ2VzLmFkZCggUmVwYWNrYWdlci5zcGxpdFBhdGgoIGZyb20sICcuJyApICk7Ci0gICAgICAgICAgICBfdG9QYWNrYWdlcy5hZGQoIFJlcGFja2FnZXIuc3BsaXRQYXRoKCB0bywgJy4nICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9mcm9tTWF0Y2hlcnMgPSBuZXcgTWF0Y2hlciBbIF9mcm9tUGFja2FnZXMuc2l6ZSgpICogMiBdOwotICAgICAgICBfdG9QYWNrYWdlTmFtZXMgPSBuZXcgU3RyaW5nIFsgX2Zyb21QYWNrYWdlcy5zaXplKCkgKiAyIF07Ci0KLSAgICAgICAgYWRkUGF0dGVybnMoICcuJywgMCApOwotICAgICAgICBhZGRQYXR0ZXJucyggJy8nLCBfZnJvbVBhY2thZ2VzLnNpemUoKSApOwotICAgIH0KLQotICAgIHZvaWQgYWRkUGF0dGVybnMgKCBjaGFyIHNlcCwgaW50IG9mZiApCi0gICAgewotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2Zyb21QYWNrYWdlcy5zaXplKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGZyb20gPSAoTGlzdCkgX2Zyb21QYWNrYWdlcy5nZXQoIGkgKTsKLSAgICAgICAgICAgIExpc3QgdG8gPSAoTGlzdCkgX3RvUGFja2FnZXMuZ2V0KCBpICk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBqID0gMCA7IGogPCBmcm9tLnNpemUoKSA7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPiAwKQotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICs9ICJcXCIgKyBzZXA7Ci0KLSAgICAgICAgICAgICAgICBwYXR0ZXJuICs9IGZyb20uZ2V0KCBqICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyB0b1BhY2thZ2UgPSAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGogPSAwIDsgaiA8IHRvLnNpemUoKSA7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPiAwKQotICAgICAgICAgICAgICAgICAgICB0b1BhY2thZ2UgKz0gc2VwOwotCi0gICAgICAgICAgICAgICAgdG9QYWNrYWdlICs9IHRvLmdldCggaiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfZnJvbU1hdGNoZXJzWyBvZmYgKyBpIF0gPSBQYXR0ZXJuLmNvbXBpbGUoIHBhdHRlcm4gKS5tYXRjaGVyKCBudWxsICk7Ci0gICAgICAgICAgICBfdG9QYWNrYWdlTmFtZXNbIG9mZiArIGkgXSA9IHRvUGFja2FnZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcGFja2FnZSAoIFN0cmluZ0J1ZmZlciBzYiApCi0gICAgewotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2Zyb21NYXRjaGVycy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSAoTWF0Y2hlcikgX2Zyb21NYXRjaGVyc1sgaSBdOwotCi0gICAgICAgICAgICBtYXRjaGVyLnJlc2V0KCBzYiApOwotCi0gICAgICAgICAgICB3aGlsZSAoIG1hdGNoZXIuZmluZCgpICkKLSAgICAgICAgICAgICAgICBzYi5yZXBsYWNlKCBtYXRjaGVyLnN0YXJ0KCksIG1hdGNoZXIuZW5kKCksIF90b1BhY2thZ2VOYW1lc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRGcm9tUGFja2FnZXMgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX2Zyb21QYWNrYWdlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRUb1BhY2thZ2VzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90b1BhY2thZ2VzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBzcGxpdFBhdGggKCBTdHJpbmcgcGF0aCwgY2hhciBzZXBhcmF0b3IgKQotICAgIHsKLSAgICAgICAgQXJyYXlMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaSA9IHBhdGguaW5kZXhPZiggc2VwYXJhdG9yICk7Ci0KLSAgICAgICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoIHBhdGguc3Vic3RyaW5nKCAwLCBpICkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKCBpICsgMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoIHBhdGggKTsKLQotICAgICAgICByZXR1cm4gY29tcG9uZW50czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyRm9yUGF0aCAoIFN0cmluZyBwYXRoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShwYXRoKS5nZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgX2Zyb21QYWNrYWdlczsKLSAgICBwcml2YXRlIExpc3QgX3RvUGFja2FnZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXRjaGVyW10gX2Zyb21NYXRjaGVyczsKLSAgICBwcml2YXRlIFN0cmluZ1tdICBfdG9QYWNrYWdlTmFtZXM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3Rvb2xzY2hlbWEvbHRnZm10LnhzZCBiL3YxL3NyYy90b29sc2NoZW1hL2x0Z2ZtdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTUwYjYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3Rvb2xzY2hlbWEvbHRnZm10LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94bWxiZWFuL2x0Z2ZtdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveG1sYmVhbi9sdGdmbXQiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idGVzdHMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idGVzdCIgdHlwZT0idG5zOnRlc3QtY2FzZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAKLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0ZXN0LWNhc2UiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlsZXMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlsZSIgdHlwZT0idG5zOmZpbGUtZGVzYyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9yaWdpbiIgdHlwZT0ieHM6dG9rZW4iLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1vZGlmaWVkIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmlsZS1kZXNjIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRzRGlyIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9sZGVyIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmlsZU5hbWUiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyb2xlIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2NoZW1hIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnN0YW5jZSIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzb3VyY2UiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkaXR5IiB0eXBlPSJ4czpib29sZWFuIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3Rvb2xzY2hlbWEvc3Vic3R3c2RsLnhzZCBiL3YxL3NyYy90b29sc2NoZW1hL3N1YnN0d3NkbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOWIwMTIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3Rvb2xzY2hlbWEvc3Vic3R3c2RsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPCEtLQotICAgVGhpcyBzY2hlbWEgc3RhbmRzIGluIGZvciBhIHNjaGVtYSBmb3IgV1NETC4KLQotICAgSXQgaGFzIG5vbmUgb2YgdGhlIHJlYWwgc3RydWN0dXJlIG9mIGEgV1NETCBleGNlcHQgImltcG9ydHMiIGFuZAotICAgdGhlIDJuZC1sZXZlbCB0YWcgbmFtZXMuCi0KLSAgIFdoZW4gY29tcGlsaW5nIHNjaGVtYXMgd2l0aGluIC53c2RsIGZpbGVzLCB3ZSB1c2UgdGhpcyBzY2hlbWEgdG8gbG9hZAotICAgdGhlIFdTREwgZmlsZXMuICBPZiBjb3Vyc2UsIFdTREwgZmlsZXMgYXJlIGFjdHVhbGx5IGluIHRoZQotICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8gbmFtZXNwYWNlLCBidXQgd2UgdXNlIHRoZQotICAgTG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzIG9wdGlvbiBpbiBvcmRlciB0byBpbnRlcm5hbGx5IHN1YnN0aXR1dGUKLSAgIHRoZSBuYW1lc3BhY2UgYmVsb3cuCi0tLT4KLQotCi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp0bnM9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVmaW5pdGlvbnMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImltcG9ydCIgdHlwZT0idG5zOlRJbXBvcnQiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZXMiLz4gICAgICAgICAgICAgICAJCQkKLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaW5kaW5nIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InBvcnRUeXBlIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiLz4KLSAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZS8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUSW1wb3J0Ij4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiLz4JCQotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy90b29sc2NoZW1hL3hzZG93bmxvYWQueHNkIGIvdjEvc3JjL3Rvb2xzY2hlbWEveHNkb3dubG9hZC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzQyNjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3Rvb2xzY2hlbWEveHNkb3dubG9hZC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOmk9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3htbGJlYW4veHNkb3dubG9hZCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveG1sYmVhbi94c2Rvd25sb2FkIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRvd25sb2FkZWQtc2NoZW1hcyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZW50cnkiIHR5cGU9Imk6ZG93bmxvYWRlZC1zY2hlbWEtZW50cnkiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdERpcmVjdG9yeSIgdHlwZT0ieHM6dG9rZW4iLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRvd25sb2FkZWQtc2NoZW1hLWVudHJ5Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmaWxlbmFtZSIgdHlwZT0ieHM6dG9rZW4iLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNoYTEiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzY2hlbWFMb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvQk1QYXR0ZXJuLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L0JNUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UyZDE3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvQk1QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotCi0vKioKLSAqIEJveWVyLU1vb3JlIHNlYXJjaGVyLgotICovCi1wdWJsaWMgY2xhc3MgQk1QYXR0ZXJuIHsKLSAgICBjaGFyW10gcGF0dGVybjsKLSAgICBpbnRbXSBzaGlmdFRhYmxlOwotICAgIGJvb2xlYW4gaWdub3JlQ2FzZTsKLQotICAgIHB1YmxpYyBCTVBhdHRlcm4oU3RyaW5nIHBhdCwgYm9vbGVhbiBpZ25vcmVDYXNlKSB7Ci0gICAgICAgIHRoaXMocGF0LCAyNTYsIGlnbm9yZUNhc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCTVBhdHRlcm4oU3RyaW5nIHBhdCwgaW50IHRhYmxlU2l6ZSwgYm9vbGVhbiBpZ25vcmVDYXNlKSB7Ci0gICAgICAgIHRoaXMucGF0dGVybiA9IHBhdC50b0NoYXJBcnJheSgpOwotICAgICAgICB0aGlzLnNoaWZ0VGFibGUgPSBuZXcgaW50W3RhYmxlU2l6ZV07Ci0gICAgICAgIHRoaXMuaWdub3JlQ2FzZSA9IGlnbm9yZUNhc2U7Ci0KLSAgICAgICAgaW50IGxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoOyAgaSArKykKLSAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpXSA9IGxlbmd0aDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsZW5ndGg7ICBpICsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGhpcy5wYXR0ZXJuW2ldOwotICAgICAgICAgICAgaW50IGRpZmYgPSBsZW5ndGgtaS0xOwotICAgICAgICAgICAgaW50IGluZGV4ID0gY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoOwotICAgICAgICAgICAgaWYgKGRpZmYgPCB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdKQotICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpbmRleF0gPSBkaWZmOwotICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgewotICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGNoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IHRoaXMuc2hpZnRUYWJsZVtpbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpbmRleF0gPSBkaWZmOwotICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGNoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IHRoaXMuc2hpZnRUYWJsZVtpbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpbmRleF0gPSBkaWZmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIC0xIGlmIDx2YXI+aXRlcmF0b3I8L3Zhcj4gZG9lcyBub3QgY29udGFpbiB0aGlzIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHVibGljIGludCBtYXRjaGVzKENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgewotICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSAgcmV0dXJuIHRoaXMubWF0Y2hlc0lnbm9yZUNhc2UoaXRlcmF0b3IsIHN0YXJ0LCBsaW1pdCk7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoID0gaXRlcmF0b3Iuc2V0SW5kZXgoLS1pbmRleCkpICE9IHRoaXMucGF0dGVyblstLXBpbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGlmIChwaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfSB3aGlsZSAocGluZGV4ID4gMCk7Ci0gICAgICAgICAgICBpbmRleCArPSB0aGlzLnNoaWZ0VGFibGVbY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoXSsxOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgbmluZGV4KSAgaW5kZXggPSBuaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiAtMSBpZiA8dmFyPnN0cjwvdmFyPiBkb2VzIG5vdCBjb250YWluIHRoaXMgcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1hdGNoZXMoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgIHJldHVybiB0aGlzLm1hdGNoZXNJZ25vcmVDYXNlKHN0ciwgc3RhcnQsIGxpbWl0KTsKLSAgICAgICAgaW50IHBsZW5ndGggPSB0aGlzLnBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBpZiAocGxlbmd0aCA9PSAwKSAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBpbnQgaW5kZXggPSBzdGFydCtwbGVuZ3RoOwotICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGltaXQpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJTdGFydHMgYXQgIitpbmRleCk7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdCgtLWluZGV4KSkgIT0gdGhpcy5wYXR0ZXJuWy0tcGluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKLSAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiAtMSBpZiA8dmFyPmNoYXJzPC9jaGFyPiBkb2VzIG5vdCBjb250YWluIHRoaXMgcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1hdGNoZXMoY2hhcltdIGNoYXJzLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgewotICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSAgcmV0dXJuIHRoaXMubWF0Y2hlc0lnbm9yZUNhc2UoY2hhcnMsIHN0YXJ0LCBsaW1pdCk7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRzIGF0ICIraW5kZXgpOwotICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7Ci0gICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKLSAgICAgICAgICAgIGNoYXIgY2g7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaCA9IGNoYXJzWy0taW5kZXhdKSAhPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOwotICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpbnQgbWF0Y2hlc0lnbm9yZUNhc2UoQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCBzdGFydCwgaW50IGxpbWl0KSB7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IGNoID0gaXRlcmF0b3Iuc2V0SW5kZXgoLS1pbmRleCk7Ci0gICAgICAgICAgICAgICAgY2hhciBjaDIgPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgICAgICAgICBjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMikpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKLSAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIGludCBtYXRjaGVzSWdub3JlQ2FzZShTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaW50IHBsZW5ndGggPSB0aGlzLnBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBpZiAocGxlbmd0aCA9PSAwKSAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBpbnQgaW5kZXggPSBzdGFydCtwbGVuZ3RoOwotICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGltaXQpIHsKLSAgICAgICAgICAgIGludCBwaW5kZXggPSBwbGVuZ3RoOwotICAgICAgICAgICAgaW50IG5pbmRleCA9IGluZGV4KzE7Ci0gICAgICAgICAgICBjaGFyIGNoOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gY2ggPSB0ZXh0LmNoYXJBdCgtLWluZGV4KTsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMiA9IHRoaXMucGF0dGVyblstLXBpbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2gxICE9IGNoMiAmJiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOwotICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IG1hdGNoZXNJZ25vcmVDYXNlKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaW50IHBsZW5ndGggPSB0aGlzLnBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBpZiAocGxlbmd0aCA9PSAwKSAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBpbnQgaW5kZXggPSBzdGFydCtwbGVuZ3RoOwotICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGltaXQpIHsKLSAgICAgICAgICAgIGludCBwaW5kZXggPSBwbGVuZ3RoOwotICAgICAgICAgICAgaW50IG5pbmRleCA9IGluZGV4KzE7Ci0gICAgICAgICAgICBjaGFyIGNoOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gY2ggPSBjaGFyc1stLWluZGV4XTsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMiA9IHRoaXMucGF0dGVyblstLXBpbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2gxICE9IGNoMiAmJiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOwotICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludFtdIHNoaWZ0VGFibGUgPSBuZXcgaW50WzI1Nl07Ci0gICAgICAgICAgICBpbml0aWFsaXplQm95ZXJNb29yZShhcmd2WzBdLCBzaGlmdFRhYmxlLCB0cnVlKTsKLSAgICAgICAgICAgIGludCBvID0gLTE7Ci0gICAgICAgICAgICBDaGFyYWN0ZXJJdGVyYXRvciBpdGUgPSBuZXcgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKGFyZ3ZbMV0pOwotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgIGkgPCAxMDAwMDsgIGkgKyspCi0gICAgICAgICAgICAgICAgbyA9IHNlYXJjaElnbm9yZUNhc2VzV2l0aEJveWVyTW9vcmUoaXRlLCAwLCBhcmd2WzBdLCBzaGlmdFRhYmxlKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQ7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdDogIitvKyIsIEVsYXBzZWQ6ICIrc3RhcnQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfSovCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvTWF0Y2guamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvTWF0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlOWM5Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L01hdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYXMgcmFuZ2VzIGNhcHR1cmVkIGluIG1hdGNoaW5nLgotICoKLSAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhjaGFyW10sIGludCwgaW50LCBNYXRjaCkKLSAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhjaGFyW10sIE1hdGNoKQotICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvciwgTWF0Y2gpCi0gKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIE1hdGNoKQotICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcsIE1hdGNoKQotICogQGF1dGhvciBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OwotICovCi1wdWJsaWMgY2xhc3MgTWF0Y2ggaW1wbGVtZW50cyBDbG9uZWFibGUgewotICAgIGludFtdIGJlZ2lucG9zID0gbnVsbDsKLSAgICBpbnRbXSBlbmRwb3MgPSBudWxsOwotICAgIGludCBub2Zncm91cHMgPSAwOwotCi0gICAgQ2hhcmFjdGVySXRlcmF0b3IgY2lTb3VyY2UgPSBudWxsOwotICAgIFN0cmluZyBzdHJTb3VyY2UgPSBudWxsOwotICAgIGNoYXJbXSBjaGFyU291cmNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIE1hdGNoKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIE1hdGNoIG1hID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgIGlmICh0aGlzLm5vZmdyb3VwcyA+IDApIHsKLSAgICAgICAgICAgIG1hLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mZ3JvdXBzKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmNpU291cmNlICE9IG51bGwpICBtYS5zZXRTb3VyY2UodGhpcy5jaVNvdXJjZSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5zdHJTb3VyY2UgIT0gbnVsbCkgIG1hLnNldFNvdXJjZSh0aGlzLnN0clNvdXJjZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLm5vZmdyb3VwczsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICBtYS5zZXRCZWdpbm5pbmcoaSwgdGhpcy5nZXRCZWdpbm5pbmcoaSkpOwotICAgICAgICAgICAgICAgIG1hLnNldEVuZChpLCB0aGlzLmdldEVuZChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TnVtYmVyT2ZHcm91cHMoaW50IG4pIHsKLSAgICAgICAgaW50IG9sZG4gPSB0aGlzLm5vZmdyb3VwczsKLSAgICAgICAgdGhpcy5ub2Zncm91cHMgPSBuOwotICAgICAgICBpZiAob2xkbiA8PSAwCi0gICAgICAgICAgICB8fCBvbGRuIDwgbiB8fCBuKjIgPCBvbGRuKSB7Ci0gICAgICAgICAgICB0aGlzLmJlZ2lucG9zID0gbmV3IGludFtuXTsKLSAgICAgICAgICAgIHRoaXMuZW5kcG9zID0gbmV3IGludFtuXTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBuOyAgaSArKykgewotICAgICAgICAgICAgdGhpcy5iZWdpbnBvc1tpXSA9IC0xOwotICAgICAgICAgICAgdGhpcy5lbmRwb3NbaV0gPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlKENoYXJhY3Rlckl0ZXJhdG9yIGNpKSB7Ci0gICAgICAgIHRoaXMuY2lTb3VyY2UgPSBjaTsKLSAgICAgICAgdGhpcy5zdHJTb3VyY2UgPSBudWxsOwotICAgICAgICB0aGlzLmNoYXJTb3VyY2UgPSBudWxsOwotICAgIH0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNvdXJjZShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHRoaXMuY2lTb3VyY2UgPSBudWxsOwotICAgICAgICB0aGlzLnN0clNvdXJjZSA9IHN0cjsKLSAgICAgICAgdGhpcy5jaGFyU291cmNlID0gbnVsbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2UoY2hhcltdIGNoYXJzKSB7Ci0gICAgICAgIHRoaXMuY2lTb3VyY2UgPSBudWxsOwotICAgICAgICB0aGlzLnN0clNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuY2hhclNvdXJjZSA9IGNoYXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVnaW5uaW5nKGludCBpbmRleCwgaW50IHYpIHsKLSAgICAgICAgdGhpcy5iZWdpbnBvc1tpbmRleF0gPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RW5kKGludCBpbmRleCwgaW50IHYpIHsKLSAgICAgICAgdGhpcy5lbmRwb3NbaW5kZXhdID0gdjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXBzLgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgMSB3aGVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIG5vIGNhcHR1cmluZy1wYXJlbnRoZXNpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mR3JvdXBzKCkgewotICAgICAgICBpZiAodGhpcy5ub2Zncm91cHMgPD0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgcmVzdWx0IGlzIG5vdCBzZXQuIik7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZmdyb3VwczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IHRleHQgbWF0Y2hlZCB0byBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIGdyb3VwLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IExlc3MgdGhhbiA8Y29kZT5nZXROdW1iZXJPZkdyb3VwcygpPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJlZ2lubmluZyhpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHRoaXMuYmVnaW5wb3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgcmVzdWx0IGlzIG5vdCBzZXQuIik7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5ub2Zncm91cHMgPD0gaW5kZXgpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMubm9mZ3JvdXBzKyI6ICIraW5kZXgpOwotICAgICAgICByZXR1cm4gdGhpcy5iZWdpbnBvc1tpbmRleF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGVuZCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IHRleHQgbWF0Y2hlZCB0byBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIGdyb3VwLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IExlc3MgdGhhbiA8Y29kZT5nZXROdW1iZXJPZkdyb3VwcygpPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVuZChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHRoaXMuZW5kcG9zID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBIHJlc3VsdCBpcyBub3Qgc2V0LiIpOwotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IHRoaXMubm9mZ3JvdXBzIDw9IGluZGV4KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciBtdXN0IGJlIGxlc3MgdGhhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0aGlzLm5vZmdyb3VwcysiOiAiK2luZGV4KTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZW5kcG9zW2luZGV4XTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gc3Vic3RyaW5nIG9mIHRoZSB0YXJnZXQgdGV4dCBtYXRjaGVkIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggTGVzcyB0aGFuIDxjb2RlPmdldE51bWJlck9mR3JvdXBzKCk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FwdHVyZWRUZXh0KGludCBpbmRleCkgewotICAgICAgICBpZiAodGhpcy5iZWdpbnBvcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWF0Y2goKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQuIik7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5ub2Zncm91cHMgPD0gaW5kZXgpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMubm9mZ3JvdXBzKyI6ICIraW5kZXgpOwotICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICBpbnQgYmVnaW4gPSB0aGlzLmJlZ2lucG9zW2luZGV4XSwgZW5kID0gdGhpcy5lbmRwb3NbaW5kZXhdOwotICAgICAgICBpZiAoYmVnaW4gPCAwIHx8IGVuZCA8IDApICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuY2lTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0ID0gUkVVdGlsLnN1YnN0cmluZyh0aGlzLmNpU291cmNlLCBiZWdpbiwgZW5kKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0clNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSB0aGlzLnN0clNvdXJjZS5zdWJzdHJpbmcoYmVnaW4sIGVuZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBuZXcgU3RyaW5nKHRoaXMuY2hhclNvdXJjZSwgYmVnaW4sIGVuZC1iZWdpbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L09wLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L09wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGZmYzkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9PcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICovCi1jbGFzcyBPcCB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBET1QgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUiA9IDE7ICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGNoYXJhY3RlcgotICAgIHN0YXRpYyBmaW5hbCBpbnQgUkFOR0UgPSAzOyAgICAgICAgICAgICAgICAgLy8gW2EtekEtWl0KLSAgICBzdGF0aWMgZmluYWwgaW50IE5SQU5HRSA9IDQ7ICAgICAgICAgICAgICAgIC8vIFteYS16QS1aXQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5DSE9SID0gNTsgICAgICAgICAgICAgICAgLy8gXiAkIC4uLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HID0gNjsgICAgICAgICAgICAgICAgLy8gbGl0ZXJhbCBTdHJpbmcgCi0gICAgc3RhdGljIGZpbmFsIGludCBDTE9TVVJFID0gNzsgICAgICAgICAgICAgICAvLyBYKgotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9OR1JFRURZQ0xPU1VSRSA9IDg7ICAgICAgLy8gWCo/Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUVTVElPTiA9IDk7ICAgICAgICAgICAgICAvLyBYPwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9OR1JFRURZUVVFU1RJT04gPSAxMDsgICAgLy8gWD8/Ci0gICAgc3RhdGljIGZpbmFsIGludCBVTklPTiA9IDExOyAgICAgICAgICAgICAgICAvLyBYfFkKLSAgICBzdGF0aWMgZmluYWwgaW50IENBUFRVUkUgPSAxNTsgICAgICAgICAgICAgIC8vICggYW5kICkKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBQ0tSRUZFUkVOQ0UgPSAxNjsgICAgICAgIC8vIFwxIFwyIC4uLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS0FIRUFEID0gMjA7ICAgICAgICAgICAgLy8gKD89Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVMT09LQUhFQUQgPSAyMTsgICAgLy8gKD8hLi4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS0JFSElORCA9IDIyOyAgICAgICAgICAgLy8gKD88PS4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IE5FR0FUSVZFTE9PS0JFSElORCA9IDIzOyAgIC8vICg/PCEuLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBJTkRFUEVOREVOVCA9IDI0OyAgICAgICAgICAvLyAoPz4uLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBNT0RJRklFUiA9IDI1OyAgICAgICAgICAgICAvLyAoP2ltcy1pbXM6Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OID0gMjY7ICAgICAgICAgICAgLy8gKD8oLi4peWVzfG5vKQotCi0gICAgc3RhdGljIGludCBub2ZpbnN0YW5jZXMgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UID0gZmFsc2U7Ci0KLSAgICBzdGF0aWMgT3AgY3JlYXRlRG90KCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgT3AoT3AuRE9UKTsKLSAgICB9Ci0gICAgc3RhdGljIENoYXJPcCBjcmVhdGVDaGFyKGludCBkYXRhKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFyT3AoT3AuQ0hBUiwgZGF0YSk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGFyT3AgY3JlYXRlQW5jaG9yKGludCBkYXRhKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFyT3AoT3AuQU5DSE9SLCBkYXRhKTsKLSAgICB9Ci0gICAgc3RhdGljIENoYXJPcCBjcmVhdGVDYXB0dXJlKGludCBudW1iZXIsIE9wIG5leHQpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICBDaGFyT3Agb3AgPSBuZXcgQ2hhck9wKE9wLkNBUFRVUkUsIG51bWJlcik7Ci0gICAgICAgIG9wLm5leHQgPSBuZXh0OwotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfQotICAgIHN0YXRpYyBVbmlvbk9wIGNyZWF0ZVVuaW9uKGludCBzaXplKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkNyZWF0ZXMgVW5pb25PcCIpOwotICAgICAgICByZXR1cm4gbmV3IFVuaW9uT3AoT3AuVU5JT04sIHNpemUpOwotICAgIH0KLSAgICBzdGF0aWMgQ2hpbGRPcCBjcmVhdGVDbG9zdXJlKGludCBpZCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgTW9kaWZpZXJPcChPcC5DTE9TVVJFLCBpZCwgLTEpOwotICAgIH0KLSAgICBzdGF0aWMgQ2hpbGRPcCBjcmVhdGVOb25HcmVlZHlDbG9zdXJlKCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hpbGRPcChPcC5OT05HUkVFRFlDTE9TVVJFKTsKLSAgICB9Ci0gICAgc3RhdGljIENoaWxkT3AgY3JlYXRlUXVlc3Rpb24oYm9vbGVhbiBub25ncmVlZHkpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IENoaWxkT3Aobm9uZ3JlZWR5ID8gT3AuTk9OR1JFRURZUVVFU1RJT04gOiBPcC5RVUVTVElPTik7Ci0gICAgfQotICAgIHN0YXRpYyBSYW5nZU9wIGNyZWF0ZVJhbmdlKFRva2VuIHRvaykgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgUmFuZ2VPcChPcC5SQU5HRSwgdG9rKTsKLSAgICB9Ci0gICAgc3RhdGljIENoaWxkT3AgY3JlYXRlTG9vayhpbnQgdHlwZSwgT3AgbmV4dCwgT3AgYnJhbmNoKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgQ2hpbGRPcCBvcCA9IG5ldyBDaGlsZE9wKHR5cGUpOwotICAgICAgICBvcC5zZXRDaGlsZChicmFuY2gpOwotICAgICAgICBvcC5uZXh0ID0gbmV4dDsKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0KLSAgICBzdGF0aWMgQ2hhck9wIGNyZWF0ZUJhY2tSZWZlcmVuY2UoaW50IHJlZm5vKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFyT3AoT3AuQkFDS1JFRkVSRU5DRSwgcmVmbm8pOwotICAgIH0KLSAgICBzdGF0aWMgU3RyaW5nT3AgY3JlYXRlU3RyaW5nKFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdPcChPcC5TVFJJTkcsIGxpdGVyYWwpOwotICAgIH0KLSAgICBzdGF0aWMgQ2hpbGRPcCBjcmVhdGVJbmRlcGVuZGVudChPcCBuZXh0LCBPcCBicmFuY2gpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICBDaGlsZE9wIG9wID0gbmV3IENoaWxkT3AoT3AuSU5ERVBFTkRFTlQpOwotICAgICAgICBvcC5zZXRDaGlsZChicmFuY2gpOwotICAgICAgICBvcC5uZXh0ID0gbmV4dDsKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0KLSAgICBzdGF0aWMgTW9kaWZpZXJPcCBjcmVhdGVNb2RpZmllcihPcCBuZXh0LCBPcCBicmFuY2gsIGludCBhZGQsIGludCBtYXNrKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgTW9kaWZpZXJPcCBvcCA9IG5ldyBNb2RpZmllck9wKE9wLk1PRElGSUVSLCBhZGQsIG1hc2spOwotICAgICAgICBvcC5zZXRDaGlsZChicmFuY2gpOwotICAgICAgICBvcC5uZXh0ID0gbmV4dDsKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0KLSAgICBzdGF0aWMgQ29uZGl0aW9uT3AgY3JlYXRlQ29uZGl0aW9uKE9wIG5leHQsIGludCByZWYsIE9wIGNvbmRpdGlvbmZsb3csIE9wIHllc2Zsb3csIE9wIG5vZmxvdykgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIENvbmRpdGlvbk9wIG9wID0gbmV3IENvbmRpdGlvbk9wKE9wLkNPTkRJVElPTiwgcmVmLCBjb25kaXRpb25mbG93LCB5ZXNmbG93LCBub2Zsb3cpOwotICAgICAgICBvcC5uZXh0ID0gbmV4dDsKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0KLQotICAgIGludCB0eXBlOwotICAgIE9wIG5leHQgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIE9wKGludCB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgaW50IHNpemUoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgVU5JT04KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIE9wIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsgICAgICAgICAgICAgICAgICAgLy8gZm9yIFVOSW9OCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7Ci0gICAgfQotICAgIE9wIGdldENoaWxkKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIENMT1NVUkUsIFFVRVNUSU9OCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9kaWZpZXJPcAotICAgIGludCBnZXREYXRhKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhck9wICBmb3IgQ0hBUiwgQkFDS1JFRkVSRU5DRSwgQ0FQVFVSRSwgQU5DSE9SLCAKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKLSAgICB9Ci0gICAgaW50IGdldERhdGEyKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZmllck9wCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7Ci0gICAgfQotICAgIFJhbmdlVG9rZW4gZ2V0VG9rZW4oKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gUkFOR0UsIE5SQU5HRQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHR5cGU9Iit0aGlzLnR5cGUpOwotICAgIH0KLSAgICBTdHJpbmcgZ2V0U3RyaW5nKCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNUUklORwotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHR5cGU9Iit0aGlzLnR5cGUpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgY2xhc3MgQ2hhck9wIGV4dGVuZHMgT3AgewotICAgICAgICBpbnQgY2hhckRhdGE7Ci0gICAgICAgIENoYXJPcChpbnQgdHlwZSwgaW50IGRhdGEpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy5jaGFyRGF0YSA9IGRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdldERhdGEoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyRGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgY2xhc3MgVW5pb25PcCBleHRlbmRzIE9wIHsKLSAgICAgICAgVmVjdG9yIGJyYW5jaGVzOwotICAgICAgICBVbmlvbk9wKGludCB0eXBlLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLmJyYW5jaGVzID0gbmV3IFZlY3RvcihzaXplKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIGFkZEVsZW1lbnQoT3Agb3ApIHsKLSAgICAgICAgICAgIHRoaXMuYnJhbmNoZXMuYWRkRWxlbWVudChvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5icmFuY2hlcy5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3AgZWxlbWVudEF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIChPcCl0aGlzLmJyYW5jaGVzLmVsZW1lbnRBdChpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGNsYXNzIENoaWxkT3AgZXh0ZW5kcyBPcCB7Ci0gICAgICAgIE9wIGNoaWxkOwotICAgICAgICBDaGlsZE9wKGludCB0eXBlKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHNldENoaWxkKE9wIGNoaWxkKSB7Ci0gICAgICAgICAgICB0aGlzLmNoaWxkID0gY2hpbGQ7Ci0gICAgICAgIH0KLSAgICAgICAgT3AgZ2V0Q2hpbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGNsYXNzIE1vZGlmaWVyT3AgZXh0ZW5kcyBDaGlsZE9wIHsKLSAgICAgICAgaW50IHYxOwotICAgICAgICBpbnQgdjI7Ci0gICAgICAgIE1vZGlmaWVyT3AoaW50IHR5cGUsIGludCB2MSwgaW50IHYyKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMudjEgPSB2MTsKLSAgICAgICAgICAgIHRoaXMudjIgPSB2MjsKLSAgICAgICAgfQotICAgICAgICBpbnQgZ2V0RGF0YSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnYxOwotICAgICAgICB9Ci0gICAgICAgIGludCBnZXREYXRhMigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnYyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgY2xhc3MgUmFuZ2VPcCBleHRlbmRzIE9wIHsKLSAgICAgICAgVG9rZW4gdG9rOwotICAgICAgICBSYW5nZU9wKGludCB0eXBlLCBUb2tlbiB0b2spIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy50b2sgPSB0b2s7Ci0gICAgICAgIH0KLSAgICAgICAgUmFuZ2VUb2tlbiBnZXRUb2tlbigpIHsKLSAgICAgICAgICAgIHJldHVybiAoUmFuZ2VUb2tlbil0aGlzLnRvazsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGNsYXNzIFN0cmluZ09wIGV4dGVuZHMgT3AgewotICAgICAgICBTdHJpbmcgc3RyaW5nOwotICAgICAgICBTdHJpbmdPcChpbnQgdHlwZSwgU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBsaXRlcmFsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBjbGFzcyBDb25kaXRpb25PcCBleHRlbmRzIE9wIHsKLSAgICAgICAgaW50IHJlZk51bWJlcjsKLSAgICAgICAgT3AgY29uZGl0aW9uOwotICAgICAgICBPcCB5ZXM7Ci0gICAgICAgIE9wIG5vOwotICAgICAgICBDb25kaXRpb25PcChpbnQgdHlwZSwgaW50IHJlZm5vLCBPcCBjb25kaXRpb25mbG93LCBPcCB5ZXNmbG93LCBPcCBub2Zsb3cpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy5yZWZOdW1iZXIgPSByZWZubzsKLSAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uZmxvdzsKLSAgICAgICAgICAgIHRoaXMueWVzID0geWVzZmxvdzsKLSAgICAgICAgICAgIHRoaXMubm8gPSBub2Zsb3c7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlRXhjZXB0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTZlMGQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIGludCBsb2NhdGlvbjsKLQotICAgIC8qCi0gICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXMpIHsKLSAgICAgICAgdGhpcyhtZXMsIC0xKTsKLSAgICB9Ci0gICAgKi8KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzLCBpbnQgbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIobWVzKTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiAtMSBpZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VyRm9yWE1MU2NoZW1hLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlckZvclhNTFNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODI5NmY4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VyRm9yWE1MU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIEEgcmVndWxhciBleHByZXNzaW9uIHBhcnNlciBmb3IgdGhlIFhNTCBTaGVtYS4KLSAqCi0gKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7Ci0gKi8KLWNsYXNzIFBhcnNlckZvclhNTFNjaGVtYSBleHRlbmRzIFJlZ2V4UGFyc2VyIHsKLQotICAgIHB1YmxpYyBQYXJzZXJGb3JYTUxTY2hlbWEoKSB7Ci0gICAgICAgIC8vdGhpcy5zZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gICAgfQotICAgIHB1YmxpYyBQYXJzZXJGb3JYTUxTY2hlbWEoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICAvL3RoaXMuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgfQotCi0gICAgVG9rZW4gcHJvY2Vzc0NhcmV0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDaGFyKCdeJyk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NEb2xsYXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNoYXIoJyQnKTsKLSAgICAgfQotICAgIFRva2VuIHByb2Nlc3NMb29rYWhlYWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc05lZ2F0aXZlbG9va2FoZWFkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NMb29rYmVoaW5kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NOZWdhdGl2ZWxvb2tiZWhpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0EoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX1ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX3ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2x0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19ndCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzU3RhcihUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzUGx1cyhUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFgrIC0+IFhYKgotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNvbmNhdCh0b2ssIFRva2VuLmNyZWF0ZUNsb3N1cmUodG9rKSk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NRdWVzdGlvbihUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFg/IC0+IFh8Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiBwYXIgPSBUb2tlbi5jcmVhdGVVbmlvbigpOwotICAgICAgICBwYXIuYWRkQ2hpbGQodG9rKTsKLSAgICAgICAgcGFyLmFkZENoaWxkKFRva2VuLmNyZWF0ZUVtcHR5KCkpOwotICAgICAgICByZXR1cm4gcGFyOwotICAgIH0KLSAgICBib29sZWFuIGNoZWNrUXVlc3Rpb24oaW50IG9mZikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NQYXJlbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVQYXJlbih0aGlzLnBhcnNlUmVnZXgoKSwgMCk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBzdXBlci5UX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzUGFyZW4yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NDb25kaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc01vZGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzSW5kZXBlbmRlbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ2MnKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ0MnKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2koKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ2knKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0koKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ0knKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2coKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19YKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldC0yKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tyZWZlcmVuY2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0LTQpOwotICAgIH0KLQotICAgIGludCBwcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKFJhbmdlVG9rZW4gdG9rLCBpbnQgYykgewotICAgICAgICB0b2subWVyZ2VSYW5nZXModGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZChjKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIGNoYXJhY3Rlci1jbGFzcy1leHByZXNzaW9uLCBub3QgYSBjaGFyYWN0ZXItY2xhc3MtZXNjYXBlLgotICAgICAqCi0gICAgICogYy1jLWV4cHJlc3Npb24gICA6Oj0gJ1snIGMtZ3JvdXAgJ10nCi0gICAgICogYy1ncm91cCAgICAgICAgICA6Oj0gcG9zaXRpdmUtYy1ncm91cCB8IG5lZ2F0aXZlLWMtZ3JvdXAgfCBjLWMtc3VidHJhY3Rpb24KLSAgICAgKiBwb3NpdGl2ZS1jLWdyb3VwIDo6PSAoYy1yYW5nZSB8IGMtYy1lc2NhcGUpKwotICAgICAqIG5lZ2F0aXZlLWMtZ3JvdXAgOjo9ICdeJyBwb3NpdGl2ZS1jLWdyb3VwCi0gICAgICogYy1jLXN1YnRyYWN0aW9uICA6Oj0gKHBvc2l0aXZlLWMtZ3JvdXAgfCBuZWdhdGl2ZS1jLWdyb3VwKSBzdWJ0cmFjdGlvbgotICAgICAqIHN1YnRyYWN0aW9uICAgICAgOjo9ICctJyBjLWMtZXhwcmVzc2lvbgotICAgICAqIGMtcmFuZ2UgICAgICAgICAgOjo9IHNpbmdsZS1yYW5nZSB8IGZyb20tdG8tcmFuZ2UKLSAgICAgKiBzaW5nbGUtcmFuZ2UgICAgIDo6PSBtdWx0aS1jLWVzY2FwZSB8IGNhdGVnb3J5LWMtZXNjYXBlIHwgYmxvY2stYy1lc2NhcGUgfCA8YW55IFhNTCBjaGFyPgotICAgICAqIGNjLW5vcm1hbC1jICAgICAgOjo9IDxhbnkgY2hhcmFjdGVyIGV4Y2VwdCBbLCBdLCBcPgotICAgICAqIGZyb20tdG8tcmFuZ2UgICAgOjo9IGNjLW5vcm1hbC1jICctJyBjYy1ub3JtYWwtYwotICAgICAqCi0gICAgICogQHBhcmFtIHVzZU5yYWdlIElnbm9yZWQuCi0gICAgICogQHJldHVybiBUaGlzIHJldHVybnMgbm8gTnJhZ2VUb2tlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBwYXJzZUNoYXJhY3RlckNsYXNzKGJvb2xlYW4gdXNlTnJhbmdlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNldENvbnRleHQoU19JTkJSQUNLRVRTKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdbJwotICAgICAgICBib29sZWFuIG5yYW5nZSA9IGZhbHNlOwotICAgICAgICBSYW5nZVRva2VuIGJhc2UgPSBudWxsOwotICAgICAgICBSYW5nZVRva2VuIHRvazsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICdeJykgewotICAgICAgICAgICAgbnJhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdeJwotICAgICAgICAgICAgYmFzZSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBiYXNlLmFkZFJhbmdlKDAsIFRva2VuLlVURjE2X01BWCk7Ci0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdGxvb3AgPSB0cnVlOwotICAgICAgICB3aGlsZSAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgIT0gVF9FT0YpIHsgLy8gRG9uJ3QgdXNlICdjb3RpbnVlJyBmb3IgdGhpcyBsb29wLgotICAgICAgICAgICAgLy8gc2luZ2xlLXJhbmdlIHwgZnJvbS10by1yYW5nZSB8IHN1YnRyYWN0aW9uCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScgJiYgIWZpcnN0bG9vcCkgewotICAgICAgICAgICAgICAgIGlmIChucmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZS5zdWJ0cmFjdFJhbmdlcyh0b2spOwotICAgICAgICAgICAgICAgICAgICB0b2sgPSBiYXNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjID0gdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBUX0JBQ0tTT0xJRFVTKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgICBjYXNlICdkJzogIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgY2FzZSAndyc6ICBjYXNlICdXJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOiAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyh0aGlzLmdldFRva2VuRm9yU2hvcnRoYW5kKGMpKTsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOiAgY2FzZSAnSSc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICdjJzogIGNhc2UgJ0MnOgotICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5wcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKHRvaywgYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjIDwgMCkgIGVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICAgICAgICAgICAgIGludCBwc3RhcnQgPSB0aGlzLm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2syID0gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfcFAoYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2syID09IG51bGwpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuYXRvbS41IiwgcHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKHRvazIpOwotICAgICAgICAgICAgICAgICAgICBlbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYyA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOwotICAgICAgICAgICAgICAgIH0gLy8gXCArIGMKLSAgICAgICAgICAgIH0gLy8gYmFja3NvbGlkdXMKLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gVF9YTUxTQ0hFTUFfQ0NfU1VCVFJBQ1RJT04gJiYgIWZpcnN0bG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VicmFjdGlvbgotICAgICAgICAgICAgICAgIGlmIChucmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZS5zdWJ0cmFjdFJhbmdlcyh0b2spOwotICAgICAgICAgICAgICAgICAgICB0b2sgPSBiYXNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlMiA9IHRoaXMucGFyc2VDaGFyYWN0ZXJDbGFzcyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdG9rLnN1YnRyYWN0UmFuZ2VzKHJhbmdlMik7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCB0aGlzLmNoYXJkYXRhICE9ICddJykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjUiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGl0IHRoaXMgbG9vcAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWVuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgc2hvcnRoYW5kcy4uLgotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnWycpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNiIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXScpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNyIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8IHRoaXMuY2hhcmRhdGEgIT0gJy0nKSB7IC8vIEhlcmUgaXMgbm8gJy0nLgotICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCAnLScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgJy0nIGlzIGEgZnJvbS10byB0b2tlbj8/Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBTa2lwcyAnLScKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0gdGhpcy5yZWFkKCkpID09IFRfRU9GKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjICctJyAnXScgLT4gJy0nIGlzIGEgc2luZ2xlLXJhbmdlLgotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnLScsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMgJy0nICctWycgLT4gJy0nIGlzIGEgc2luZ2xlLXJhbmdlLgotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFRfWE1MU0NIRU1BX0NDX1NVQlRSQUNUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoJy0nLCAnLScpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlZW5kID0gdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZWVuZCA9PSAnWycpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNiIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZWVuZCA9PSAnXScpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNyIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9CQUNLU09MSURVUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZWVuZCA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgcmFuZ2VlbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyc3Rsb29wID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfRU9GKQotICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgIC8vdG9rLmR1bXBSYW5nZXMoKTsKLSAgICAgICAgdGhpcy5zZXRDb250ZXh0KFNfTk9STUFMKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnXScKLQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSYW5nZVRva2VuIHBhcnNlU2V0T3BlcmF0aW9ucygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotIAotICAgIFRva2VuIGdldFRva2VuRm9yU2hvcnRoYW5kKGludCBjaCkgewotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNEaWdpdCIsIHRydWUpOwotICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzRGlnaXQiLCBmYWxzZSk7Ci0gICAgICAgICAgY2FzZSAndyc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNXb3JkIiwgdHJ1ZSk7Ci0gICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNXb3JkIiwgZmFsc2UpOwotICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzU3BhY2UiLCB0cnVlKTsKLSAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc1NwYWNlIiwgZmFsc2UpOwotICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzTmFtZUNoYXIiLCB0cnVlKTsKLSAgICAgICAgICBjYXNlICdDJzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc05hbWVDaGFyIiwgZmFsc2UpOwotICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzSW5pdGlhbE5hbWVDaGFyIiwgdHJ1ZSk7Ci0gICAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNJbml0aWFsTmFtZUNoYXIiLCBmYWxzZSk7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogc2hvcnRoYW5kczogXFx1IitJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNikpOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBkZWNvZGVFc2NhcGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQkFDS1NPTElEVVMpICB0aHJvdyBleCgicGFyc2VyLm5leHQuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICBpbnQgYyA9IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgIGNhc2UgJ24nOiAgYyA9ICdcbic7ICBicmVhazsgLy8gTElORSBGRUVEIFUrMDAwQQotICAgICAgICAgIGNhc2UgJ3InOiAgYyA9ICdccic7ICBicmVhazsgLy8gQ1JSSUFHRSBSRVRVUk4gVSswMDBECi0gICAgICAgICAgY2FzZSAndCc6ICBjID0gJ1x0JzsgIGJyZWFrOyAvLyBIT1JJWk9OVEFMIFRBQlVMQVRJT04gVSswMDA5Ci0KLSAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuNSIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIHJhbmdlcyA9IG51bGw7Ci0gICAgc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIHJhbmdlczIgPSBudWxsOwotICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgcHJvdGVjdGVkIFJhbmdlVG9rZW4gZ2V0UmFuZ2UoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcG9zaXRpdmUpIHsKLSAgICAgICAgaWYgKHJhbmdlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByYW5nZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICByYW5nZXMyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIFNQQUNFUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNTcGFjZSIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzU3BhY2UiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIERJR0lUUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNEaWdpdCIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzRGlnaXQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIERJR0lUUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNEaWdpdCIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzRGlnaXQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIExFVFRFUlMpOwotICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKChUb2tlbilyYW5nZXMuZ2V0KCJ4bWw6aXNEaWdpdCIpKTsKLSAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc1dvcmQiLCB0b2spOwotICAgICAgICAgICAgcmFuZ2VzMi5wdXQoInhtbDppc1dvcmQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIE5BTUVDSEFSUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNOYW1lQ2hhciIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzTmFtZUNoYXIiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIExFVFRFUlMpOwotICAgICAgICAgICAgdG9rLmFkZFJhbmdlKCdfJywgJ18nKTsKLSAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnOicsICc6Jyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNJbml0aWFsTmFtZUNoYXIiLCB0b2spOwotICAgICAgICAgICAgcmFuZ2VzMi5wdXQoInhtbDppc0luaXRpYWxOYW1lQ2hhciIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBwb3NpdGl2ZSA/IChSYW5nZVRva2VuKXJhbmdlcy5nZXQobmFtZSkKLSAgICAgICAgICAgIDogKFJhbmdlVG9rZW4pcmFuZ2VzMi5nZXQobmFtZSk7Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0dXBSYW5nZShUb2tlbiByYW5nZSwgU3RyaW5nIHNyYykgewotICAgICAgICBpbnQgbGVuID0gc3JjLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsZW47ICBpICs9IDIpCi0gICAgICAgICAgICByYW5nZS5hZGRSYW5nZShzcmMuY2hhckF0KGkpLCBzcmMuY2hhckF0KGkrMSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRVMgPSAiXHRcblxyXHIgICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVDSEFSUyA9Ci0gICAgICAgICJcdTAwMmRcdTAwMmVcdTAwMzBcdTAwM2FcdTAwNDFcdTAwNWFcdTAwNWZcdTAwNWZcdTAwNjFcdTAwN2FcdTAwYjdcdTAwYjdcdTAwYzBcdTAwZDYiCi0gICAgICAgICsiXHUwMGQ4XHUwMGY2XHUwMGY4XHUwMTMxXHUwMTM0XHUwMTNlXHUwMTQxXHUwMTQ4XHUwMTRhXHUwMTdlXHUwMTgwXHUwMWMzXHUwMWNkXHUwMWYwIgotICAgICAgICArIlx1MDFmNFx1MDFmNVx1MDFmYVx1MDIxN1x1MDI1MFx1MDJhOFx1MDJiYlx1MDJjMVx1MDJkMFx1MDJkMVx1MDMwMFx1MDM0NVx1MDM2MFx1MDM2MSIKLSAgICAgICAgKyJcdTAzODZcdTAzOGFcdTAzOGNcdTAzOGNcdTAzOGVcdTAzYTFcdTAzYTNcdTAzY2VcdTAzZDBcdTAzZDZcdTAzZGFcdTAzZGFcdTAzZGNcdTAzZGMiCi0gICAgICAgICsiXHUwM2RlXHUwM2RlXHUwM2UwXHUwM2UwXHUwM2UyXHUwM2YzXHUwNDAxXHUwNDBjXHUwNDBlXHUwNDRmXHUwNDUxXHUwNDVjXHUwNDVlXHUwNDgxIgotICAgICAgICArIlx1MDQ4M1x1MDQ4Nlx1MDQ5MFx1MDRjNFx1MDRjN1x1MDRjOFx1MDRjYlx1MDRjY1x1MDRkMFx1MDRlYlx1MDRlZVx1MDRmNVx1MDRmOFx1MDRmOSIKLSAgICAgICAgKyJcdTA1MzFcdTA1NTZcdTA1NTlcdTA1NTlcdTA1NjFcdTA1ODZcdTA1OTFcdTA1YTFcdTA1YTNcdTA1YjlcdTA1YmJcdTA1YmRcdTA1YmZcdTA1YmYiCi0gICAgICAgICsiXHUwNWMxXHUwNWMyXHUwNWM0XHUwNWM0XHUwNWQwXHUwNWVhXHUwNWYwXHUwNWYyXHUwNjIxXHUwNjNhXHUwNjQwXHUwNjUyXHUwNjYwXHUwNjY5IgotICAgICAgICArIlx1MDY3MFx1MDZiN1x1MDZiYVx1MDZiZVx1MDZjMFx1MDZjZVx1MDZkMFx1MDZkM1x1MDZkNVx1MDZlOFx1MDZlYVx1MDZlZFx1MDZmMFx1MDZmOSIKLSAgICAgICAgKyJcdTA5MDFcdTA5MDNcdTA5MDVcdTA5MzlcdTA5M2NcdTA5NGRcdTA5NTFcdTA5NTRcdTA5NThcdTA5NjNcdTA5NjZcdTA5NmZcdTA5ODFcdTA5ODMiCi0gICAgICAgICsiXHUwOTg1XHUwOThjXHUwOThmXHUwOTkwXHUwOTkzXHUwOWE4XHUwOWFhXHUwOWIwXHUwOWIyXHUwOWIyXHUwOWI2XHUwOWI5XHUwOWJjXHUwOWJjIgotICAgICAgICArIlx1MDliZVx1MDljNFx1MDljN1x1MDljOFx1MDljYlx1MDljZFx1MDlkN1x1MDlkN1x1MDlkY1x1MDlkZFx1MDlkZlx1MDllM1x1MDllNlx1MDlmMSIKLSAgICAgICAgKyJcdTBhMDJcdTBhMDJcdTBhMDVcdTBhMGFcdTBhMGZcdTBhMTBcdTBhMTNcdTBhMjhcdTBhMmFcdTBhMzBcdTBhMzJcdTBhMzNcdTBhMzVcdTBhMzYiCi0gICAgICAgICsiXHUwYTM4XHUwYTM5XHUwYTNjXHUwYTNjXHUwYTNlXHUwYTQyXHUwYTQ3XHUwYTQ4XHUwYTRiXHUwYTRkXHUwYTU5XHUwYTVjXHUwYTVlXHUwYTVlIgotICAgICAgICArIlx1MGE2Nlx1MGE3NFx1MGE4MVx1MGE4M1x1MGE4NVx1MGE4Ylx1MGE4ZFx1MGE4ZFx1MGE4Zlx1MGE5MVx1MGE5M1x1MGFhOFx1MGFhYVx1MGFiMCIKLSAgICAgICAgKyJcdTBhYjJcdTBhYjNcdTBhYjVcdTBhYjlcdTBhYmNcdTBhYzVcdTBhYzdcdTBhYzlcdTBhY2JcdTBhY2RcdTBhZTBcdTBhZTBcdTBhZTZcdTBhZWYiCi0gICAgICAgICsiXHUwYjAxXHUwYjAzXHUwYjA1XHUwYjBjXHUwYjBmXHUwYjEwXHUwYjEzXHUwYjI4XHUwYjJhXHUwYjMwXHUwYjMyXHUwYjMzXHUwYjM2XHUwYjM5IgotICAgICAgICArIlx1MGIzY1x1MGI0M1x1MGI0N1x1MGI0OFx1MGI0Ylx1MGI0ZFx1MGI1Nlx1MGI1N1x1MGI1Y1x1MGI1ZFx1MGI1Zlx1MGI2MVx1MGI2Nlx1MGI2ZiIKLSAgICAgICAgKyJcdTBiODJcdTBiODNcdTBiODVcdTBiOGFcdTBiOGVcdTBiOTBcdTBiOTJcdTBiOTVcdTBiOTlcdTBiOWFcdTBiOWNcdTBiOWNcdTBiOWVcdTBiOWYiCi0gICAgICAgICsiXHUwYmEzXHUwYmE0XHUwYmE4XHUwYmFhXHUwYmFlXHUwYmI1XHUwYmI3XHUwYmI5XHUwYmJlXHUwYmMyXHUwYmM2XHUwYmM4XHUwYmNhXHUwYmNkIgotICAgICAgICArIlx1MGJkN1x1MGJkN1x1MGJlN1x1MGJlZlx1MGMwMVx1MGMwM1x1MGMwNVx1MGMwY1x1MGMwZVx1MGMxMFx1MGMxMlx1MGMyOFx1MGMyYVx1MGMzMyIKLSAgICAgICAgKyJcdTBjMzVcdTBjMzlcdTBjM2VcdTBjNDRcdTBjNDZcdTBjNDhcdTBjNGFcdTBjNGRcdTBjNTVcdTBjNTZcdTBjNjBcdTBjNjFcdTBjNjZcdTBjNmYiCi0gICAgICAgICsiXHUwYzgyXHUwYzgzXHUwYzg1XHUwYzhjXHUwYzhlXHUwYzkwXHUwYzkyXHUwY2E4XHUwY2FhXHUwY2IzXHUwY2I1XHUwY2I5XHUwY2JlXHUwY2M0IgotICAgICAgICArIlx1MGNjNlx1MGNjOFx1MGNjYVx1MGNjZFx1MGNkNVx1MGNkNlx1MGNkZVx1MGNkZVx1MGNlMFx1MGNlMVx1MGNlNlx1MGNlZlx1MGQwMlx1MGQwMyIKLSAgICAgICAgKyJcdTBkMDVcdTBkMGNcdTBkMGVcdTBkMTBcdTBkMTJcdTBkMjhcdTBkMmFcdTBkMzlcdTBkM2VcdTBkNDNcdTBkNDZcdTBkNDhcdTBkNGFcdTBkNGQiCi0gICAgICAgICsiXHUwZDU3XHUwZDU3XHUwZDYwXHUwZDYxXHUwZDY2XHUwZDZmXHUwZTAxXHUwZTJlXHUwZTMwXHUwZTNhXHUwZTQwXHUwZTRlXHUwZTUwXHUwZTU5IgotICAgICAgICArIlx1MGU4MVx1MGU4Mlx1MGU4NFx1MGU4NFx1MGU4N1x1MGU4OFx1MGU4YVx1MGU4YVx1MGU4ZFx1MGU4ZFx1MGU5NFx1MGU5N1x1MGU5OVx1MGU5ZiIKLSAgICAgICAgKyJcdTBlYTFcdTBlYTNcdTBlYTVcdTBlYTVcdTBlYTdcdTBlYTdcdTBlYWFcdTBlYWJcdTBlYWRcdTBlYWVcdTBlYjBcdTBlYjlcdTBlYmJcdTBlYmQiCi0gICAgICAgICsiXHUwZWMwXHUwZWM0XHUwZWM2XHUwZWM2XHUwZWM4XHUwZWNkXHUwZWQwXHUwZWQ5XHUwZjE4XHUwZjE5XHUwZjIwXHUwZjI5XHUwZjM1XHUwZjM1IgotICAgICAgICArIlx1MGYzN1x1MGYzN1x1MGYzOVx1MGYzOVx1MGYzZVx1MGY0N1x1MGY0OVx1MGY2OVx1MGY3MVx1MGY4NFx1MGY4Nlx1MGY4Ylx1MGY5MFx1MGY5NSIKLSAgICAgICAgKyJcdTBmOTdcdTBmOTdcdTBmOTlcdTBmYWRcdTBmYjFcdTBmYjdcdTBmYjlcdTBmYjlcdTEwYTBcdTEwYzVcdTEwZDBcdTEwZjZcdTExMDBcdTExMDAiCi0gICAgICAgICsiXHUxMTAyXHUxMTAzXHUxMTA1XHUxMTA3XHUxMTA5XHUxMTA5XHUxMTBiXHUxMTBjXHUxMTBlXHUxMTEyXHUxMTNjXHUxMTNjXHUxMTNlXHUxMTNlIgotICAgICAgICArIlx1MTE0MFx1MTE0MFx1MTE0Y1x1MTE0Y1x1MTE0ZVx1MTE0ZVx1MTE1MFx1MTE1MFx1MTE1NFx1MTE1NVx1MTE1OVx1MTE1OVx1MTE1Zlx1MTE2MSIKLSAgICAgICAgKyJcdTExNjNcdTExNjNcdTExNjVcdTExNjVcdTExNjdcdTExNjdcdTExNjlcdTExNjlcdTExNmRcdTExNmVcdTExNzJcdTExNzNcdTExNzVcdTExNzUiCi0gICAgICAgICsiXHUxMTllXHUxMTllXHUxMWE4XHUxMWE4XHUxMWFiXHUxMWFiXHUxMWFlXHUxMWFmXHUxMWI3XHUxMWI4XHUxMWJhXHUxMWJhXHUxMWJjXHUxMWMyIgotICAgICAgICArIlx1MTFlYlx1MTFlYlx1MTFmMFx1MTFmMFx1MTFmOVx1MTFmOVx1MWUwMFx1MWU5Ylx1MWVhMFx1MWVmOVx1MWYwMFx1MWYxNVx1MWYxOFx1MWYxZCIKLSAgICAgICAgKyJcdTFmMjBcdTFmNDVcdTFmNDhcdTFmNGRcdTFmNTBcdTFmNTdcdTFmNTlcdTFmNTlcdTFmNWJcdTFmNWJcdTFmNWRcdTFmNWRcdTFmNWZcdTFmN2QiCi0gICAgICAgICsiXHUxZjgwXHUxZmI0XHUxZmI2XHUxZmJjXHUxZmJlXHUxZmJlXHUxZmMyXHUxZmM0XHUxZmM2XHUxZmNjXHUxZmQwXHUxZmQzXHUxZmQ2XHUxZmRiIgotICAgICAgICArIlx1MWZlMFx1MWZlY1x1MWZmMlx1MWZmNFx1MWZmNlx1MWZmY1x1MjBkMFx1MjBkY1x1MjBlMVx1MjBlMVx1MjEyNlx1MjEyNlx1MjEyYVx1MjEyYiIKLSAgICAgICAgKyJcdTIxMmVcdTIxMmVcdTIxODBcdTIxODJcdTMwMDVcdTMwMDVcdTMwMDdcdTMwMDdcdTMwMjFcdTMwMmZcdTMwMzFcdTMwMzVcdTMwNDFcdTMwOTQiCi0gICAgICAgICsiXHUzMDk5XHUzMDlhXHUzMDlkXHUzMDllXHUzMGExXHUzMGZhXHUzMGZjXHUzMGZlXHUzMTA1XHUzMTJjXHU0ZTAwXHU5ZmE1XHVhYzAwXHVkN2EzIgotICAgICAgICArIiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFVFRFUlMgPQotICAgICAgICAiXHUwMDQxXHUwMDVhXHUwMDYxXHUwMDdhXHUwMGMwXHUwMGQ2XHUwMGQ4XHUwMGY2XHUwMGY4XHUwMTMxXHUwMTM0XHUwMTNlXHUwMTQxXHUwMTQ4IgotICAgICAgICArIlx1MDE0YVx1MDE3ZVx1MDE4MFx1MDFjM1x1MDFjZFx1MDFmMFx1MDFmNFx1MDFmNVx1MDFmYVx1MDIxN1x1MDI1MFx1MDJhOFx1MDJiYlx1MDJjMSIKLSAgICAgICAgKyJcdTAzODZcdTAzODZcdTAzODhcdTAzOGFcdTAzOGNcdTAzOGNcdTAzOGVcdTAzYTFcdTAzYTNcdTAzY2VcdTAzZDBcdTAzZDZcdTAzZGFcdTAzZGEiCi0gICAgICAgICsiXHUwM2RjXHUwM2RjXHUwM2RlXHUwM2RlXHUwM2UwXHUwM2UwXHUwM2UyXHUwM2YzXHUwNDAxXHUwNDBjXHUwNDBlXHUwNDRmXHUwNDUxXHUwNDVjIgotICAgICAgICArIlx1MDQ1ZVx1MDQ4MVx1MDQ5MFx1MDRjNFx1MDRjN1x1MDRjOFx1MDRjYlx1MDRjY1x1MDRkMFx1MDRlYlx1MDRlZVx1MDRmNVx1MDRmOFx1MDRmOSIKLSAgICAgICAgKyJcdTA1MzFcdTA1NTZcdTA1NTlcdTA1NTlcdTA1NjFcdTA1ODZcdTA1ZDBcdTA1ZWFcdTA1ZjBcdTA1ZjJcdTA2MjFcdTA2M2FcdTA2NDFcdTA2NGEiCi0gICAgICAgICsiXHUwNjcxXHUwNmI3XHUwNmJhXHUwNmJlXHUwNmMwXHUwNmNlXHUwNmQwXHUwNmQzXHUwNmQ1XHUwNmQ1XHUwNmU1XHUwNmU2XHUwOTA1XHUwOTM5IgotICAgICAgICArIlx1MDkzZFx1MDkzZFx1MDk1OFx1MDk2MVx1MDk4NVx1MDk4Y1x1MDk4Zlx1MDk5MFx1MDk5M1x1MDlhOFx1MDlhYVx1MDliMFx1MDliMlx1MDliMiIKLSAgICAgICAgKyJcdTA5YjZcdTA5YjlcdTA5ZGNcdTA5ZGRcdTA5ZGZcdTA5ZTFcdTA5ZjBcdTA5ZjFcdTBhMDVcdTBhMGFcdTBhMGZcdTBhMTBcdTBhMTNcdTBhMjgiCi0gICAgICAgICsiXHUwYTJhXHUwYTMwXHUwYTMyXHUwYTMzXHUwYTM1XHUwYTM2XHUwYTM4XHUwYTM5XHUwYTU5XHUwYTVjXHUwYTVlXHUwYTVlXHUwYTcyXHUwYTc0IgotICAgICAgICArIlx1MGE4NVx1MGE4Ylx1MGE4ZFx1MGE4ZFx1MGE4Zlx1MGE5MVx1MGE5M1x1MGFhOFx1MGFhYVx1MGFiMFx1MGFiMlx1MGFiM1x1MGFiNVx1MGFiOSIKLSAgICAgICAgKyJcdTBhYmRcdTBhYmRcdTBhZTBcdTBhZTBcdTBiMDVcdTBiMGNcdTBiMGZcdTBiMTBcdTBiMTNcdTBiMjhcdTBiMmFcdTBiMzBcdTBiMzJcdTBiMzMiCi0gICAgICAgICsiXHUwYjM2XHUwYjM5XHUwYjNkXHUwYjNkXHUwYjVjXHUwYjVkXHUwYjVmXHUwYjYxXHUwYjg1XHUwYjhhXHUwYjhlXHUwYjkwXHUwYjkyXHUwYjk1IgotICAgICAgICArIlx1MGI5OVx1MGI5YVx1MGI5Y1x1MGI5Y1x1MGI5ZVx1MGI5Zlx1MGJhM1x1MGJhNFx1MGJhOFx1MGJhYVx1MGJhZVx1MGJiNVx1MGJiN1x1MGJiOSIKLSAgICAgICAgKyJcdTBjMDVcdTBjMGNcdTBjMGVcdTBjMTBcdTBjMTJcdTBjMjhcdTBjMmFcdTBjMzNcdTBjMzVcdTBjMzlcdTBjNjBcdTBjNjFcdTBjODVcdTBjOGMiCi0gICAgICAgICsiXHUwYzhlXHUwYzkwXHUwYzkyXHUwY2E4XHUwY2FhXHUwY2IzXHUwY2I1XHUwY2I5XHUwY2RlXHUwY2RlXHUwY2UwXHUwY2UxXHUwZDA1XHUwZDBjIgotICAgICAgICArIlx1MGQwZVx1MGQxMFx1MGQxMlx1MGQyOFx1MGQyYVx1MGQzOVx1MGQ2MFx1MGQ2MVx1MGUwMVx1MGUyZVx1MGUzMFx1MGUzMFx1MGUzMlx1MGUzMyIKLSAgICAgICAgKyJcdTBlNDBcdTBlNDVcdTBlODFcdTBlODJcdTBlODRcdTBlODRcdTBlODdcdTBlODhcdTBlOGFcdTBlOGFcdTBlOGRcdTBlOGRcdTBlOTRcdTBlOTciCi0gICAgICAgICsiXHUwZTk5XHUwZTlmXHUwZWExXHUwZWEzXHUwZWE1XHUwZWE1XHUwZWE3XHUwZWE3XHUwZWFhXHUwZWFiXHUwZWFkXHUwZWFlXHUwZWIwXHUwZWIwIgotICAgICAgICArIlx1MGViMlx1MGViM1x1MGViZFx1MGViZFx1MGVjMFx1MGVjNFx1MGY0MFx1MGY0N1x1MGY0OVx1MGY2OVx1MTBhMFx1MTBjNVx1MTBkMFx1MTBmNiIKLSAgICAgICAgKyJcdTExMDBcdTExMDBcdTExMDJcdTExMDNcdTExMDVcdTExMDdcdTExMDlcdTExMDlcdTExMGJcdTExMGNcdTExMGVcdTExMTJcdTExM2NcdTExM2MiCi0gICAgICAgICsiXHUxMTNlXHUxMTNlXHUxMTQwXHUxMTQwXHUxMTRjXHUxMTRjXHUxMTRlXHUxMTRlXHUxMTUwXHUxMTUwXHUxMTU0XHUxMTU1XHUxMTU5XHUxMTU5IgotICAgICAgICArIlx1MTE1Zlx1MTE2MVx1MTE2M1x1MTE2M1x1MTE2NVx1MTE2NVx1MTE2N1x1MTE2N1x1MTE2OVx1MTE2OVx1MTE2ZFx1MTE2ZVx1MTE3Mlx1MTE3MyIKLSAgICAgICAgKyJcdTExNzVcdTExNzVcdTExOWVcdTExOWVcdTExYThcdTExYThcdTExYWJcdTExYWJcdTExYWVcdTExYWZcdTExYjdcdTExYjhcdTExYmFcdTExYmEiCi0gICAgICAgICsiXHUxMWJjXHUxMWMyXHUxMWViXHUxMWViXHUxMWYwXHUxMWYwXHUxMWY5XHUxMWY5XHUxZTAwXHUxZTliXHUxZWEwXHUxZWY5XHUxZjAwXHUxZjE1IgotICAgICAgICArIlx1MWYxOFx1MWYxZFx1MWYyMFx1MWY0NVx1MWY0OFx1MWY0ZFx1MWY1MFx1MWY1N1x1MWY1OVx1MWY1OVx1MWY1Ylx1MWY1Ylx1MWY1ZFx1MWY1ZCIKLSAgICAgICAgKyJcdTFmNWZcdTFmN2RcdTFmODBcdTFmYjRcdTFmYjZcdTFmYmNcdTFmYmVcdTFmYmVcdTFmYzJcdTFmYzRcdTFmYzZcdTFmY2NcdTFmZDBcdTFmZDMiCi0gICAgICAgICsiXHUxZmQ2XHUxZmRiXHUxZmUwXHUxZmVjXHUxZmYyXHUxZmY0XHUxZmY2XHUxZmZjXHUyMTI2XHUyMTI2XHUyMTJhXHUyMTJiXHUyMTJlXHUyMTJlIgotICAgICAgICArIlx1MjE4MFx1MjE4Mlx1MzAwN1x1MzAwN1x1MzAyMVx1MzAyOVx1MzA0MVx1MzA5NFx1MzBhMVx1MzBmYVx1MzEwNVx1MzEyY1x1NGUwMFx1OWZhNSIKLSAgICAgICAgKyJcdWFjMDBcdWQ3YTMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUdJVFMgPQotICAgICAgICAiXHUwMDMwXHUwMDM5XHUwNjYwXHUwNjY5XHUwNkYwXHUwNkY5XHUwOTY2XHUwOTZGXHUwOUU2XHUwOUVGXHUwQTY2XHUwQTZGXHUwQUU2XHUwQUVGIgotICAgICAgICArIlx1MEI2Nlx1MEI2Rlx1MEJFN1x1MEJFRlx1MEM2Nlx1MEM2Rlx1MENFNlx1MENFRlx1MEQ2Nlx1MEQ2Rlx1MEU1MFx1MEU1OVx1MEVEMFx1MEVEOSIKLSAgICAgICAgKyJcdTBGMjBcdTBGMjkiOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRUFETUUudHh0IGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2YxMTY3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVRoaXMgaXMgYW4gaXNvbGF0ZWQgZGlyZWN0b3J5IHRoYXQgd2FzIHRha2VuIGZyb20gdGhlCi1BcGFjaGUgWGVyY2VzLUogMi4wIHByb2plY3QuCi0KLUl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbW9kaWZpY2F0aW9uczoKLQotKDEpIGEgY2hhbmdlIGluIG5hbWVzcGFjZS4KLSgyKSB0aGUgYWRkaXRpb24gb2YgYSBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbiBjbGFzcyBmb3IgZmFzdAotICAgIGRldGVjdGlvbiBvZiBOQ05BTUUsIGV0Yy4KLQotTm8geGJlYW4gY29kZSBvdXRzaWRlIHRoaXMgZGlyZWN0b3J5IG9yIG90aGVyIGRpcmVjdG9yaWVzIHdpdGgKLXNpbWlsYXIgUkVBRE1FIG5vdGljZXMgd2FzIHRha2VuIGZyb20gQXBhY2hlLgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRVV0aWwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUkVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGRkMmUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRVV0aWwgewotICAgIHByaXZhdGUgUkVVdGlsKCkgewotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgY29tcG9zZUZyb21TdXJyb2dhdGVzKGludCBoaWdoLCBpbnQgbG93KSB7Ci0gICAgICAgIHJldHVybiAweDEwMDAwICsgKChoaWdoLTB4ZDgwMCk8PDEwKSArIGxvdy0weGRjMDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNMb3dTdXJyb2dhdGUoaW50IGNoKSB7Ci0gICAgICAgIHJldHVybiAoY2ggJiAweGZjMDApID09IDB4ZGMwMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0hpZ2hTdXJyb2dhdGUoaW50IGNoKSB7Ci0gICAgICAgIHJldHVybiAoY2ggJiAweGZjMDApID09IDB4ZDgwMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlY29tcG9zZVRvU3Vycm9nYXRlcyhpbnQgY2gpIHsKLSAgICAgICAgY2hhcltdIGNocyA9IG5ldyBjaGFyWzJdOwotICAgICAgICBjaCAtPSAweDEwMDAwOwotICAgICAgICBjaHNbMF0gPSAoY2hhcikoKGNoPj4xMCkrMHhkODAwKTsKLSAgICAgICAgY2hzWzFdID0gKGNoYXIpKChjaCYweDNmZikrMHhkYzAwKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hzKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHN1YnN0cmluZyhDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciwgaW50IGJlZ2luLCBpbnQgZW5kKSB7Ci0gICAgICAgIGNoYXJbXSBzcmMgPSBuZXcgY2hhcltlbmQtYmVnaW5dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBzcmMubGVuZ3RoOyAgaSArKykKLSAgICAgICAgICAgIHNyY1tpXSA9IGl0ZXJhdG9yLnNldEluZGV4KGkrYmVnaW4pOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzcmMpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgZ2V0T3B0aW9uVmFsdWUoaW50IGNoKSB7Ci0gICAgICAgIGludCByZXQgPSAwOwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5JR05PUkVfQ0FTRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uTVVMVElQTEVfTElORVM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlNJTkdMRV9MSU5FOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5FWFRFTkRFRF9DT01NRU5UOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ3cnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uVU5JQ09ERV9XT1JEX0JPVU5EQVJZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5QUk9ISUJJVF9GSVhFRF9TVFJJTkdfT1BUSU1JWkFUSU9OOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5QUk9ISUJJVF9IRUFEX0NIQVJBQ1RFUl9PUFRJTUlaQVRJT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdYJzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnLCc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5TUEVDSUFMX0NPTU1BOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgcGFyc2VPcHRpb25zKFN0cmluZyBvcHRzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpZiAob3B0cyA9PSBudWxsKSAgcmV0dXJuIDA7Ci0gICAgICAgIGludCBvcHRpb25zID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgb3B0cy5sZW5ndGgoKTsgIGkgKyspIHsKLSAgICAgICAgICAgIGludCB2ID0gZ2V0T3B0aW9uVmFsdWUob3B0cy5jaGFyQXQoaSkpOwotICAgICAgICAgICAgaWYgKHYgPT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVua25vd24gT3B0aW9uOiAiK29wdHMuc3Vic3RyaW5nKGkpLCAtMSk7Ci0gICAgICAgICAgICBvcHRpb25zIHw9IHY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBjcmVhdGVPcHRpb25TdHJpbmcoaW50IG9wdGlvbnMpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig5KTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uUFJPSElCSVRfRklYRURfU1RSSU5HX09QVElNSVpBVElPTikgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhciknRicpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5QUk9ISUJJVF9IRUFEX0NIQVJBQ1RFUl9PUFRJTUlaQVRJT04pICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ0gnKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREUpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ1gnKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ2knKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uTVVMVElQTEVfTElORVMpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ20nKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uU0lOR0xFX0xJTkUpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ3MnKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ3UnKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uVU5JQ09ERV9XT1JEX0JPVU5EQVJZKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSd3Jyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLkVYVEVOREVEX0NPTU1FTlQpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ3gnKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQSkgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhciknLCcpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKS5pbnRlcm4oKTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5kZWRDb21tZW50KFN0cmluZyByZWdleCkgewotICAgICAgICBpbnQgbGVuID0gcmVnZXgubGVuZ3RoKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0gICAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuKSB7Ci0gICAgICAgICAgICBpbnQgY2ggPSByZWdleC5jaGFyQXQob2Zmc2V0KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgYSB3aGl0ZSBzcGFjZS4KLSAgICAgICAgICAgIGlmIChjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xmJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICcgJykKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKGNoID09ICcjJykgeyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgY2hyYWN0ZXJzIGJldHdlZW4gJyMnIGFuZCBhIGxpbmUgZW5kLgotICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSByZWdleC5jaGFyQXQob2Zmc2V0KyspOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcHMgYW4gZXNjYXBlZCB3aGl0ZSBzcGFjZS4KLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIG9mZnNldCA8IGxlbikgewotICAgICAgICAgICAgICAgIGlmICgobmV4dCA9IHJlZ2V4LmNoYXJBdChvZmZzZXQpKSA9PSAnIycKLSAgICAgICAgICAgICAgICAgICAgfHwgbmV4dCA9PSAnXHQnIHx8IG5leHQgPT0gJ1xuJyB8fCBuZXh0ID09ICdcZicKLSAgICAgICAgICAgICAgICAgICAgfHwgbmV4dCA9PSAnXHInIHx8IG5leHQgPT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpbmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIGVzY2FwZWQgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSdcXCcpOwotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKW5leHQpOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXMgaXMuCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciljaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIFNhbXBsZSBlbnRyeS4KLSAgICAgKiA8ZGl2PlVzYWdlOiA8S0JEPm9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLnJlZ2V4LlJFVXRpbCAmbHQ7cmVnZXgmZ3Q7ICZsdDtzdHJpbmcmZ3Q7PC9LQkQ+PC9kaXY+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotICAgICAgICBTdHJpbmcgcGF0dGVybiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgb3B0aW9ucyA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICBpZiggYXJndi5sZW5ndGggPT0gMCApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFcnJvcjpVc2FnZTogamF2YSBSRVV0aWwgLWl8LW18LXN8LXV8LXd8LVggcmVndWxhckV4cHJlc3Npb24gU3RyaW5nIiApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KCAwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBhcmd2Lmxlbmd0aDsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJndltpXS5sZW5ndGgoKSA9PSAwIHx8IGFyZ3ZbaV0uY2hhckF0KDApICE9ICctJykgewotICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IGFyZ3ZbaV07Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gYXJndltpXTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbm5lY2Vzc2FyeTogIithcmd2W2ldKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItaSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gImkiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1tIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAibSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLXMiKSkgewotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJzIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItdSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gInUiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi13IikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAidyI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLVgiKSkgewotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJYIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVua25vd24gb3B0aW9uOiAiK2FyZ3ZbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHJlZyA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbihwYXR0ZXJuLCBvcHRpb25zKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVndWxhckV4cHJlc3Npb246ICIrcmVnKTsKLSAgICAgICAgICAgIE1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgICAgICByZWcubWF0Y2hlcyh0YXJnZXQsIG1hdGNoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG1hdGNoLmdldE51bWJlck9mR3JvdXBzKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCApICBTeXN0ZW0ub3V0LnByaW50KCJNYXRjaGVkIHJhbmdlIGZvciB0aGUgd2hvbGUgcGF0dGVybjogIik7Ci0gICAgICAgICAgICAgICAgZWxzZSBTeXN0ZW0ub3V0LnByaW50KCJbIitpKyJdOiAiKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2guZ2V0QmVnaW5uaW5nKGkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItMSIpOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KG1hdGNoLmdldEJlZ2lubmluZyhpKSsiLCAiK21hdGNoLmdldEVuZChpKSsiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIiIrbWF0Y2guZ2V0Q2FwdHVyZWRUZXh0KGkpKyJcIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5QYXJzZUV4Y2VwdGlvbjogIitwZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbmRlbnQgPSAiICAgICAgICAiOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihpbmRlbnQrcGF0dGVybik7Ci0gICAgICAgICAgICAgICAgaW50IGxvYyA9IHBlLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvYyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoaW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbG9jOyAgaSArKykgIFN5c3RlbS5lcnIucHJpbnQoIi0iKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJeIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVTSVpFID0gMjA7Ci0gICAgc3RhdGljIGZpbmFsIFJlZ3VsYXJFeHByZXNzaW9uW10gcmVnZXhDYWNoZSA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbltDQUNIRVNJWkVdOwotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBSZWd1bGFyRXhwcmVzc2lvbiBpbnN0YW5jZS4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYWNoZXMgY3JlYXRlZCBpbnN0YW5jZXMuCi0gICAgICoKLSAgICAgKiBAc2VlcSBSZWd1bGFyRXhwcmVzc2lvbiNSZWd1bGFyRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVndWxhckV4cHJlc3Npb24gY3JlYXRlUmVnZXgoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBvcHRpb25zKQotICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbiByZSA9IG51bGw7Ci0gICAgICAgIGludCBpbnRPcHRpb25zID0gUkVVdGlsLnBhcnNlT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgc3luY2hyb25pemVkIChSRVV0aWwucmVnZXhDYWNoZSkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IFJFVXRpbC5DQUNIRVNJWkU7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgUmVndWxhckV4cHJlc3Npb24gY2FjaGVkID0gUkVVdGlsLnJlZ2V4Q2FjaGVbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGNhY2hlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjYWNoZWQuZXF1YWxzKHBhdHRlcm4sIGludE9wdGlvbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlID0gY2FjaGVkOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShSRVV0aWwucmVnZXhDYWNoZSwgMCwgUkVVdGlsLnJlZ2V4Q2FjaGUsIDEsIGkpOwotICAgICAgICAgICAgICAgICAgICBSRVV0aWwucmVnZXhDYWNoZVswXSA9IHJlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVndWxhckV4cHJlc3Npb24ocGF0dGVybiwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShSRVV0aWwucmVnZXhDYWNoZSwgMCwgUkVVdGlsLnJlZ2V4Q2FjaGUsIDEsIFJFVXRpbC5DQUNIRVNJWkUtMSk7Ci0gICAgICAgICAgICAgICAgUkVVdGlsLnJlZ2V4Q2FjaGVbMF0gPSByZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcmVnZXgsIFN0cmluZyB0YXJnZXQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBSRVV0aWwuY3JlYXRlUmVnZXgocmVnZXgsIG51bGwpLm1hdGNoZXModGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyByZWdleCwgU3RyaW5nIG9wdGlvbnMsIFN0cmluZyB0YXJnZXQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBSRVV0aWwuY3JlYXRlUmVnZXgocmVnZXgsIG9wdGlvbnMpLm1hdGNoZXModGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlTWV0YShTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICBpbnQgbGVuID0gbGl0ZXJhbC5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGxlbjsgIGkgKyspIHsKLSAgICAgICAgICAgIGludCBjaCA9IGxpdGVyYWwuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKCIuKis/e1soKXxcXF4kIi5pbmRleE9mKGNoKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoaSsobGVuLWkpKjIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApICBidWZmZXIuYXBwZW5kKGxpdGVyYWwuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciknXFwnKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKWNoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciljaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlciAhPSBudWxsID8gYnVmZmVyLnRvU3RyaW5nKCkgOiBsaXRlcmFsOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHN0YXRpYyB2b2lkIGR1bXBTdHJpbmcoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdi5sZW5ndGgoKTsgIGkgKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyh2LmNoYXJBdChpKSkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmFuZ2VUb2tlbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SYW5nZVRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjdiOTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SYW5nZVRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNoYXJhY3RlciBjbGFzcyBzdWNoIGFzIFthLXpdIG9yIGEgcGVyaW9kLgotICovCi1maW5hbCBjbGFzcyBSYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KLSAgICBpbnRbXSByYW5nZXM7Ci0gICAgYm9vbGVhbiBzb3J0ZWQ7Ci0gICAgYm9vbGVhbiBjb21wYWN0ZWQ7Ci0gICAgUmFuZ2VUb2tlbiBpY2FzZUNhY2hlID0gbnVsbDsKLSAgICBpbnRbXSBtYXAgPSBudWxsOwotICAgIGludCBub25NYXBJbmRleDsKLQotICAgIFJhbmdlVG9rZW4oaW50IHR5cGUpIHsKLSAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgIHRoaXMuc2V0U29ydGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBSQU5HRSBvciBOUkFOR0UKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbnVsbDsKLSAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIlRva2VuI2FkZFJhbmdlKCk6ICIrc3RhcnQrIiAiK2VuZCk7Ci0gICAgICAgIGludCByMSwgcjI7Ci0gICAgICAgIGlmIChzdGFydCA8PSBlbmQpIHsKLSAgICAgICAgICAgIHIxID0gc3RhcnQ7Ci0gICAgICAgICAgICByMiA9IGVuZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHIxID0gZW5kOwotICAgICAgICAgICAgcjIgPSBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50WzJdOwotICAgICAgICAgICAgdGhpcy5yYW5nZXNbMF0gPSByMTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzWzFdID0gcjI7Ci0gICAgICAgICAgICB0aGlzLnNldFNvcnRlZCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBvcyA9IHRoaXMucmFuZ2VzLmxlbmd0aDsKLSAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlc1twb3MtMV0rMSA9PSByMSkgewotICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW3Bvcy0xXSA9IHIyOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludFtdIHRlbXAgPSBuZXcgaW50W3BvcysyXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5yYW5nZXMsIDAsIHRlbXAsIDAsIHBvcyk7Ci0gICAgICAgICAgICB0aGlzLnJhbmdlcyA9IHRlbXA7Ci0gICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbcG9zLTFdID49IHIxKQotICAgICAgICAgICAgICAgIHRoaXMuc2V0U29ydGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzW3BvcysrXSA9IHIxOwotICAgICAgICAgICAgdGhpcy5yYW5nZXNbcG9zXSA9IHIyOwotICAgICAgICAgICAgaWYgKCF0aGlzLnNvcnRlZCkKLSAgICAgICAgICAgICAgICB0aGlzLnNvcnRSYW5nZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1NvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkOwotICAgIH0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0U29ydGVkKGJvb2xlYW4gc29ydCkgewotICAgICAgICB0aGlzLnNvcnRlZCA9IHNvcnQ7Ci0gICAgICAgIGlmICghc29ydCkgIHRoaXMuY29tcGFjdGVkID0gZmFsc2U7Ci0gICAgfQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0NvbXBhY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFjdGVkOwotICAgIH0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0Q29tcGFjdGVkKCkgewotICAgICAgICB0aGlzLmNvbXBhY3RlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc29ydFJhbmdlcygpIHsKLSAgICAgICAgaWYgKHRoaXMuaXNTb3J0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHRoaXMucmFuZ2VzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJEbyBzb3J0aW5nOiAiK3RoaXMucmFuZ2VzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1YmJsZSBzb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaHk/IC0tIEluIG1hbnkgY2FzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMucmFuZ2VzIGhhcyBmZXcgZWxlbWVudHMuCi0gICAgICAgIGZvciAoaW50IGkgPSB0aGlzLnJhbmdlcy5sZW5ndGgtNDsgIGkgPj0gMDsgIGkgLT0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7ICBqIDw9IGk7ICBqICs9IDIpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbal0gPiB0aGlzLnJhbmdlc1tqKzJdCi0gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMucmFuZ2VzW2pdID09IHRoaXMucmFuZ2VzW2orMl0gJiYgdGhpcy5yYW5nZXNbaisxXSA+IHRoaXMucmFuZ2VzW2orM10pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gdGhpcy5yYW5nZXNbaisyXTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbaisyXSA9IHRoaXMucmFuZ2VzW2pdOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tqXSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gdGhpcy5yYW5nZXNbaiszXTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbaiszXSA9IHRoaXMucmFuZ2VzW2orMV07Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2orMV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2V0U29ydGVkKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMucmFuZ2VzIGlzIHNvcnRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYWN0UmFuZ2VzKCkgewotICAgICAgICBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0gICAgICAgIGlmICh0aGlzLnJhbmdlcyA9PSBudWxsIHx8IHRoaXMucmFuZ2VzLmxlbmd0aCA8PSAyKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAodGhpcy5pc0NvbXBhY3RlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgYmFzZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kZXggb2Ygd3JpdGluZyBwb2ludAotICAgICAgICBpbnQgdGFyZ2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kZXggb2YgcHJvY2Vzc2luZyBwb2ludAotCi0gICAgICAgIHdoaWxlICh0YXJnZXQgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIGlmIChiYXNlICE9IHRhcmdldCkgewotICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2VdID0gdGhpcy5yYW5nZXNbdGFyZ2V0KytdOwotICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2UrMV0gPSB0aGlzLnJhbmdlc1t0YXJnZXQrK107Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB0YXJnZXQgKz0gMjsKLSAgICAgICAgICAgIGludCBiYXNlZW5kID0gdGhpcy5yYW5nZXNbYmFzZSsxXTsKLSAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZWVuZCsxIDwgdGhpcy5yYW5nZXNbdGFyZ2V0XSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VlbmQrMSA9PSB0aGlzLnJhbmdlc1t0YXJnZXRdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBDb21wYWN0aW9uOiBbIit0aGlzLnJhbmdlc1tiYXNlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0sIFsiK3RoaXMucmFuZ2VzW3RhcmdldF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gLT4gWyIrdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbYmFzZSsxXSA9IHRoaXMucmFuZ2VzW3RhcmdldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgYmFzZWVuZCA9IHRoaXMucmFuZ2VzW2Jhc2UrMV07Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZWVuZCA+PSB0aGlzLnJhbmdlc1t0YXJnZXQrMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUb2tlbiNjb21wYWN0UmFuZ2VzKCk6IENvbXBhY3Rpb246IFsiK3RoaXMucmFuZ2VzW2Jhc2VdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsICIrdGhpcy5yYW5nZXNbYmFzZSsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSwgWyIrdGhpcy5yYW5nZXNbdGFyZ2V0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW3RhcmdldCsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSAtPiBbIit0aGlzLnJhbmdlc1tiYXNlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYXNlZW5kIDwgdGhpcy5yYW5nZXNbdGFyZ2V0KzFdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBDb21wYWN0aW9uOiBbIit0aGlzLnJhbmdlc1tiYXNlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0sIFsiK3RoaXMucmFuZ2VzW3RhcmdldF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gLT4gWyIrdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbYmFzZSsxXSA9IHRoaXMucmFuZ2VzW3RhcmdldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgYmFzZWVuZCA9IHRoaXMucmFuZ2VzW2Jhc2UrMV07Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNjb21wYWN0UmFuZ2VzKCk6IEludGVybmVsIEVycm9yOiBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0aGlzLnJhbmdlc1tiYXNlKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSBbIit0aGlzLnJhbmdlc1t0YXJnZXRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdGhpcy5yYW5nZXNbdGFyZ2V0KzFdKyJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvLyB3aGlsZQotICAgICAgICAgICAgYmFzZSArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2UgIT0gdGhpcy5yYW5nZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2Jhc2VdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLnJhbmdlcywgMCwgcmVzdWx0LCAwLCBiYXNlKTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzID0gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2V0Q29tcGFjdGVkKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VSYW5nZXMoVG9rZW4gdG9rZW4pIHsKLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSAoUmFuZ2VUb2tlbil0b2tlbjsKLSAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIGlmICh0b2sucmFuZ2VzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHRoaXMuaWNhc2VDYWNoZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuc2V0U29ydGVkKHRydWUpOwotICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50W3Rvay5yYW5nZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG9rLnJhbmdlcywgMCwgdGhpcy5yYW5nZXMsIDAsIHRvay5yYW5nZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W3RoaXMucmFuZ2VzLmxlbmd0aCt0b2sucmFuZ2VzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gMCwgayA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoIHx8IGogPCB0b2sucmFuZ2VzLmxlbmd0aDspIHsKLSAgICAgICAgICAgIGlmIChpID49IHRoaXMucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgfSBlbHNlIGlmIChqID49IHRvay5yYW5nZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2srK10gPSB0aGlzLnJhbmdlc1tpKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdGhpcy5yYW5nZXNbaSsrXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLnJhbmdlc1tqXSA8IHRoaXMucmFuZ2VzW2ldCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IHRvay5yYW5nZXNbal0gPT0gdGhpcy5yYW5nZXNbaV0gJiYgdG9rLnJhbmdlc1tqKzFdIDwgdGhpcy5yYW5nZXNbaSsxXSkgewotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRoaXMucmFuZ2VzW2krK107Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2srK10gPSB0aGlzLnJhbmdlc1tpKytdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMucmFuZ2VzID0gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHN1YnRyYWN0UmFuZ2VzKFRva2VuIHRva2VuKSB7Ci0gICAgICAgIGlmICh0b2tlbi50eXBlID09IE5SQU5HRSkgewotICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3RSYW5nZXModG9rZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47Ci0gICAgICAgIGlmICh0b2sucmFuZ2VzID09IG51bGwgfHwgdGhpcy5yYW5nZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbnVsbDsKLSAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRoaXMuY29tcGFjdFJhbmdlcygpOwotICAgICAgICB0b2suc29ydFJhbmdlcygpOwotICAgICAgICB0b2suY29tcGFjdFJhbmdlcygpOwotCi0gICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJUb2tlbiNzdWJzdHJhY3RSYW5nZXMoKTogRW50cnk6ICIrdGhpcy5yYW5nZXMubGVuZ3RoKyIsICIrdG9rLnJhbmdlcy5sZW5ndGgpOwotCi0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbdGhpcy5yYW5nZXMubGVuZ3RoK3Rvay5yYW5nZXMubGVuZ3RoXTsKLSAgICAgICAgaW50IHdwID0gMCwgc3JjID0gMCwgc3ViID0gMDsKLSAgICAgICAgd2hpbGUgKHNyYyA8IHRoaXMucmFuZ2VzLmxlbmd0aCAmJiBzdWIgPCB0b2sucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgaW50IHNyY2JlZ2luID0gdGhpcy5yYW5nZXNbc3JjXTsKLSAgICAgICAgICAgIGludCBzcmNlbmQgPSB0aGlzLnJhbmdlc1tzcmMrMV07Ci0gICAgICAgICAgICBpbnQgc3ViYmVnaW4gPSB0b2sucmFuZ2VzW3N1Yl07Ci0gICAgICAgICAgICBpbnQgc3ViZW5kID0gdG9rLnJhbmdlc1tzdWIrMV07Ci0gICAgICAgICAgICBpZiAoc3JjZW5kIDwgc3ViYmVnaW4pIHsgICAgICAgICAgICAvLyBOb3Qgb3ZlcmxhcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgby0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzdWIKLSAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSB0aGlzLnJhbmdlc1tzcmMrK107Ci0gICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gdGhpcy5yYW5nZXNbc3JjKytdOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNlbmQgPj0gc3ViYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgJiYgc3JjYmVnaW4gPD0gc3ViZW5kKSB7IC8vIE92ZXJsYXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS0tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICBpZiAoc3ViYmVnaW4gPD0gc3JjYmVnaW4gJiYgc3JjZW5kIDw9IHN1YmVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICBvLS0tLS0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiBlbXB0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3ViCi0gICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViYmVnaW4gPD0gc3JjYmVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYyg9cmVzKQotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmNdID0gc3ViZW5kKzE7Ci0gICAgICAgICAgICAgICAgICAgIHN1YiArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjZW5kIDw9IHN1YmVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzdWIKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjYmVnaW47Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHN1YmJlZ2luLTE7Ci0gICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YjogICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgby1vICAgIG8tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3JjKD1yaWdodCByZXMpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyY2JlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzdWJiZWdpbi0xOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmNdID0gc3ViZW5kKzE7Ci0gICAgICAgICAgICAgICAgICAgIHN1YiArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViZW5kIDwgc3JjYmVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBvdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Yjogby0tLS1vCi0gICAgICAgICAgICAgICAgc3ViICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNzdWJ0cmFjdFJhbmdlcygpOiBJbnRlcm5hbCBFcnJvcjogWyIrdGhpcy5yYW5nZXNbc3JjXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdGhpcy5yYW5nZXNbc3JjKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIC0gWyIrdG9rLnJhbmdlc1tzdWJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0b2sucmFuZ2VzW3N1YisxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChzcmMgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYysrXTsKLSAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYysrXTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnJhbmdlcyA9IG5ldyBpbnRbd3BdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgdGhpcy5yYW5nZXMsIDAsIHdwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucmFuZ2VzIGlzIHNvcnRlZCBhbmQgY29tcGFjdGVkLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0b2sgSWdub3JlIHdoZXRoZXIgaXQgaXMgTlJBTkdFIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcnNlY3RSYW5nZXMoVG9rZW4gdG9rZW4pIHsKLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSAoUmFuZ2VUb2tlbil0b2tlbjsKLSAgICAgICAgaWYgKHRvay5yYW5nZXMgPT0gbnVsbCB8fCB0aGlzLnJhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0aGlzLmljYXNlQ2FjaGUgPSBudWxsOwotICAgICAgICB0aGlzLnNvcnRSYW5nZXMoKTsKLSAgICAgICAgdGhpcy5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7Ci0KLSAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFt0aGlzLnJhbmdlcy5sZW5ndGgrdG9rLnJhbmdlcy5sZW5ndGhdOwotICAgICAgICBpbnQgd3AgPSAwLCBzcmMxID0gMCwgc3JjMiA9IDA7Ci0gICAgICAgIHdoaWxlIChzcmMxIDwgdGhpcy5yYW5nZXMubGVuZ3RoICYmIHNyYzIgPCB0b2sucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgaW50IHNyYzFiZWdpbiA9IHRoaXMucmFuZ2VzW3NyYzFdOwotICAgICAgICAgICAgaW50IHNyYzFlbmQgPSB0aGlzLnJhbmdlc1tzcmMxKzFdOwotICAgICAgICAgICAgaW50IHNyYzJiZWdpbiA9IHRvay5yYW5nZXNbc3JjMl07Ci0gICAgICAgICAgICBpbnQgc3JjMmVuZCA9IHRvay5yYW5nZXNbc3JjMisxXTsKLSAgICAgICAgICAgIGlmIChzcmMxZW5kIDwgc3JjMmJlZ2luKSB7ICAgICAgICAgIC8vIE5vdCBvdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogIGVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzcmMyCi0gICAgICAgICAgICAgICAgc3JjMSArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMxZW5kID49IHNyYzJiZWdpbgotICAgICAgICAgICAgICAgICAgICAgICAmJiBzcmMxYmVnaW4gPD0gc3JjMmVuZCkgeyAvLyBPdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogICAgICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS0tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICBpZiAoc3JjMmJlZ2luIDw9IHNyYzJiZWdpbiAmJiBzcmMxZW5kIDw9IHNyYzJlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICBvLS0tLS0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3JjMgotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMxYmVnaW47Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzFlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIHNyYzEgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYzJiZWdpbiA8PSBzcmMxYmVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgIG8tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHRoZSByZXN0IG9mIHNyYzEKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMWJlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMyZW5kOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmMxXSA9IHNyYzJlbmQrMTsKLSAgICAgICAgICAgICAgICAgICAgc3JjMiArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjMWVuZCA8PSBzcmMyZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgICAgICAgIG8tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYzIKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMmJlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMxZW5kOwotICAgICAgICAgICAgICAgICAgICBzcmMxICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIHJlc3Qgb2Ygc3JjMQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMyYmVnaW47Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzJlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW3NyYzFdID0gc3JjMmVuZCsxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjMmVuZCA8IHNyYzFiZWdpbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IG92ZXJsYXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6IG8tLS0tbwotICAgICAgICAgICAgICAgIHNyYzIgKz0gMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI2ludGVyc2VjdFJhbmdlcygpOiBJbnRlcm5hbCBFcnJvcjogWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5yYW5nZXNbc3JjMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwiK3RoaXMucmFuZ2VzW3NyYzErMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gJiBbIit0b2sucmFuZ2VzW3NyYzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0b2sucmFuZ2VzW3NyYzIrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoc3JjMSA8IHRoaXMucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gdGhpcy5yYW5nZXNbc3JjMSsrXTsKLSAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYzErK107Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50W3dwXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHRoaXMucmFuZ2VzLCAwLCB3cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnJhbmdlcyBpcyBzb3J0ZWQgYW5kIGNvbXBhY3RlZC4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmb3IgUkFOR0U6IENyZWF0ZXMgY29tcGxlbWVudC4KLSAgICAgKiBmb3IgTlJBTkdFOiBDcmVhdGVzIHRoZSBzYW1lIG1lYW5pbmcgUkFOR0UuCi0gICAgICovCi0gICAgc3RhdGljIFRva2VuIGNvbXBsZW1lbnRSYW5nZXMoVG9rZW4gdG9rZW4pIHsKLSAgICAgICAgaWYgKHRva2VuLnR5cGUgIT0gUkFOR0UgJiYgdG9rZW4udHlwZSAhPSBOUkFOR0UpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUb2tlbiNjb21wbGVtZW50UmFuZ2VzKCk6IG11c3QgYmUgUkFOR0U6ICIrdG9rZW4udHlwZSk7Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgIGludCBsZW4gPSB0b2sucmFuZ2VzLmxlbmd0aCsyOwotICAgICAgICBpZiAodG9rLnJhbmdlc1swXSA9PSAwKQotICAgICAgICAgICAgbGVuIC09IDI7Ci0gICAgICAgIGludCBsYXN0ID0gdG9rLnJhbmdlc1t0b2sucmFuZ2VzLmxlbmd0aC0xXTsKLSAgICAgICAgaWYgKGxhc3QgPT0gVVRGMTZfTUFYKQotICAgICAgICAgICAgbGVuIC09IDI7Ci0gICAgICAgIFJhbmdlVG9rZW4gcmV0ID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgcmV0LnJhbmdlcyA9IG5ldyBpbnRbbGVuXTsKLSAgICAgICAgaW50IHdwID0gMDsKLSAgICAgICAgaWYgKHRvay5yYW5nZXNbMF0gPiAwKSB7Ci0gICAgICAgICAgICByZXQucmFuZ2VzW3dwKytdID0gMDsKLSAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSB0b2sucmFuZ2VzWzBdLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7ICBpIDwgdG9rLnJhbmdlcy5sZW5ndGgtMjsgIGkgKz0gMikgewotICAgICAgICAgICAgcmV0LnJhbmdlc1t3cCsrXSA9IHRvay5yYW5nZXNbaV0rMTsKLSAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSB0b2sucmFuZ2VzW2krMV0tMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGFzdCAhPSBVVEYxNl9NQVgpIHsKLSAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSBsYXN0KzE7Ci0gICAgICAgICAgICByZXQucmFuZ2VzW3dwXSA9IFVURjE2X01BWDsKLSAgICAgICAgfQotICAgICAgICByZXQuc2V0Q29tcGFjdGVkKCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIFJhbmdlVG9rZW4gZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKSB7Ci0gICAgICAgIGlmICh0aGlzLmljYXNlQ2FjaGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmljYXNlQ2FjaGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgUmFuZ2VUb2tlbiB1cHBlcnMgPSB0aGlzLnR5cGUgPT0gVG9rZW4uUkFOR0UgPyBUb2tlbi5jcmVhdGVSYW5nZSgpIDogVG9rZW4uY3JlYXRlTlJhbmdlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgY2ggPSB0aGlzLnJhbmdlc1tpXTsgIGNoIDw9IHRoaXMucmFuZ2VzW2krMV07ICBjaCArKykgewotICAgICAgICAgICAgICAgIGlmIChjaCA+IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgdXBwZXJzLmFkZFJhbmdlKGNoLCBjaCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICAgICAgdXBwZXJzLmFkZFJhbmdlKHVjaCwgdWNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUmFuZ2VUb2tlbiBsb3dlcnMgPSB0aGlzLnR5cGUgPT0gVG9rZW4uUkFOR0UgPyBUb2tlbi5jcmVhdGVSYW5nZSgpIDogVG9rZW4uY3JlYXRlTlJhbmdlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHVwcGVycy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjaCA9IHVwcGVycy5yYW5nZXNbaV07ICBjaCA8PSB1cHBlcnMucmFuZ2VzW2krMV07ICBjaCArKykgewotICAgICAgICAgICAgICAgIGlmIChjaCA+IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgbG93ZXJzLmFkZFJhbmdlKGNoLCBjaCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICAgICAgbG93ZXJzLmFkZFJhbmdlKHVjaCwgdWNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG93ZXJzLm1lcmdlUmFuZ2VzKHVwcGVycyk7Ci0gICAgICAgIGxvd2Vycy5tZXJnZVJhbmdlcyh0aGlzKTsKLSAgICAgICAgbG93ZXJzLmNvbXBhY3RSYW5nZXMoKTsKLQotICAgICAgICB0aGlzLmljYXNlQ2FjaGUgPSBsb3dlcnM7Ci0gICAgICAgIHJldHVybiBsb3dlcnM7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUmFuZ2VzKCkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCJSQU5HRTogIik7Ci0gICAgICAgIGlmICh0aGlzLnJhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgTlVMTCIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIlsiK3RoaXMucmFuZ2VzW2ldKyIsIit0aGlzLnJhbmdlc1tpKzFdKyJdICIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBtYXRjaChpbnQgY2gpIHsKLSAgICAgICAgaWYgKHRoaXMubWFwID09IG51bGwpICB0aGlzLmNyZWF0ZU1hcCgpOwotICAgICAgICBib29sZWFuIHJldDsKLSAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBSQU5HRSkgewotICAgICAgICAgICAgaWYgKGNoIDwgTUFQU0laRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMubWFwW2NoLzMyXSAmICgxPDwoY2gmMHgxZikpKSAhPSAwOwotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gdGhpcy5ub25NYXBJbmRleDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbaV0gPD0gY2ggJiYgY2ggPD0gdGhpcy5yYW5nZXNbaSsxXSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY2ggPCBNQVBTSVpFKQotICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5tYXBbY2gvMzJdICYgKDE8PChjaCYweDFmKSkpID09IDA7Ci0gICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMubm9uTWFwSW5kZXg7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VzW2ldIDw9IGNoICYmIGNoIDw9IHRoaXMucmFuZ2VzW2krMV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVBTSVpFID0gMjU2OwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNYXAoKSB7Ci0gICAgICAgIGludCBhc2l6ZSA9IE1BUFNJWkUvMzI7ICAgICAgICAgICAgICAgICAvLyAzMiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYGludCcuCi0gICAgICAgIHRoaXMubWFwID0gbmV3IGludFthc2l6ZV07Ci0gICAgICAgIHRoaXMubm9uTWFwSW5kZXggPSB0aGlzLnJhbmdlcy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGFzaXplOyAgaSArKykgIHRoaXMubWFwW2ldID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICBpbnQgcyA9IHRoaXMucmFuZ2VzW2ldOwotICAgICAgICAgICAgaW50IGUgPSB0aGlzLnJhbmdlc1tpKzFdOwotICAgICAgICAgICAgaWYgKHMgPCBNQVBTSVpFKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHM7ICBqIDw9IGUgJiYgaiA8IE1BUFNJWkU7ICBqICsrKQotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFtqLzMyXSB8PSAxPDwoaiYweDFmKTsgLy8gcyYweDFmIDogMC0zMQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5vbk1hcEluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlID49IE1BUFNJWkUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5vbk1hcEluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyAgaSA8IGFzaXplOyAgaSArKykgIFN5c3RlbS5lcnIucHJpbnRsbigiTWFwOiAiK0ludGVnZXIudG9TdHJpbmcodGhpcy5tYXBbaV0sIDE2KSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICBpZiAodGhpcy50eXBlID09IFJBTkdFKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl9kb3QpCi0gICAgICAgICAgICAgICAgcmV0ID0gIi4iOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl8wdG85KQotICAgICAgICAgICAgICAgIHJldCA9ICJcXGQiOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl93b3JkY2hhcnMpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcdyI7Ci0gICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX3NwYWNlcykKLSAgICAgICAgICAgICAgICByZXQgPSAiXFxzIjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQSkgIT0gMCAmJiBpID4gMCkgIHNiLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbaV0gPT0gdGhpcy5yYW5nZXNbaSsxXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSctJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2krMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICByZXQgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fbm90XzB0bzkpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcRCI7Ci0gICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX25vdF93b3JkY2hhcnMpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcVyI7Ci0gICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX25vdF9zcGFjZXMpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcUyI7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJbXiIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgewotICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5TUEVDSUFMX0NPTU1BKSAhPSAwICYmIGkgPiAwKSAgc2IuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlc1tpXSA9PSB0aGlzLnJhbmdlc1tpKzFdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlc2NhcGVDaGFySW5DaGFyQ2xhc3ModGhpcy5yYW5nZXNbaSsxXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXSIpOwotICAgICAgICAgICAgICAgIHJldCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlQ2hhckluQ2hhckNsYXNzKGludCBjaCkgewotICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAnWyc6ICBjYXNlICddJzogIGNhc2UgJy0nOiAgY2FzZSAnXic6Ci0gICAgICAgICAgY2FzZSAnLCc6ICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXQgPSAiXFwiKyhjaGFyKWNoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnXGYnOiAgcmV0ID0gIlxcZiI7ICBicmVhazsKLSAgICAgICAgICBjYXNlICdcbic6ICByZXQgPSAiXFxuIjsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1xyJzogIHJldCA9ICJcXHIiOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnXHQnOiAgcmV0ID0gIlxcdCI7ICBicmVhazsKLSAgICAgICAgICBjYXNlIDB4MWI6ICByZXQgPSAiXFxlIjsgIGJyZWFrOwotICAgICAgICAgIC8vY2FzZSAweDBiOiAgcmV0ID0gIlxcdiI7ICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKGNoIDwgMHgyMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyhjaCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gIlxceCIrcHJlLnN1YnN0cmluZyhwcmUubGVuZ3RoKCktMiwgcHJlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgxMDAwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyhjaCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gIlxcdiIrcHJlLnN1YnN0cmluZyhwcmUubGVuZ3RoKCktNiwgcHJlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldCA9ICIiKyhjaGFyKWNoOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ2V4UGFyc2VyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ2V4UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzE2ZGUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWdleFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogQSBSZWd1bGFyIEV4cHJlc3Npb24gUGFyc2VyLgotICovCi1jbGFzcyBSZWdleFBhcnNlciB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUX0NIQVIgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9FT0YgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9PUiA9IDI7ICAgICAgICAgICAgICAgICAgLy8gJ3wnCi0gICAgc3RhdGljIGZpbmFsIGludCBUX1NUQVIgPSAzOyAgICAgICAgICAgICAgICAvLyAnKicKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfUExVUyA9IDQ7ICAgICAgICAgICAgICAgIC8vICcrJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9RVUVTVElPTiA9IDU7ICAgICAgICAgICAgLy8gJz8nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0xQQVJFTiA9IDY7ICAgICAgICAgICAgICAvLyAnKCcKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfUlBBUkVOID0gNzsgICAgICAgICAgICAgIC8vICcpJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9ET1QgPSA4OyAgICAgICAgICAgICAgICAgLy8gJy4nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0xCUkFDS0VUID0gOTsgICAgICAgICAgICAvLyAnWycKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfQkFDS1NPTElEVVMgPSAxMDsgICAgICAgIC8vICdcJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9DQVJFVCA9IDExOyAgICAgICAgICAgICAgLy8gJ14nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0RPTExBUiA9IDEyOyAgICAgICAgICAgICAvLyAnJCcKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfTFBBUkVOMiA9IDEzOyAgICAgICAgICAgIC8vICcoPzonCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0xPT0tBSEVBRCA9IDE0OyAgICAgICAgICAvLyAnKD89JwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9ORUdBVElWRUxPT0tBSEVBRCA9IDE1OyAgLy8gJyg/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+IFRva2VuLlVURjE2X01BWCkgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwcGUuNCIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgYyA9IHV2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuNSIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IGhleENoYXIoaW50IGNoKSB7Ci0gICAgICAgIGlmIChjaCA8ICcwJykgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGNoID4gJ2YnKSAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoY2ggPD0gJzknKSAgcmV0dXJuIGNoLScwJzsKLSAgICAgICAgaWYgKGNoIDwgJ0EnKSAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoY2ggPD0gJ0YnKSAgcmV0dXJuIGNoLSdBJysxMDsKLSAgICAgICAgaWYgKGNoIDwgJ2EnKSAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gY2gtJ2EnKzEwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmVndWxhckV4cHJlc3Npb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmVndWxhckV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwZGZlMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ3VsYXJFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQ3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLQotLyoqCi0gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBlbmdpbmUgdXNpbmcgTm9uLWRldGVybWluaXN0aWMgRmluaXRlIEF1dG9tYXRvbiAoTkZBKS4KLSAqIFRoaXMgZW5naW5lIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAqCi0gKiA8aHIgd2lkdGg9IjUwJSI+Ci0gKiA8aDM+SG93IHRvIHVzZTwvaDM+Ci0gKgotICogPGRsPgotICogICA8ZHQ+QS4gU3RhbmRhcmQgd2F5Ci0gKiAgIDxkZD4KLSAqIDxwcmU+Ci0gKiBSZWd1bGFyRXhwcmVzc2lvbiByZSA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbig8dmFyPnJlZ2V4PC92YXI+KTsKLSAqIGlmIChyZS5tYXRjaGVzKHRleHQpKSB7IC4uLiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiAgIDxkdD5CLiBDYXB0dXJpbmcgZ3JvdXBzCi0gKiAgIDxkZD4KLSAqIDxwcmU+Ci0gKiBSZWd1bGFyRXhwcmVzc2lvbiByZSA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbig8dmFyPnJlZ2V4PC92YXI+KTsKLSAqIE1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKCk7Ci0gKiBpZiAocmUubWF0Y2hlcyh0ZXh0LCBtYXRjaCkpIHsKLSAqICAgICAuLi4gLy8gWW91IGNhbiByZWZlciBjYXB0dXJlZCB0ZXh0cyB3aXRoIG1ldGhvZHMgb2YgdGhlIDxjb2RlPk1hdGNoPC9jb2RlPiBjbGFzcy4KLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqIDwvZGw+Ci0gKgotICogPGg0PkNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmc8L2g0PgotICogPHByZT4KLSAqIFJlZ3VsYXJFeHByZXNzaW9uIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKDx2YXI+cmVnZXg8L3Zhcj4sICJpIik7Ci0gKiBpZiAocmUubWF0Y2hlcyh0ZXh0KSA+PSAwKSB7IC4uLn0KLSAqIDwvcHJlPgotICoKLSAqIDxoND5PcHRpb25zPC9oND4KLSAqIDxwPllvdSBjYW4gc3BlY2lmeSBvcHRpb25zIHRvIDxhIGhyZWY9IiNSZWd1bGFyRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PGNvZGU+UmVndWxhckV4cHJlc3Npb24oPC9jb2RlPjx2YXI+cmVnZXg8L3Zhcj48Y29kZT4sIDwvY29kZT48dmFyPm9wdGlvbnM8L3Zhcj48Y29kZT4pPC9jb2RlPjwvYT4KLSAqICAgIG9yIDxhIGhyZWY9IiNzZXRQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48Y29kZT5zZXRQYXR0ZXJuKDwvY29kZT48dmFyPnJlZ2V4PC92YXI+PGNvZGU+LCA8L2NvZGU+PHZhcj5vcHRpb25zPC92YXI+PGNvZGU+KTwvY29kZT48L2E+LgotICogICAgVGhpcyA8dmFyPm9wdGlvbnM8L3Zhcj4gcGFyYW1ldGVyIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycy4KLSAqIDwvcD4KLSAqIDxkbD4KLSAqICAgPGR0PjxhIG5hbWU9IklfT1BUSU9OIj48Y29kZT4iaSI8L2NvZGU+PC9hPgotICogICA8ZGQ+VGhpcyBvcHRpb24gaW5kaWNhdGVzIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcuCi0gKiAgIDxkdD48YSBuYW1lPSJNX09QVElPTiI+PGNvZGU+Im0iPC9jb2RlPjwvYT4KLSAqICAgPGRkIGNsYXNzPSJSRUdFWCI+PGtiZD5ePC9rYmQ+IGFuZCA8a2JkPiQ8L2tiZD4gY29uc2lkZXIgdGhlIEVPTCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgdGV4dC4KLSAqICAgPGR0PjxhIG5hbWU9IlNfT1BUSU9OIj48Y29kZT4icyI8L2NvZGU+PC9hPgotICogICA8ZGQgY2xhc3M9IlJFR0VYIj48a2JkPi48L2tiZD4gbWF0Y2hlcyBhbnkgb25lIGNoYXJhY3Rlci4KLSAqICAgPGR0PjxhIG5hbWU9IlVfT1BUSU9OIj48Y29kZT4idSI8L2NvZGU+PC9hPgotICogICA8ZGQgY2xhc3M9IlJFR0VYIj5SZWRlZmluZXMgPEtiZD5cZCBcRCBcdyBcVyBccyBcUyBcYiBcQiBcJmx0OyBcPjwva2JkPiBhcyBiZWNvbWluZyB0byBVbmljb2RlLgotICogICA8ZHQ+PGEgbmFtZT0iV19PUFRJT04iPjxjb2RlPiJ3IjwvY29kZT48L2E+Ci0gKiAgIDxkZCBjbGFzcz0iUkVHRVgiPkJ5IHRoaXMgb3B0aW9uLCA8a2JkPlxiIFxCIFwmbHQ7IFw+PC9rYmQ+IGFyZSBwcm9jZXNzZWQgd2l0aCB0aGUgbWV0aG9kIG9mCi0gKiAgICAgICdVbmljb2RlIFJlZ3VsYXIgRXhwcmVzc2lvbiBHdWlkZWxpbmVzJyBSZXZpc2lvbiA0LgotICogICAgICBXaGVuICJ3IiBhbmQgInUiIGFyZSBzcGVjaWZpZWQgYXQgdGhlIHNhbWUgdGltZSwKLSAqICAgICAgPGtiZD5cYiBcQiBcJmx0OyBcPjwva2JkPiBhcmUgcHJvY2Vzc2VkIGZvciB0aGUgInciIG9wdGlvbi4KLSAqICAgPGR0PjxhIG5hbWU9IkNPTU1BX09QVElPTiI+PGNvZGU+IiwiPC9jb2RlPjwvYT4KLSAqICAgPGRkPlRoZSBwYXJzZXIgdHJlYXRzIGEgY29tbWEgaW4gYSBjaGFyYWN0ZXIgY2xhc3MgYXMgYSByYW5nZSBzZXBhcmF0b3IuCi0gKiAgICAgIDxrYmQgY2xhc3M9IlJFR0VYIj5bYSxiXTwva2JkPiBtYXRjaGVzIDxrYmQ+YTwva2JkPiBvciA8a2JkPiw8L2tiZD4gb3IgPGtiZD5iPC9rYmQ+IHdpdGhvdXQgdGhpcyBvcHRpb24uCi0gKiAgICAgIDxrYmQgY2xhc3M9IlJFR0VYIj5bYSxiXTwva2JkPiBtYXRjaGVzIDxrYmQ+YTwva2JkPiBvciA8a2JkPmI8L2tiZD4gd2l0aCB0aGlzIG9wdGlvbi4KLSAqCi0gKiAgIDxkdD48YSBuYW1lPSJYX09QVElPTiI+PGNvZGU+IlgiPC9jb2RlPjwvYT4KLSAqICAgPGRkIGNsYXNzPSJSRUdFWCI+Ci0gKiAgICAgICBCeSB0aGlzIG9wdGlvbiwgdGhlIGVuZ2luZSBjb25mb21zIHRvIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvV0QteG1sc2NoZW1hLTItMjAwMDA0MDcvI3JlZ2V4cyI+WE1MIFNjaGVtYTogUmVndWxhciBFeHByZXNzaW9uPC9hPi4KLSAqICAgICAgIFRoZSA8Y29kZT5tYXRjaCgpPC9jb2RlPiBtZXRob2QgZG9lcyBub3QgZG8gc3Vic3JpbmcgbWF0Y2hpbmcKLSAqICAgICAgIGJ1dCBlbnRpcmUgc3RyaW5nIG1hdGNoaW5nLgotICoKLSAqIDwvZGw+Ci0gKiAKLSAqIDxociB3aWR0aD0iNTAlIj4KLSAqIDxoMz5TeW50YXg8L2gzPgotICogPHRhYmxlIGJvcmRlcj0iMSIgYmdjb2xvcj0iI2RkZWVmZiI+Ci0gKiAgIDx0cj4KLSAqICAgIDx0ZD4KLSAqICAgICA8aDQ+RGlmZmVyZW5jZXMgZnJvbSB0aGUgUGVybCA1IHJlZ3VsYXIgZXhwcmVzc2lvbjwvaDQ+Ci0gKiAgICAgPHVsPgotICogICAgICA8bGk+VGhlcmUgaXMgNi1kaWdpdCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gICg8a2JkPlx1MDA1Y3Y8L2tiZD48dmFyPkhISEhISDwvdmFyPi4pCi0gKiAgICAgIDxsaT5TdXBwb3J0cyBzdWJ0cmFjdGlvbiwgdW5pb24sIGFuZCBpbnRlcnNlY3Rpb24gb3BlcmF0aW9ucyBmb3IgY2hhcmFjdGVyIGNsYXNzZXMuCi0gKiAgICAgIDxsaT5Ob3Qgc3VwcG9ydGVkOiA8a2JkPlw8L2tiZD48dmFyPm9vbzwvdmFyPiAoT2N0YWwgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9ucyksCi0gKiAgICAgICAgICA8S2JkPlxHPC9rYmQ+LCA8a2JkPlxDPC9rYmQ+LCA8a2JkPlxsPC9rYmQ+PHZhcj5jPC92YXI+LAotICogICAgICAgICAgPGtiZD5cdTAwNWMgdTwva2JkPjx2YXI+YzwvdmFyPiwgPGtiZD5cTDwva2JkPiwgPGtiZD5cVTwva2JkPiwKLSAqICAgICAgICAgIDxrYmQ+XEU8L2tiZD4sIDxrYmQ+XFE8L2tiZD4sIDxrYmQ+XE57PC9rYmQ+PHZhcj5uYW1lPC92YXI+PGtiZD59PC9rYmQ+LAotICogICAgICAgICAgPEtiZD4oP3s8a2JkPjx2YXI+Y29kZTwvdmFyPjxrYmQ+fSk8L2tiZD4sIDxLYmQ+KD8/ezxrYmQ+PHZhcj5jb2RlPC92YXI+PGtiZD59KTwva2JkPgotICogICAgIDwvdWw+Ci0gKiAgICA8L3RkPgotICogICA8L3RyPgotICogPC90YWJsZT4KLSAqCi0gKiA8UD5NZXRhIGNoYXJhY3RlcnMgYXJlIGA8S0JEPi4gKiArID8geyBbICggKSB8IFwgXiAkPC9LQkQ+Jy48L1A+Ci0gKiA8dWw+Ci0gKiAgIDxsaT5DaGFyYWN0ZXIKLSAqICAgICA8ZGw+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPi48L2tiZD4gKEEgcGVyaW9kKQotICogICAgICAgPGRkPk1hdGNoZXMgYW55IG9uZSBjaGFyYWN0ZXIgZXhjZXB0IHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycy4KLSAqICAgICAgIDxkZD5MSU5FIEZFRUQgKFUrMDAwQSksIENBUlJJQUdFIFJFVFVSTiAoVSswMDBEKSwKLSAqICAgICAgICAgICBQQVJBR1JBUEggU0VQQVJBVE9SIChVKzIwMjkpLCBMSU5FIFNFUEFSQVRPUiAoVSsyMDI4KQotICogICAgICAgPGRkPlRoaXMgZXhwcmVzc2lvbiBtYXRjaGVzIG9uZSBjb2RlIHBvaW50IGluIFVuaWNvZGUuIEl0IGNhbiBtYXRjaCBhIHBhaXIgb2Ygc3Vycm9nYXRlcy4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNTX09QVElPTiI+dGhlICJzIiBvcHRpb248L2E+IGlzIHNwZWNpZmllZCwKLSAqICAgICAgICAgICBpdCBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgaW5jbHVkaW5nIHRoZSBhYm92ZSBmb3VyIGNoYXJhY3RlcnMuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PEtiZD5cZSBcZiBcbiBcciBcdDwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgRVNDQVBFIChVKzAwMUIpLCBGT1JNIEZFRUQgKFUrMDAwQyksIExJTkUgRkVFRCAoVSswMDBBKSwKLSAqICAgICAgICAgICBDQVJSSUFHRSBSRVRVUk4gKFUrMDAwRCksIEhPUklaT05UQUwgVEFCVUxBVElPTiAoVSswMDA5KQotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XGM8L2tiZD48dmFyPkM8L3Zhcj4KLSAqICAgICAgIDxkZD5NYXRjaGVzIGEgY29udHJvbCBjaGFyYWN0ZXIuCi0gKiAgICAgICAgICAgVGhlIDx2YXI+QzwvdmFyPiBtdXN0IGJlIG9uZSBvZiAnPGtiZD5APC9rYmQ+JywgJzxrYmQ+QTwva2JkPictJzxrYmQ+Wjwva2JkPicsCi0gKiAgICAgICAgICAgJzxrYmQ+Wzwva2JkPicsICc8a2JkPlx1MDA1Yzwva2JkPicsICc8a2JkPl08L2tiZD4nLCAnPGtiZD5ePC9rYmQ+JywgJzxrYmQ+Xzwva2JkPicuCi0gKiAgICAgICAgICAgSXQgbWF0Y2hlcyBhIGNvbnRyb2wgY2hhcmFjdGVyIG9mIHdoaWNoIHRoZSBjaGFyYWN0ZXIgY29kZSBpcyBsZXNzIHRoYW4KLSAqICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGNvZGUgb2YgdGhlIDx2YXI+QzwvdmFyPiBieSAweDAwNDAuCi0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5Gb3IgZXhhbXBsZSwgYSA8a2JkPlxjSjwva2JkPiBtYXRjaGVzIGEgTElORSBGRUVEIChVKzAwMEEpLAotICogICAgICAgICAgIGFuZCBhIDxrYmQ+XGNbPC9rYmQ+IG1hdGNoZXMgYW4gRVNDQVBFIChVKzAwMUIpLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPmEgbm9uLW1ldGEgY2hhcmFjdGVyCi0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgY2hhcmFjdGVyLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxLQkQ+XDwvS0JEPiArIGEgbWV0YSBjaGFyYWN0ZXIKLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBtZXRhIGNoYXJhY3Rlci4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlx1MDA1Y3g8L2tiZD48dmFyPkhIPC92YXI+IDxrYmQ+XHUwMDVjeHs8L2tiZD48dmFyPkhISEg8L3Zhcj48a2JkPn08L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIGEgY2hhcmFjdGVyIG9mIHdoaWNoIGNvZGUgcG9pbnQgaXMgPHZhcj5ISDwvdmFyPiAoSGV4YWRlY2ltYWwpIGluIFVuaWNvZGUuCi0gKiAgICAgICAgICAgWW91IGNhbiB3cml0ZSBqdXN0IDIgZGlnaXRzIGZvciA8a2JkPlx1MDA1Y3g8L2tiZD48dmFyPkhIPC92YXI+LCBhbmQKLSAqICAgICAgICAgICB2YXJpYWJsZSBsZW5ndGggZGlnaXRzIGZvciA8a2JkPlx1MDA1Y3h7PC9rYmQ+PHZhcj5ISEhIPC92YXI+PGtiZD59PC9rYmQ+LgotICoKLSAqICAgICAgIDwhLS0KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHUwMDVjIHU8L2tiZD48dmFyPkhISEg8L3Zhcj4KLSAqICAgICAgIDxkZD5NYXRjaGVzIGEgY2hhcmFjdGVyIG9mIHdoaWNoIGNvZGUgcG9pbnQgaXMgPHZhcj5ISEhIPC92YXI+IChIZXhhZGVjaW1hbCkgaW4gVW5pY29kZS4KLSAqICAgICAgIC0tPgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHUwMDVjdjwva2JkPjx2YXI+SEhISEhIPC92YXI+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGNoYXJhY3RlciBvZiB3aGljaCBjb2RlIHBvaW50IGlzIDx2YXI+SEhISEhIPC92YXI+IChIZXhhZGVjaW1hbCkgaW4gVW5pY29kZS4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxnPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGdyYXBoZW1lLgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+SXQgaXMgZXF1aXZhbGVudCB0byA8a2JkPig/W1xwe0FTU0lHTkVEfV0tW1xwe019XHB7Q31dKT8oPzpccHtNfXxbXHh7MDk0RH1ceHswOUNEfVx4ezBBNER9XHh7MEFDRH1ceHswQjNEfVx4ezBCQ0R9XHh7MEM0RH1ceHswQ0NEfVx4ezBENER9XHh7MEUzQX1ceHswRjg0fV1ccHtMfXxbXHh7MTE2MH0tXHh7MTFBN31dfFtceHsxMUE4fS1ceHsxMUZGfV18W1x4e0ZGOUV9XHh7RkY5Rn1dKSo8L2tiZD4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxYPC9rYmQ+Ci0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5NYXRjaGVzIGEgY29tYmluaW5nIGNoYXJhY3RlciBzZXF1ZW5jZS4KLSAqICAgICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD4oPzpcUE1ccE0qKTwva2JkPgotICogICAgIDwvZGw+Ci0gKiAgIDwvbGk+Ci0gKgotICogICA8bGk+Q2hhcmFjdGVyIGNsYXNzCi0gKiAgICAgPGRsPgotKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+Wzwva2JkPjx2YXI+UjxzdWI+MTwvc3ViPjwvdmFyPjx2YXI+UjxzdWI+Mjwvc3ViPjwvdmFyPjx2YXI+Li4uPC92YXI+PHZhcj5SPHN1Yj5uPC9zdWI+PC92YXI+PGtiZD5dPC9rYmQ+ICh3aXRob3V0IDxhIGhyZWY9IiNDT01NQV9PUFRJT04iPiIsIiBvcHRpb248L2E+KQotKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+Wzwva2JkPjx2YXI+UjxzdWI+MTwvc3ViPjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+UjxzdWI+Mjwvc3ViPjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+Li4uPC92YXI+PGtiZD4sPC9rYmQ+PHZhcj5SPHN1Yj5uPC9zdWI+PC92YXI+PGtiZD5dPC9rYmQ+ICh3aXRoIDxhIGhyZWY9IiNDT01NQV9PUFRJT04iPiIsIiBvcHRpb248L2E+KQotICogICAgICAgPGRkPlBvc2l0aXZlIGNoYXJhY3RlciBjbGFzcy4gIEl0IG1hdGNoZXMgYSBjaGFyYWN0ZXIgaW4gcmFuZ2VzLgotICogICAgICAgPGRkPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjoKLSAqICAgICAgIDx1bD4KLSAqICAgICAgICAgPGxpIGNsYXNzPSJSRUdFWCI+QSBjaGFyYWN0ZXIgKGluY2x1ZGluZyA8S2JkPlxlIFxmIFxuIFxyIFx0PC9rYmQ+IDxrYmQ+XHUwMDVjeDwva2JkPjx2YXI+SEg8L3Zhcj4gPGtiZD5cdTAwNWN4ezwva2JkPjx2YXI+SEhISDwvdmFyPjxrYmQ+fTwva2JkPiA8IS0ta2JkPlx1MDA1YyB1PC9rYmQ+PHZhcj5ISEhIPC92YXItLT4gPGtiZD5cdTAwNWN2PC9rYmQ+PHZhcj5ISEhISEg8L3Zhcj4pCi0gKiAgICAgICAgICAgICA8cD5UaGlzIHJhbmdlIG1hdGNoZXMgdGhlIGNoYXJhY3Rlci4KLSAqICAgICAgICAgPGxpIGNsYXNzPSJSRUdFWCI+PHZhcj5DPHN1Yj4xPC9zdWI+PC92YXI+PGtiZD4tPC9rYmQ+PHZhcj5DPHN1Yj4yPC9zdWI+PC92YXI+Ci0gKiAgICAgICAgICAgICA8cD5UaGlzIHJhbmdlIG1hdGNoZXMgYSBjaGFyYWN0ZXIgd2hpY2ggaGFzIGEgY29kZSBwb2ludCB0aGF0IGlzID49IDx2YXI+QzxzdWI+MTwvc3ViPjwvdmFyPidzIGNvZGUgcG9pbnQgYW5kICZsdDs9IDx2YXI+QzxzdWI+Mjwvc3ViPjwvdmFyPidzIGNvZGUgcG9pbnQuCi0rICogICAgICAgICA8bGkgY2xhc3M9IlJFR0VYIj5BIFBPU0lYIGNoYXJhY3RlciBjbGFzczogPEtiZD5bOmFscGhhOl0gWzphbG51bTpdIFs6YXNjaWk6XSBbOmNudHJsOl0gWzpkaWdpdDpdIFs6Z3JhcGg6XSBbOmxvd2VyOl0gWzpwcmludDpdIFs6cHVuY3Q6XSBbOnNwYWNlOl0gWzp1cHBlcjpdIFs6eGRpZ2l0Ol08L2tiZD4sCi0rICogICAgICAgICAgICAgYW5kIG5lZ2F0aXZlIFBPU0lYIGNoYXJhY3RlciBjbGFzc2VzIGluIFBlcmwgbGlrZSA8a2JkPls6XmFscGhhOl08L2tiZD4KLSAqICAgICAgICAgICAgIDxwPi4uLgotICogICAgICAgICA8bGkgY2xhc3M9IlJFR0VYIj48a2JkPlxkIFxEIFxzIFxTIFx3IFxXIFxwezwva2JkPjx2YXI+bmFtZTwvdmFyPjxrYmQ+fSBcUHs8L2tiZD48dmFyPm5hbWU8L3Zhcj48a2JkPn08L2tiZD4KLSAqICAgICAgICAgICAgIDxwPlRoZXNlIGV4cHJlc3Npb25zIHNwZWNpZmllcyB0aGUgc2FtZSByYW5nZXMgYXMgdGhlIGZvbGxvd2luZyBleHByZXNzaW9ucy4KLSAqICAgICAgIDwvdWw+Ci0gKiAgICAgICA8cCBjbGFzcz0iUkVHRVgiPkVudW1lcmF0ZWQgcmFuZ2VzIGFyZSBtZXJnZWQgKHVuaW9uIG9wZXJhdGlvbikuCi0gKiAgICAgICAgICA8a2JkPlthLWVjLXpdPC9rYmQ+IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5bYS16XTwva2JkPgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+W148L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj48L3Zhcj48dmFyPlI8c3ViPjI8L3N1Yj48L3Zhcj48dmFyPi4uLjwvdmFyPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjxrYmQ+XTwva2JkPiAod2l0aG91dCBhIDxhIGhyZWY9IiNDT01NQV9PUFRJT04iPiIsIiBvcHRpb248L2E+KQotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5bXjwva2JkPjx2YXI+UjxzdWI+MTwvc3ViPjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+UjxzdWI+Mjwvc3ViPjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+Li4uPC92YXI+PGtiZD4sPC9rYmQ+PHZhcj5SPHN1Yj5uPC9zdWI+PC92YXI+PGtiZD5dPC9rYmQ+ICh3aXRoIGEgPGEgaHJlZj0iI0NPTU1BX09QVElPTiI+IiwiIG9wdGlvbjwvYT4pCi0gKiAgICAgICA8ZGQ+TmVnYXRpdmUgY2hhcmFjdGVyIGNsYXNzLiAgSXQgbWF0Y2hlcyBhIGNoYXJhY3RlciBub3QgaW4gcmFuZ2VzLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD9bPC9rYmQ+PHZhcj5yYW5nZXM8L3Zhcj48a2JkPl08L2tiZD48dmFyPm9wPC92YXI+PGtiZD5bPC9rYmQ+PHZhcj5yYW5nZXM8L3Zhcj48a2JkPl08L2tiZD48dmFyPm9wPC92YXI+PGtiZD5bPC9rYmQ+PHZhcj5yYW5nZXM8L3Zhcj48a2JkPl08L2tiZD4gLi4uIDxLYmQ+KTwva2JkPgotICogICAgICAgKDx2YXI+b3A8L3Zhcj4gaXMgPGtiZD4tPC9rYmQ+IG9yIDxrYmQ+Kzwva2JkPiBvciA8a2JkPiY8L2tiZD4uKQotICogICAgICAgPGRkPlN1YnRyYWN0aW9uIG9yIHVuaW9uIG9yIGludGVyc2VjdGlvbiBmb3IgY2hhcmFjdGVyIGNsYXNzZXMuCi0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5Gb3IgZXhtYXBsZSwgPGtiZD4oP1tBLVpdLVtDRl0pPC9rYmQ+IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5bQS1CRC1FRy1aXTwva2JkPiwgYW5kIDxrYmQ+KD9bMHgwMC0weDdmXS1bS10mW1xwe0x1fV0pPC9rYmQ+IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5bQS1KTC1aXTwva2JkPi4KLSAqICAgICAgIDxkZD5UaGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9ucyBpcyBhIDx1PnBvc2l0aXZlIGNoYXJhY3RlciBjbGFzczwvdT4KLSAqICAgICAgICAgICBldmVuIGlmIGFuIGV4cHJlc3Npb24gaW5jbHVkZXMgYW55IG5lZ2F0aXZlIGNoYXJhY3RlciBjbGFzc2VzLgotICogICAgICAgICAgIFlvdSBoYXZlIHRvIHRha2UgY2FyZSBvbiB0aGlzIGluIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcuCi0gKiAgICAgICAgICAgRm9yIGluc3RhbmNlLCA8a2JkPig/W15iXSk8L2tiZD4gaXMgZXF1aXZhbGVudCB0byA8a2JkPltceDAwLWFjLVx4ezEwZmZmZn1dPC9rYmQ+LAotICogICAgICAgICAgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5bXmJdPC9rYmQ+IGluIGNhc2Utc2Vuc2l0aXZlIG1hdGNoaW5nLgotICogICAgICAgICAgIEJ1dCwgaW4gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgPGtiZD4oP1teYl0pPC9rYmQ+IG1hdGNoZXMgYW55IGNoYXJhY3RlciBiZWNhdXNlCi0gKiAgICAgICAgICAgaXQgaW5jbHVkZXMgJzxrYmQ+Qjwva2JkPicgYW5kICc8a2JkPkI8L2tiZD4nIG1hdGNoZXMgJzxrYmQ+Yjwva2JkPicKLSAqICAgICAgICAgICB0aG91Z2ggPGtiZD5bXmJdPC9rYmQ+IGlzIHByb2Nlc3NlZCBhcyA8a2JkPlteQmJdPC9rYmQ+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+Wzwva2JkPjx2YXI+UjxzdWI+MTwvc3ViPlI8c3ViPjI8L3N1Yj4uLi48L3Zhcj48a2JkPi1bPC9rYmQ+PHZhcj5SPHN1Yj5uPC9zdWI+UjxzdWI+bisxPC9zdWI+Li4uPC92YXI+PGtiZD5dXTwva2JkPiAod2l0aCBhbiA8YSBocmVmPSIjWF9PUFRJT04iPiJYIiBvcHRpb248L2E+KTwvZHQ+Ci0gKiAgICAgICA8ZGQ+Q2hhcmFjdGVyIGNsYXNzIHN1YnRyYWN0aW9uIGZvciB0aGUgWE1MIFNjaGVtYS4KLSAqICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGlzIHN5bnRheCB3aGVuIHlvdSBzcGVjaWZ5IGFuIDxhIGhyZWY9IiNYX09QVElPTiI+IlgiIG9wdGlvbjwvYT4uCi0gKiAgICAgICAgICAgCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxkPC9rYmQ+Ci0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5FcXVpdmFsZW50IHRvIDxrYmQ+WzAtOV08L2tiZD4uCi0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjVV9PUFRJT04iPmEgInUiIG9wdGlvbjwvYT4gaXMgc2V0LCBpdCBpcyBlcXVpdmFsZW50IHRvCi0gKiAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlxwe05kfTwva2JkPjwvc3Bhbj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cRDwva2JkPgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlteMC05XTwva2JkPgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bwotICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5cUHtOZH08L2tiZD48L3NwYW4+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHM8L2tiZD4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bIFxmXG5cclx0XTwva2JkPgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bwotICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5bIFxmXG5cclx0XHB7Wn1dPC9rYmQ+PC9zcGFuPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxTPC9rYmQ+Ci0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5FcXVpdmFsZW50IHRvIDxrYmQ+W14gXGZcblxyXHRdPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjVV9PUFRJT04iPmEgInUiIG9wdGlvbjwvYT4gaXMgc2V0LCBpdCBpcyBlcXVpdmFsZW50IHRvCi0gKiAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlteIFxmXG5cclx0XHB7Wn1dPC9rYmQ+PC9zcGFuPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlx3PC9rYmQ+Ci0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5FcXVpdmFsZW50IHRvIDxrYmQ+W2EtekEtWjAtOV9dPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjVV9PUFRJT04iPmEgInUiIG9wdGlvbjwvYT4gaXMgc2V0LCBpdCBpcyBlcXVpdmFsZW50IHRvCi0gKiAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPltccHtMdX1ccHtMbH1ccHtMb31ccHtOZH1fXTwva2JkPjwvc3Bhbj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cVzwva2JkPgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlteYS16QS1aMC05X108L2tiZD4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+W15ccHtMdX1ccHtMbH1ccHtMb31ccHtOZH1fXTwva2JkPjwvc3Bhbj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5ccHs8L2tiZD48dmFyPm5hbWU8L3Zhcj48a2JkPn08L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHNwZWNpZmllZCBHZW5lcmFsIENhdGVnb3J5ICh0aGUgc2Vjb25kIGZpZWxkIGluIDxhIGhyZWY9ImZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvVU5JREFUQS9Vbmljb2RlRGF0YS50eHQiPjxrYmQ+VW5pY29kZURhdGEudHh0PC9rYmQ+PC9hPikgb3IgdGhlIHNwZWNpZmllZCA8YSBocmVmPSJmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvQmxvY2tzLnR4dCI+QmxvY2s8L2E+LgotICogICAgICAgVGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgYXZhaWxhYmxlOgotICogICAgICAgPGRsPgotICogICAgICAgICA8ZHQ+VW5pY29kZSBHZW5lcmFsIENhdGVnb3JpZXM6Ci0gKiAgICAgICAgIDxkZD48a2JkPgotICogICAgICAgTCwgTSwgTiwgWiwgQywgUCwgUywgTHUsIExsLCBMdCwgTG0sIExvLCBNbiwgTWUsIE1jLCBOZCwgTmwsIE5vLCBacywgWmwsIFpwLAotICogICAgICAgQ2MsIENmLCBDbiwgQ28sIENzLCBQZCwgUHMsIFBlLCBQYywgUG8sIFNtLCBTYywgU2ssIFNvLAotICogICAgICAgICA8L2tiZD4KLSAqICAgICAgICAgPGRkPihDdXJyZW50bHkgdGhlIENuIGNhdGVnb3J5IGluY2x1ZGVzIFUrMTAwMDAtVSsxMEZGRkYgY2hhcmFjdGVycykKLSAqICAgICAgICAgPGR0PlVuaWNvZGUgQmxvY2tzOgotICogICAgICAgICA8ZGQ+PGtiZD4KLSAqICAgICAgIEJhc2ljIExhdGluLCBMYXRpbi0xIFN1cHBsZW1lbnQsIExhdGluIEV4dGVuZGVkLUEsIExhdGluIEV4dGVuZGVkLUIsCi0gKiAgICAgICBJUEEgRXh0ZW5zaW9ucywgU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzLCBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MsIEdyZWVrLAotICogICAgICAgQ3lyaWxsaWMsIEFybWVuaWFuLCBIZWJyZXcsIEFyYWJpYywgRGV2YW5hZ2FyaSwgQmVuZ2FsaSwgR3VybXVraGksIEd1amFyYXRpLAotICogICAgICAgT3JpeWEsIFRhbWlsLCBUZWx1Z3UsIEthbm5hZGEsIE1hbGF5YWxhbSwgVGhhaSwgTGFvLCBUaWJldGFuLCBHZW9yZ2lhbiwKLSAqICAgICAgIEhhbmd1bCBKYW1vLCBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsLCBHcmVlayBFeHRlbmRlZCwgR2VuZXJhbCBQdW5jdHVhdGlvbiwKLSAqICAgICAgIFN1cGVyc2NyaXB0cyBhbmQgU3Vic2NyaXB0cywgQ3VycmVuY3kgU3ltYm9scywgQ29tYmluaW5nIE1hcmtzIGZvciBTeW1ib2xzLAotICogICAgICAgTGV0dGVybGlrZSBTeW1ib2xzLCBOdW1iZXIgRm9ybXMsIEFycm93cywgTWF0aGVtYXRpY2FsIE9wZXJhdG9ycywKLSAqICAgICAgIE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsLCBDb250cm9sIFBpY3R1cmVzLCBPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiwKLSAqICAgICAgIEVuY2xvc2VkIEFscGhhbnVtZXJpY3MsIEJveCBEcmF3aW5nLCBCbG9jayBFbGVtZW50cywgR2VvbWV0cmljIFNoYXBlcywKLSAqICAgICAgIE1pc2NlbGxhbmVvdXMgU3ltYm9scywgRGluZ2JhdHMsIENKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiwgSGlyYWdhbmEsCi0gKiAgICAgICBLYXRha2FuYSwgQm9wb21vZm8sIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8sIEthbmJ1biwKLSAqICAgICAgIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMsIENKSyBDb21wYXRpYmlsaXR5LCBDSksgVW5pZmllZCBJZGVvZ3JhcGhzLAotICogICAgICAgSGFuZ3VsIFN5bGxhYmxlcywgSGlnaCBTdXJyb2dhdGVzLCBIaWdoIFByaXZhdGUgVXNlIFN1cnJvZ2F0ZXMsIExvdyBTdXJyb2dhdGVzLAotICogICAgICAgUHJpdmF0ZSBVc2UsIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMsIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zLAotICogICAgICAgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BLCBDb21iaW5pbmcgSGFsZiBNYXJrcywgQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMsCi0gKiAgICAgICBTbWFsbCBGb3JtIFZhcmlhbnRzLCBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUIsIFNwZWNpYWxzLAotICogICAgICAgSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMKLSAqICAgICAgICAgPC9rYmQ+Ci0gKiAgICAgICAgIDxkdD5PdGhlcnM6Ci0gKiAgICAgICAgIDxkZD48a2JkPkFMTDwva2JkPiAoRXF1aXZhbGVudCB0byA8a2JkPltcdTAwNWN1MDAwMC1cdTAwNWN2MTBGRkZGXTwva2JkPikKLSAqICAgICAgICAgPGRkPjxrYmQ+QVNTR0lORUQ8L2tiZD4gKDxrYmQ+XHB7QVNTSUdORUR9PC9rYmQ+IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5cUHtDbn08L2tiZD4pCi0gKiAgICAgICAgIDxkZD48a2JkPlVOQVNTR0lORUQ8L2tiZD4KLSAqICAgICAgICAgICAgICg8a2JkPlxwe1VOQVNTSUdORUR9PC9rYmQ+IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5ccHtDbn08L2tiZD4pCi0gKiAgICAgICA8L2RsPgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XFB7PC9rYmQ+PHZhcj5uYW1lPC92YXI+PGtiZD59PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBvbmUgY2hhcmFjdGVyIG5vdCBpbiB0aGUgc3BlY2lmaWVkIEdlbmVyYWwgQ2F0ZWdvcnkgb3IgdGhlIHNwZWNpZmllZCBCbG9jay4KLSAqICAgICA8L2RsPgotICogICA8L2xpPgotICoKLSAqICAgPGxpPlNlbGVjdGlvbiBhbmQgUXVhbnRpZmllcgotICogICAgIDxkbD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+fDwva2JkPjxWQVI+WTwvVkFSPgotICogICAgICAgPGRkPi4uLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+KjwvS0JEPgotICogICAgICAgPGRkPk1hdGNoZXMgMCBvciBtb3JlIDx2YXI+WDwvdmFyPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPis8L0tCRD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIDEgb3IgbW9yZSA8dmFyPlg8L3Zhcj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD4/PC9LQkQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyAwIG9yIDEgPHZhcj5YPC92YXI+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjx2YXI+WDwvdmFyPjxrYmQ+ezwva2JkPjx2YXI+bnVtYmVyPC92YXI+PGtiZD59PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyA8dmFyPm51bWJlcjwvdmFyPiB0aW1lcy4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48dmFyPlg8L3Zhcj48a2JkPns8L2tiZD48dmFyPm1pbjwvdmFyPjxrYmQ+LH08L2tiZD4KLSAqICAgICAgIDxkZD4uLi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48dmFyPlg8L3Zhcj48a2JkPns8L2tiZD48dmFyPm1pbjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+bWF4PC92YXI+PGtiZD59PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Li4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD4qPzwva2JkPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD4rPzwva2JkPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD4/Pzwva2JkPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PHZhcj5YPC92YXI+PGtiZD57PC9rYmQ+PHZhcj5taW48L3Zhcj48a2JkPix9Pzwva2JkPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PHZhcj5YPC92YXI+PGtiZD57PC9rYmQ+PHZhcj5taW48L3Zhcj48a2JkPiw8L2tiZD48dmFyPm1heDwvdmFyPjxrYmQ+fT88L2tiZD4KLSAqICAgICAgIDxkZD5Ob24tZ3JlZWR5IG1hdGNoaW5nLgotICogICAgIDwvZGw+Ci0gKiAgIDwvbGk+Ci0gKgotICogICA8bGk+R3JvdXBpbmcsIENhcHR1cmluZywgYW5kIEJhY2stcmVmZXJlbmNlCi0gKiAgICAgPGRsPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PEtCRD4oPzo8L2tiZD48VkFSPlg8L1ZBUj48a2JkPik8L0tCRD4KLSAqICAgICAgIDxkZD5Hcm91cGluZy4gIjxLQkQ+Zm9vKzwvS0JEPiIgbWF0Y2hlcyAiPEtCRD5mb288L0tCRD4iIG9yICI8S0JEPmZvb29vPC9LQkQ+Ii4KLSAqICAgICAgIElmIHlvdSB3YW50IGl0IG1hdGNoZXMgIjxLQkQ+Zm9vZm9vPC9LQkQ+IiBvciAiPEtCRD5mb29mb29mb288L0tCRD4iLAotICogICAgICAgeW91IGhhdmUgdG8gd3JpdGUgIjxLQkQ+KD86Zm9vKSs8L0tCRD4iLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxLQkQ+KDwva2JkPjxWQVI+WDwvVkFSPjxrYmQ+KTwvS0JEPgotICogICAgICAgPGRkPkdyb3VwaW5nIHdpdGggY2FwdHVyaW5nLgotICogSXQgbWFrZSBhIGdyb3VwIGFuZCBhcHBsaWNhdGlvbnMgY2FuIGtub3cKLSAqIHdoZXJlIGluIHRhcmdldCB0ZXh0IGEgZ3JvdXAgbWF0Y2hlZCB3aXRoIG1ldGhvZHMgb2YgYSA8Y29kZT5NYXRjaDwvY29kZT4gaW5zdGFuY2UKLSAqIGFmdGVyIDxjb2RlPjxhIGhyZWY9IiNtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLnJlZ2V4Lk1hdGNoKSI+bWF0Y2hlcyhTdHJpbmcsTWF0Y2gpPC9hPjwvY29kZT4uCi0gKiBUaGUgMHRoIGdyb3VwIG1lYW5zIHdob2xlIG9mIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgotICogVGhlIDxWQVI+TjwvVkFSPnRoIGdvcnVwIGlzIHRoZSBpbnNpZGUgb2YgdGhlIDxWQVI+TjwvVkFSPnRoIGxlZnQgcGFyZW50aGVzaXMuCi0gKiAKLSAqICAgPHA+Rm9yIGluc3RhbmNlLCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcwotICogICAiPEZPTlQgY29sb3I9Ymx1ZT48S0JEPiAqKFteJmx0OzpdKikgKyZsdDsoW14mZ3Q7XSopJmd0OyAqPC9LQkQ+PC9GT05UPiIKLSAqICAgYW5kIHRhcmdldCB0ZXh0IGlzCi0gKiAgICI8Rk9OVCBjb2xvcj1yZWQ+PEtCRD5Gcm9tOiBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OzwvS0JEPjwvRk9OVD4iOgotICogICA8dWw+Ci0gKiAgICAgPGxpPjxjb2RlPk1hdGNoLmdldENhcHR1cmVkVGV4dCgwKTwvY29kZT46Ci0gKiAgICAgIjxGT05UIGNvbG9yPXJlZD48S0JEPiBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OzwvS0JEPjwvRk9OVD4iCi0gKiAgICAgPGxpPjxjb2RlPk1hdGNoLmdldENhcHR1cmVkVGV4dCgxKTwvY29kZT46ICI8Rk9OVCBjb2xvcj1yZWQ+PEtCRD5UQU1VUkEgS2VudDwvS0JEPjwvRk9OVD4iCi0gKiAgICAgPGxpPjxjb2RlPk1hdGNoLmdldENhcHR1cmVkVGV4dCgyKTwvY29kZT46ICI8Rk9OVCBjb2xvcj1yZWQ+PEtCRD5rZW50QHRybC5pYm0uY28uanA8L0tCRD48L0ZPTlQ+IgotICogICA8L3VsPgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XDEgXDIgXDMgXDQgXDUgXDYgXDcgXDggXDk8L2tiZD4KLSAqICAgICAgIDxkZD4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Pjwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPkluZGVwZW5kZW50IGV4cHJlc3Npb24gZ3JvdXAuIC4uLi4uLi4uLi4uLi4uLi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/PC9rYmQ+PHZhcj5vcHRpb25zPC92YXI+PGtiZD46PC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/PC9rYmQ+PHZhcj5vcHRpb25zPC92YXI+PGtiZD4tPC9rYmQ+PHZhcj5vcHRpb25zMjwvdmFyPjxrYmQ+Ojwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAqICAgICAgIDxkZD5UaGUgPHZhcj5vcHRpb25zPC92YXI+IG9yIHRoZSA8dmFyPm9wdGlvbnMyPC92YXI+IGNvbnNpc3RzIG9mICdpJyAnbScgJ3MnICd3Jy4KLSAqICAgICAgICAgICBOb3RlIHRoYXQgaXQgY2FuIG5vdCBjb250YWluICd1Jy4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/PC9rYmQ+PHZhcj5vcHRpb25zPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/PC9rYmQ+PHZhcj5vcHRpb25zPC92YXI+PGtiZD4tPC9rYmQ+PHZhcj5vcHRpb25zMjwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPi4uLi4uLgotICogICAgICAgPGRkPlRoZXNlIGV4cHJlc3Npb25zIG11c3QgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGdyb3VwLgotICogICAgIDwvZGw+Ci0gKiAgIDwvbGk+Ci0gKgotICogICA8bGk+QW5jaG9yCi0gKiAgICAgPGRsPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cQTwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGJlZ2lubmlnIG9mIHRoZSB0ZXh0LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XFo8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHRleHQsIG9yIGJlZm9yZSBhbiBFT0wgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQsCi0gKiAgICAgICAgICAgb3IgQ0FSUklBR0UgUkVUVVJOICsgTElORSBGRUVEIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cejwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgdGV4dC4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPl48L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuICBJdCBpcyBlcXVpdmFsZW50IHRvIDxzcGFuIGNsYXNzPSJSRUdFWCI+PEtiZD5cQTwva2JkPjwvc3Bhbj4uCi0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjTV9PUFRJT04iPmEgIm0iIG9wdGlvbjwvYT4gaXMgc2V0LAotICogICAgICAgICAgIGl0IG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dCwgb3IgYWZ0ZXIgb25lIG9mIEVPTCBjaGFyYWN0ZXJzICgKLSAqICAgICAgICAgICBMSU5FIEZFRUQgKFUrMDAwQSksIENBUlJJQUdFIFJFVFVSTiAoVSswMDBEKSwgTElORSBTRVBBUkFUT1IgKFUrMjAyOCksCi0gKiAgICAgICAgICAgUEFSQUdSQVBIIFNFUEFSQVRPUiAoVSsyMDI5KS4pCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4kPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBvciBiZWZvcmUgYW4gRU9MIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LAotICogICAgICAgICAgIG9yIENBUlJJQUdFIFJFVFVSTiArIExJTkUgRkVFRCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI01fT1BUSU9OIj5hICJtIiBvcHRpb248L2E+IGlzIHNldCwKLSAqICAgICAgICAgICBpdCBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHRleHQsIG9yIGJlZm9yZSBhbiBFT0wgY2hhcmFjdGVyLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XGI8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHdvcmQgYm91bmRhcnkuCi0gKiAgICAgICAgICAgKFNlZSA8YSBocmVmPSIjV19PUFRJT04iPmEgInciIG9wdGlvbjwvYT4pCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cQjwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgbm9uIHdvcmQgYm91bmRhcnkuCi0gKiAgICAgICAgICAgKFNlZSA8YSBocmVmPSIjV19PUFRJT04iPmEgInciIG9wdGlvbjwvYT4pCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cJmx0Ozwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBhIHdvcmQuCi0gKiAgICAgICAgICAgKFNlZSA8YSBocmVmPSIjV19PUFRJT04iPmEgInciIG9wdGlvbjwvYT4pCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cJmd0Ozwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGVuZCBvZiBhIHdvcmQuCi0gKiAgICAgICAgICAgKFNlZSA8YSBocmVmPSIjV19PUFRJT04iPmEgInciIG9wdGlvbjwvYT4pCi0gKiAgICAgPC9kbD4KLSAqICAgPC9saT4KLSAqICAgPGxpPkxvb2thaGVhZCBhbmQgbG9va2JlaGluZAotICogICAgIDxkbD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD89PC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TG9va2FoZWFkLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8hPC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TmVnYXRpdmUgbG9va2FoZWFkLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8mbHQ7PTwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPkxvb2tiZWhpbmQuCi0gKiAgICAgICA8ZGQ+KE5vdGUgZm9yIHRleHQgY2FwdHVyaW5nLi4uLi4uKQotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8mbHQ7ITwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPk5lZ2F0aXZlIGxvb2tiZWhpbmQuCi0gKiAgICAgPC9kbD4KLSAqICAgPC9saT4KLSAqCi0gKiAgIDxsaT5NaXNjLgotICogICAgIDxkbD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8oPC9LYmQ+PHZhcj5jb25kaXRpb248L3Zhcj48S2JkPik8L2tiZD48dmFyPnllcy1wYXR0ZXJuPC92YXI+PGtiZD58PC9rYmQ+PHZhcj5uby1wYXR0ZXJuPC92YXI+PGtiZD4pPC9rYmQ+LAotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPyg8L2tiZD48dmFyPmNvbmRpdGlvbjwvdmFyPjxrYmQ+KTwva2JkPjx2YXI+eWVzLXBhdHRlcm48L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD4uLi4uLi4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8jPC9rYmQ+PHZhcj5jb21tZW50PC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Q29tbWVudC4gIEEgY29tbWVudCBzdHJpbmcgY29uc2lzdHMgb2YgY2hhcmFjdGVycyBleGNlcHQgJzxrYmQ+KTwva2JkPicuCi0gKiAgICAgICAgICAgWW91IGNhbiBub3Qgd3JpdGUgY29tbWVudHMgaW4gY2hhcmFjdGVyIGNsYXNzZXMgYW5kIGJlZm9yZSBxdWFudGlmaWVycy4KLSAqICAgICA8L2RsPgotICogICA8L2xpPgotICogPC91bD4KLSAqCi0gKgotICogPGhyIHdpZHRoPSI1MCUiPgotICogPGgzPkJORiBmb3IgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbjwvaDM+Ci0gKiA8cHJlPgotICogcmVnZXggOjo9ICgnKD8nIG9wdGlvbnMgJyknKT8gdGVybSAoJ3wnIHRlcm0pKgotICogdGVybSA6Oj0gZmFjdG9yKwotICogZmFjdG9yIDo6PSBhbmNob3JzIHwgYXRvbSAoKCcqJyB8ICcrJyB8ICc/JyB8IG1pbm1heCApICc/Jz8gKT8KLSAqICAgICAgICAgICAgfCAnKD8jJyBbXildKiAnKScKLSAqIG1pbm1heCA6Oj0gJ3snIChbMC05XSsgfCBbMC05XSsgJywnIHwgJywnIFswLTldKyB8IFswLTldKyAnLCcgWzAtOV0rKSAnfScKLSAqIGF0b20gOjo9IGNoYXIgfCAnLicgfCBjaGFyLWNsYXNzIHwgJygnIHJlZ2V4ICcpJyB8ICcoPzonIHJlZ2V4ICcpJyB8ICdcJyBbMC05XQotICogICAgICAgICAgfCAnXHcnIHwgJ1xXJyB8ICdcZCcgfCAnXEQnIHwgJ1xzJyB8ICdcUycgfCBjYXRlZ29yeS1ibG9jayB8ICdcWCcKLSAqICAgICAgICAgIHwgJyg/PicgcmVnZXggJyknIHwgJyg/JyBvcHRpb25zICc6JyByZWdleCAnKScKLSAqICAgICAgICAgIHwgJyg/JyAoJygnIFswLTldICcpJyB8ICcoJyBhbmNob3JzICcpJyB8IGxvb2tzKSB0ZXJtICgnfCcgdGVybSk/ICcpJwotICogb3B0aW9ucyA6Oj0gW2ltc3ddKiAoJy0nIFtpbXN3XSspPwotICogYW5jaG9ycyA6Oj0gJ14nIHwgJyQnIHwgJ1xBJyB8ICdcWicgfCAnXHonIHwgJ1xiJyB8ICdcQicgfCAnXCZsdDsnIHwgJ1w+JwotICogbG9va3MgOjo9ICcoPz0nIHJlZ2V4ICcpJyAgfCAnKD8hJyByZWdleCAnKScKLSAqICAgICAgICAgICB8ICcoPyZsdDs9JyByZWdleCAnKScgfCAnKD8mbHQ7IScgcmVnZXggJyknCi0gKiBjaGFyIDo6PSAnXFwnIHwgJ1wnIFtlZm5ydHZdIHwgJ1xjJyBbQC1fXSB8IGNvZGUtcG9pbnQgfCBjaGFyYWN0ZXItMQotICogY2F0ZWdvcnktYmxvY2sgOjo9ICdcJyBbcFBdIGNhdGVnb3J5LXN5bWJvbC0xCi0gKiAgICAgICAgICAgICAgICAgICAgfCAoJ1xweycgfCAnXFB7JykgKGNhdGVnb3J5LXN5bWJvbCB8IGJsb2NrLW5hbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvdGhlci1wcm9wZXJ0aWVzKSAnfScKLSAqIGNhdGVnb3J5LXN5bWJvbC0xIDo6PSAnTCcgfCAnTScgfCAnTicgfCAnWicgfCAnQycgfCAnUCcgfCAnUycKLSAqIGNhdGVnb3J5LXN5bWJvbCA6Oj0gY2F0ZWdvcnktc3ltYm9sLTEgfCAnTHUnIHwgJ0xsJyB8ICdMdCcgfCAnTG0nIHwgTG8nCi0gKiAgICAgICAgICAgICAgICAgICAgIHwgJ01uJyB8ICdNZScgfCAnTWMnIHwgJ05kJyB8ICdObCcgfCAnTm8nCi0gKiAgICAgICAgICAgICAgICAgICAgIHwgJ1pzJyB8ICdabCcgfCAnWnAnIHwgJ0NjJyB8ICdDZicgfCAnQ24nIHwgJ0NvJyB8ICdDcycKLSAqICAgICAgICAgICAgICAgICAgICAgfCAnUGQnIHwgJ1BzJyB8ICdQZScgfCAnUGMnIHwgJ1BvJwotICogICAgICAgICAgICAgICAgICAgICB8ICdTbScgfCAnU2MnIHwgJ1NrJyB8ICdTbycKLSAqIGJsb2NrLW5hbWUgOjo9IChTZWUgYWJvdmUpCi0gKiBvdGhlci1wcm9wZXJ0aWVzIDo6PSAnQUxMJyB8ICdBU1NJR05FRCcgfCAnVU5BU1NJR05FRCcKLSAqIGNoYXJhY3Rlci0xIDo6PSAoYW55IGNoYXJhY3RlciBleGNlcHQgbWV0YS1jaGFyYWN0ZXJzKQotICoKLSAqIGNoYXItY2xhc3MgOjo9ICdbJyByYW5nZXMgJ10nCi0gKiAgICAgICAgICAgICAgICB8ICcoP1snIHJhbmdlcyAnXScgKFstKyZdICdbJyByYW5nZXMgJ10nKT8gJyknCi0gKiByYW5nZXMgOjo9ICdeJz8gKHJhbmdlIDxhIGhyZWY9IiNDT01NQV9PUFRJT04iPicsJz88L2E+KSsKLSAqIHJhbmdlIDo6PSAnXGQnIHwgJ1x3JyB8ICdccycgfCAnXEQnIHwgJ1xXJyB8ICdcUycgfCBjYXRlZ29yeS1ibG9jawotICogICAgICAgICAgIHwgcmFuZ2UtY2hhciB8IHJhbmdlLWNoYXIgJy0nIHJhbmdlLWNoYXIKLSAqIHJhbmdlLWNoYXIgOjo9ICdcWycgfCAnXF0nIHwgJ1xcJyB8ICdcJyBbLC1lZm5ydHZdIHwgY29kZS1wb2ludCB8IGNoYXJhY3Rlci0yCi0gKiBjb2RlLXBvaW50IDo6PSAnXHgnIGhleC1jaGFyIGhleC1jaGFyCi0gKiAgICAgICAgICAgICAgICB8ICdceHsnIGhleC1jaGFyKyAnfScKLSAqIDwhLS0gICAgICAgICAgICAgICB8ICdcdTAwNWMgdScgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIKLSAqIC0tPiAgICAgICAgICAgICAgIHwgJ1x2JyBoZXgtY2hhciBoZXgtY2hhciBoZXgtY2hhciBoZXgtY2hhciBoZXgtY2hhciBoZXgtY2hhcgotICogaGV4LWNoYXIgOjo9IFswLTlhLWZBLUZdCi0gKiBjaGFyYWN0ZXItMiA6Oj0gKGFueSBjaGFyYWN0ZXIgZXhjZXB0IFxbXS0sKQotICogPC9wcmU+Ci0gKgotICogPGhyIHdpZHRoPSI1MCUiPgotICogPGgzPlRPRE88L2gzPgotICogPHVsPgotICogICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIxOC8iPlVuaWNvZGUgUmVndWxhciBFeHByZXNzaW9uIEd1aWRlbGluZXM8L2E+Ci0gKiAgICAgPHVsPgotICogICAgICAgPGxpPjIuNCBDYW5vbmljYWwgRXF1aXZhbGVudHMKLSAqICAgICAgIDxsaT5MZXZlbCAzCi0gKiAgICAgPC91bD4KLSAqICAgPGxpPlBhcnNpbmcgcGVyZm9ybWFuY2UKLSAqIDwvdWw+Ci0gKgotICogPGhyIHdpZHRoPSI1MCUiPgotICoKLSAqIEBhdXRob3IgVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDsKLSAqIEB2ZXJzaW9uICRJZDogUmVndWxhckV4cHJlc3Npb24uamF2YSx2IDEuNCAyMDA0LzAyLzEyIDIwOjA1OjU1IGVyaWN2YXMgRXhwICQKLSAqLwotcHVibGljIGNsYXNzIFJlZ3VsYXJFeHByZXNzaW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhIHRva2VuIHRyZWUgaW50byBhbiBvcGVyYXRpb24gZmxvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNvbXBpbGUoVG9rZW4gdG9rKSB7Ci0gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdGhpcy5udW1iZXJPZkNsb3N1cmVzID0gMDsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gdGhpcy5jb21waWxlKHRvaywgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgdG9rZW4gdG8gYW4gb3BlcmF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgT3AgY29tcGlsZShUb2tlbiB0b2ssIE9wIG5leHQsIGJvb2xlYW4gcmV2ZXJzZSkgewotICAgICAgICBPcCByZXQ7Ci0gICAgICAgIHN3aXRjaCAodG9rLnR5cGUpIHsKLSAgICAgICAgY2FzZSBUb2tlbi5ET1Q6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVEb3QoKTsKLSAgICAgICAgICAgIHJldC5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uQ0hBUjoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUNoYXIodG9rLmdldENoYXIoKSk7Ci0gICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkFOQ0hPUjoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUFuY2hvcih0b2suZ2V0Q2hhcigpKTsKLSAgICAgICAgICAgIHJldC5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uUkFOR0U6Ci0gICAgICAgIGNhc2UgVG9rZW4uTlJBTkdFOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlUmFuZ2UodG9rKTsKLSAgICAgICAgICAgIHJldC5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uQ09OQ0FUOgotICAgICAgICAgICAgcmV0ID0gbmV4dDsKLSAgICAgICAgICAgIGlmICghcmV2ZXJzZSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB0b2suc2l6ZSgpLTE7ICBpID49IDA7ICBpIC0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbXBpbGUodG9rLmdldENoaWxkKGkpLCByZXQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRvay5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbXBpbGUodG9rLmdldENoaWxkKGkpLCByZXQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uVU5JT046Ci0gICAgICAgICAgICBPcC5Vbmlvbk9wIHVuaSA9IE9wLmNyZWF0ZVVuaW9uKHRvay5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdG9rLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICB1bmkuYWRkRWxlbWVudChjb21waWxlKHRvay5nZXRDaGlsZChpKSwgbmV4dCwgcmV2ZXJzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gdW5pOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0Lm5leHQgaXMgbnVsbC4KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uQ0xPU1VSRToKLSAgICAgICAgY2FzZSBUb2tlbi5OT05HUkVFRFlDTE9TVVJFOgotICAgICAgICAgICAgVG9rZW4gY2hpbGQgPSB0b2suZ2V0Q2hpbGQoMCk7Ci0gICAgICAgICAgICBpbnQgbWluID0gdG9rLmdldE1pbigpOwotICAgICAgICAgICAgaW50IG1heCA9IHRvay5nZXRNYXgoKTsKLSAgICAgICAgICAgIGlmIChtaW4gPj0gMCAmJiBtaW4gPT0gbWF4KSB7IC8vIHtufQotICAgICAgICAgICAgICAgIHJldCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbXBpbGUoY2hpbGQsIHJldCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbiA+IDAgJiYgbWF4ID4gMCkKLSAgICAgICAgICAgICAgICBtYXggLT0gbWluOwotICAgICAgICAgICAgaWYgKG1heCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBYezIsNn0gLT4gWFgoWChYKFhYPyk/KT8pPwotICAgICAgICAgICAgICAgIHJldCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbWF4OyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICBPcC5DaGlsZE9wIHEgPSBPcC5jcmVhdGVRdWVzdGlvbih0b2sudHlwZSA9PSBUb2tlbi5OT05HUkVFRFlDTE9TVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgcS5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgcS5zZXRDaGlsZChjb21waWxlKGNoaWxkLCByZXQsIHJldmVyc2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gcTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9wLkNoaWxkT3Agb3A7Ci0gICAgICAgICAgICAgICAgaWYgKHRvay50eXBlID09IFRva2VuLk5PTkdSRUVEWUNMT1NVUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBPcC5jcmVhdGVOb25HcmVlZHlDbG9zdXJlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2tlbi5DTE9TVVJFCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRNaW5MZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBPcC5jcmVhdGVDbG9zdXJlKHRoaXMubnVtYmVyT2ZDbG9zdXJlcysrKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBPcC5jcmVhdGVDbG9zdXJlKC0xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgb3Auc2V0Q2hpbGQoY29tcGlsZShjaGlsZCwgb3AsIHJldmVyc2UpKTsKLSAgICAgICAgICAgICAgICByZXQgPSBvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtaW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbWluOyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKGNoaWxkLCByZXQsIHJldmVyc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uRU1QVFk6Ci0gICAgICAgICAgICByZXQgPSBuZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5TVFJJTkc6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVTdHJpbmcodG9rLmdldFN0cmluZygpKTsKLSAgICAgICAgICAgIHJldC5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUJhY2tSZWZlcmVuY2UodG9rLmdldFJlZmVyZW5jZU51bWJlcigpKTsKLSAgICAgICAgICAgIHJldC5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uUEFSRU46Ci0gICAgICAgICAgICBpZiAodG9rLmdldFBhcmVuTnVtYmVyKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldCA9IGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBuZXh0LCByZXZlcnNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmV2ZXJzZSkgewotICAgICAgICAgICAgICAgIG5leHQgPSBPcC5jcmVhdGVDYXB0dXJlKHRvay5nZXRQYXJlbk51bWJlcigpLCBuZXh0KTsKLSAgICAgICAgICAgICAgICBuZXh0ID0gY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG5leHQsIHJldmVyc2UpOwotICAgICAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUNhcHR1cmUoLXRvay5nZXRQYXJlbk51bWJlcigpLCBuZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IE9wLmNyZWF0ZUNhcHR1cmUoLXRvay5nZXRQYXJlbk51bWJlcigpLCBuZXh0KTsKLSAgICAgICAgICAgICAgICBuZXh0ID0gY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG5leHQsIHJldmVyc2UpOwotICAgICAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUNhcHR1cmUodG9rLmdldFBhcmVuTnVtYmVyKCksIG5leHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5MT09LQUhFQUQ6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVMb29rKE9wLkxPT0tBSEVBRCwgbmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIGZhbHNlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUb2tlbi5ORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUxvb2soT3AuTkVHQVRJVkVMT09LQUhFQUQsIG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCBmYWxzZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVG9rZW4uTE9PS0JFSElORDoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUxvb2soT3AuTE9PS0JFSElORCwgbmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIHRydWUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRva2VuLk5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUxvb2soT3AuTkVHQVRJVkVMT09LQkVISU5ELCBuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgdHJ1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5JTkRFUEVOREVOVDoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUluZGVwZW5kZW50KG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCByZXZlcnNlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLk1PRElGSUVSR1JPVVA6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVNb2RpZmllcihuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgcmV2ZXJzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRva2VuLk1vZGlmaWVyVG9rZW4pdG9rKS5nZXRPcHRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRva2VuLk1vZGlmaWVyVG9rZW4pdG9rKS5nZXRPcHRpb25zTWFzaygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uQ09ORElUSU9OOgotICAgICAgICAgICAgVG9rZW4uQ29uZGl0aW9uVG9rZW4gY3RvayA9IChUb2tlbi5Db25kaXRpb25Ub2tlbil0b2s7Ci0gICAgICAgICAgICBpbnQgcmVmID0gY3Rvay5yZWZOdW1iZXI7Ci0gICAgICAgICAgICBPcCBjb25kaXRpb24gPSBjdG9rLmNvbmRpdGlvbiA9PSBudWxsID8gbnVsbCA6IGNvbXBpbGUoY3Rvay5jb25kaXRpb24sIG51bGwsIHJldmVyc2UpOwotICAgICAgICAgICAgT3AgeWVzID0gY29tcGlsZShjdG9rLnllcywgbmV4dCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICBPcCBubyA9IGN0b2subm8gPT0gbnVsbCA/IG51bGwgOiBjb21waWxlKGN0b2subm8sIG5leHQsIHJldmVyc2UpOwotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlQ29uZGl0aW9uKG5leHQsIHJlZiwgY29uZGl0aW9uLCB5ZXMsIG5vKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biB0b2tlbiB0eXBlOiAiK3Rvay50eXBlKTsKLSAgICAgICAgfSAvLyBzd2l0Y2ggKHRvay50eXBlKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotCi0vL1B1YmxpYwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaXMgbWF0Y2hlZCB0byB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGNoYXJbXSAgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCAwLCAgdGFyZ2V0IC5sZW5ndGggLCAoTWF0Y2gpbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4KLSAgICAgKiBpbiBzcGVjaWZpZWQgcmFuZ2Ugb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHBhcmFtIGVuZCAgRW5kIG9mZnNldCArMSBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaXMgbWF0Y2hlZCB0byB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGNoYXJbXSAgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIHN0YXJ0LCBlbmQsIChNYXRjaCludWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybiBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF0Y2ggQSBNYXRjaCBpbnN0YW5jZSBmb3Igc3RvcmluZyBtYXRjaGluZyByZXN1bHQuCi0gICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIDxWQVI+dGFyZ2V0PC9WQVI+OyBvciAtMSBpZiBub3QgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgTWF0Y2ggbWF0Y2gpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIDAsICB0YXJnZXQgLmxlbmd0aCAsIG1hdGNoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuCi0gICAgICogaW4gc3BlY2lmaWVkIHJhbmdlIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZmZzZXQgb2YgdGhlIHJhbmdlLgotICAgICAqIEBwYXJhbSBlbmQgIEVuZCBvZmZzZXQgKzEgb2YgdGhlIHJhbmdlLgotICAgICAqIEBwYXJhbSBtYXRjaCBBIE1hdGNoIGluc3RhbmNlIGZvciBzdG9yaW5nIG1hdGNoaW5nIHJlc3VsdC4KLSAgICAgKiBAcmV0dXJuIE9mZnNldCBvZiB0aGUgc3RhcnQgcG9zaXRpb24gaW4gPFZBUj50YXJnZXQ8L1ZBUj47IG9yIC0xIGlmIG5vdCBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGNoYXJbXSAgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBlbmQsIE1hdGNoIG1hdGNoKSB7Ci0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZXh0IGNvbiA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5jb250ZXh0KSB7Ci0gICAgICAgICAgICBjb24gPSB0aGlzLmNvbnRleHQuaW51c2UgPyBuZXcgQ29udGV4dCgpIDogdGhpcy5jb250ZXh0OwotICAgICAgICAgICAgY29uLnJlc2V0KHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpcy5udW1iZXJPZkNsb3N1cmVzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgbWF0Y2guc2V0TnVtYmVyT2ZHcm91cHModGhpcy5ub2ZwYXJlbik7Ci0gICAgICAgICAgICBtYXRjaC5zZXRTb3VyY2UodGFyZ2V0KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc0JhY2tSZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICBtYXRjaCA9IG5ldyBNYXRjaCgpOwotICAgICAgICAgICAgbWF0Y2guc2V0TnVtYmVyT2ZHcm91cHModGhpcy5ub2ZwYXJlbik7Ci0gICAgICAgICAgICAvLyBOZWVkIG5vdCB0byBjYWxsIHNldFNvdXJjZSgpIGJlY2F1c2UKLSAgICAgICAgICAgIC8vIGEgY2FsbGVyIGNhbiBub3QgYWNjZXNzIHRoaXMgbWF0Y2ggaW5zdGFuY2UuCi0gICAgICAgIH0KLSAgICAgICAgY29uLm1hdGNoID0gbWF0Y2g7Ci0KLSAgICAgICAgaWYgKHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBYTUxTQ0hFTUFfTU9ERSkpIHsKLSAgICAgICAgICAgIGludCBtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBtYXRjaEVuZD0iK21hdGNoRW5kKTsKLSAgICAgICAgICAgIGlmIChtYXRjaEVuZCA9PSBjb24ubGltaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBjb24uc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG1hdGNoRW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgcGF0dGVybiBoYXMgb25seSBmaXhlZCBzdHJpbmcuCi0gICAgICAgICAqIFRoZSBlbmdpbmUgdXNlcyBCb3llci1Nb29yZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nT25seSkgewotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBmaXhlZC1vbmx5OiAiK3RoaXMuZml4ZWRTdHJpbmcpOwotICAgICAgICAgICAgaW50IG8gPSB0aGlzLmZpeGVkU3RyaW5nVGFibGUubWF0Y2hlcyh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0KTsKLSAgICAgICAgICAgIGlmIChvID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBvKTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBvK3RoaXMuZml4ZWRTdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHBhdHRlcm4gY29udGFpbnMgYSBmaXhlZCBzdHJpbmcuCi0gICAgICAgICAqIFRoZSBlbmdpbmUgY2hlY2tzIHdpdGggQm95ZXItTW9vcmUgd2hldGhlciB0aGUgdGV4dCBjb250YWlucyB0aGUgZml4ZWQgc3RyaW5nIG9yIG5vdC4KLSAgICAgICAgICogSWYgbm90LCBpdCByZXR1cm4gd2l0aCBmYWxzZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7Ci0gICAgICAgICAgICBpZiAobyA8IDApIHsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTm9uLW1hdGNoIGluIGZpeGVkLXN0cmluZyBzZWFyY2guIik7Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGxpbWl0ID0gY29uLmxpbWl0LXRoaXMubWlubGVuZ3RoOwotICAgICAgICBpbnQgbWF0Y2hTdGFydDsKLSAgICAgICAgaW50IG1hdGNoRW5kID0gLTE7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggIi4qIi4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgIT0gbnVsbAotICAgICAgICAgICAgJiYgdGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuQ0xPU1VSRSAmJiB0aGlzLm9wZXJhdGlvbnMuZ2V0Q2hpbGQoKS50eXBlID09IE9wLkRPVCkgewotICAgICAgICAgICAgaWYgKGlzU2V0KHRoaXMub3B0aW9ucywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hTdGFydCA9IGNvbi5zdGFydDsKLSAgICAgICAgICAgICAgICBtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHByZXZpb3VzSXNFT0wgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgbWF0Y2hTdGFydCBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNFT0wgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSXNFT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNFT0wgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE9wdGltaXphdGlvbiBhZ2FpbnN0IHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIGlmICh0aGlzLmZpcnN0Q2hhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IHdpdGggZmlyc3RjaGFyLW1hdGNoaW5nOiAiK3RoaXMuZmlyc3RDaGFyKTsKLSAgICAgICAgICAgIFJhbmdlVG9rZW4gcmFuZ2UgPSB0aGlzLmZpcnN0Q2hhcjsKLSAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmZpcnN0Q2hhci5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgbWF0Y2hTdGFydCBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG1hdGNoU3RhcnQrMSA8IGNvbi5saW1pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQrMSBdICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQgXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgWyAgbWF0Y2hTdGFydCsxIF0gKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTdHJhaWdodGZvcndhcmQgbWF0Y2hpbmcuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF0Y2hFbmQgPj0gMCkgewotICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBtYXRjaFN0YXJ0KTsKLSAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG1hdGNoRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotLyoqCi0gKiBAcmV0dXJuIC0xIHdoZW4gbm90IG1hdGNoOyBvZmZzZXQgb2YgdGhlIGVuZCBvZiBtYXRjaGVkIHN0cmluZyB3aGVuIG1hdGNoLgotICovCi0gICAgcHJpdmF0ZSBpbnQgbWF0Y2hDaGFyQXJyYXkgKENvbnRleHQgY29uLCBPcCBvcCwgaW50IG9mZnNldCwgaW50IGR4LCBpbnQgb3B0cykgewotCi0gICAgICAgIGNoYXJbXSB0YXJnZXQgPSBjb24uY2hhclRhcmdldDsKLQotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNTZXQob3B0cywgWE1MU0NIRU1BX01PREUpICYmIG9mZnNldCAhPSBjb24ubGltaXQgPyAtMSA6IG9mZnNldDsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiBjb24ubGltaXQgfHwgb2Zmc2V0IDwgY29uLnN0YXJ0KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHN3aXRjaCAob3AudHlwZSkgewotICAgICAgICAgICAgY2FzZSBPcC5DSEFSOgotICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCB8fCAhbWF0Y2hJZ25vcmVDYXNlKGNoLCAgdGFyZ2V0IFsgIG9mZnNldCBdICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCB8fCAhbWF0Y2hJZ25vcmVDYXNlKGNoLCAgdGFyZ2V0IFsgIG8xIF0gKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQgfHwgY2ggIT0gIHRhcmdldCBbICBvZmZzZXQgXSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCB8fCBjaCAhPSAgdGFyZ2V0IFsgIG8xIF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5ET1Q6Ci0gICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBvZmZzZXQgXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IFsgICsrb2Zmc2V0IF0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG8xIF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbzEgLS07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgWyAgLS1vMSBdICwgY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VPTENoYXIoY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlJBTkdFOgotICAgICAgICAgICAgY2FzZSBPcC5OUkFOR0U6Ci0gICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBvZmZzZXQgXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCBbICArK29mZnNldCBdICk7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgbzEgXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyggdGFyZ2V0IFsgIC0tbzEgXSAsIGNoKTsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBvcC5nZXRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2suZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2subWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5BTkNIT1I6Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBnbyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN3aXRjaCAob3AuZ2V0RGF0YSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBNVUxUSVBMRV9MSU5FUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24uc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA+IGNvbi5zdGFydCAmJiBpc0VPTENoYXIoIHRhcmdldCBbICBvZmZzZXQtMSBdICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0AnOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCB1c2Ugb25seS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEAgYWx3YXlzIG1hdGNoZXMgbGluZSBiZWdpbm5pbmdzLgotICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA+IGNvbi5zdGFydCAmJiBpc0VPTENoYXIoIHRhcmdldCBbICBvZmZzZXQtMSBdICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJyQnOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgTVVMVElQTEVfTElORVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPCBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgWyAgb2Zmc2V0IF0gKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzEgPT0gY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IFsgIG9mZnNldCBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IFsgIG9mZnNldCBdICA9PSBDQVJSSUFHRV9SRVRVUk4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICB0YXJnZXQgWyAgb2Zmc2V0KzEgXSAgPT0gTElORV9GRUVEKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24uc3RhcnQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzEgPT0gY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IFsgIG9mZnNldCBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgWyAgb2Zmc2V0IF0gID09IENBUlJJQUdFX1JFVFVSTgotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IFsgIG9mZnNldCsxIF0gID09IExJTkVfRkVFRCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLmxpbWl0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IFdUX0lHTk9SRSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZWZvcmUgPSBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gYmVmb3JlKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gYWZ0ZXIgPT0gV1RfSUdOT1JFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFmdGVyID09IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWdvKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwIHx8IG9mZnNldCA9PSBjb24ubGltaXQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX0xFVFRFUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX09USEVSKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwIHx8IG9mZnNldCA9PSBjb24uc3RhcnQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX09USEVSCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IC8vIHN3aXRjaCBhbmNob3IgdHlwZQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5CQUNLUkVGRVJFTkNFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlZm5vID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmbm8gPD0gMCB8fCByZWZubyA+PSB0aGlzLm5vZnBhcmVuKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBSZWZlcmVuY2UgbnVtYmVyIG11c3QgYmUgbW9yZSB0aGFuIHplcm86ICIrcmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubykgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjb24ubWF0Y2guZ2V0RW5kKHJlZm5vKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgIC8vICoqKioqKioqCi0gICAgICAgICAgICAgICAgICAgIGludCBvMiA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGl0ZXJhbGxlbiA9IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pLW8yOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLlNUUklORzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaXRlcmFsID0gb3AuZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gbGl0ZXJhbC5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ0xPU1VSRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFNhdmVzIGN1cnJlbnQgcG9zaXRpb24gdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgICogemVyby13aWR0aCByZXBlYXRzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzT2Zmc2V0ID0gY29uLm9mZnNldHNbaWRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzT2Zmc2V0IDwgMCB8fCBwcmV2aW91c09mZnNldCAhPSBvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24ub2Zmc2V0c1tpZF0gPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5RVUVTVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlDTE9TVVJFOgotICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlRVUVTVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5nZXRDaGlsZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5VTklPTjoKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBvcC5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5lbGVtZW50QXQoaSksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVU5JT046ICIraSsiLCByZXQ9IityZXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgY2FzZSBPcC5DQVBUVVJFOgotICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBzYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtcmVmbm87Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEVuZChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoaW5kZXgsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBzYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgICAgIGlmICgwIDw9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5JTkRFUEVOREVOVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTU9ESUZJRVI6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxvcHRzID0gb3B0czsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzIHw9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzICY9IH5vcC5nZXREYXRhMigpOwotICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTU9ESUZJRVI6ICIrSW50ZWdlci50b1N0cmluZyhvcHRzLCAxNikrIiAtPiAiK0ludGVnZXIudG9TdHJpbmcobG9jYWxvcHRzLCAxNikpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgbG9jYWxvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ09ORElUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT3AuQ29uZGl0aW9uT3AgY29wID0gKE9wLkNvbmRpdGlvbk9wKW9wOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNocCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3AucmVmTnVtYmVyID49IHRoaXMubm9mcGFyZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBSZWZlcmVuY2UgbnVtYmVyIG11c3QgYmUgbW9yZSB0aGFuIHplcm86ICIrY29wLnJlZk51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKGNvcC5yZWZOdW1iZXIpID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbi5tYXRjaC5nZXRFbmQoY29wLnJlZk51bWJlcikgPj0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNocCA9IDAgPD0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgY29wLmNvbmRpdGlvbiwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC55ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29wLm5vICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5vOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBvcGVyYXRpb24gdHlwZTogIitvcC50eXBlKTsKLSAgICAgICAgICAgIH0gLy8gc3dpdGNoIChvcC50eXBlKQotICAgICAgICB9IC8vIHdoaWxlCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFByZXZpb3VzV29yZFR5cGUoY2hhcltdICB0YXJnZXQsIGludCBiZWdpbiwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgewotICAgICAgICBpbnQgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7Ci0gICAgICAgIHdoaWxlIChyZXQgPT0gV1RfSUdOT1JFKQotICAgICAgICAgICAgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFdvcmRUeXBlKGNoYXJbXSAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCBiZWdpbiB8fCBvZmZzZXQgPj0gZW5kKSAgcmV0dXJuIFdUX09USEVSOwotICAgICAgICByZXR1cm4gZ2V0V29yZFR5cGUwKCB0YXJnZXQgWyAgb2Zmc2V0IF0gLCBvcHRzKTsKLSAgICB9Ci0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzKGNoYXJbXSAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGlmICggdGFyZ2V0IFsgIG9mZnNldCsrIF0gICE9IHBhcnQuY2hhckF0KGkrKykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MiwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IG9mZnNldDI7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoIHRhcmdldCBbICBvZmZzZXQrKyBdICAhPSAgdGFyZ2V0IFsgIGkrKyBdICkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0vKioKLSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZyNyZWdpb25NYXRjaGVzCi0gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGNoYXJbXSAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBjaGFyIGNoMSA9ICB0YXJnZXQgWyAgb2Zmc2V0KysgXSA7Ci0gICAgICAgICAgICBjaGFyIGNoMiA9IHBhcnQuY2hhckF0KGkrKyk7Ci0gICAgICAgICAgICBpZiAoY2gxID09IGNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNoYXIgdWNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgY2hhciB1Y2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMik7Ci0gICAgICAgICAgICBpZiAodWNoMSA9PSB1Y2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoY2hhcltdICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gb2Zmc2V0MjsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGNoYXIgY2gxID0gIHRhcmdldCBbICBvZmZzZXQrKyBdIDsKLSAgICAgICAgICAgIGNoYXIgY2gyID0gIHRhcmdldCBbICBpKysgXSA7Ci0gICAgICAgICAgICBpZiAoY2gxID09IGNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNoYXIgdWNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgY2hhciB1Y2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMik7Ci0gICAgICAgICAgICBpZiAodWNoMSA9PSB1Y2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgIHRhcmdldCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgMCwgIHRhcmdldCAubGVuZ3RoKCkgLCAoTWF0Y2gpbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4KLSAgICAgKiBpbiBzcGVjaWZpZWQgcmFuZ2Ugb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHBhcmFtIGVuZCAgRW5kIG9mZnNldCArMSBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaXMgbWF0Y2hlZCB0byB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyAgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIHN0YXJ0LCBlbmQsIChNYXRjaCludWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybiBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF0Y2ggQSBNYXRjaCBpbnN0YW5jZSBmb3Igc3RvcmluZyBtYXRjaGluZyByZXN1bHQuCi0gICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIDxWQVI+dGFyZ2V0PC9WQVI+OyBvciAtMSBpZiBub3QgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgIHRhcmdldCwgTWF0Y2ggbWF0Y2gpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIDAsICB0YXJnZXQgLmxlbmd0aCgpICwgbWF0Y2gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuCi0gICAgICogaW4gc3BlY2lmaWVkIHJhbmdlIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZmZzZXQgb2YgdGhlIHJhbmdlLgotICAgICAqIEBwYXJhbSBlbmQgIEVuZCBvZmZzZXQgKzEgb2YgdGhlIHJhbmdlLgotICAgICAqIEBwYXJhbSBtYXRjaCBBIE1hdGNoIGluc3RhbmNlIGZvciBzdG9yaW5nIG1hdGNoaW5nIHJlc3VsdC4KLSAgICAgKiBAcmV0dXJuIE9mZnNldCBvZiB0aGUgc3RhcnQgcG9zaXRpb24gaW4gPFZBUj50YXJnZXQ8L1ZBUj47IG9yIC0xIGlmIG5vdCBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyAgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBlbmQsIE1hdGNoIG1hdGNoKSB7Ci0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZXh0IGNvbiA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5jb250ZXh0KSB7Ci0gICAgICAgICAgICBjb24gPSB0aGlzLmNvbnRleHQuaW51c2UgPyBuZXcgQ29udGV4dCgpIDogdGhpcy5jb250ZXh0OwotICAgICAgICAgICAgY29uLnJlc2V0KHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpcy5udW1iZXJPZkNsb3N1cmVzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgbWF0Y2guc2V0TnVtYmVyT2ZHcm91cHModGhpcy5ub2ZwYXJlbik7Ci0gICAgICAgICAgICBtYXRjaC5zZXRTb3VyY2UodGFyZ2V0KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc0JhY2tSZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICBtYXRjaCA9IG5ldyBNYXRjaCgpOwotICAgICAgICAgICAgbWF0Y2guc2V0TnVtYmVyT2ZHcm91cHModGhpcy5ub2ZwYXJlbik7Ci0gICAgICAgICAgICAvLyBOZWVkIG5vdCB0byBjYWxsIHNldFNvdXJjZSgpIGJlY2F1c2UKLSAgICAgICAgICAgIC8vIGEgY2FsbGVyIGNhbiBub3QgYWNjZXNzIHRoaXMgbWF0Y2ggaW5zdGFuY2UuCi0gICAgICAgIH0KLSAgICAgICAgY29uLm1hdGNoID0gbWF0Y2g7Ci0KLSAgICAgICAgaWYgKHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBYTUxTQ0hFTUFfTU9ERSkpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigidGFyZ2V0IHN0cmluZz0iK3RhcmdldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigibWF0Y2hFbmQ9IittYXRjaEVuZCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjb24ubGltaXQ9Iitjb24ubGltaXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1hdGNoRW5kID09IGNvbi5saW1pdCkgewotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIGNvbi5zdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBwYXR0ZXJuIGhhcyBvbmx5IGZpeGVkIHN0cmluZy4KLSAgICAgICAgICogVGhlIGVuZ2luZSB1c2VzIEJveWVyLU1vb3JlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmdPbmx5KSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IGZpeGVkLW9ubHk6ICIrdGhpcy5maXhlZFN0cmluZyk7Ci0gICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOwotICAgICAgICAgICAgaWYgKG8gPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG8pOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG8rdGhpcy5maXhlZFN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgcGF0dGVybiBjb250YWlucyBhIGZpeGVkIHN0cmluZy4KLSAgICAgICAgICogVGhlIGVuZ2luZSBjaGVja3Mgd2l0aCBCb3llci1Nb29yZSB3aGV0aGVyIHRoZSB0ZXh0IGNvbnRhaW5zIHRoZSBmaXhlZCBzdHJpbmcgb3Igbm90LgotICAgICAgICAgKiBJZiBub3QsIGl0IHJldHVybiB3aXRoIGZhbHNlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IG8gPSB0aGlzLmZpeGVkU3RyaW5nVGFibGUubWF0Y2hlcyh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0KTsKLSAgICAgICAgICAgIGlmIChvIDwgMCkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJOb24tbWF0Y2ggaW4gZml4ZWQtc3RyaW5nIHNlYXJjaC4iKTsKLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGltaXQgPSBjb24ubGltaXQtdGhpcy5taW5sZW5ndGg7Ci0gICAgICAgIGludCBtYXRjaFN0YXJ0OwotICAgICAgICBpbnQgbWF0Y2hFbmQgPSAtMTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAiLioiLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyAhPSBudWxsCi0gICAgICAgICAgICAmJiB0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5DTE9TVVJFICYmIHRoaXMub3BlcmF0aW9ucy5nZXRDaGlsZCgpLnR5cGUgPT0gT3AuRE9UKSB7Ci0gICAgICAgICAgICBpZiAoaXNTZXQodGhpcy5vcHRpb25zLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OwotICAgICAgICAgICAgICAgIG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBjb24uc3RhcnQsIDEsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJldmlvdXNJc0VPTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgbWF0Y2hTdGFydCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNFT0wgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSXNFT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNFT0wgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE9wdGltaXphdGlvbiBhZ2FpbnN0IHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIGlmICh0aGlzLmZpcnN0Q2hhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IHdpdGggZmlyc3RjaGFyLW1hdGNoaW5nOiAiK3RoaXMuZmlyc3RDaGFyKTsKLSAgICAgICAgICAgIFJhbmdlVG9rZW4gcmFuZ2UgPSB0aGlzLmZpcnN0Q2hhcjsKLSAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmZpcnN0Q2hhci5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG1hdGNoU3RhcnQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuY2hhckF0KCAgbWF0Y2hTdGFydCsxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG1hdGNoU3RhcnQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLmNoYXJBdCggIG1hdGNoU3RhcnQrMSApICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3RyYWlnaHRmb3J3YXJkIG1hdGNoaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hdGNoRW5kID49IDApIHsKLSAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbWF0Y2hTdGFydCk7Ci0gICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIC0xIHdoZW4gbm90IG1hdGNoOyBvZmZzZXQgb2YgdGhlIGVuZCBvZiBtYXRjaGVkIHN0cmluZyB3aGVuIG1hdGNoLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1hdGNoU3RyaW5nIChDb250ZXh0IGNvbiwgT3Agb3AsIGludCBvZmZzZXQsIGludCBkeCwgaW50IG9wdHMpIHsKLQotCi0KLQotICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gY29uLnN0clRhcmdldDsKLQotCi0KLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlzU2V0KG9wdHMsIFhNTFNDSEVNQV9NT0RFKSAmJiBvZmZzZXQgIT0gY29uLmxpbWl0ID8gLTEgOiBvZmZzZXQ7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID4gY29uLmxpbWl0IHx8IG9mZnNldCA8IGNvbi5zdGFydCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBzd2l0Y2ggKG9wLnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgT3AuQ0hBUjoKLSAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgLmNoYXJBdCggIG8xICkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQgfHwgY2ggIT0gIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgY2ggIT0gIHRhcmdldCAuY2hhckF0KCAgbzEgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkRPVDoKLSAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICArK29mZnNldCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFT0xDaGFyKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgbzEgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMSAtLTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCAuY2hhckF0KCAgLS1vMSApICwgY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VPTENoYXIoY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlJBTkdFOgotICAgICAgICAgICAgY2FzZSBPcC5OUkFOR0U6Ci0gICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLmNoYXJBdCggICsrb2Zmc2V0ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBvcC5nZXRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2suZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2subWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgbzEgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyggdGFyZ2V0IC5jaGFyQXQoICAtLW8xICkgLCBjaCk7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQU5DSE9SOgotICAgICAgICAgICAgICAgIGJvb2xlYW4gZ28gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wLmdldERhdGEoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ14nOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgTVVMVElQTEVfTElORVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldC0xICkgKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24uc3RhcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQCc6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIHVzZSBvbmx5LgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQCBhbHdheXMgbWF0Y2hlcyBsaW5lIGJlZ2lubmluZ3MuCi0gICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24uc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQtMSApICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJyQnOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgTVVMVElQTEVfTElORVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPCBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICA9PSBDQVJSSUFHRV9SRVRVUk4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCsxICkgID09IExJTkVfRkVFRCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ1onOgotICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgID09IENBUlJJQUdFX1JFVFVSTgotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQrMSApICA9PSBMSU5FX0ZFRUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5saW1pdCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBXVF9JR05PUkUpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlID0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IGJlZm9yZSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnbyA9IGFmdGVyID09IFdUX0lHTk9SRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBhZnRlciA9PSBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFnbykgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLmxpbWl0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX0xFVFRFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2ggYW5jaG9yIHR5cGUKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZm5vIDw9IDAgfHwgcmVmbm8gPj0gdGhpcy5ub2ZwYXJlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK3JlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29uLm1hdGNoLmdldEVuZChyZWZubykgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAvLyAqKioqKioqKgotICAgICAgICAgICAgICAgICAgICBpbnQgbzIgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBjb24ubWF0Y2guZ2V0RW5kKHJlZm5vKS1vMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5TVFJJTkc6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IG9wLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGl0ZXJhbGxlbiA9IGxpdGVyYWwubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNMT1NVUkU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBTYXZlcyBjdXJyZW50IHBvc2l0aW9uIHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAqIHplcm8td2lkdGggcmVwZWF0cy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGludCBpZCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2aW91c09mZnNldCA9IGNvbi5vZmZzZXRzW2lkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c09mZnNldCA8IDAgfHwgcHJldmlvdXNPZmZzZXQgIT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMCkgIGNvbi5vZmZzZXRzW2lkXSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlFVRVNUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWVFVRVNUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLmdldENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlVOSU9OOgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG9wLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmVsZW1lbnRBdChpKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVTklPTjogIitpKyIsIHJldD0iK3JldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNBUFRVUkU6Ci0gICAgICAgICAgICAgICAgaW50IHJlZm5vID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCAmJiByZWZubyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmUgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZyhyZWZubywgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIHNhdmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC1yZWZubzsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmUgPSBjb24ubWF0Y2guZ2V0RW5kKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIGNvbi5tYXRjaC5zZXRFbmQoaW5kZXgsIHNhdmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTE9PS0FIRUFEOgotICAgICAgICAgICAgICAgIGlmICgwID4gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAxLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgICAgICAgIGlmICgwIDw9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5MT09LQkVISU5EOgotICAgICAgICAgICAgICAgIGlmICgwID4gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAtMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAtMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLklOREVQRU5ERU5UOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5NT0RJRklFUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsb2NhbG9wdHMgPSBvcHRzOwotICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgfD0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgJj0gfm9wLmdldERhdGEyKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJNT0RJRklFUjogIitJbnRlZ2VyLnRvU3RyaW5nKG9wdHMsIDE2KSsiIC0+ICIrSW50ZWdlci50b1N0cmluZyhsb2NhbG9wdHMsIDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBsb2NhbG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5DT05ESVRJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBPcC5Db25kaXRpb25PcCBjb3AgPSAoT3AuQ29uZGl0aW9uT3Apb3A7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3AucmVmTnVtYmVyID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPj0gdGhpcy5ub2ZwYXJlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIitjb3AucmVmTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNocCA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcoY29wLnJlZk51bWJlcikgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29uLm1hdGNoLmdldEVuZChjb3AucmVmTnVtYmVyKSA+PSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gMCA8PSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBjb3AuY29uZGl0aW9uLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaHApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLnllczsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3Aubm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3Aubm87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC5uZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIG9wZXJhdGlvbiB0eXBlOiAiK29wLnR5cGUpOwotICAgICAgICAgICAgfSAvLyBzd2l0Y2ggKG9wLnR5cGUpCi0gICAgICAgIH0gLy8gd2hpbGUKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UHJldmlvdXNXb3JkVHlwZShTdHJpbmcgIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7Ci0gICAgICAgIGludCByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgd2hpbGUgKHJldCA9PSBXVF9JR05PUkUpCi0gICAgICAgICAgICByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0V29yZFR5cGUoU3RyaW5nICB0YXJnZXQsIGludCBiZWdpbiwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IG9wdHMpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IGJlZ2luIHx8IG9mZnNldCA+PSBlbmQpICByZXR1cm4gV1RfT1RIRVI7Ci0gICAgICAgIHJldHVybiBnZXRXb3JkVHlwZTAoIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgLCBvcHRzKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0ZXh0LnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBwYXJ0LCAwLCBwYXJ0bGVuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoU3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdGV4dC5yZWdpb25NYXRjaGVzKG9mZnNldCwgdGV4dCwgb2Zmc2V0MiwgcGFydGxlbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShTdHJpbmcgdGV4dCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0LnJlZ2lvbk1hdGNoZXModHJ1ZSwgb2Zmc2V0LCBwYXJ0LCAwLCBwYXJ0bGVuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MiwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0ZXh0LnJlZ2lvbk1hdGNoZXModHJ1ZSwgb2Zmc2V0LCB0ZXh0LCBvZmZzZXQyLCBwYXJ0bGVuKTsKLSAgICB9Ci0KLQotCi0KLQotCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybiBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBpcyBtYXRjaGVkIHRvIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoQ2hhcmFjdGVySXRlcmF0b3IgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCAoTWF0Y2gpbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybiBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF0Y2ggQSBNYXRjaCBpbnN0YW5jZSBmb3Igc3RvcmluZyBtYXRjaGluZyByZXN1bHQuCi0gICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIDxWQVI+dGFyZ2V0PC9WQVI+OyBvciAtMSBpZiBub3QgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBNYXRjaCBtYXRjaCkgewotICAgICAgICBpbnQgc3RhcnQgPSB0YXJnZXQuZ2V0QmVnaW5JbmRleCgpOwotICAgICAgICBpbnQgZW5kID0gdGFyZ2V0LmdldEVuZEluZGV4KCk7Ci0KLQotCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZSgpOwotICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGV4dCBjb24gPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuY29udGV4dCkgewotICAgICAgICAgICAgY29uID0gdGhpcy5jb250ZXh0LmludXNlID8gbmV3IENvbnRleHQoKSA6IHRoaXMuY29udGV4dDsKLSAgICAgICAgICAgIGNvbi5yZXNldCh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXMubnVtYmVyT2ZDbG9zdXJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOwotICAgICAgICAgICAgbWF0Y2guc2V0U291cmNlKHRhcmdldCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNCYWNrUmVmZXJlbmNlcykgewotICAgICAgICAgICAgbWF0Y2ggPSBuZXcgTWF0Y2goKTsKLSAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOwotICAgICAgICAgICAgLy8gTmVlZCBub3QgdG8gY2FsbCBzZXRTb3VyY2UoKSBiZWNhdXNlCi0gICAgICAgICAgICAvLyBhIGNhbGxlciBjYW4gbm90IGFjY2VzcyB0aGlzIG1hdGNoIGluc3RhbmNlLgotICAgICAgICB9Ci0gICAgICAgIGNvbi5tYXRjaCA9IG1hdGNoOwotCi0gICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgWE1MU0NIRU1BX01PREUpKSB7Ci0gICAgICAgICAgICBpbnQgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBtYXRjaEVuZD0iK21hdGNoRW5kKTsKLSAgICAgICAgICAgIGlmIChtYXRjaEVuZCA9PSBjb24ubGltaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBjb24uc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG1hdGNoRW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgcGF0dGVybiBoYXMgb25seSBmaXhlZCBzdHJpbmcuCi0gICAgICAgICAqIFRoZSBlbmdpbmUgdXNlcyBCb3llci1Nb29yZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nT25seSkgewotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBmaXhlZC1vbmx5OiAiK3RoaXMuZml4ZWRTdHJpbmcpOwotICAgICAgICAgICAgaW50IG8gPSB0aGlzLmZpeGVkU3RyaW5nVGFibGUubWF0Y2hlcyh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0KTsKLSAgICAgICAgICAgIGlmIChvID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBvKTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBvK3RoaXMuZml4ZWRTdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHBhdHRlcm4gY29udGFpbnMgYSBmaXhlZCBzdHJpbmcuCi0gICAgICAgICAqIFRoZSBlbmdpbmUgY2hlY2tzIHdpdGggQm95ZXItTW9vcmUgd2hldGhlciB0aGUgdGV4dCBjb250YWlucyB0aGUgZml4ZWQgc3RyaW5nIG9yIG5vdC4KLSAgICAgICAgICogSWYgbm90LCBpdCByZXR1cm4gd2l0aCBmYWxzZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7Ci0gICAgICAgICAgICBpZiAobyA8IDApIHsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTm9uLW1hdGNoIGluIGZpeGVkLXN0cmluZyBzZWFyY2guIik7Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGxpbWl0ID0gY29uLmxpbWl0LXRoaXMubWlubGVuZ3RoOwotICAgICAgICBpbnQgbWF0Y2hTdGFydDsKLSAgICAgICAgaW50IG1hdGNoRW5kID0gLTE7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggIi4qIi4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgIT0gbnVsbAotICAgICAgICAgICAgJiYgdGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuQ0xPU1VSRSAmJiB0aGlzLm9wZXJhdGlvbnMuZ2V0Q2hpbGQoKS50eXBlID09IE9wLkRPVCkgewotICAgICAgICAgICAgaWYgKGlzU2V0KHRoaXMub3B0aW9ucywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hTdGFydCA9IGNvbi5zdGFydDsKLSAgICAgICAgICAgICAgICBtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBjb24uc3RhcnQsIDEsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJldmlvdXNJc0VPTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBtYXRjaFN0YXJ0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNFT0xDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0VPTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJc0VPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNFT0wgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE9wdGltaXphdGlvbiBhZ2FpbnN0IHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIGlmICh0aGlzLmZpcnN0Q2hhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IHdpdGggZmlyc3RjaGFyLW1hdGNoaW5nOiAiK3RoaXMuZmlyc3RDaGFyKTsKLSAgICAgICAgICAgIFJhbmdlVG9rZW4gcmFuZ2UgPSB0aGlzLmZpcnN0Q2hhcjsKLSAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmZpcnN0Q2hhci5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbWF0Y2hTdGFydCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG1hdGNoU3RhcnQrMSA8IGNvbi5saW1pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5zZXRJbmRleCggIG1hdGNoU3RhcnQrMSApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBtYXRjaFN0YXJ0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5zZXRJbmRleCggIG1hdGNoU3RhcnQrMSApICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0cmFpZ2h0Zm9yd2FyZCBtYXRjaGluZy4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hdGNoRW5kID49IDApIHsKLSAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbWF0Y2hTdGFydCk7Ci0gICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIC0xIHdoZW4gbm90IG1hdGNoOyBvZmZzZXQgb2YgdGhlIGVuZCBvZiBtYXRjaGVkIHN0cmluZyB3aGVuIG1hdGNoLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKENvbnRleHQgY29uLCBPcCBvcCwgaW50IG9mZnNldCwgaW50IGR4LCBpbnQgb3B0cykgewotCi0KLSAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgdGFyZ2V0ID0gY29uLmNpVGFyZ2V0OwotCi0KLQotCi0KLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlzU2V0KG9wdHMsIFhNTFNDSEVNQV9NT0RFKSAmJiBvZmZzZXQgIT0gY29uLmxpbWl0ID8gLTEgOiBvZmZzZXQ7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID4gY29uLmxpbWl0IHx8IG9mZnNldCA8IGNvbi5zdGFydCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBzd2l0Y2ggKG9wLnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgT3AuQ0hBUjoKLSAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCAuc2V0SW5kZXgoICBvMSApICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8IGNoICE9ICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgY2ggIT0gIHRhcmdldCAuc2V0SW5kZXgoICBvMSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuRE9UOgotICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuc2V0SW5kZXgoICArK29mZnNldCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFT0xDaGFyKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBvMSApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8xIC0tOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyggdGFyZ2V0IC5zZXRJbmRleCggIC0tbzEgKSAsIGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFT0xDaGFyKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5SQU5HRToKLSAgICAgICAgICAgIGNhc2UgT3AuTlJBTkdFOgotICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgKytvZmZzZXQgKSApOwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG8xICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCAuc2V0SW5kZXgoICAtLW8xICkgLCBjaCk7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQU5DSE9SOgotICAgICAgICAgICAgICAgIGJvb2xlYW4gZ28gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wLmdldERhdGEoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ14nOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgTVVMVElQTEVfTElORVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0LTEgKSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdAJzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBAIGFsd2F5cyBtYXRjaGVzIGxpbmUgYmVnaW5uaW5ncy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0LTEgKSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICckJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0IDwgY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSAgPT0gQ0FSUklBR0VfUkVUVVJOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsxICkgID09IExJTkVfRkVFRCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ1onOgotICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICA9PSBDQVJSSUFHRV9SRVRVUk4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrMSApICA9PSBMSU5FX0ZFRUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5saW1pdCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBXVF9JR05PUkUpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlID0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IGJlZm9yZSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnbyA9IGFmdGVyID09IFdUX0lHTk9SRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBhZnRlciA9PSBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFnbykgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLmxpbWl0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX0xFVFRFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2ggYW5jaG9yIHR5cGUKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZm5vIDw9IDAgfHwgcmVmbm8gPj0gdGhpcy5ub2ZwYXJlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK3JlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29uLm1hdGNoLmdldEVuZChyZWZubykgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAvLyAqKioqKioqKgotICAgICAgICAgICAgICAgICAgICBpbnQgbzIgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBjb24ubWF0Y2guZ2V0RW5kKHJlZm5vKS1vMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5TVFJJTkc6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IG9wLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGl0ZXJhbGxlbiA9IGxpdGVyYWwubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNMT1NVUkU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBTYXZlcyBjdXJyZW50IHBvc2l0aW9uIHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAqIHplcm8td2lkdGggcmVwZWF0cy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGludCBpZCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2aW91c09mZnNldCA9IGNvbi5vZmZzZXRzW2lkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c09mZnNldCA8IDAgfHwgcHJldmlvdXNPZmZzZXQgIT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMCkgIGNvbi5vZmZzZXRzW2lkXSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlFVRVNUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZQ0xPU1VSRToKLSAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZUVVFU1RJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5nZXRDaGlsZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5VTklPTjoKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBvcC5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmVsZW1lbnRBdChpKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVTklPTjogIitpKyIsIHJldD0iK3JldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNBUFRVUkU6Ci0gICAgICAgICAgICAgICAgaW50IHJlZm5vID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCAmJiByZWZubyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmUgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZyhyZWZubywgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEJlZ2lubmluZyhyZWZubywgc2F2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb24ubWF0Y2ggIT0gbnVsbCAmJiByZWZubyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLXJlZm5vOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRFbmQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBzYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAxLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgICAgICAgIGlmICgwIDw9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAxLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLkxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgICAgIGlmICgwIDw9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAtMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLklOREVQRU5ERU5UOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLk1PRElGSUVSOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvY2Fsb3B0cyA9IG9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyB8PSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyAmPSB+b3AuZ2V0RGF0YTIoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk1PRElGSUVSOiAiK0ludGVnZXIudG9TdHJpbmcob3B0cywgMTYpKyIgLT4gIitJbnRlZ2VyLnRvU3RyaW5nKGxvY2Fsb3B0cywgMTYpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgbG9jYWxvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ09ORElUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT3AuQ29uZGl0aW9uT3AgY29wID0gKE9wLkNvbmRpdGlvbk9wKW9wOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNocCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3AucmVmTnVtYmVyID49IHRoaXMubm9mcGFyZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBSZWZlcmVuY2UgbnVtYmVyIG11c3QgYmUgbW9yZSB0aGFuIHplcm86ICIrY29wLnJlZk51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKGNvcC5yZWZOdW1iZXIpID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbi5tYXRjaC5nZXRFbmQoY29wLnJlZk51bWJlcikgPj0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNocCA9IDAgPD0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBjb3AuY29uZGl0aW9uLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaHApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLnllczsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3Aubm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3Aubm87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC5uZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIG9wZXJhdGlvbiB0eXBlOiAiK29wLnR5cGUpOwotICAgICAgICAgICAgfSAvLyBzd2l0Y2ggKG9wLnR5cGUpCi0gICAgICAgIH0gLy8gd2hpbGUKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UHJldmlvdXNXb3JkVHlwZShDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IG9wdHMpIHsKLSAgICAgICAgaW50IHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOwotICAgICAgICB3aGlsZSAocmV0ID09IFdUX0lHTk9SRSkKLSAgICAgICAgICAgIHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRXb3JkVHlwZShDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCBiZWdpbiB8fCBvZmZzZXQgPj0gZW5kKSAgcmV0dXJuIFdUX09USEVSOwotICAgICAgICByZXR1cm4gZ2V0V29yZFR5cGUwKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgLCBvcHRzKTsKLSAgICB9Ci0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgaWYgKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0KysgKSAgIT0gcGFydC5jaGFyQXQoaSsrKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSBvZmZzZXQyOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgaWYgKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0KysgKSAgIT0gIHRhcmdldCAuc2V0SW5kZXgoICBpKysgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLlN0cmluZyNyZWdpb25NYXRjaGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBjaGFyIGNoMSA9ICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0KysgKSA7Ci0gICAgICAgICAgICBjaGFyIGNoMiA9IHBhcnQuY2hhckF0KGkrKyk7Ci0gICAgICAgICAgICBpZiAoY2gxID09IGNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNoYXIgdWNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgY2hhciB1Y2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMik7Ci0gICAgICAgICAgICBpZiAodWNoMSA9PSB1Y2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSBvZmZzZXQyOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgY2hhciBjaDEgPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsrICkgOwotICAgICAgICAgICAgY2hhciBjaDIgPSAgdGFyZ2V0IC5zZXRJbmRleCggIGkrKyApIDsKLSAgICAgICAgICAgIGlmIChjaDEgPT0gY2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2hhciB1Y2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICBjaGFyIHVjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgIGlmICh1Y2gxID09IHVjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDEpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogQSByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICogQHNlcmlhbAotICAgICAqLwotICAgIFN0cmluZyByZWdleDsKLSAgICAvKioKLSAgICAgKiBAc2VyaWFsCi0gICAgICovCi0gICAgaW50IG9wdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHBhcmVudGhlc2lzIGluIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICogQHNlcmlhbAotICAgICAqLwotICAgIGludCBub2ZwYXJlbjsKLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KLSAgICBUb2tlbiB0b2tlbnRyZWU7Ci0KLSAgICBib29sZWFuIGhhc0JhY2tSZWZlcmVuY2VzID0gZmFsc2U7Ci0KLSAgICB0cmFuc2llbnQgaW50IG1pbmxlbmd0aDsKLSAgICB0cmFuc2llbnQgT3Agb3BlcmF0aW9ucyA9IG51bGw7Ci0gICAgdHJhbnNpZW50IGludCBudW1iZXJPZkNsb3N1cmVzOwotICAgIHRyYW5zaWVudCBDb250ZXh0IGNvbnRleHQgPSBudWxsOwotICAgIHRyYW5zaWVudCBSYW5nZVRva2VuIGZpcnN0Q2hhciA9IG51bGw7Ci0KLSAgICB0cmFuc2llbnQgU3RyaW5nIGZpeGVkU3RyaW5nID0gbnVsbDsKLSAgICB0cmFuc2llbnQgaW50IGZpeGVkU3RyaW5nT3B0aW9uczsKLSAgICB0cmFuc2llbnQgQk1QYXR0ZXJuIGZpeGVkU3RyaW5nVGFibGUgPSBudWxsOwotICAgIHRyYW5zaWVudCBib29sZWFuIGZpeGVkU3RyaW5nT25seSA9IGZhbHNlOwotCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ29udGV4dCB7Ci0gICAgICAgIENoYXJhY3Rlckl0ZXJhdG9yIGNpVGFyZ2V0OwotICAgICAgICBTdHJpbmcgc3RyVGFyZ2V0OwotICAgICAgICBjaGFyW10gY2hhclRhcmdldDsKLSAgICAgICAgaW50IHN0YXJ0OwotICAgICAgICBpbnQgbGltaXQ7Ci0gICAgICAgIGludCBsZW5ndGg7Ci0gICAgICAgIE1hdGNoIG1hdGNoOwotICAgICAgICBib29sZWFuIGludXNlID0gZmFsc2U7Ci0gICAgICAgIGludFtdIG9mZnNldHM7Ci0KLSAgICAgICAgQ29udGV4dCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZXNldENvbW1vbihpbnQgbm9mY2xvc3VyZXMpIHsKLSAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5saW1pdC10aGlzLnN0YXJ0OwotICAgICAgICAgICAgdGhpcy5pbnVzZSA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLm1hdGNoID0gbnVsbDsKLSAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldHMgPT0gbnVsbCB8fCB0aGlzLm9mZnNldHMubGVuZ3RoICE9IG5vZmNsb3N1cmVzKQotICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbbm9mY2xvc3VyZXNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbm9mY2xvc3VyZXM7ICBpICsrKSAgdGhpcy5vZmZzZXRzW2ldID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCByZXNldChDaGFyYWN0ZXJJdGVyYXRvciB0YXJnZXQsIGludCBzdGFydCwgaW50IGxpbWl0LCBpbnQgbm9mY2xvc3VyZXMpIHsKLSAgICAgICAgICAgIHRoaXMuY2lUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7Ci0gICAgICAgICAgICB0aGlzLnJlc2V0Q29tbW9uKG5vZmNsb3N1cmVzKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHJlc2V0KFN0cmluZyB0YXJnZXQsIGludCBzdGFydCwgaW50IGxpbWl0LCBpbnQgbm9mY2xvc3VyZXMpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OwotICAgICAgICAgICAgdGhpcy5yZXNldENvbW1vbihub2ZjbG9zdXJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCByZXNldChjaGFyW10gdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgaW50IG5vZmNsb3N1cmVzKSB7Ci0gICAgICAgICAgICB0aGlzLmNoYXJUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7Ci0gICAgICAgICAgICB0aGlzLnJlc2V0Q29tbW9uKG5vZmNsb3N1cmVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZXBhcmVzIGZvciBtYXRjaGluZy4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBzdGFydGluZyBtYXRjaGluZy4KLSAgICAgKi8KLSAgICB2b2lkIHByZXBhcmUoKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyA9IDA7Ci0gICAgICAgIHRoaXMuY29tcGlsZSh0aGlzLnRva2VudHJlZSk7Ci0gICAgICAgIC8qCi0gICAgICAgIGlmICAodGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuQ0xPU1VSRSAmJiB0aGlzLm9wZXJhdGlvbnMuZ2V0Q2hpbGQoKS50eXBlID09IE9wLkRPVCkgeyAvLyAuKgotICAgICAgICAgICAgT3AgYW5jaG9yID0gT3AuY3JlYXRlQW5jaG9yKGlzU2V0KHRoaXMub3B0aW9ucywgU0lOR0xFX0xJTkUpID8gJ0EnIDogJ0AnKTsKLSAgICAgICAgICAgIGFuY2hvci5uZXh0ID0gdGhpcy5vcGVyYXRpb25zOwotICAgICAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gYW5jaG9yOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIGlmIChPcC5DT1VOVCkgIFN5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9uczogIitPcC5ub2ZpbnN0YW5jZXMpOwotCi0gICAgICAgIHRoaXMubWlubGVuZ3RoID0gdGhpcy50b2tlbnRyZWUuZ2V0TWluTGVuZ3RoKCk7Ci0KLSAgICAgICAgdGhpcy5maXJzdENoYXIgPSBudWxsOwotICAgICAgICBpZiAoIWlzU2V0KHRoaXMub3B0aW9ucywgUFJPSElCSVRfSEVBRF9DSEFSQUNURVJfT1BUSU1JWkFUSU9OKQotICAgICAgICAgICAgJiYgIWlzU2V0KHRoaXMub3B0aW9ucywgWE1MU0NIRU1BX01PREUpKSB7Ci0gICAgICAgICAgICBSYW5nZVRva2VuIGZpcnN0Q2hhciA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBpbnQgZnJlc3VsdCA9IHRoaXMudG9rZW50cmVlLmFuYWx5emVGaXJzdENoYXJhY3RlcihmaXJzdENoYXIsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoZnJlc3VsdCA9PSBUb2tlbi5GQ19URVJNSU5BTCkgewotICAgICAgICAgICAgICAgIGZpcnN0Q2hhci5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5maXJzdENoYXIgPSBmaXJzdENoYXI7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBVc2UgdGhlIGZpcnN0IGNoYXJhY3RlciBvcHRpbWl6YXRpb246ICIrZmlyc3RDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgIT0gbnVsbAotICAgICAgICAgICAgJiYgKHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLlNUUklORyB8fCB0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5DSEFSKQotICAgICAgICAgICAgJiYgdGhpcy5vcGVyYXRpb25zLm5leHQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIiAqKiogT25seSBmaXhlZCBzdHJpbmchICoqKiAiKTsKLSAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmdPbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5TVFJJTkcpCi0gICAgICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZyA9IHRoaXMub3BlcmF0aW9ucy5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3BlcmF0aW9ucy5nZXREYXRhKCkgPj0gMHgxMDAwMCkgeyAvLyBPcC5DSEFSCi0gICAgICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZyA9IFJFVXRpbC5kZWNvbXBvc2VUb1N1cnJvZ2F0ZXModGhpcy5vcGVyYXRpb25zLmdldERhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoYXJbXSBhYyA9IG5ldyBjaGFyWzFdOwotICAgICAgICAgICAgICAgIGFjWzBdID0gKGNoYXIpdGhpcy5vcGVyYXRpb25zLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nID0gbmV3IFN0cmluZyhhYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nT3B0aW9ucyA9IHRoaXMub3B0aW9uczsKLSAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmdUYWJsZSA9IG5ldyBCTVBhdHRlcm4odGhpcy5maXhlZFN0cmluZywgMjU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NldCh0aGlzLmZpeGVkU3RyaW5nT3B0aW9ucywgSUdOT1JFX0NBU0UpKTsKLSAgICAgICAgfSBlbHNlIGlmICghaXNTZXQodGhpcy5vcHRpb25zLCBQUk9ISUJJVF9GSVhFRF9TVFJJTkdfT1BUSU1JWkFUSU9OKQotICAgICAgICAgICAgICAgICAgICYmICFpc1NldCh0aGlzLm9wdGlvbnMsIFhNTFNDSEVNQV9NT0RFKSkgewotICAgICAgICAgICAgVG9rZW4uRml4ZWRTdHJpbmdDb250YWluZXIgY29udGFpbmVyID0gbmV3IFRva2VuLkZpeGVkU3RyaW5nQ29udGFpbmVyKCk7Ci0gICAgICAgICAgICB0aGlzLnRva2VudHJlZS5maW5kRml4ZWRTdHJpbmcoY29udGFpbmVyLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZyA9IGNvbnRhaW5lci50b2tlbiA9PSBudWxsID8gbnVsbCA6IGNvbnRhaW5lci50b2tlbi5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmdPcHRpb25zID0gY29udGFpbmVyLm9wdGlvbnM7Ci0gICAgICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsICYmIHRoaXMuZml4ZWRTdHJpbmcubGVuZ3RoKCkgPCAyKQotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgLy8gVGhpcyBwYXR0ZXJuIGhhcyBhIGZpeGVkIHN0cmluZyBvZiB3aGljaCBsZW5ndGggaXMgbW9yZSB0aGFuIG9uZS4KLSAgICAgICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nVGFibGUgPSBuZXcgQk1QYXR0ZXJuKHRoaXMuZml4ZWRTdHJpbmcsIDI1NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2V0KHRoaXMuZml4ZWRTdHJpbmdPcHRpb25zLCBJR05PUkVfQ0FTRSkpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBUaGUgbG9uZ2VzdCBmaXhlZCBzdHJpbmc6ICIrdGhpcy5maXhlZFN0cmluZy5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIvIiAvLyt0aGlzLmZpeGVkU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIi8iK1JFVXRpbC5jcmVhdGVPcHRpb25TdHJpbmcodGhpcy5maXhlZFN0cmluZ09wdGlvbnMpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludCgiU3RyaW5nOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgUkVVdGlsLmR1bXBTdHJpbmcodGhpcy5maXhlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gb3B0aW9uLgotICAgICAqIElmIHlvdSBzcGVjaWZ5IHRoaXMgb3B0aW9uLCA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+KDwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPjwvc3Bhbj4KLSAgICAgKiBjYXB0dXJlcyBtYXRjaGVkIHRleHQsIGFuZCA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+KDo/PC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+PC9zcGFuPgotICAgICAqIGRvZXMgbm90IGNhcHR1cmUuCi0gICAgICoKLSAgICAgKiBAc2VlICNSZWd1bGFyRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLGludCkKLSAgICAgKiBAc2VlICNzZXRQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcsaW50KQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFSS19QQVJFTlMgPSAxPDwwOwotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogImkiCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBJR05PUkVfQ0FTRSA9IDE8PDE7Ci0KLSAgICAvKioKLSAgICAgKiAicyIKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNJTkdMRV9MSU5FID0gMTw8MjsKLQotICAgIC8qKgotICAgICAqICJtIgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVVMVElQTEVfTElORVMgPSAxPDwzOwotCi0gICAgLyoqCi0gICAgICogIngiCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBFWFRFTkRFRF9DT01NRU5UID0gMTw8NDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgb3B0aW9uIHJlZGVmaW5lcyA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+XGQgXEQgXHcgXFcgXHMgXFM8L2tiZD48L3NwYW4+LgotICAgICAqCi0gICAgICogQHNlZSAjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZyxpbnQpCi0gICAgICogQHNlZSAjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLGludCkKLSAgICAgKiBAc2VlICNVTklDT0RFX1dPUkRfQk9VTkRBUlkKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFVTRV9VTklDT0RFX0NBVEVHT1JZID0gMTw8NTsgLy8gInUiCi0KLSAgICAvKioKLSAgICAgKiBBbiBvcHRpb24uCi0gICAgICogVGhpcyBlbmFibGVzIHRvIHByb2Nlc3MgbG9jYWxlLWluZGVwZW5kZW50IHdvcmQgYm91bmRhcnkgZm9yIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5cYiBcQiBcJmx0OyBcPjwva2JkPjwvc3Bhbj4uCi0gICAgICogPHA+QnkgZGVmYXVsdCwgdGhlIGVuZ2luZSBjb25zaWRlcnMgYSBwb3NpdGlvbiBiZXR3ZWVuIGEgd29yZCBjaGFyYWN0ZXIKLSAgICAgKiAoPHNwYW4gY2xhc3M9IlJFR0VYIj48S2JkPlx3PC9rYmQ+PC9zcGFuPikgYW5kIGEgbm9uIHdvcmQgY2hhcmFjdGVyCi0gICAgICogaXMgYSB3b3JkIGJvdW5kYXJ5LgotICAgICAqIDxwPkJ5IHRoaXMgb3B0aW9uLCB0aGUgZW5naW5lIGNoZWNrcyB3b3JkIGJvdW5kYXJpZXMgd2l0aCB0aGUgbWV0aG9kIG9mCi0gICAgICogJ1VuaWNvZGUgUmVndWxhciBFeHByZXNzaW9uIEd1aWRlbGluZXMnIFJldmlzaW9uIDQuCi0gICAgICoKLSAgICAgKiBAc2VlICNSZWd1bGFyRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLGludCkKLSAgICAgKiBAc2VlICNzZXRQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcsaW50KQotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5JQ09ERV9XT1JEX0JPVU5EQVJZID0gMTw8NjsgLy8gInciCi0KLSAgICAvKioKLSAgICAgKiAiSCIKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0hJQklUX0hFQURfQ0hBUkFDVEVSX09QVElNSVpBVElPTiA9IDE8PDc7Ci0gICAgLyoqCi0gICAgICogIkYiCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBQUk9ISUJJVF9GSVhFRF9TVFJJTkdfT1BUSU1JWkFUSU9OID0gMTw8ODsKLSAgICAvKioKLSAgICAgKiAiWCIuIFhNTCBTY2hlbWEgbW9kZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFhNTFNDSEVNQV9NT0RFID0gMTw8OTsKLSAgICAvKioKLSAgICAgKiAiLCIuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBTUEVDSUFMX0NPTU1BID0gMTw8MTA7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNTZXQoaW50IG9wdGlvbnMsIGludCBmbGFnKSB7Ci0gICAgICAgIHJldHVybiAob3B0aW9ucyAmIGZsYWcpID09IGZsYWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBSZWd1bGFyRXhwcmVzc2lvbiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWdleCBBIHJlZ3VsYXIgZXhwcmVzc2lvbgotICAgICAqIEBleGNlcHRpb24gb3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguUGFyc2VFeGNlcHRpb24gPFZBUj5yZWdleDwvVkFSPiBpcyBub3QgY29uZm9ybWluZyB0byB0aGUgc3ludGF4LgotICAgICAqLwotICAgIHB1YmxpYyBSZWd1bGFyRXhwcmVzc2lvbihTdHJpbmcgcmVnZXgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2V0UGF0dGVybihyZWdleCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBSZWd1bGFyRXhwcmVzc2lvbiBpbnN0YW5jZSB3aXRoIG9wdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVnZXggQSByZWd1bGFyIGV4cHJlc3Npb24KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIFN0cmluZyBjb25zaXN0ZWQgb2YgImkiICJtIiAicyIgInUiICJ3IiAiLCIgIlgiCi0gICAgICogQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5QYXJzZUV4Y2VwdGlvbiA8VkFSPnJlZ2V4PC9WQVI+IGlzIG5vdCBjb25mb3JtaW5nIHRvIHRoZSBzeW50YXguCi0gICAgICovCi0gICAgcHVibGljIFJlZ3VsYXJFeHByZXNzaW9uKFN0cmluZyByZWdleCwgU3RyaW5nIG9wdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2V0UGF0dGVybihyZWdleCwgb3B0aW9ucyk7Ci0gICAgfQotCi0gICAgUmVndWxhckV4cHJlc3Npb24oU3RyaW5nIHJlZ2V4LCBUb2tlbiB0b2ssIGludCBwYXJlbnMsIGJvb2xlYW4gaGFzQmFja1JlZmVyZW5jZXMsIGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRoaXMucmVnZXggPSByZWdleDsKLSAgICAgICAgdGhpcy50b2tlbnRyZWUgPSB0b2s7Ci0gICAgICAgIHRoaXMubm9mcGFyZW4gPSBwYXJlbnM7Ci0gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgICAgIHRoaXMuaGFzQmFja1JlZmVyZW5jZXMgPSBoYXNCYWNrUmVmZXJlbmNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIG5ld1BhdHRlcm4pIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2V0UGF0dGVybihuZXdQYXR0ZXJuLCB0aGlzLm9wdGlvbnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBuZXdQYXR0ZXJuLCBpbnQgb3B0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5yZWdleCA9IG5ld1BhdHRlcm47Ci0gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgICAgIFJlZ2V4UGFyc2VyIHJwID0gdGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFKQotICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFBhcnNlckZvclhNTFNjaGVtYSgpIDogbmV3IFJlZ2V4UGFyc2VyKCk7Ci0gICAgICAgIHRoaXMudG9rZW50cmVlID0gcnAucGFyc2UodGhpcy5yZWdleCwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgdGhpcy5ub2ZwYXJlbiA9IHJwLnBhcmVubnVtYmVyOwotICAgICAgICB0aGlzLmhhc0JhY2tSZWZlcmVuY2VzID0gcnAuaGFzQmFja1JlZmVyZW5jZXM7Ci0KLSAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gbnVsbDsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gbnVsbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBuZXdQYXR0ZXJuLCBTdHJpbmcgb3B0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXRQYXR0ZXJuKG5ld1BhdHRlcm4sIFJFVXRpbC5wYXJzZU9wdGlvbnMob3B0aW9ucykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWdleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIHRoaXMgaW5zdGVuY2UgaW4gU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRva2VudHJlZS50b1N0cmluZyh0aGlzLm9wdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBvcHRpb24gc3RyaW5nLgotICAgICAqIFRoZSBvcmRlciBvZiBsZXR0ZXJzIGluIGl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSBhIHN0cmluZyBzcGVjaWZpZWQKLSAgICAgKiBpbiBhIGNvbnN0cnVjdG9yIG9yIDxjb2RlPnNldFBhdHRlcm4oKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAc2VlICNSZWd1bGFyRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcpCi0gICAgICogQHNlZSAjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25zKCkgewotICAgICAgICByZXR1cm4gUkVVdGlsLmNyZWF0ZU9wdGlvblN0cmluZyh0aGlzLm9wdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm4gdHJ1ZSBpZiBwYXR0ZXJucyBhcmUgdGhlIHNhbWUgYW5kIHRoZSBvcHRpb25zIGFyZSBlcXVpdmFsZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmVndWxhckV4cHJlc3Npb24pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbiByID0gKFJlZ3VsYXJFeHByZXNzaW9uKW9iajsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVnZXguZXF1YWxzKHIucmVnZXgpICYmIHRoaXMub3B0aW9ucyA9PSByLm9wdGlvbnM7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIHBhdHRlcm4sIGludCBvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlZ2V4LmVxdWFscyhwYXR0ZXJuKSAmJiB0aGlzLm9wdGlvbnMgPT0gb3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5yZWdleCsiLyIrdGhpcy5nZXRPcHRpb25zKCkpLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVndWxhciBleHByZXNzaW9uIGdyb3Vwcy4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDEgd2hlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIGhhcyBubyBjYXB0dXJpbmctcGFyZW50aGVzaXMuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mR3JvdXBzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ub2ZwYXJlbjsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV1RfSUdOT1JFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV1RfTEVUVEVSID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV1RfT1RIRVIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRXb3JkVHlwZTAoY2hhciBjaCwgaW50IG9wdHMpIHsKLSAgICAgICAgaWYgKCFpc1NldChvcHRzLCBVTklDT0RFX1dPUkRfQk9VTkRBUlkpKSB7Ci0gICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgVVNFX1VOSUNPREVfQ0FURUdPUlkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChUb2tlbi5nZXRSYW5nZSgiSXNXb3JkIiwgdHJ1ZSkubWF0Y2goY2gpKSA/IFdUX0xFVFRFUiA6IFdUX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGlzV29yZENoYXIoY2gpID8gV1RfTEVUVEVSIDogV1RfT1RIRVI7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKENoYXJhY3Rlci5nZXRUeXBlKGNoKSkgewotICAgICAgICBjYXNlIENoYXJhY3Rlci5VUFBFUkNBU0VfTEVUVEVSOiAgICAgIC8vIEwKLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTE9XRVJDQVNFX0xFVFRFUjogICAgICAvLyBMCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLlRJVExFQ0FTRV9MRVRURVI6ICAgICAgLy8gTAotICAgICAgICBjYXNlIENoYXJhY3Rlci5NT0RJRklFUl9MRVRURVI6ICAgICAgIC8vIEwKLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuT1RIRVJfTEVUVEVSOiAgICAgICAgICAvLyBMCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLkxFVFRFUl9OVU1CRVI6ICAgICAgICAgLy8gTgotICAgICAgICBjYXNlIENoYXJhY3Rlci5ERUNJTUFMX0RJR0lUX05VTUJFUjogIC8vIE4KLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuT1RIRVJfTlVNQkVSOiAgICAgICAgICAvLyBOCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNPTUJJTklOR19TUEFDSU5HX01BUks6IC8vIE1jCi0gICAgICAgICAgICByZXR1cm4gV1RfTEVUVEVSOwotCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLkZPUk1BVDogICAgICAgICAgICAgICAgLy8gQ2YKLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTk9OX1NQQUNJTkdfTUFSSzogICAgICAvLyBNbgotICAgICAgICBjYXNlIENoYXJhY3Rlci5FTkNMT1NJTkdfTUFSSzogICAgICAgIC8vIE1jCi0gICAgICAgICAgICByZXR1cm4gV1RfSUdOT1JFOwotCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNPTlRST0w6ICAgICAgICAgICAgICAgLy8gQ2MKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgIGNhc2UgJ1x1MDAwQic6Ci0gICAgICAgICAgICBjYXNlICdcZic6Ci0gICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdUX09USEVSOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gV1RfSUdOT1JFOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gV1RfT1RIRVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IExJTkVfRkVFRCA9IDB4MDAwQTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBUlJJQUdFX1JFVFVSTiA9IDB4MDAwRDsKLSAgICBzdGF0aWMgZmluYWwgaW50IExJTkVfU0VQQVJBVE9SID0gMHgyMDI4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSQUdSQVBIX1NFUEFSQVRPUiA9IDB4MjAyOTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNFT0xDaGFyKGludCBjaCkgewotICAgICAgICByZXR1cm4gY2ggPT0gTElORV9GRUVEIHx8IGNoID09IENBUlJJQUdFX1JFVFVSTiB8fCBjaCA9PSBMSU5FX1NFUEFSQVRPUgotICAgICAgICB8fCBjaCA9PSBQQVJBR1JBUEhfU0VQQVJBVE9SOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXb3JkQ2hhcihpbnQgY2gpIHsgLy8gTGVnYWN5IHdvcmQgY2hhcmFjdGVycwotICAgICAgICBpZiAoY2ggPT0gJ18nKSAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjaCA8ICcwJykgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGNoID4gJ3onKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY2ggPD0gJzknKSAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjaCA8ICdBJykgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGNoIDw9ICdaJykgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoY2ggPCAnYScpICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbWF0Y2hJZ25vcmVDYXNlKGludCBjaGFyZGF0YSwgaW50IGNoKSB7Ci0gICAgICAgIGlmIChjaGFyZGF0YSA9PSBjaCkgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoY2hhcmRhdGEgPiAweGZmZmYgfHwgY2ggPiAweGZmZmYpICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNoYXIgdWNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaGFyZGF0YSk7Ci0gICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgIGlmICh1Y2gxID09IHVjaDIpICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gxKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9TY2hlbWFSZWd1bGFyRXhwcmVzc2lvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9TY2hlbWFSZWd1bGFyRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWExNTU3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvU2NoZW1hUmVndWxhckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbiBleHRlbmRzIFJlZ3VsYXJFeHByZXNzaW9uCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbihTdHJpbmcgcGF0dGVybikKLSAgICB7Ci0gICAgICAgIHN1cGVyKHBhdHRlcm4sICJYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZWd1bGFyRXhwcmVzc2lvbiBmb3JQYXR0ZXJuKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgU2NoZW1hUmVndWxhckV4cHJlc3Npb24gdHJlID0gKFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uKWtub3duUGF0dGVybnMuZ2V0KHMpOwotICAgICAgICBpZiAodHJlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHJlOwotICAgICAgICByZXR1cm4gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHMsICJYIik7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIE1hcCBrbm93blBhdHRlcm5zID0gYnVpbGRLbm93blBhdHRlcm5NYXAoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZEtub3duUGF0dGVybk1hcCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiXFxjKyIsIG5ldyBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbigiXFxjKyIpCi0gICAgICAgICAgICB7IHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHMpIHsgcmV0dXJuIFhNTENoYXIuaXNWYWxpZE5tdG9rZW4ocyk7IH0gfSApOwotICAgICAgICByZXN1bHQucHV0KCJcXGlcXGMqIiwgbmV3IFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uKCJcXGlcXGMqIikKLSAgICAgICAgICAgIHsgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcykgeyByZXR1cm4gWE1MQ2hhci5pc1ZhbGlkTmFtZShzKTsgfSB9ICk7Ci0gICAgICAgIHJlc3VsdC5wdXQoIltcXGktWzpdXVtcXGMtWzpdXSoiLCBuZXcgU2NoZW1hUmVndWxhckV4cHJlc3Npb24oIltcXGktWzpdXVtcXGMtWzpdXSoiKQotICAgICAgICAgICAgeyBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzKSB7IHJldHVybiBYTUxDaGFyLmlzVmFsaWROQ05hbWUocyk7IH0gfSApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvVG9rZW4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExMzU5MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIxICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCi0gKi8KLWNsYXNzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UVE9LRU5TID0gdHJ1ZTsKLSAgICBzdGF0aWMgaW50IHRva2VucyA9IDA7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVIgPSAwOyAgICAgICAgICAgICAgICAgIC8vIExpdGVyYWwgY2hhcgotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9UID0gMTE7ICAgICAgICAgICAgICAgICAgLy8gLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ0FUID0gMTsgICAgICAgICAgICAgICAgLy8gWFkKLSAgICBzdGF0aWMgZmluYWwgaW50IFVOSU9OID0gMjsgICAgICAgICAgICAgICAgIC8vIFh8WXxaCi0gICAgc3RhdGljIGZpbmFsIGludCBDTE9TVVJFID0gMzsgICAgICAgICAgICAgICAvLyBYKgotICAgIHN0YXRpYyBmaW5hbCBpbnQgUkFOR0UgPSA0OyAgICAgICAgICAgICAgICAgLy8gW2EtekEtWl0gZXRjLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgTlJBTkdFID0gNTsgICAgICAgICAgICAgICAgLy8gW15hLXpBLVpdIGV0Yy4KLSAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOID0gNjsgICAgICAgICAgICAgICAgIC8vIChYKSBvciAoPzpYKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSA3OyAgICAgICAgICAgICAgICAgLy8KLSAgICBzdGF0aWMgZmluYWwgaW50IEFOQ0hPUiA9IDg7ICAgICAgICAgICAgICAgIC8vIF4gJCBcYiBcQiBcPCBcPiBcQSBcWiBcegotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9OR1JFRURZQ0xPU1VSRSA9IDk7ICAgICAgLy8gKj8gKz8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUUklORyA9IDEwOyAgICAgICAgICAgICAgIC8vIHN0cmluZ3MKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBQ0tSRUZFUkVOQ0UgPSAxMjsgICAgICAgIC8vIGJhY2sgcmVmZXJlbmNlcwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS0FIRUFEID0gMjA7ICAgICAgICAgICAgLy8gKD89Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVMT09LQUhFQUQgPSAyMTsgICAgLy8gKD8hLi4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS0JFSElORCA9IDIyOyAgICAgICAgICAgLy8gKD88PS4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IE5FR0FUSVZFTE9PS0JFSElORCA9IDIzOyAgIC8vICg/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/PD0nIFx1MzA0YiAnKD88IScgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLm5leHQuND1cdThhM2JcdTkxYzhcdTMwNGNcdTk1ODlcdTMwNThcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuZmFjdG9yLjE9JyknIFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5mYWN0b3IuMj1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTRlZDhcdTMwNGRcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmVcdTRlMmRcdTMwNjdcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuCi1wYXJzZXIuZmFjdG9yLjM9JzonIFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5mYWN0b3IuND1cdTY3NjFcdTRlZjZcdTRlZDhcdTMwNGRcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmVcdTRlMmRcdTMwNjdcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuCi1wYXJzZXIuZmFjdG9yLjU9XHU2NzYxXHU0ZWY2XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZiXHUzMDZmXHUzMDAxXHU1ZjhjXHU2NWI5XHU1M2MyXHU3MTY3XHUzMGZiXHUzMGEyXHUzMGYzXHUzMGFiXHUzMGZjXHUzMGZiXHU1MTQ4XHU4YWFkXHUzMDdmXHUzMGZiXHU1ZjhjXHU4YWFkXHUzMDdmXHUzMDZlXHUzMDdmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5LgotcGFyc2VyLmZhY3Rvci42PVx1Njc2MVx1NGVmNlx1NGVkOFx1MzA0ZFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGUyZFx1MzA2YjNcdTUwMGJcdTRlZTVcdTRlMGFcdTMwNmVcdTkwNzhcdTYyOWVcdTMwOTJcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuYXRvbS4xPVxcYyBcdTMwNmVcdTVmOGNcdTMwNmJcdTMwNmZcdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNGMgVSswMDQwXHVmZjVlVSswMDVmIFx1MzA2ZVx1N2JjNFx1NTZmMlx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5hdG9tLjI9MVx1NjU4N1x1NWI1N1x1MzA2ZVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1NjU4N1x1NWI1N1x1MzA0YiAneycgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmF0b20uMz1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTU0MGRcdTMwNGMgJ30nIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5My4KLXBhcnNlci5hdG9tLjQ9XHUzMGUxXHUzMGJmXHU2NTg3XHU1YjU3XHUzMDRjXHU1OTA5XHUzMDZhXHUzMDY4XHUzMDUzXHUzMDhkXHUzMDZiXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5LgotcGFyc2VyLmF0b20uNT1cdTY3MmFcdTc3ZTVcdTMwNmVcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTU0MGRcdTMwNjdcdTMwNTkuCi1wYXJzZXIuY2MuMT1QT1NJWCBcdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTMwNmYgJzpdJyBcdTMwNjdcdTk1ODlcdTMwNThcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkuCi1wYXJzZXIuY2MuMj1cdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTUxODVcdTMwNjdcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuCi1wYXJzZXIuY2MuMz1cdTY3MmFcdTc3ZTVcdTMwNmUgUE9TSVggXHU2NTg3XHU1YjU3XHUzMGFmXHUzMGU5XHUzMGI5XHU1NDBkXHUzMDY3XHUzMDU5LgotcGFyc2VyLmNjLjQ9XHUzMDUzXHUzMDUzXHUzMDZiICctJyBcdTMwOTJcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuY2MuNT0nXScgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmNjLjY9XHU2NTg3XHU1YjU3XHUzMGFmXHUzMGU5XHUzMGI5XHU1MTg1XHUzMDY3XHUzMDZmICdbJyBcdTMwOTJcdTc2ZjRcdTYzYTVcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuICdcXFsnIFx1MzA2OFx1NjZmOFx1MzA0NFx1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NC4KLXBhcnNlci5jYy43PVx1NjU4N1x1NWI1N1x1MzBhZlx1MzBlOVx1MzBiOVx1NTE4NVx1MzA2N1x1MzA2ZiAnXScgXHUzMDkyXHU3NmY0XHU2M2E1XHU2NmY4XHUzMDRmXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzLiAnXFxdJyBcdTMwNjhcdTY2ZjhcdTMwNDRcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDQuCi1wYXJzZXIub3BlLjE9J1snIFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5vcGUuMj0nKScgXHUzMDRiICctWycgXHUzMDRiICcrWycgXHUzMDRiICcmWycgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmRlc2NhcGUuMT1cdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNmUxNlx1OTAzMlx1NjU3MFx1ODg2OFx1OGExOFx1NGUyZFx1MzA2Ylx1OTU5M1x1OTA1NVx1MzA2M1x1MzA1Zlx1NjU4N1x1NWI1N1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OS4KLXBhcnNlci5kZXNjYXBlLjI9XHUzMGIzXHUzMGZjXHUzMGM5XHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU2NTcwXHU1MDI0XHUzMDRjXHU1OTI3XHUzMDRkXHUzMDU5XHUzMDRlXHUzMDdlXHUzMDU5LgotcGFyc2VyLmRlc2NhcGUuMz0nXFx4eycgXHUzMDZmICd9JyBcdTMwNjdcdTk1ODlcdTMwNThcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuZGVzY2FwZS40PVVuaWNvZGUgXHUzMDZlXHUzMGIzXHUzMGZjXHUzMGM5XHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDY4XHUzMDU3XHUzMDY2XHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5LgotcGFyc2VyLmRlc2NhcGUuNT1cdTMwYTJcdTMwZjNcdTMwYWJcdTMwZmNcdTMwOTJcdTMwNTNcdTMwNTNcdTMwNmJcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIucHJvY2Vzcy4xPVx1MzA1M1x1MzA2ZVx1ODg2OFx1NzNmZVx1MzA2Zlx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1OGEyZFx1NWI5YVx1MzA2N1x1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9CdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjUzYTI2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUxICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sSW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxTdHJpbmdJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguU2NoZW1hUmVndWxhckV4cHJlc3Npb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBjbGFzcyBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbSBleHRlbmRzIFNjaGVtYVR5cGVMb2FkZXJCYXNlIGltcGxlbWVudHMgU2NoZW1hVHlwZVN5c3RlbQotewotICAgIC8vIFRoZSBnbG9iYWwgYnVpbHRpbiB0eXBlIHN5c3RlbQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZVN5c3RlbSBnZXQoKQotICAgICAgICB7IHJldHVybiBfZ2xvYmFsOyB9Ci0KLSAgICAvLyBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgZWFybHkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlW10gRU1QVFlfU0NIRU1BVFlQRV9BUlJBWSA9IG5ldyBTY2hlbWFUeXBlWzBdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUuUmVmW10gRU1QVFlfU0NIRU1BVFlQRVJFRl9BUlJBWSA9IG5ldyBTY2hlbWFUeXBlLlJlZlswXTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFHbG9iYWxFbGVtZW50W10gRU1QVFlfU0NIRU1BRUxFTUVOVF9BUlJBWSA9IG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50WzBdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIEVNUFRZX1NDSEVNQUFUVFJJQlVURV9BUlJBWSA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbMF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hTW9kZWxHcm91cFtdIEVNUFRZX1NDSEVNQU1PREVMR1JPVVBfQVJSQVkgPSBuZXcgU2NoZW1hTW9kZWxHcm91cFswXTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIEVNUFRZX1NDSEVNQUFUVFJJQlVURUdST1VQX0FSUkFZID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwWzBdOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0gX2dsb2JhbCA9IG5ldyBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbSgpOwotCi0gICAgLy8gVVIgdHlwZXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0FOWV9UWVBFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19BTllfVFlQRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9BTllfU0lNUExFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFKTsKLQotICAgIC8vIHByaW1pdGl2ZXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0JPT0xFQU4gPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0JPT0xFQU4pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQkFTRV82NF9CSU5BUlkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0hFWF9CSU5BUlkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQU5ZX1VSSSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQU5ZX1VSSSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9RTkFNRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfUU5BTUUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk9UQVRJT04gPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0ZMT0FUID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19GTE9BVCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9ET1VCTEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0RPVUJMRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9ERUNJTUFMID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19ERUNJTUFMKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1NUUklORyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfU1RSSU5HKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfRFVSQVRJT04gPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0RBVEVfVElNRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfREFURV9USU1FKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1RJTUUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1RJTUUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfREFURSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfREFURSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9HX1lFQVJfTU9OVEggPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9HX1lFQVIgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0dfWUVBUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9HX01PTlRIX0RBWSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19EQVkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0dfREFZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0dfTU9OVEggPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEgpOwotCi0gICAgLy8gZGVyaXZlZCBudW1lcmljcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSU5URUdFUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9MT05HID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19MT05HKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0lOVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSU5UKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1NIT1JUID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19TSE9SVCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9CWVRFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19CWVRFKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05PTl9QT1NJVElWRV9JTlRFR0VSID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OT05fUE9TSVRJVkVfSU5URUdFUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9ORUdBVElWRV9JTlRFR0VSID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19ORUdBVElWRV9JTlRFR0VSKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05PTl9ORUdBVElWRV9JTlRFR0VSID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OT05fTkVHQVRJVkVfSU5URUdFUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9QT1NJVElWRV9JTlRFR0VSID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19QT1NJVElWRV9JTlRFR0VSKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1VOU0lHTkVEX0xPTkcgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0xPTkcpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfVU5TSUdORURfSU5UID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfVU5TSUdORURfU0hPUlQgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX1NIT1JUKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1VOU0lHTkVEX0JZVEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0JZVEUpOwotCi0gICAgLy8gZGVyaXZlZCBzdHJpbmdzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OT1JNQUxJWkVEX1NUUklORyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkcpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfVE9LRU4gPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1RPS0VOKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05BTUUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05BTUUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTkNOQU1FID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OQ05BTUUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTEFOR1VBR0UgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0lEID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19JRCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9JRFJFRiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSURSRUYpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfSURSRUZTID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19JRFJFRlMpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfRU5USVRZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19FTlRJVFkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfRU5USVRJRVMgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05NVE9LRU4gPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05NVE9LRU4pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk1UT0tFTlMgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05NVE9LRU5TKTsKLQotICAgIC8vIHRoZSBuby10eXBlCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OT19UWVBFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZiBYTUxTVFJfUFJFU0VSVkUgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZiBYTUxTVFJfUkVQTEFDRSA9IGJ1aWxkU3RyaW5nKCJwcmVzZXJ2ZSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmIFhNTFNUUl9DT0xMQVBTRSA9IGJ1aWxkU3RyaW5nKCJwcmVzZXJ2ZSIpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfTk9ORSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICBudWxsLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX05PTkUgPSBuZXcgYm9vbGVhbltdCi0gICAgICAgIHsgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19XU19DT0xMQVBTRSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfV1NfUkVQTEFDRSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX1JFUExBQ0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19XU19QUkVTRVJWRSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX1BSRVNFUlZFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfSU5URUdFUiA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfTE9ORyA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1JTl9WQUxVRSkpLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0lOVCA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1JTl9WQUxVRSkpLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1NIT1JUID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKFNob3J0Lk1JTl9WQUxVRSkpLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKFNob3J0Lk1BWF9WQUxVRSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19CWVRFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKEJ5dGUuTUlOX1ZBTFVFKSksIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoQnl0ZS5NQVhfVkFMVUUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfTk9OTkVHQVRJVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBudWxsLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19QT1NJVElWRSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuT05FKSwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfTk9OUE9TSVRJVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19ORUdBVElWRSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuT05FLm5lZ2F0ZSgpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5TSUdORURfTE9ORyA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksIGJ1aWxkSW50ZWdlcihuZXcgQmlnSW50ZWdlcigiMTg0NDY3NDQwNzM3MDk1NTE2MTUiKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1VOU0lHTkVEX0lOVCA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoNDI5NDk2NzI5NUwpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5TSUdORURfU0hPUlQgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDY1NTM1KSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1VOU0lHTkVEX0JZVEUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDI1NSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19CVUlMVElOX0xJU1QgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuT05FKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19XUyA9IG5ldyBib29sZWFuW10KLSAgICAgICAgeyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19JTlRFR0VSID0gbmV3IGJvb2xlYW5bXQotICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwKLSAgICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKLQotICAgIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTklPTiA9IEZBQ0VUU19OT05FOwotICAgIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX1VOSU9OID0gRklYRURfRkFDRVRTX05PTkU7Ci0KLSAgICBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfTElTVCA9IEZBQ0VUU19XU19DT0xMQVBTRTsKLSAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19MSVNUID0gRklYRURfRkFDRVRTX1dTOwotCi0KLSAgICAvKgotICAgICAqIExBU1QgU3RhdGljIGluaXRpYWxpemVyCi0gICAgICovCi0gICAgc3RhdGljIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOOyBpIDw9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZ2xvYmFsLmZpbGxJblR5cGUoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBfdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlSW1wbFtdIF90eXBlQXJyYXkgPSBuZXcgU2NoZW1hVHlwZUltcGxbU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOICsgMV07Ci0gICAgcHJpdmF0ZSBNYXAgX2hhbmRsZXNUb09iamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9vYmplY3RzVG9IYW5kbGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfdHlwZXNCeUNsYXNzbmFtZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGVJbXBsIGdldEJ1aWx0aW5UeXBlKGludCBidGMpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGVBcnJheVtidGNdOwotICAgIH0KLQotICAgIHByaXZhdGUgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0oKQotICAgIHsKLSAgICAgICAgLy8gVVIgdHlwZXMKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFLCAiYW55VHlwZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSwgImFueVNpbXBsZVR5cGUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlIik7Ci0KLSAgICAgICAgLy8gcHJpbWl0aXZlcwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfQk9PTEVBTiwgImJvb2xlYW4iLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxCb29sZWFuIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWSwgImJhc2U2NEJpbmFyeSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJhc2U2NEJpbmFyeSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWSwgImhleEJpbmFyeSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEhleEJpbmFyeSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfQU5ZX1VSSSwgImFueVVSSSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVVSSSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfUU5BTUUsICJRTmFtZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OT1RBVElPTiwgIk5PVEFUSU9OIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk9UQVRJT04iKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0ZMT0FULCAiZmxvYXQiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxGbG9hdCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfRE9VQkxFLCAiZG91YmxlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG91YmxlIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19ERUNJTUFMLCAiZGVjaW1hbCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERlY2ltYWwiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1NUUklORywgInN0cmluZyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZyIpOwotCi0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19EVVJBVElPTiwgImR1cmF0aW9uIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRHVyYXRpb24iKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSwgImRhdGVUaW1lIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZVRpbWUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1RJTUUsICJ0aW1lIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVGltZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfREFURSwgImRhdGUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEgsICJnWWVhck1vbnRoIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR1llYXJNb250aCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfR19ZRUFSLCAiZ1llYXIiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxHWWVhciIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVksICJnTW9udGhEYXkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxHTW9udGhEYXkiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0dfREFZLCAiZ0RheSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdEYXkiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEgsICJnTW9udGgiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxHTW9udGgiKTsKLQotICAgICAgICAvLyBkZXJpdmVkIG51bWVyaWNzCi0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19JTlRFR0VSLCAiaW50ZWdlciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXIiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0xPTkcsICJsb25nIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTG9uZyIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSU5ULCAiaW50IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19TSE9SVCwgInNob3J0IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2hvcnQiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0JZVEUsICJieXRlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQnl0ZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9OX1BPU0lUSVZFX0lOVEVHRVIsICJub25Qb3NpdGl2ZUludGVnZXIiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb25Qb3NpdGl2ZUludGVnZXIiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05FR0FUSVZFX0lOVEVHRVIsICJuZWdhdGl2ZUludGVnZXIiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOZWdhdGl2ZUludGVnZXIiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSLCAibm9uTmVnYXRpdmVJbnRlZ2VyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19QT1NJVElWRV9JTlRFR0VSLCAicG9zaXRpdmVJbnRlZ2VyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9MT05HLCAidW5zaWduZWRMb25nIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRMb25nIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQsICJ1bnNpZ25lZEludCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkSW50Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9TSE9SVCwgInVuc2lnbmVkU2hvcnQiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZFNob3J0Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9CWVRFLCAidW5zaWduZWRCeXRlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRCeXRlIik7Ci0KLSAgICAgICAgLy8gZGVyaXZlZCBzdHJpbmdzCi0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OT1JNQUxJWkVEX1NUUklORywgIm5vcm1hbGl6ZWRTdHJpbmciLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb3JtYWxpemVkU3RyaW5nIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19UT0tFTiwgInRva2VuIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVG9rZW4iKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05BTUUsICJOYW1lIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTmFtZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTkNOQU1FLCAiTkNOYW1lIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTkNOYW1lIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRSwgImxhbmd1YWdlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGFuZ3VhZ2UiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0lELCAiSUQiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSURSRUYsICJJRFJFRiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEUkVGIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19JRFJFRlMsICJJRFJFRlMiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRFJFRlMiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0VOVElUWSwgIkVOVElUWSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVOVElUWSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfRU5USVRJRVMsICJFTlRJVElFUyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVOVElUSUVTIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OTVRPS0VOLCAiTk1UT0tFTiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5NVE9LRU4iKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05NVE9LRU5TLCAiTk1UT0tFTlMiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOTVRPS0VOUyIpOwotCi0gICAgICAgIC8vIHRoZSBuby10eXBlCi0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gInNjaGVtYS50eXBlc3lzdGVtLmJ1aWx0aW4iOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRGVmaW5lZChTdHJpbmcgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZFR5cGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfdHlwZU1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kRG9jdW1lbnRUeXBlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kQXR0cmlidXRlVHlwZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQgZmluZEVsZW1lbnQoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZmluZEF0dHJpYnV0ZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBmaW5kVHlwZShuYW1lKTsKLSAgICAgICAgcmV0dXJuICh0eXBlID09IG51bGwgPyBudWxsIDogdHlwZS5nZXRSZWYoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmREb2N1bWVudFR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kQXR0cmlidXRlVHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIGZpbmRFbGVtZW50UmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBmaW5kQXR0cmlidXRlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cC5SZWYgZmluZE1vZGVsR3JvdXBSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBmaW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKFFOYW1lIG5hbWUpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckNsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlKV90eXBlc0J5Q2xhc3NuYW1lLmdldChjbGFzc25hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTb3VyY2VBc1N0cmVhbShTdHJpbmcgc291cmNlTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOyAvLyBidWlsdGluIHNjaGVtYSB0eXBlIHN5c3RlbSBoYXMgbm8gc291cmNlLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB0eXBlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gZ2xvYmFsVHlwZXMoKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW190eXBlQXJyYXkubGVuZ3RoIC0gMV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3R5cGVBcnJheSwgMSwgcmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCB0eXBlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BVFlQRV9BUlJBWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFUWVBFX0FSUkFZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50W10gZ2xvYmFsRWxlbWVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQUVMRU1FTlRfQVJSQVk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gZ2xvYmFsQXR0cmlidXRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BQVRUUklCVVRFX0FSUkFZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vZGVsIGdyb3VwcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwW10gbW9kZWxHcm91cHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQU1PREVMR1JPVVBfQVJSQVk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGdyb3VwcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIGF0dHJpYnV0ZUdyb3VwcygpCi0gICAgewotICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BQVRUUklCVVRFR1JPVVBfQVJSQVk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gdHlwZSB3aXRoaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBoYW5kbGVGb3JUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKV9vYmplY3RzVG9IYW5kbGVzLmdldCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc2xvYWRlciB1c2VkIGJ5IHRoaXMgbG9hZGVyIGZvciByZXNvbHZpbmcgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoaXMgdHlwZSB0byBhIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlVG9EaXJlY3RvcnkoRmlsZSBjbGFzc0RpcikKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGJ1aWx0aW4gc2NoZW1hIHR5cGUgc3lzdGVtIGNhbm5vdCBiZSBzYXZlZC4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZF93c3N0cmluZyhpbnQgd3NyKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh3c3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19QUkVTRVJWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX1BSRVNFUlZFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9SRVBMQUNFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOgotICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfQ09MTEFQU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sVmFsdWVSZWYgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlciBiaWdJbnQpCi0gICAgewotICAgICAgICBpZiAoYmlnSW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKGJpZ0ludC5zaWdudW0oKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEludGVnZXJJbXBsIGkgPSBuZXcgWG1sSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGkuc2V0KGJpZ0ludCk7Ci0gICAgICAgICAgICBpLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZihpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sVmFsdWVSZWYgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIgYmlnSW50KQotICAgIHsKLSAgICAgICAgaWYgKGJpZ0ludCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxJbnRlZ2VySW1wbCBpID0gbmV3IFhtbEludGVnZXJJbXBsKCk7Ci0gICAgICAgICAgICBpLnNldChiaWdJbnQpOwotICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkU3RyaW5nKFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sU3RyaW5nSW1wbCBpID0gbmV3IFhtbFN0cmluZ0ltcGwoKTsKLSAgICAgICAgICAgIGkuc2V0KHN0cik7Ci0gICAgICAgICAgICBpLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZihpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQnVpbHRpbihpbnQgYnRjLCBTdHJpbmcgbG9jYWxuYW1lLCBTdHJpbmcgY2xhc3NuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZUltcGwgcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVJbXBsKHRoaXMsIHRydWUpOwotICAgICAgICBRTmFtZSBuYW1lID0gbG9jYWxuYW1lID09IG51bGwgPyBudWxsIDogUU5hbWVIZWxwZXIuZm9yTE5TKGxvY2FsbmFtZSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSAiX0JJXyIgKyAobG9jYWxuYW1lID09IG51bGwgPyAiTk9fVFlQRSIgOiBsb2NhbG5hbWUpOwotICAgICAgICByZXN1bHQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgcmVzdWx0LnNldEJ1aWx0aW5UeXBlQ29kZShidGMpOwotICAgICAgICBpZiAoY2xhc3NuYW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHQuc2V0RnVsbEphdmFOYW1lKGNsYXNzbmFtZSk7Ci0KLSAgICAgICAgX3R5cGVBcnJheVtidGNdID0gcmVzdWx0OwotICAgICAgICBfdHlwZU1hcC5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgX2hhbmRsZXNUb09iamVjdHMucHV0KGhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgX29iamVjdHNUb0hhbmRsZXMucHV0KHJlc3VsdCwgaGFuZGxlKTsKLSAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgX3R5cGVzQnlDbGFzc25hbWUucHV0KGNsYXNzbmFtZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKLSAgICB7Ci0gICAgICAgIC8vIHdlJ3JlIGJvcm4gcmVzb2x2ZWQgYW5kIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckhhbmRsZShTdHJpbmcgaGFuZGxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlKV9oYW5kbGVzVG9PYmplY3RzLmdldChoYW5kbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQgcmVzb2x2ZUhhbmRsZShTdHJpbmcgaGFuZGxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFDb21wb25lbnQpX2hhbmRsZXNUb09iamVjdHMuZ2V0KGhhbmRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlua3MgYSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxJblR5cGUoaW50IGJ0YykKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IGdldEJ1aWx0aW5UeXBlKGJ0Yyk7Ci0gICAgICAgIFNjaGVtYVR5cGUgYmFzZTsKLSAgICAgICAgU2NoZW1hVHlwZSBpdGVtID0gbnVsbDsKLSAgICAgICAgaW50IHZhcmlldHkgPSBTY2hlbWFUeXBlLkFUT01JQzsKLSAgICAgICAgaW50IGRlcml2YXRpb25UeXBlID0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTjsKLQotICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTjoKLSAgICAgICAgICAgICAgICB2YXJpZXR5ID0gU2NoZW1hVHlwZS5OT1RfU0lNUExFOwotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9BTllfVFlQRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVFlQRToKLSAgICAgICAgICAgICAgICB2YXJpZXR5ID0gU2NoZW1hVHlwZS5OT1RfU0lNUExFOwotICAgICAgICAgICAgICAgIGJhc2UgPSBudWxsOwotICAgICAgICAgICAgICAgIGRlcml2YXRpb25UeXBlID0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0FOWV9UWVBFOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0FOWV9TSU1QTEU7IGJyZWFrOwotCi0gICAgICAgICAgICAvLyBkZXJpdmVkIG51bWVyaWNzCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0RFQ0lNQUw7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xPTkc6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0lOVEVHRVI7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVDoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfTE9ORzsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0lOVDsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQllURToKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfU0hPUlQ7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9JTlRFR0VSOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OT05fUE9TSVRJVkVfSU5URUdFUjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9OX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0lOVEVHRVI7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX05PTl9ORUdBVElWRV9JTlRFR0VSOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9MT05HOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OT05fTkVHQVRJVkVfSU5URUdFUjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfSU5UOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9VTlNJR05FRF9MT05HOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9TSE9SVDoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfVU5TSUdORURfSU5UOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9CWVRFOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9VTlNJR05FRF9TSE9SVDsgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIGRlcml2ZWQgc3RyaW5ncwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfU1RSSU5HOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19UT0tFTjoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfTk9STUFMSVpFRF9TVFJJTkc7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05BTUU6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX1RPS0VOOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX05BTUU7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRZOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OQ05BTUU7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9UT0tFTjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUZTOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTlM6Ci0gICAgICAgICAgICAgICAgdmFyaWV0eSA9IFNjaGVtYVR5cGUuTElTVDsKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgICAgICAgICBpZiAoYnRjID09IFNjaGVtYVR5cGUuQlRDX0lEUkVGUykKLSAgICAgICAgICAgICAgICAgICAgaXRlbSA9IFNUX0lEUkVGOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19FTlRJVElFUykKLSAgICAgICAgICAgICAgICAgICAgaXRlbSA9IFNUX0VOVElUWTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBTVF9OTVRPS0VOOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldERlcml2YXRpb25UeXBlKGRlcml2YXRpb25UeXBlKTsKLSAgICAgICAgcmVzdWx0LnNldFNpbXBsZVR5cGVWYXJpZXR5KHZhcmlldHkpOwotICAgICAgICBpZiAodmFyaWV0eSAhPSBTY2hlbWFUeXBlLk5PVF9TSU1QTEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IChidGMgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEUgfHwgYnRjID09IFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0QmFzZVR5cGVSZWYoYmFzZSA9PSBudWxsID8gbnVsbCA6IGJhc2UuZ2V0UmVmKCkpOwotICAgICAgICByZXN1bHQuc2V0QmFzZURlcHRoKGJhc2UgPT0gbnVsbCA/IDAgOiAoKFNjaGVtYVR5cGVJbXBsKWJhc2UpLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMaXN0SXRlbVR5cGVSZWYoaXRlbSA9PSBudWxsID8gbnVsbCA6IGl0ZW0uZ2V0UmVmKCkpOwotICAgICAgICBpZiAoYnRjID49IFNjaGVtYVR5cGUuQlRDX0ZJUlNUX1BSSU1JVElWRSAmJiBidGMgPD0gU2NoZW1hVHlwZS5CVENfTEFTVF9QUklNSVRJVkUpCi0gICAgICAgICAgICByZXN1bHQuc2V0UHJpbWl0aXZlVHlwZVJlZihyZXN1bHQuZ2V0UmVmKCkpOwotICAgICAgICBlbHNlIGlmICh2YXJpZXR5ID09IFNjaGVtYVR5cGUuQVRPTUlDKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmFzZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJhc2Ugd2FzIG51bGwgZm9yICIgKyBidGMpOwotICAgICAgICAgICAgaWYgKGJhc2UuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmFzZS5ncHQgd2FzIG51bGwgZm9yICIgKyBidGMpOwotICAgICAgICAgICAgcmVzdWx0LnNldFByaW1pdGl2ZVR5cGVSZWYoYmFzZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgWG1sVmFsdWVSZWZbXSBmYWNldHM7Ci0gICAgICAgIGJvb2xlYW5bXSBmaXhlZGY7Ci0gICAgICAgIGludCB3c3IgPSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOwotICAgICAgICBpbnQgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLk5PVF9ERUNJTUFMOwotCi0gICAgICAgIC8vIG5vdyBzZXQgdXAgZmFjZXRzCi0gICAgICAgIHN3aXRjaCAoYnRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19OT05FOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19OT05FOwotICAgICAgICAgICAgICAgIHdzciA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19XU19QUkVTRVJWRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfTk9ORTsKLSAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1dTX0NPTExBUFNFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19XUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19XU19DT0xMQVBTRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfV1M7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIGRlcml2ZWQgbnVtZXJpY3MKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MT05HOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19MT05HOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0xPTkc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5UOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19JTlQ7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfSU5UOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NIT1JUOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19TSE9SVDsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9TSE9SVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CWVRFOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19CWVRFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JZVEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9OX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX05PTlBPU0lUSVZFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX05FR0FUSVZFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19OT05ORUdBVElWRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19QT1NJVElWRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9MT05HOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19VTlNJR05FRF9MT05HOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfVU5TSUdORURfSU5UOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0xPTkc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1VOU0lHTkVEX1NIT1JUOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0lOVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9CWVRFOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19VTlNJR05FRF9CWVRFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgIC8vIGRlcml2ZWQgc3RyaW5ncwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfV1NfUkVQTEFDRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfTk9ORTsKLSAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX1JFUExBQ0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVE9LRU46Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05DTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTEFOR1VBR0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUZTOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19FTlRJVFk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU46Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1dTX0NPTExBUFNFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19OT05FOwotICAgICAgICAgICAgICAgIHdzciA9IFNjaGVtYVR5cGUuV1NfQ09MTEFQU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRJRVM6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU5TOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19CVUlMVElOX0xJU1Q7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX05PTkU7Ci0gICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZ1bmRhbWVudGFsIGZhY2V0cwotICAgICAgICBpbnQgb3JkZXJlZCA9IFNjaGVtYVR5cGUuVU5PUkRFUkVEOwotICAgICAgICBib29sZWFuIGlzTnVtZXJpYyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGlzRmluaXRlID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaXNCb3VuZGVkID0gZmFsc2U7Ci0KLSAgICAgICAgc3dpdGNoIChidGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVFlQRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU46Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RPS0VOOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQ05BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUY6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGUzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTlM6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICBpc0Zpbml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlRFR0VSOgotICAgICAgICAgICAgICAgIGlzTnVtZXJpYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFNjaGVtYVR5cGUuVE9UQUxfT1JERVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICBvcmRlcmVkID0gU2NoZW1hVHlwZS5QQVJUSUFMX09SREVSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xPTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU0hPUlQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JZVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfSU5UOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9TSE9SVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURToKLSAgICAgICAgICAgICAgICBpc051bWVyaWMgPSB0cnVlOwotICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBTY2hlbWFUeXBlLlRPVEFMX09SREVSOwotICAgICAgICAgICAgICAgIGlzRmluaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc0JvdW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldEJhc2ljRmFjZXRzKGZhY2V0cywgZml4ZWRmKTsKLSAgICAgICAgcmVzdWx0LnNldFdoaXRlU3BhY2VSdWxlKHdzcik7Ci0gICAgICAgIHJlc3VsdC5zZXRPcmRlcmVkKG9yZGVyZWQpOwotICAgICAgICByZXN1bHQuc2V0Qm91bmRlZChpc0JvdW5kZWQpOwotICAgICAgICByZXN1bHQuc2V0TnVtZXJpYyhpc051bWVyaWMpOwotICAgICAgICByZXN1bHQuc2V0RmluaXRlKGlzRmluaXRlKTsKLSAgICAgICAgcmVzdWx0LnNldERlY2ltYWxTaXplKGRlY2ltYWxTaXplKTsKLSAgICAgICAgcmVzdWx0LnNldEFub255bW91c1R5cGVSZWZzKEVNUFRZX1NDSEVNQVRZUEVSRUZfQVJSQVkpOwotCi0gICAgICAgIC8vIFRPRE86IHNldCB1cCBwYXR0ZXJucyBmb3IgTkNOQU1FLCBsYW5ndWFnZSwgZXRjLgotCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBoYXNQYXR0ZXJuID0gZmFsc2U7Ci0KLSAgICAgICAgc3dpdGNoIChidGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTEFOR1VBR0U6Ci0gICAgICAgICAgICAgICAgcGF0dGVybiA9ICJbYS16QS1aXXsxLDh9KC1bYS16QS1aMC05XXsxLDh9KSoiOyAvLyB3ZSB1c2VkIHRvIGhhdmUgKFthLXpBLVpdezJ9fFtpSV0tW2EtekEtWl0rfFt4WF0tW2EtekEtWl17MSw4fSkoLVthLXpBLVpdezEsOH0pKiIsIGJ1dCBzNHMgdXNlcyB0aGUgbW9yZSBsZW5pZW50IHBhdHRlcm4gdG8gdGhlIGxlZnQuIAotICAgICAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOOgotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFxjKyI7IAotICAgICAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQU1FOgotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFxpXFxjKiI7Ci0gICAgICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05DTkFNRToKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIltcXGktWzpdXVtcXGMtWzpdXSoiOwotICAgICAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBUaGVzZSB0eXBlcyBpbmhlcml0IHRoZWlyIHBhdHRlcm5zCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRZOgotICAgICAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uIHAgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsgcCA9IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5TY2hlbWFSZWd1bGFyRXhwcmVzc2lvbi5mb3JQYXR0ZXJuKHBhdHRlcm4pOyB9Ci0gICAgICAgICAgICBjYXRjaCAob3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlBhcnNlRXhjZXB0aW9uIGUpIHsgYXNzZXJ0IGZhbHNlOyB9Ci0gICAgICAgICAgICByZXN1bHQuc2V0UGF0dGVybnMobmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHtwfSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnNldFBhdHRlcm5GYWNldChoYXNQYXR0ZXJuKTsKLQotCi0KLSAgICAgICAgLy8gQU5ZX1RZUEUgaGFzIHRvIGJlIGFibGUgdG8gYWN0IGxpa2UgYSBjb21wbGV4IHR5cGUKLSAgICAgICAgaWYgKGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19BTllfVFlQRSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIGNvbnRlbnRNb2RlbCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRQYXJ0aWNsZVR5cGUoU2NoZW1hUGFydGljbGUuV0lMRENBUkQpOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFdpbGRjYXJkU2V0KFFOYW1lU2V0LkFMTCk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0V2lsZGNhcmRQcm9jZXNzKFNjaGVtYVBhcnRpY2xlLkxBWCk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0TWF4T2NjdXJzKG51bGwpOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFRyYW5zaXRpb25SdWxlcyhRTmFtZVNldC5BTEwsIHRydWUpOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFRyYW5zaXRpb25Ob3RlcyhRTmFtZVNldC5BTEwsIHRydWUpOwotCi0gICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotICAgICAgICAgICAgYXR0ck1vZGVsLnNldFdpbGRjYXJkUHJvY2VzcyhTY2hlbWFBdHRyaWJ1dGVNb2RlbC5MQVgpOwotICAgICAgICAgICAgYXR0ck1vZGVsLnNldFdpbGRjYXJkU2V0KFFOYW1lU2V0LkFMTCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRDb21wbGV4VHlwZVZhcmlldHkoU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDb250ZW50TW9kZWwoY29udGVudE1vZGVsLCBhdHRyTW9kZWwsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBmYWxzZSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0QW5vbnltb3VzVHlwZVJlZnMoRU1QVFlfU0NIRU1BVFlQRVJFRl9BUlJBWSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRTdW1tYXJ5KFFOYW1lU2V0LkFMTCwgdHJ1ZSwgUU5hbWVTZXQuQUxMLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChidGMgPT0gU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNvIGRvZXMgdGhlIG5vX3R5cGUgOiBpdCBwZXJtaXRzIG5vIGNvbnRlbnRzIChhbmQgZXZlbiBlbXB0eSBjb250ZW50cyBpcyBpbnZhbGlkLCBidXQgdGhhdCdzIHNwZWNpYWwtY2FzZWQpCi0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgY29udGVudE1vZGVsID0gbnVsbDsgLy8gZW1wdHkKLSAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7IC8vIGVtcHR5Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q29tcGxleFR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgZmFsc2UpOwotICAgICAgICAgICAgcmVzdWx0LnNldEFub255bW91c1R5cGVSZWZzKEVNUFRZX1NDSEVNQVRZUEVSRUZfQVJSQVkpOwotICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkU3VtbWFyeShRTmFtZVNldC5FTVBUWSwgZmFsc2UsIFFOYW1lU2V0LkVNUFRZLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0T3JkZXJTZW5zaXRpdmUoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZSBnZXROb1R5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNUX05PX1RZUEU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJlMmE0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0NsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlciBpbXBsZW1lbnRzIFJlc291cmNlTG9hZGVyCi17Ci0gICAgQ2xhc3NMb2FkZXIgX2NsYXNzTG9hZGVyOwotCi0gICAgQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICB7Ci0gICAgICAgIF9jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNvdXJjZU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gX2NsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9GaWxlUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0ZpbGVSZXNvdXJjZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRhY2RhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0ZpbGVSZXNvdXJjZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlUmVzb3VyY2VMb2FkZXIgaW1wbGVtZW50cyBSZXNvdXJjZUxvYWRlcgotewotICAgIHByaXZhdGUgRmlsZSBfZGlyZWN0b3J5OwotICAgIHByaXZhdGUgWmlwRmlsZSBfemlwZmlsZTsKLQotICAgIHB1YmxpYyBGaWxlUmVzb3VyY2VMb2FkZXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICBfZGlyZWN0b3J5ID0gZmlsZTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfemlwZmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlc291cmNlTmFtZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3ppcGZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IF96aXBmaWxlLmdldEVudHJ5KHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIHJldHVybiBfemlwZmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoX2RpcmVjdG9yeSwgcmVzb3VyY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgaWYgKF96aXBmaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF96aXBmaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvaCB3ZWxsLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3ppcGZpbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9QYXRoUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1BhdGhSZXNvdXJjZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjZkODkxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1BhdGhSZXNvdXJjZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFBhdGhSZXNvdXJjZUxvYWRlciBpbXBsZW1lbnRzIFJlc291cmNlTG9hZGVyCi17Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZUxvYWRlcltdIF9wYXRoOwotCi0gICAgcHVibGljIFBhdGhSZXNvdXJjZUxvYWRlcihSZXNvdXJjZUxvYWRlcltdIGxvYWRlcnBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX3BhdGggPSBuZXcgUmVzb3VyY2VMb2FkZXJbbG9hZGVycGF0aC5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxvYWRlcnBhdGgsIDAsIF9wYXRoLCAwLCBfcGF0aC5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXRoUmVzb3VyY2VMb2FkZXIoRmlsZVtdIGZpbGVwYXRoKQotICAgIHsKLSAgICAgICAgTGlzdCBwYXRobGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VMb2FkZXIgcGF0aCA9IG5ldyBGaWxlUmVzb3VyY2VMb2FkZXIoZmlsZXBhdGhbaV0pOwotICAgICAgICAgICAgICAgIHBhdGhsaXN0LmFkZChwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBjYW4ndCByZWFkIGEgZmlsZSBvbiBjbGFzc3BhdGg/IHNraXAgaXQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX3BhdGggPSAoUmVzb3VyY2VMb2FkZXJbXSlwYXRobGlzdC50b0FycmF5KG5ldyBSZXNvdXJjZUxvYWRlcltwYXRobGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gcmVzdWx0ID0gX3BhdGhbaV0uZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3BhdGhbaV0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvaCB3ZWxsLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1Jlc291cmNlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNWFiMjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvUmVzb3VyY2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTG9hZGVyCi17Ci0gICAgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKTsKLSAgICB2b2lkIGNsb3NlKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNmZTE0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgaW1wbGVtZW50cyBTY2hlbWFBdHRyaWJ1dGVHcm91cAotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIHByaXZhdGUgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9yZWRlZmluaXRpb247Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSkKLSAgICB7Ci0gICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSwgUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXModHlwZVN5c3RlbSk7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFFOYW1lIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbiwgWG1sT2JqZWN0IHgpCi0gICAgewotICAgICAgICBhc3NlcnQgX25hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscyggX25hbWUgKTsKLQotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgIF9wYXJzZVROUyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgX2NoYW1lbGVvbiA9IGNoYW1lbGVvbjsKLSAgICAgICAgX3JlZGVmaW5pdGlvbiA9IHJlZGVmaW5pdGlvbjsKLSAgICAgICAgX3BhcnNlT2JqZWN0ID0geDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOyB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9uYW1lOyB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGdldFBhcnNlT2JqZWN0KCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlT2JqZWN0OyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZVROUzsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uID8gX3BhcnNlVE5TIDogbnVsbDsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKHRoaXMpOwotICAgIAotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZGVmaW5pdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9yZWRlZmluaXRpb247IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTRlZGEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGltcGxlbWVudHMgU2NoZW1hQXR0cmlidXRlTW9kZWwKLXsKLSAgICBwcml2YXRlIE1hcCBhdHRyTWFwOwotICAgIHByaXZhdGUgUU5hbWVTZXQgd2NTZXQ7Ci0gICAgcHJpdmF0ZSBpbnQgd2NQcm9jZXNzOwotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpCi0gICAgewotICAgICAgICBhdHRyTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgd2NTZXQgPSBudWxsOwotICAgICAgICB3Y1Byb2Nlc3MgPSBOT05FOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoU2NoZW1hQXR0cmlidXRlTW9kZWwgc2FtKQotICAgIHsKLSAgICAgICAgYXR0ck1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGlmIChzYW0gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd2NTZXQgPSBudWxsOwotICAgICAgICAgICAgd2NQcm9jZXNzID0gTk9ORTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnMgPSBzYW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyTWFwLnB1dChhdHRyc1tpXS5nZXROYW1lKCksIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNhbS5nZXRXaWxkY2FyZFByb2Nlc3MoKSAhPSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5OT05FKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdjU2V0ID0gc2FtLmdldFdpbGRjYXJkU2V0KCk7Ci0gICAgICAgICAgICAgICAgd2NQcm9jZXNzID0gc2FtLmdldFdpbGRjYXJkUHJvY2VzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gRU1QVFlfU0xBX0FSUkFZID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlWzBdOwotCi0gICAgcHVibGljIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUxvY2FsQXR0cmlidXRlW10pYXR0ck1hcC52YWx1ZXMoKS50b0FycmF5KEVNUFRZX1NMQV9BUlJBWSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUxvY2FsQXR0cmlidXRlIGdldEF0dHJpYnV0ZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFMb2NhbEF0dHJpYnV0ZSlhdHRyTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYXR0cnVzZSkKLSAgICB7Ci0gICAgICAgIGF0dHJNYXAucHV0KGF0dHJ1c2UuZ2V0TmFtZSgpLCBhdHRydXNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvaGliaXRlZEF0dHJpYnV0ZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgYXR0ck1hcC5yZW1vdmUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lU2V0IGdldFdpbGRjYXJkU2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3Y1NldCA9PSBudWxsID8gUU5hbWVTZXQuRU1QVFkgOiB3Y1NldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFNldChRTmFtZVNldCBzZXQpCi0gICAgewotICAgICAgICB3Y1NldCA9IHNldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpbGRjYXJkUHJvY2VzcygpCi0gICAgewotICAgICAgICByZXR1cm4gd2NQcm9jZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdpbGRjYXJkUHJvY2VzcyhpbnQgcHJvYykKLSAgICB7Ci0gICAgICAgIHdjUHJvY2VzcyA9IHByb2M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDE1MDE2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsCi0gICAgICAgIGltcGxlbWVudHMgU2NoZW1hR2xvYmFsQXR0cmlidXRlCi17Ci0gICAgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBTdHJpbmcgX2ZpbGVuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSkKLSAgICB7Ci0gICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZVN5c3RlbTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9maWxlbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICBfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRleHQoWG1sT2JqZWN0IHBhcnNlT2JqZWN0LCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikKLSAgICB7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX2NoYW1lbGVvbiA/IF9wYXJzZVROUyA6IG51bGw7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBfc2VsZnJlZiA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmKHRoaXMpOwotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxFbGVtZW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5MzFjMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZXh0ZW5kcyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsCi0gICAgICAgIGltcGxlbWVudHMgU2NoZW1hR2xvYmFsRWxlbWVudAotewotICAgIHByaXZhdGUgU2V0IF9zZ01lbWJlcnMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lW10gX25hbWVhcnJheSA9IG5ldyBRTmFtZVswXTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsRXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxSZXN0OwotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFN0cmluZyBfZmlsZW5hbWU7Ci0gICAgLy8gcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OyBub3cgaW5oZXJpdGVkIGZyb20gYmFzZQotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLSAgICBwcml2YXRlIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIF9zZzsKLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0pCi0gICAgewotICAgICAgICBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRGaW5hbChib29sZWFuIGZpbmFsRXh0LCBib29sZWFuIGZpbmFsUmVzdCkKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOyBfZmluYWxFeHQgPSBmaW5hbEV4dDsgX2ZpbmFsUmVzdCA9IGZpbmFsUmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50IHN1YnN0aXR1dGlvbkdyb3VwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2cgPT0gbnVsbCA/IG51bGwgOiBfc2cuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uR3JvdXAoU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgc2cpIAotICAgIHsKLSAgICAgICAgX3NnID0gc2c7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lW10gc3Vic3RpdHV0aW9uR3JvdXBNZW1iZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoUU5hbWVbXSlfc2dNZW1iZXJzLnRvQXJyYXkoX25hbWVhcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOyBfc2dNZW1iZXJzLmFkZChuYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmFsRXh0ZW5zaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmluYWxFeHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxSZXN0cmljdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbmFsUmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRleHQoWG1sT2JqZWN0IHBhcnNlT2JqZWN0LCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikKLSAgICB7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX2NoYW1lbGVvbiA/IF9wYXJzZVROUyA6IG51bGw7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYodGhpcyk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNzMzNjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbCBpbXBsZW1lbnRzIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludAotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFN0cmluZyBfc2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBfZmllbGRzOwotICAgIHByaXZhdGUgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBfa2V5OwotICAgIHByaXZhdGUgUU5hbWUgX25hbWU7Ci0gICAgcHJpdmF0ZSBpbnQgX3R5cGU7Ci0gICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlOwotICAgIHByaXZhdGUgTWFwIF9uc01hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0KLSAgICAvLyBMYXppbHkgY29tcHV0ZWQgcGF0aHMKLSAgICBwcml2YXRlIHZvbGF0aWxlIFhQYXRoIF9zZWxlY3RvclBhdGg7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBYUGF0aFtdIF9maWVsZFBhdGhzOwotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwoU2NoZW1hVHlwZVN5c3RlbSBzeXMpIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSBzeXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIF9zZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdG9yUGF0aCgpIHsKLSAgICAgICAgWFBhdGggcCA9IF9zZWxlY3RvclBhdGg7Ci0gICAgICAgIGlmIChwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRQYXRocygpOwotICAgICAgICAgICAgICAgIHAgPSBfc2VsZWN0b3JQYXRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhQYXRoLlhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiRmFpbGVkIHRvIGNvbXBpbGUgeHBhdGguIFNob3VsZCBiZSBjYXVnaHQgYnkgY29tcGlsZXIgIiArIGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TlNNYXAoTWFwIG5zTWFwKSB7Ci0gICAgICAgIF9uc01hcCA9IG5zTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0TlNNYXAoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoX25zTWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RvcihTdHJpbmcgc2VsZWN0b3IpIHsKLSAgICAgICAgYXNzZXJ0IHNlbGVjdG9yICE9IG51bGw7Ci0gICAgICAgIF9zZWxlY3RvciA9IHNlbGVjdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkcyhTdHJpbmdbXSBmaWVsZHMpIHsKLSAgICAgICAgYXNzZXJ0IGZpZWxkcyAhPSBudWxsICYmIGZpZWxkcy5sZW5ndGggPiAwOwotICAgICAgICBfZmllbGRzID0gZmllbGRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGaWVsZHMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IG5ldyBTdHJpbmdbX2ZpZWxkcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9maWVsZHMsIDAsIGZpZWxkcywgMCwgZmllbGRzLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFBhdGgoaW50IGluZGV4KSB7Ci0gICAgICAgIFhQYXRoW10gcCA9IF9maWVsZFBhdGhzOwotICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1aWxkUGF0aHMoKTsKLSAgICAgICAgICAgICAgICBwID0gX2ZpZWxkUGF0aHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJGYWlsZWQgdG8gY29tcGlsZSB4cGF0aC4gU2hvdWxkIGJlIGNhdWdodCBieSBjb21waWxlciAiICsgZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFtpbmRleF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnVpbGRQYXRocygpIHRocm93cyBYUGF0aC5YUGF0aENvbXBpbGVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiBOZWVkIHRoZSBuYW1lc3BhY2UgbWFwIC0gcmVxdWlyZXMgc3RvcmUgc3VwcG9ydAotICAgICAgICBfc2VsZWN0b3JQYXRoID0gWFBhdGguY29tcGlsZVhQYXRoKF9zZWxlY3RvciwgX25zTWFwKTsKLQotICAgICAgICBfZmllbGRQYXRocyA9IG5ldyBYUGF0aFtfZmllbGRzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9maWVsZFBhdGhzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIF9maWVsZFBhdGhzW2ldID0gWFBhdGguY29tcGlsZVhQYXRoKF9maWVsZHNbaV0sIF9uc01hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZEtleShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGtleSkgewotICAgICAgICBfa2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZ2V0UmVmZXJlbmNlZEtleSgpIHsKLSAgICAgICAgcmV0dXJuIF9rZXkuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludENhdGVnb3J5KGludCB0eXBlKSB7Ci0gICAgICAgIGFzc2VydCB0eXBlID49IENDX0tFWSAmJiB0eXBlIDw9IENDX1VOSVFVRTsKLSAgICAgICAgX3R5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgewotICAgICAgICByZXR1cm4gX3R5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIElERU5USVRZX0NPTlNUUkFJTlQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpIHsKLSAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgbywgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24pIHsKLSAgICAgICAgX3BhcnNlID0gbzsKLSAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICBfY2hhbWVsZW9uID0gY2hhbWVsZW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyc2VUTlM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBfY2hhbWVsZW9uID8gX3BhcnNlVE5TIDogbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE9ubHkgYXBwbGljYWJsZSB0byBrZXlyZWZzLiBPdGhlciB0eXBlcyBhcmUgaW1wbGljaXRseSByZXNvbHZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotICAgICAgICByZXR1cm4gZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgIT0gQ0NfS0VZUkVGIHx8IF9rZXkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZih0aGlzKTsKLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGdldFJlZigpCi0gICAgICAgIHsgcmV0dXJuIF9zZWxmcmVmOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50LlJlZiBnZXRDb21wb25lbnRSZWYoKQotICAgICAgICB7IHJldHVybiBnZXRSZWYoKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2NmU3NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU2NoZW1hV1NETEFycmF5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzIFNjaGVtYUxvY2FsQXR0cmlidXRlLCBTY2hlbWFXU0RMQXJyYXlUeXBlCi17Ci0gICAgcHVibGljIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoUU5hbWUgbmFtZSwgU2NoZW1hVHlwZS5SZWYgdHlwZXJlZiwgaW50IHVzZSwgU3RyaW5nIGRlZnRleHQsIFhtbE9iamVjdCBwYXJzZU9iamVjdCwgWG1sVmFsdWVSZWYgZGVmdmFsdWUsIGJvb2xlYW4gaXNGaXhlZCwgU09BUEFycmF5VHlwZSB3c2RsQXJyYXkpCi0gICAgewotICAgICAgICBpZiAoX3htbE5hbWUgIT0gbnVsbCB8fCBfdHlwZXJlZiAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWxyZWFkeSBpbml0aWFsaXplZCIpOwotICAgICAgICBfdXNlID0gdXNlOwotICAgICAgICBfdHlwZXJlZiA9IHR5cGVyZWY7Ci0gICAgICAgIF9kZWZhdWx0VGV4dCA9IGRlZnRleHQ7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgICAgICBfZGVmYXVsdFZhbHVlID0gZGVmdmFsdWU7Ci0gICAgICAgIF9pc0RlZmF1bHQgPSAoZGVmdGV4dCAhPSBudWxsKTsKLSAgICAgICAgX2lzRml4ZWQgPSBpc0ZpeGVkOwotICAgICAgICBfeG1sTmFtZSA9IG5hbWU7Ci0gICAgICAgIF93c2RsQXJyYXlUeXBlID0gd3NkbEFycmF5OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF9kZWZhdWx0VGV4dDsKLSAgICAvKiBwYWNrYWdlICovIFhtbFZhbHVlUmVmIF9kZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0ZpeGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNEZWZhdWx0OwotICAgIHByaXZhdGUgUU5hbWUgX3htbE5hbWU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfdHlwZXJlZjsKLSAgICBwcml2YXRlIFNPQVBBcnJheVR5cGUgX3dzZGxBcnJheVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgX3VzZTsKLSAgICBwcm90ZWN0ZWQgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsgLy8gZm9yIFFOYW1lIHJlc29sdXRpb24KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZVJlc29sdmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX3R5cGVyZWYgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICB7Ci0gICAgICAgIGlmIChfdHlwZXJlZiAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfdHlwZXJlZiA9IHR5cGVyZWY7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRVc2UoKQotICAgICAgICB7IHJldHVybiBfdXNlOyB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF94bWxOYW1lOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUZXh0KCkKLSAgICAgICAgeyByZXR1cm4gX2RlZmF1bHRUZXh0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKQotICAgICAgICB7IHJldHVybiBfaXNEZWZhdWx0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkKCkKLSAgICAgICAgeyByZXR1cm4gX2lzRml4ZWQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlKCkKLSAgICAgICAgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF90eXBlcmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZ2V0VHlwZVJlZigpCi0gICAgICAgIHsgcmV0dXJuIF90eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW5PY2N1cnMoKQotICAgICAgICB7IHJldHVybiBfdXNlID09IFJFUVVJUkVEID8gQmlnSW50ZWdlci5PTkUgOiBCaWdJbnRlZ2VyLlpFUk87IH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF91c2UgPT0gUFJPSElCSVRFRCA/IEJpZ0ludGVnZXIuWkVSTyA6IEJpZ0ludGVnZXIuT05FOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkKLSAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlIGdldFdTRExBcnJheVR5cGUoKQotICAgICAgICB7IHJldHVybiBfd3NkbEFycmF5VHlwZTsgfQotICAgIAotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpCi0gICAgewotICAgICAgICBpZiAoX2RlZmF1bHRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWUuZ2V0KCk7Ci0gICAgICAgIGlmIChfZGVmYXVsdFRleHQgIT0gbnVsbCAmJiBYbWxBbnlTaW1wbGVUeXBlLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShnZXRUeXBlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3BhcnNlT2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoX3BhcnNlT2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKCkubmV3VmFsdWUoX2RlZmF1bHRUZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLm5ld1ZhbHVlKF9kZWZhdWx0VGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFhtbFZhbHVlUmVmIGRlZmF1bHRSZWYpCi0gICAgICAgIHsgX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRSZWY7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUxvY2FsRWxlbWVudEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUxvY2FsRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjNWZjMC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNjaGVtYVdTRExBcnJheVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2NoZW1hUGFydGljbGVJbXBsCi0gICAgICAgIGltcGxlbWVudHMgU2NoZW1hTG9jYWxFbGVtZW50LCBTY2hlbWFXU0RMQXJyYXlUeXBlCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja0V4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrUmVzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrU3Vic3Q7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2FiczsKLSAgICBwcml2YXRlIFNPQVBBcnJheVR5cGUgX3dzZGxBcnJheVR5cGU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gX2NvbnN0cmFpbnRzID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbMF07Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCkKLSAgICB7Ci0gICAgICAgIHNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBibG9ja0V4dGVuc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Jsb2NrRXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ibG9ja1Jlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tTdWJzdGl0dXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ibG9ja1N1YnN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hYnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBhYnMpCi0gICAgewotICAgICAgICBfYWJzID0gYWJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJsb2NrKGJvb2xlYW4gZXh0ZW5zaW9uLCBib29sZWFuIHJlc3RyaWN0aW9uLCBib29sZWFuIHN1YnN0aXR1dGlvbikKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOwotICAgICAgICBfYmxvY2tFeHQgPSBleHRlbnNpb247Ci0gICAgICAgIF9ibG9ja1Jlc3QgPSByZXN0cmljdGlvbjsKLSAgICAgICAgX2Jsb2NrU3Vic3QgPSBzdWJzdGl0dXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbEFycmF5VHlwZShTT0FQQXJyYXlUeXBlIGFycmF5VHlwZSkKLSAgICB7Ci0gICAgICAgIF93c2RsQXJyYXlUeXBlID0gYXJyYXlUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlIGdldFdTRExBcnJheVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF93c2RsQXJyYXlUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkZW50aXR5Q29uc3RyYWludHMoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIGNvbnN0cmFpbnRzKSB7Ci0gICAgICAgIG11dGF0ZSgpOwotICAgICAgICBfY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpIHsKLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gcmVzdWx0ID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtfY29uc3RyYWludHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcmVzdWx0Lmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IF9jb25zdHJhaW50c1tpXS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIGdldElkZW50aXR5Q29uc3RyYWludFJlZnMoKSB7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltfY29uc3RyYWludHMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfY29uc3RyYWludHMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFNb2RlbEdyb3VwSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTW9kZWxHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyMWM0Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFNb2RlbEdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNjaGVtYU1vZGVsR3JvdXBJbXBsIGltcGxlbWVudHMgU2NoZW1hTW9kZWxHcm91cAotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIHByaXZhdGUgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9yZWRlZmluaXRpb247Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQotICAgIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwSW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0sIFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzKHR5cGVTeXN0ZW0pOwotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChRTmFtZSBuYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgYm9vbGVhbiByZWRlZmluaXRpb24sIFhtbE9iamVjdCB4KQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9uYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIF9uYW1lICk7Ci0gICAgICAgIAotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgIF9wYXJzZVROUyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgX2NoYW1lbGVvbiA9IGNoYW1lbGVvbjsKLSAgICAgICAgX3JlZGVmaW5pdGlvbiA9IHJlZGVmaW5pdGlvbjsKLSAgICAgICAgX3BhcnNlT2JqZWN0ID0geDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA7IH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX25hbWU7IH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VPYmplY3Q7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlVE5TOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWRlZmluaXRpb24oKQotICAgICAgICB7IHJldHVybiBfcmVkZWZpbml0aW9uOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYU1vZGVsR3JvdXAuUmVmIF9zZWxmcmVmID0gbmV3IFNjaGVtYU1vZGVsR3JvdXAuUmVmKHRoaXMpOwotICAgIAotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwLlJlZiBnZXRSZWYoKQotICAgICAgICB7IHJldHVybiBfc2VsZnJlZjsgfQotCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudC5SZWYgZ2V0Q29tcG9uZW50UmVmKCkKLSAgICAgICAgeyByZXR1cm4gZ2V0UmVmKCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVBhcnRpY2xlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUGFydGljbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjY4OTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUGFydGljbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUGFydGljbGVJbXBsIGltcGxlbWVudHMgU2NoZW1hUGFydGljbGUKLXsKLSAgICBwcml2YXRlIGludCBfcGFydGljbGVUeXBlOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfbWluT2NjdXJzOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfbWF4T2NjdXJzOwotICAgIHByaXZhdGUgU2NoZW1hUGFydGljbGVbXSBfcGFydGljbGVDaGlsZHJlbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzSW1tdXRhYmxlOwotICAgIHByaXZhdGUgUU5hbWVTZXQgX3N0YXJ0U2V0OwotICAgIHByaXZhdGUgUU5hbWVTZXQgX2V4Y2x1ZGVOZXh0U2V0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNTa2lwcGFibGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0RldGVybWluaXN0aWM7Ci0gICAgcHJpdmF0ZSBpbnQgX2ludE1pbk9jY3VyczsKLSAgICBwcml2YXRlIGludCBfaW50TWF4T2NjdXJzOwotICAgIHByaXZhdGUgUU5hbWVTZXQgX3dpbGRjYXJkU2V0OwotICAgIHByaXZhdGUgaW50IF93aWxkY2FyZFByb2Nlc3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmF1bHRUZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNEZWZhdWx0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNGaXhlZDsKLSAgICBwcml2YXRlIFFOYW1lIF9xTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzTmlsbGFibGU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfdHlwZXJlZjsKLSAgICBwcm90ZWN0ZWQgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsKLSAgICBwcml2YXRlIFhtbFZhbHVlUmVmIF9kZWZhdWx0VmFsdWU7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBtdXRhdGUoKQotICAgICAgICB7IGlmIChfaXNJbW11dGFibGUpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW1tdXRhYmxlKCkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2lzSW1tdXRhYmxlID0gdHJ1ZTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVHJhbnNpdGlvblJ1bGVzKCkKLSAgICAgICAgeyByZXR1cm4gKF9zdGFydFNldCAhPSBudWxsKTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVHJhbnNpdGlvbk5vdGVzKCkKLSAgICAgICAgeyByZXR1cm4gKF9leGNsdWRlTmV4dFNldCAhPSBudWxsKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNpdGlvblJ1bGVzKFFOYW1lU2V0IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2tpcHBhYmxlKQotICAgIHsKLSAgICAgICAgX3N0YXJ0U2V0ID0gc3RhcnQ7Ci0gICAgICAgIF9pc1NraXBwYWJsZSA9IGlzU2tpcHBhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaXRpb25Ob3RlcyhRTmFtZVNldCBleGNsdWRlTmV4dCwgYm9vbGVhbiBpc0RldGVybWluaXN0aWMpCi0gICAgewotICAgICAgICBfZXhjbHVkZU5leHRTZXQgPSBleGNsdWRlTmV4dDsKLSAgICAgICAgX2lzRGV0ZXJtaW5pc3RpYyA9IGlzRGV0ZXJtaW5pc3RpYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5TdGFydFdpdGhFbGVtZW50KFFOYW1lIG5hbWUpCi0gICAgICAgIHsgcmV0dXJuIG5hbWUgIT0gbnVsbCAmJiBfc3RhcnRTZXQuY29udGFpbnMobmFtZSk7IH0KLQotICAgIHB1YmxpYyBRTmFtZVNldCBhY2NlcHRlZFN0YXJ0TmFtZXMoKQotICAgICAgICB7IHJldHVybiBfc3RhcnRTZXQ7IH0KLQotICAgIHB1YmxpYyBRTmFtZVNldCBnZXRFeGNsdWRlTmV4dFNldCgpCi0gICAgICAgIHsgcmV0dXJuIF9leGNsdWRlTmV4dFNldDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwcGFibGUoKQotICAgICAgICB7IHJldHVybiBfaXNTa2lwcGFibGU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpCi0gICAgICAgIHsgcmV0dXJuIF9pc0RldGVybWluaXN0aWM7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFydGljbGVUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnRpY2xlVHlwZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFydGljbGVUeXBlKGludCBwVHlwZSkKLSAgICAgICAgeyBtdXRhdGUoKTsgX3BhcnRpY2xlVHlwZSA9IHBUeXBlOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZXRvbigpCi0gICAgICAgIHsgcmV0dXJuIF9tYXhPY2N1cnMgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICBfbWF4T2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICBfbWluT2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMDsgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX21pbk9jY3VyczsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIgbWluKQotICAgICAgICB7IG11dGF0ZSgpOyBfbWluT2NjdXJzID0gbWluOyBfaW50TWluT2NjdXJzID0gcGVnQmlnSW50ZWdlcihtaW4pOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEludE1pbk9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF9pbnRNaW5PY2N1cnM7IH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF9tYXhPY2N1cnM7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50TWF4T2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX2ludE1heE9jY3VyczsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXJzKEJpZ0ludGVnZXIgbWF4KQotICAgICAgICB7IG11dGF0ZSgpOyBfbWF4T2NjdXJzID0gbWF4OyBfaW50TWF4T2NjdXJzID0gcGVnQmlnSW50ZWdlcihtYXgpOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUGFydGljbGVbXSBnZXRQYXJ0aWNsZUNoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVBhcnRpY2xlW19wYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3BhcnRpY2xlQ2hpbGRyZW4sIDAsIHJlc3VsdCwgMCwgX3BhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aWNsZUNoaWxkcmVuKFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4pCi0gICAgICAgIHsgbXV0YXRlKCk7IF9wYXJ0aWNsZUNoaWxkcmVuID0gY2hpbGRyZW47IH0KLQotICAgIHB1YmxpYyBTY2hlbWFQYXJ0aWNsZSBnZXRQYXJ0aWNsZUNoaWxkKGludCBpKQotICAgICAgICB7IHJldHVybiBfcGFydGljbGVDaGlsZHJlbltpXTsgfQotCi0gICAgcHVibGljIGludCBjb3VudE9mUGFydGljbGVDaGlsZCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJ0aWNsZUNoaWxkcmVuID09IG51bGwgPyAwIDogX3BhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFNldChRTmFtZVNldCBzZXQpCi0gICAgICAgIHsgbXV0YXRlKCk7IF93aWxkY2FyZFNldCA9IHNldDsgfQotCi0gICAgcHVibGljIFFOYW1lU2V0IGdldFdpbGRjYXJkU2V0KCkKLSAgICAgICAgeyByZXR1cm4gX3dpbGRjYXJkU2V0OyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFByb2Nlc3MoaW50IHByb2Nlc3MpCi0gICAgICAgIHsgbXV0YXRlKCk7IF93aWxkY2FyZFByb2Nlc3MgPSBwcm9jZXNzOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpbGRjYXJkUHJvY2VzcygpCi0gICAgICAgIHsgcmV0dXJuIF93aWxkY2FyZFByb2Nlc3M7IH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21heGludCA9IEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcGVnQmlnSW50ZWdlcihCaWdJbnRlZ2VyIGJpKQotICAgIHsKLSAgICAgICAgaWYgKGJpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGlmIChiaS5zaWdudW0oKSA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChiaS5jb21wYXJlVG8oX21heGludCkgPj0gMCkKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGJpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKQotICAgICAgICB7IHJldHVybiBfcU5hbWU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVBbmRUeXBlUmVmKFFOYW1lIGZvcm1uYW1lLCBTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IG11dGF0ZSgpOyBfcU5hbWUgPSBmb3JtbmFtZTsgX3R5cGVyZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVSZXNvbHZlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKF90eXBlcmVmICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgewotICAgICAgICBpZiAoX3R5cGVyZWYgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3R5cGVyZWYgPSB0eXBlcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlKCkKLSAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldFR5cGUoKQotICAgICAgICB7IGlmIChfdHlwZXJlZiA9PSBudWxsKSByZXR1cm4gbnVsbDsgcmV0dXJuIF90eXBlcmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUZXh0KCkKLSAgICAgICAgeyByZXR1cm4gX2RlZmF1bHRUZXh0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKQotICAgICAgICB7IHJldHVybiBfaXNEZWZhdWx0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkKCkKLSAgICAgICAgeyByZXR1cm4gX2lzRml4ZWQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIGRlZnRleHQsIGJvb2xlYW4gaXNGaXhlZCwgWG1sT2JqZWN0IHBhcnNlT2JqZWN0KQotICAgIHsKLSAgICAgICAgbXV0YXRlKCk7Ci0gICAgICAgIF9kZWZhdWx0VGV4dCA9IGRlZnRleHQ7Ci0gICAgICAgIF9pc0RlZmF1bHQgPSAoZGVmdGV4dCAhPSBudWxsKTsKLSAgICAgICAgX2lzRml4ZWQgPSBpc0ZpeGVkOwotICAgICAgICBfcGFyc2VPYmplY3QgPSBwYXJzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkKLSAgICAgICAgeyByZXR1cm4gX2lzTmlsbGFibGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5pbGxhYmxlKGJvb2xlYW4gbmlsbGFibGUpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9pc05pbGxhYmxlID0gbmlsbGFibGU7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpCi0gICAgewotICAgICAgICBpZiAoX2RlZmF1bHRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWUuZ2V0KCk7Ci0gICAgICAgIGlmIChfZGVmYXVsdFRleHQgIT0gbnVsbCAmJiBYbWxBbnlTaW1wbGVUeXBlLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShnZXRUeXBlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3BhcnNlT2JqZWN0ICE9IG51bGwgJiYgWG1sUU5hbWUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKGdldFR5cGUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoX3BhcnNlT2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKCkubmV3VmFsdWUoX2RlZmF1bHRUZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLm5ld1ZhbHVlKF9kZWZhdWx0VGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShYbWxWYWx1ZVJlZiBkZWZhdWx0UmVmKQotICAgIHsKLSAgICAgICAgbXV0YXRlKCk7Ci0gICAgICAgIF9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0UmVmOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVByb3BlcnR5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYjJjZDguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFQcm9wZXJ0eUltcGwgaW1wbGVtZW50cyBTY2hlbWFQcm9wZXJ0eQotewotICAgIHByaXZhdGUgUU5hbWUgX25hbWU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfdHlwZXJlZjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzQXR0cmlidXRlOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX2NvbnRhaW5lclR5cGVSZWY7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2phdmFQcm9wZXJ0eU5hbWU7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9taW5PY2N1cnM7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9tYXhPY2N1cnM7Ci0gICAgcHJpdmF0ZSBpbnQgX2hhc05pbGxhYmxlOwotICAgIHByaXZhdGUgaW50IF9oYXNEZWZhdWx0OwotICAgIHByaXZhdGUgaW50IF9oYXNGaXhlZDsKLSAgICBwcml2YXRlIFN0cmluZyBfZGVmYXVsdFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0ltbXV0YWJsZTsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9qYXZhQmFzZWRPblR5cGVSZWY7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9leHRlbmRzU2luZ2xldG9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZXh0ZW5kc0FycmF5OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZXh0ZW5kc09wdGlvbjsKLSAgICBwcml2YXRlIGludCBfamF2YVR5cGVDb2RlOwotICAgIHByaXZhdGUgUU5hbWVTZXQgX2phdmFTZXR0ZXJEZWxpbWl0ZXI7Ci0gICAgcHJpdmF0ZSBYbWxWYWx1ZVJlZiBfZGVmYXVsdFZhbHVlOwotICAgIHByaXZhdGUgU2V0IF9hY2NlcHRlZE5hbWVzOwotCi0gICAgcHJpdmF0ZSB2b2lkIG11dGF0ZSgpCi0gICAgICAgIHsgaWYgKF9pc0ltbXV0YWJsZSkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbW11dGFibGUoKQotICAgICAgICB7IG11dGF0ZSgpOyBfaXNJbW11dGFibGUgPSB0cnVlOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRDb250YWluZXJUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2NvbnRhaW5lclR5cGVSZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lclR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICAgICAgeyBtdXRhdGUoKTsgX2NvbnRhaW5lclR5cGVSZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9uYW1lOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9uYW1lID0gbmFtZTsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhUHJvcGVydHlOYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX2phdmFQcm9wZXJ0eU5hbWU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9qYXZhUHJvcGVydHlOYW1lID0gbmFtZTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGUoKQotICAgICAgICB7IHJldHVybiBfaXNBdHRyaWJ1dGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShib29sZWFuIGlzQXR0cmlidXRlKQotICAgICAgICB7IG11dGF0ZSgpOyBfaXNBdHRyaWJ1dGUgPSBpc0F0dHJpYnV0ZTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3R5cGVyZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICAgICAgeyBtdXRhdGUoKTsgX3R5cGVyZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBqYXZhQmFzZWRPblR5cGUoKQotICAgICAgICB7IHJldHVybiBfamF2YUJhc2VkT25UeXBlUmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleHRlbmRzSmF2YVNpbmdsZXRvbigpCi0gICAgICAgIHsgcmV0dXJuIF9leHRlbmRzU2luZ2xldG9uOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleHRlbmRzSmF2YUFycmF5KCkKLSAgICAgICAgeyByZXR1cm4gX2V4dGVuZHNBcnJheTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXh0ZW5kc0phdmFPcHRpb24oKQotICAgICAgICB7IHJldHVybiBfZXh0ZW5kc09wdGlvbjsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5kc0phdmEoU2NoZW1hVHlwZS5SZWYgamF2YUJhc2VkT25UeXBlUmVmLCBib29sZWFuIHNpbmdsZXRvbiwgYm9vbGVhbiBvcHRpb24sIGJvb2xlYW4gYXJyYXkpCi0gICAgewotICAgICAgICBtdXRhdGUoKTsKLSAgICAgICAgX2phdmFCYXNlZE9uVHlwZVJlZiA9IGphdmFCYXNlZE9uVHlwZVJlZjsKLSAgICAgICAgX2V4dGVuZHNTaW5nbGV0b24gPSBzaW5nbGV0b247Ci0gICAgICAgIF9leHRlbmRzT3B0aW9uID0gb3B0aW9uOwotICAgICAgICBfZXh0ZW5kc0FycmF5ID0gYXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lU2V0IGdldEphdmFTZXR0ZXJEZWxpbWl0ZXIoKQotICAgICAgICB7IHJldHVybiBfamF2YVNldHRlckRlbGltaXRlciA9PSBudWxsID8gUU5hbWVTZXQuRU1QVFkgOiBfamF2YVNldHRlckRlbGltaXRlcjsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVNldHRlckRlbGltaXRlcihRTmFtZVNldCBzZXQpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9qYXZhU2V0dGVyRGVsaW1pdGVyID0gc2V0OyB9Ci0KLSAgICBwdWJsaWMgUU5hbWVbXSBhY2NlcHRlZE5hbWVzKCkKLSAgICB7IAotICAgICAgICBpZiAoX2FjY2VwdGVkTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWVbXSB7IF9uYW1lIH07Ci0KLSAgICAgICAgcmV0dXJuIChRTmFtZVtdKV9hY2NlcHRlZE5hbWVzLnRvQXJyYXkobmV3IFFOYW1lW19hY2NlcHRlZE5hbWVzLnNpemUoKV0pOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRlZE5hbWVzKFNldCBzZXQpCi0gICAgewotICAgICAgICBtdXRhdGUoKTsgCi0gICAgICAgIF9hY2NlcHRlZE5hbWVzID0gc2V0OwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRlZE5hbWVzKFFOYW1lU2V0IHNldCkKLSAgICB7IAotICAgICAgICBtdXRhdGUoKTsgCi0gICAgICAgIF9hY2NlcHRlZE5hbWVzID0gc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW5PY2N1cnMoKQotICAgICAgICB7IHJldHVybiBfbWluT2NjdXJzOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoQmlnSW50ZWdlciBtaW4pCi0gICAgICAgIHsgbXV0YXRlKCk7IF9taW5PY2N1cnMgPSBtaW47IH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF9tYXhPY2N1cnM7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhCaWdJbnRlZ2VyIG1heCkKLSAgICAgICAgeyBtdXRhdGUoKTsgX21heE9jY3VycyA9IG1heDsgfQotCi0gICAgcHVibGljIGludCBoYXNOaWxsYWJsZSgpCi0gICAgICAgIHsgcmV0dXJuIF9oYXNOaWxsYWJsZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmlsbGFibGUoaW50IHdoZW4pCi0gICAgICAgIHsgbXV0YXRlKCk7IF9oYXNOaWxsYWJsZSA9IHdoZW47IH0KLQotICAgIHB1YmxpYyBpbnQgaGFzRGVmYXVsdCgpCi0gICAgICAgIHsgcmV0dXJuIF9oYXNEZWZhdWx0OyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGludCB3aGVuKQotICAgICAgICB7IG11dGF0ZSgpOyBfaGFzRGVmYXVsdCA9IHdoZW47IH0KLQotICAgIHB1YmxpYyBpbnQgaGFzRml4ZWQoKQotICAgICAgICB7IHJldHVybiBfaGFzRml4ZWQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpeGVkKGludCB3aGVuKQotICAgICAgICB7IG11dGF0ZSgpOyBfaGFzRml4ZWQgPSB3aGVuOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUZXh0KCkKLSAgICAgICAgeyByZXR1cm4gX2RlZmF1bHRUZXh0OyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VGV4dChTdHJpbmcgdmFsKQotICAgICAgICB7IG11dGF0ZSgpOyBfZGVmYXVsdFRleHQgPSB2YWw7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpCi0gICAgewotICAgICAgICBpZiAoX2RlZmF1bHRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWUuZ2V0KCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoWG1sVmFsdWVSZWYgZGVmYXVsdFJlZikKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOwotICAgICAgICBfZGVmYXVsdFZhbHVlID0gZGVmYXVsdFJlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEphdmFUeXBlQ29kZSgpCi0gICAgICAgIHsgcmV0dXJuIF9qYXZhVHlwZUNvZGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFUeXBlQ29kZShpbnQgY29kZSkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2phdmFUeXBlQ29kZSA9IGNvZGU7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjMmM3MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsIGltcGxlbWVudHMgU2NoZW1hU3RyaW5nRW51bUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3N0cmluZzsKLSAgICBwcml2YXRlIGludCBfaW50OwotICAgIHByaXZhdGUgU3RyaW5nIF9lbnVtTmFtZTsKLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsKFN0cmluZyBzdHIsIGludCBpLCBTdHJpbmcgZW51bU5hbWUpCi0gICAgewotICAgICAgICBfc3RyaW5nID0gc3RyOwotICAgICAgICBfaW50ID0gaTsKLSAgICAgICAgX2VudW1OYW1lID0gZW51bU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVudW1OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZW51bU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUNvZGVQcmludGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlQ29kZVByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2NmI1YS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlQ29kZVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOTggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5OYW1lVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLS8qKgotICogUHJpbnRzIHRoZSBqYXZhIGNvZGUgZm9yIGEgc2luZ2xlIHNjaGVtYSB0eXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTY2hlbWFUeXBlQ29kZVByaW50ZXIKLXsKLSAgICBXcml0ZXIgX3dyaXRlcjsKLSAgICBpbnQgICAgX2luZGVudDsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPQotICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgPT0gbnVsbAotICAgICAgICAgICAgPyAiXG4iCi0gICAgICAgICAgICA6IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1NQQUNFUyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICBzdGF0aWMgZmluYWwgaW50IElOREVOVF9JTkNSRU1FTlQgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQ0xBU1NOQU1FID0gIlR5cGVTeXN0ZW1Ib2xkZXIiOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGVDb2RlUHJpbnRlciAoIFdyaXRlciB3cml0ZXIgKQotICAgIHsKLSAgICAgICAgX3dyaXRlciA9IHdyaXRlcjsKLSAgICAgICAgX2luZGVudCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBpbmRlbnQoKQotICAgIHsKLSAgICAgICAgX2luZGVudCArPSBJTkRFTlRfSU5DUkVNRU5UOwotICAgIH0KLQotICAgIHZvaWQgb3V0ZGVudCgpCi0gICAgewotICAgICAgICBfaW5kZW50IC09IElOREVOVF9JTkNSRU1FTlQ7Ci0gICAgfQotCi0gICAgU3RyaW5nIGVuY29kZVN0cmluZyAoIFN0cmluZyBzICkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBzYi5hcHBlbmQoICciJyApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzLmxlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KCBpICk7Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnIicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXFwnICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXCInICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXFwnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xyJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdyJyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICduJyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1x0JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICd0JyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggY2ggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCggJyInICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBlbWl0KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBpbmRlbnQgPSBfaW5kZW50OwotICAgICAgICAKLSAgICAgICAgaWYgKGluZGVudCA+IE1BWF9TUEFDRVMubGVuZ3RoKCkgLyAyKQotICAgICAgICAgICAgaW5kZW50ID0gTUFYX1NQQUNFUy5sZW5ndGgoKSAvIDQgKyBpbmRlbnQgLyAyOwotICAgICAgICAKLSAgICAgICAgaWYgKGluZGVudCA+IE1BWF9TUEFDRVMubGVuZ3RoKCkpCi0gICAgICAgICAgICBpbmRlbnQgPSBNQVhfU1BBQ0VTLmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgX3dyaXRlci53cml0ZShNQVhfU1BBQ0VTLnN1YnN0cmluZygwLCBpbmRlbnQpKTsKLSAgICAgICAgX3dyaXRlci53cml0ZShzKTsKLSAgICAgICAgX3dyaXRlci53cml0ZShMSU5FX1NFUEFSQVRPUik7Ci0gICAgICAgIAotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50KE1BWF9TUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCkpOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VHlwZUltcGwgKCBXcml0ZXIgd3JpdGVyLCBTY2hlbWFUeXBlIHNUeXBlICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBuZXcgU2NoZW1hVHlwZUNvZGVQcmludGVyKCB3cml0ZXIgKS5wcmludFR5cGVJbXBsKCBzVHlwZSwgc1R5cGUuZ2V0VHlwZVN5c3RlbSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VHlwZSAoIFdyaXRlciB3cml0ZXIsIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5ldyBTY2hlbWFUeXBlQ29kZVByaW50ZXIoIHdyaXRlciApLiBwcmludFR5cGUoIHNUeXBlLCBzVHlwZS5nZXRUeXBlU3lzdGVtKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRMb2FkZXIgKCBXcml0ZXIgd3JpdGVyLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbmV3IFNjaGVtYVR5cGVDb2RlUHJpbnRlciggd3JpdGVyICkucHJpbnRJbmRleFR5cGUoIHN5c3RlbSApOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRUeXBlKFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHByaW50VG9wQ29tbWVudChzVHlwZSk7Ci0gICAgICAgIHByaW50UGFja2FnZShzVHlwZSwgdHJ1ZSk7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBwcmludElubmVyVHlwZShzVHlwZSwgc3lzdGVtKTsKLSAgICAgICAgX3dyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRUeXBlSW1wbChTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBwcmludFRvcENvbW1lbnQoc1R5cGUpOwotICAgICAgICBwcmludFBhY2thZ2Uoc1R5cGUsIGZhbHNlKTsKLSAgICAgICAgcHJpbnRJbm5lclR5cGVJbXBsKHNUeXBlLCBzeXN0ZW0sIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW5jZSBub3QgYWxsIHNjaGVtYSB0eXBlcyBoYXZlIGphdmEgdHlwZXMsIHRoaXMgc2tpcHMKLSAgICAgKiBvdmVyIGFueSB0aGF0IGRvbid0IGFuZCBnaXZlcyB5b3UgdGhlIG5lYXJlc3QgamF2YSBiYXNlIHR5cGUuCi0gICAgICovCi0gICAgU3RyaW5nIGZpbmRKYXZhVHlwZSAoIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsICkKLSAgICAgICAgICAgIHNUeXBlID0gc1R5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHByZXR0eVFOYW1lKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCArPSAiKEAiICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiKSI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludElubmVyVHlwZUphdmFEb2MoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBRTmFtZSBuYW1lID0gc1R5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICBuYW1lID0gc1R5cGUuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgbmFtZSA9IHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzVHlwZS5nZXRDb250YWluZXJGaWVsZCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbmFtZSA9IHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdCgiLyoqIik7Ci0gICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgZW1pdCgiICogQSBkb2N1bWVudCBjb250YWluaW5nIG9uZSAiICsgcHJldHR5UU5hbWUobmFtZSkgKyAiIGVsZW1lbnQuIik7Ci0gICAgICAgIGVsc2UgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICAgICAgZW1pdCgiICogQSBkb2N1bWVudCBjb250YWluaW5nIG9uZSAiICsgcHJldHR5UU5hbWUobmFtZSkgKyAiIGF0dHJpYnV0ZS4iKTsKLSAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgZW1pdCgiICogQW4gWE1MICIgKyBwcmV0dHlRTmFtZShuYW1lKSArICIuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVtaXQoIiAqIEFuIGFub255bW91cyBpbm5lciBYTUwgdHlwZS4iKTsKLSAgICAgICAgZW1pdCgiICoiKTsKLSAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5OT1RfU0lNUExFOgotICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYSBjb21wbGV4IHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYW4gYXRvbWljIHR5cGUgdGhhdCBpcyBhIHJlc3RyaWN0aW9uIG9mICIgKyBzVHlwZS5nZXRCYXNlVHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYSBsaXN0IHR5cGUgd2hvc2UgaXRlbXMgYXJlICIgKyBzVHlwZS5nZXRMaXN0SXRlbVR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKSArICIuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgZW1pdCgiICogVGhpcyBpcyBhIHVuaW9uIHR5cGUuIEluc3RhbmNlcyBhcmUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6Iik7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlcnMgPSBzVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIiAqICAgICAiICsgbWVtYmVyc1tpXS5nZXRGdWxsSmF2YU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhDbGFzc0ZvclN5c3RlbShTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gc3lzdGVtLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG5hbWUgKyAiLiIgKyBJTkRFWF9DTEFTU05BTUU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBzaG9ydEluZGV4Q2xhc3NGb3JTeXN0ZW0oU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pCi0gICAgewotICAgICAgICByZXR1cm4gSU5ERVhfQ0xBU1NOQU1FOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRTdGF0aWNUeXBlRGVjbGFyYXRpb24oU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUgdHlwZSA9IChvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUpIiArCi0gICAgICAgICAgICAgICAgaW5kZXhDbGFzc0ZvclN5c3RlbShzeXN0ZW0pICsKLSAgICAgICAgICAgICAgICAiLnR5cGVTeXN0ZW0ucmVzb2x2ZUhhbmRsZShcIiIgKwotICAgICAgICAgICAgICAgICgoU2NoZW1hVHlwZVN5c3RlbUltcGwpc3lzdGVtKS5oYW5kbGVGb3JUeXBlKHNUeXBlKSArICJcIik7Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEluZGV4VHlwZShTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc2hvcnRJbmRleENsYXNzRm9yU3lzdGVtKHN5c3RlbSk7Ci0gICAgICAgIGVtaXQoInBhY2thZ2UgIiArIHN5c3RlbS5nZXROYW1lKCkgKyAiOyIpOwotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgZW1pdCgicHVibGljIGZpbmFsIGNsYXNzICIgKyBzaG9ydE5hbWUpOwotICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBlbWl0KCJwcml2YXRlICIgKyBzaG9ydE5hbWUgKyAiKCkgeyB9Iik7Ci0gICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0gPSBsb2FkVHlwZVN5c3RlbSgpOyIpOwotICAgICAgICBlbWl0KCJzdGF0aWMgeyB0eXBlU3lzdGVtLnJlc29sdmUoKTsgfSIpOwotICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW0gbG9hZFR5cGVTeXN0ZW0oKSIpOwotICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBlbWl0KCJ0cnkgeyByZXR1cm4gKG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbSlDbGFzcy5mb3JOYW1lKFwib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlU3lzdGVtSW1wbFwiLCB0cnVlLCAiICsgc2hvcnROYW1lICsgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IENsYXNzLmNsYXNzIH0pLm5ld0luc3RhbmNlKG5ldyBqYXZhLmxhbmcuT2JqZWN0W10geyAiICsgc2hvcnROYW1lICsgIi5jbGFzcyB9KTsgfSIpOwotICAgICAgICBlbWl0KCJjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGxvYWQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLlNjaGVtYVR5cGVTeXN0ZW1JbXBsOiBtYWtlIHN1cmUgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGguXCIsIGUpOyB9Iik7Ci0gICAgICAgIGVtaXQoImNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBTY2hlbWFUeXBlU3lzdGVtSW1wbCAoXCIgKyBlLnRvU3RyaW5nKCkgKyBcIik6IGlzIHRoZSB2ZXJzaW9uIG9mIHhiZWFuLmphciBjb3JyZWN0P1wiLCBlKTsgfSIpOwotICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgIGVtaXQoIn0iKTsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludElubmVyVHlwZShTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICBwcmludElubmVyVHlwZUphdmFEb2Moc1R5cGUpOwotCi0gICAgICAgIHN0YXJ0SW50ZXJmYWNlKHNUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIHByaW50U3RhdGljVHlwZURlY2xhcmF0aW9uKHNUeXBlLCBzeXN0ZW0pOwotCi0gICAgICAgIGlmIChzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUeXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKLSAgICAgICAgICAgICAgICBwcmludFN0cmluZ0VudW1lcmF0aW9uKHNUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcHMgPSBzVHlwZS5nZXREZXJpdmVkUHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcHJvcHNbaV07Ci0KLSAgICAgICAgICAgICAgICBwcmludFByb3BlcnR5R2V0dGVycygKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuaXNBdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCi0gICAgICAgICAgICAgICAgICAgIGphdmFUeXBlRm9yUHJvcGVydHkocHJvcCksCi0gICAgICAgICAgICAgICAgICAgIHhtbFR5cGVGb3JQcm9wZXJ0eShwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhT3B0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFBcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzUmVhZE9ubHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50UHJvcGVydHlTZXR0ZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmlzQXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZUZvclByb3BlcnR5KHByb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sVHlwZUZvclByb3BlcnR5KHByb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YU9wdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YUFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpbnROZXN0ZWRJbm5lclR5cGVzKHNUeXBlLCBzeXN0ZW0pOwotCi0gICAgICAgIHByaW50RmFjdG9yeShzVHlwZSk7Ci0KLSAgICAgICAgZW5kQmxvY2soKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50RmFjdG9yeShTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIE9ubHkgbmVlZCBmdWxsIGZhY3RvcmllcyBmb3IgdG9wLWxldmVsIHR5cGVzCi0gICAgICAgIGJvb2xlYW4gZnVsbEZhY3RvcnkgPSB0cnVlOwotICAgICAgICBpZiAoc1R5cGUuaXNBbm9ueW1vdXNUeXBlKCkgJiYgISBzVHlwZS5pc0RvY3VtZW50VHlwZSgpICYmICFzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIGZ1bGxGYWN0b3J5ID0gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0KLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIGVtaXQoIi8qKiIpOwotICAgICAgICBlbWl0KCIgKiBBIGZhY3RvcnkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIik7Ci0gICAgICAgIGVtaXQoIiAqIG9mIHRoaXMgdHlwZS4iKTsKLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICAvLyBCVUdCVUcgLSBDYW4gSSB1c2UgdGhlIG5hbWUgbG9hZGVyIGhlcmU/ICBjb3VsZCBpdCBiZSBhCi0gICAgICAgIC8vIG5lc3RlZCB0eXBlIG5hbWU/ICBJdCBpcyBsb3dlciBjYXNlIQotICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkiKTsKLSAgICAgICAgZW1pdCgieyIpOwotICAgICAgICBpbmRlbnQoKTsKLQotICAgICAgICBpZiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG9iaikgeyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdJbnN0YW5jZSgpIHsiKTsKLSAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeyIpOwotICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgaWYgKGZ1bGxGYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCJwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkIik7Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgZW1pdCgifSIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnROZXN0ZWRJbm5lclR5cGVzKFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSBhbm9uVHlwZXMgPSBzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFub25UeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFub25UeXBlc1tpXS5pc1NraXBwZWRBbm9ueW1vdXNUeXBlKCkpCi0gICAgICAgICAgICAgICAgcHJpbnROZXN0ZWRJbm5lclR5cGVzKGFub25UeXBlc1tpXSwgc3lzdGVtKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludElubmVyVHlwZShhbm9uVHlwZXNbaV0sIHN5c3RlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50VG9wQ29tbWVudChTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoIi8qIik7Ci0gICAgICAgIGlmIChzVHlwZS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiICogWE1MIFR5cGU6ICAiICsgc1R5cGUuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIE5hbWVzcGFjZTogIiArIHNUeXBlLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSB0aGVuYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHNUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlbmFtZSA9IHNUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgKiBBbiBYTUwgZG9jdW1lbnQgdHlwZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoZW5hbWUgPSBzVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAqIEFuIFhNTCBhdHRyaWJ1dGUgdHlwZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0KLSAgICAgICAgICAgIGFzc2VydCggdGhlbmFtZSAhPSBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVtaXQoIiAqIExvY2FsbmFtZTogIiArIHRoZW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgZW1pdCgiICogTmFtZXNwYWNlOiAiICsgdGhlbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW1pdCgiICogSmF2YSB0eXBlOiAiICsgc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkpOwotICAgICAgICBlbWl0KCIgKiIpOwotICAgICAgICBlbWl0KCIgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAtIGRvIG5vdCBtb2RpZnkuIik7Ci0gICAgICAgIGVtaXQoIiAqLyIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRQYWNrYWdlKFNjaGVtYVR5cGUgc1R5cGUsIGJvb2xlYW4gaW50ZikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZnFqbjsKLSAgICAgICAgaWYgKGludGYpCi0gICAgICAgICAgICBmcWpuID0gc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZxam4gPSBzVHlwZS5nZXRGdWxsSmF2YUltcGxOYW1lKCk7Ci0KLSAgICAgICAgaW50IGxhc3Rkb3QgPSBmcWpuLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChsYXN0ZG90IDwgMCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgU3RyaW5nIHBrZyA9IGZxam4uc3Vic3RyaW5nKDAsIGxhc3Rkb3QpOwotICAgICAgICBlbWl0KCJwYWNrYWdlICIgKyBwa2cgKyAiOyIpOwotICAgIH0KLQotICAgIHZvaWQgc3RhcnRJbnRlcmZhY2UoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc1R5cGUuZ2V0U2hvcnRKYXZhTmFtZSgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJhc2VJbnRlcmZhY2UgPSBmaW5kSmF2YVR5cGUoc1R5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNwZWNpYWxpemVkSW50ZXJmYWNlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuQVRPTUlDICYmCi0gICAgICAgICAgICBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfREVDSU1BTCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGJpdHMgPSBzVHlwZS5nZXREZWNpbWFsU2l6ZSgpOwotICAgICAgICAgICAgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSKQotICAgICAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgb3JnLmFwYWNoZS54bWxiZWFucy5CaWdJbnRlZ2VyVmFsdWUiKTsKLSAgICAgICAgICAgIGlmIChiaXRzID09IFNjaGVtYVR5cGUuU0laRV9MT05HKQotICAgICAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgb3JnLmFwYWNoZS54bWxiZWFucy5Mb25nVmFsdWUiKTsKLSAgICAgICAgICAgIGlmIChiaXRzIDw9IFNjaGVtYVR5cGUuU0laRV9JTlQpCi0gICAgICAgICAgICAgICAgc3BlY2lhbGl6ZWRJbnRlcmZhY2VzLmFwcGVuZCgiLCBvcmcuYXBhY2hlLnhtbGJlYW5zLkludFZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICBzcGVjaWFsaXplZEludGVyZmFjZXMuYXBwZW5kKCIsIG9yZy5hcGFjaGUueG1sYmVhbnMuTGlzdFZhbHVlIik7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGN0eXBlID0gc1R5cGUuZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpOwotICAgICAgICAgICAgU3RyaW5nIGphdmFUeXBlSG9sZGVyID0gamF2YVR5cGVIb2xkZXJGb3JUeXBlKGN0eXBlKTsKLSAgICAgICAgICAgIGlmIChqYXZhVHlwZUhvbGRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgIiArIGphdmFUeXBlSG9sZGVyKTsKLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIGVtaXQoInB1YmxpYyBpbnRlcmZhY2UgIiArIHNob3J0TmFtZSArICIgZXh0ZW5kcyAiICsgYmFzZUludGVyZmFjZSk7Ci0gICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGVtaXRTcGVjaWFsaXplZEFjY2Vzc29ycyhzVHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRTcGVjaWFsaXplZEFjY2Vzc29ycyhTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5BVE9NSUMgJiYKLSAgICAgICAgICAgIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYml0cyA9IHNUeXBlLmdldERlY2ltYWxTaXplKCk7Ci0gICAgICAgICAgICBpbnQgcGFyZW50Qml0cyA9IHNUeXBlLmdldEJhc2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKTsKLSAgICAgICAgICAgIGlmIChiaXRzICE9IHBhcmVudEJpdHMgfHwgc1R5cGUuZ2V0QmFzZVR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiaXRzID09IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShqYXZhLm1hdGguQmlnSW50ZWdlciBiaSk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLm1hdGguQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0KGphdmEubWF0aC5CaWdJbnRlZ2VyIGJpKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfTE9ORykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImxvbmcgZ2V0TG9uZ1ZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgbCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJsb25nIGxvbmdWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQobG9uZyBsKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfSU5UKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiaW50IGdldEludFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0SW50VmFsdWUoaW50IGkpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiaW50IGludFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChpbnQgaSk7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgic2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJzaG9ydCBzaG9ydFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChzaG9ydCBzKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfQllURSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgYik7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJieXRlIGJ5dGVWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQoYnl0ZSBiKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoImphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0T2JqZWN0VmFsdWUoamF2YS5sYW5nLk9iamVjdCB2YWwpOyIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLmxhbmcuT2JqZWN0IG9iamVjdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgb2JqZWN0U2V0KGphdmEubGFuZy5PYmplY3QgdmFsKTsiKTsKLSAgICAgICAgICAgIGVtaXQoIm9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKTsiKTsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgY3R5cGUgPSBzVHlwZS5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoY3R5cGUgIT0gbnVsbCAmJiBjdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTik7Ci0gICAgICAgICAgICAgICAgZW1pdFNwZWNpYWxpemVkQWNjZXNzb3JzKGN0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCBnZXRMaXN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0IHhnZXRMaXN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TGlzdFZhbHVlKGphdmEudXRpbC5MaXN0IGxpc3QpOyIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCBsaXN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgeGxpc3RWYWx1ZSgpOyIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChqYXZhLnV0aWwuTGlzdCBsaXN0KTsiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgieyIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICB9Ci0gICAgdm9pZCBlbmRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEphdmFEb2MoU3RyaW5nIHNlbnRlbmNlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgZW1pdCgiICogIiArIHNlbnRlbmNlKTsKLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFNob3J0SmF2YURvYyhTdHJpbmcgc2VudGVuY2UpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiLyoqICIgKyBzZW50ZW5jZSArICIgKi8iKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hVHlwZSBmaW5kQmFzZUVudW1UeXBlKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICB3aGlsZSAoc1R5cGUuZ2V0QmFzZVR5cGUoKS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCi0gICAgICAgICAgICBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhU3RyaW5nRXNjYXBlKFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICAvLyBmb3JiaWRkZW46IFxuLCBcciwgXCIsIFxcLgotICAgICAgICB0ZXN0OiB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRlc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFN0cmluZ0VudW1lcmF0aW9uKFNjaGVtYVR5cGUgc1R5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlRW51bVR5cGUgPSBmaW5kQmFzZUVudW1UeXBlKHNUeXBlKTsKLSAgICAgICAgU3RyaW5nIGJhc2VFbnVtQ2xhc3MgPSBiYXNlRW51bVR5cGUuZ2V0RnVsbEphdmFOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSA9PSBzVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBlbWl0KCJvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZSk7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZW50cmllcyA9IHNUeXBlLmdldFN0cmluZ0VudW1FbnRyaWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9IGVudHJpZXNbaV0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY29uc3ROYW1lID0gZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpOwotICAgICAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSAhPSBzVHlwZSkKLSAgICAgICAgICAgICAgICBlbWl0KCJzdGF0aWMgZmluYWwgIiArIGJhc2VFbnVtQ2xhc3MgKyAiLkVudW0gIiArIGNvbnN0TmFtZSArICIgPSAiICsgYmFzZUVudW1DbGFzcyArICIuIiArIGNvbnN0TmFtZSArICI7Iik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIEVudW0gIiArIGNvbnN0TmFtZSArICIgPSBFbnVtLmZvclN0cmluZyhcIiIgKyBqYXZhU3RyaW5nRXNjYXBlKGVudW1WYWx1ZSkgKyAiXCIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjb25zdE5hbWUgPSAiSU5UXyIgKyBlbnRyaWVzW2ldLmdldEVudW1OYW1lKCk7Ci0gICAgICAgICAgICBpZiAoYmFzZUVudW1UeXBlICE9IHNUeXBlKQotICAgICAgICAgICAgICAgIGVtaXQoInN0YXRpYyBmaW5hbCBpbnQgIiArIGNvbnN0TmFtZSArICIgPSAiICsgYmFzZUVudW1DbGFzcyArICIuIiArIGNvbnN0TmFtZSArICI7Iik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIGludCAiICsgY29uc3ROYW1lICsgIiA9IEVudW0uIiArIGNvbnN0TmFtZSArICI7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSA9PSBzVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIEVudW1lcmF0aW9uIHZhbHVlIGNsYXNzIGZvciAiICsgYmFzZUVudW1DbGFzcyArICIuIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBUaGVzZSBlbnVtIHZhbHVlcyBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOiIpOwotICAgICAgICAgICAgZW1pdCgiICogPHByZT4iKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIGVudW0udG9TdHJpbmcoKTsgLy8gcmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBlbnVtIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBlbnVtLmludFZhbHVlKCk7IC8vIHJldHVybnMgYW4gaW50IHZhbHVlLCB1c2VmdWwgZm9yIHN3aXRjaGVzIik7Ci0gICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgZW1pdCgiICogLy8gZS5nLiwgY2FzZSBFbnVtLklOVF8iICsgZW50cmllc1swXS5nZXRFbnVtTmFtZSgpKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIEVudW0uZm9yU3RyaW5nKHMpOyAvLyByZXR1cm5zIHRoZSBlbnVtIHZhbHVlIGZvciBhIHN0cmluZyIpOwotICAgICAgICAgICAgZW1pdCgiICogRW51bS5mb3JJbnQoaSk7IC8vIHJldHVybnMgdGhlIGVudW0gdmFsdWUgZm9yIGFuIGludCIpOwotICAgICAgICAgICAgZW1pdCgiICogPC9wcmU+Iik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBFbnVtZXJhdGlvbiBvYmplY3RzIGFyZSBpbW11dGFibGUgc2luZ2xldG9uIG9iamVjdHMgdGhhdCIpOwotICAgICAgICAgICAgZW1pdCgiICogY2FuIGJlIGNvbXBhcmVkIHVzaW5nID09IG9iamVjdCBlcXVhbGl0eS4gVGhleSBoYXZlIG5vIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBwdWJsaWMgY29uc3RydWN0b3IuIFNlZSB0aGUgY29uc3RhbnRzIGRlZmluZWQgd2l0aGluIHRoaXMiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIGNsYXNzIGZvciBhbGwgdGhlIHZhbGlkIHZhbHVlcy4iKTsKLSAgICAgICAgICAgIGVtaXQoIiAqLyIpOwotICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIGNsYXNzIEVudW0gZXh0ZW5kcyBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UiKTsKLSAgICAgICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZW1pdCgiLyoqIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBSZXR1cm5zIHRoZSBlbnVtIHZhbHVlIGZvciBhIHN0cmluZywgb3IgbnVsbCBpZiBub25lLiIpOwotICAgICAgICAgICAgZW1pdCgiICovIik7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIEVudW0gZm9yU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgcykiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgICB7IHJldHVybiAoRW51bSl0YWJsZS5mb3JTdHJpbmcocyk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiIpOwotICAgICAgICAgICAgZW1pdCgiICogUmV0dXJucyB0aGUgZW51bSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGludCwgb3IgbnVsbCBpZiBub25lLiIpOwotICAgICAgICAgICAgZW1pdCgiICovIik7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIEVudW0gZm9ySW50KGludCBpKSIpOwotICAgICAgICAgICAgZW1pdCgiICAgIHsgcmV0dXJuIChFbnVtKXRhYmxlLmZvckludChpKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBlbWl0KCJwcml2YXRlIEVudW0oamF2YS5sYW5nLlN0cmluZyBzLCBpbnQgaSkiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgICB7IHN1cGVyKHMsIGkpOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29uc3ROYW1lID0gIklOVF8iICsgZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpOwotICAgICAgICAgICAgICAgIGludCBpbnRWYWx1ZSA9IGVudHJpZXNbaV0uZ2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJzdGF0aWMgZmluYWwgaW50ICIgKyBjb25zdE5hbWUgKyAiID0gIiArIGludFZhbHVlICsgIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVtaXQoIiIpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUgdGFibGUgPSIpOwotICAgICAgICAgICAgZW1pdCgiICAgIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUiKTsKLSAgICAgICAgICAgIGVtaXQoIigiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZW1pdCgibmV3IEVudW1bXSIpOwotICAgICAgICAgICAgZW1pdCgieyIpOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9IGVudHJpZXNbaV0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnN0TmFtZSA9ICJJTlRfIiArIGVudHJpZXNbaV0uZ2V0RW51bU5hbWUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJuZXcgRW51bShcIiIgKyBqYXZhU3RyaW5nRXNjYXBlKGVudW1WYWx1ZSkgKyAiXCIsICIgKyBjb25zdE5hbWUgKyAiKSwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIn0iKTsKLSAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIik7Iik7Ci0gICAgICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiKTsKLSAgICAgICAgICAgIGVtaXQoInByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpIHsgcmV0dXJuIGZvckludChpbnRWYWx1ZSgpKTsgfSAiKTsKLSAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIn0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyB4bWxUeXBlRm9yUHJvcGVydHkoU2NoZW1hUHJvcGVydHkgc1Byb3ApCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc1Byb3AuamF2YUJhc2VkT25UeXBlKCk7Ci0gICAgICAgIHJldHVybiBmaW5kSmF2YVR5cGUoc1R5cGUpLnJlcGxhY2UoJyQnLCAnLicpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIHhtbFR5cGVGb3JQcm9wZXJ0eUlzVW5pb24oU2NoZW1hUHJvcGVydHkgc1Byb3ApCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc1Byb3AuamF2YUJhc2VkT25UeXBlKCk7Ci0gICAgICAgIHJldHVybiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkgJiYgc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pOwotICAgIH0KLQotICAgIFN0cmluZyBqYXZhVHlwZUZvclByb3BlcnR5KFNjaGVtYVByb3BlcnR5IHNQcm9wKQotICAgIHsKLSAgICAgICAgLy8gVGhlIHR5cGUgdG8gdXNlIGlzIHRoZSBYTUwgb2JqZWN0Li4uLgotICAgICAgICBpZiAoc1Byb3AuZ2V0SmF2YVR5cGVDb2RlKCkgPT0gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNQcm9wLmphdmFCYXNlZE9uVHlwZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZpbmRKYXZhVHlwZShzVHlwZSkucmVwbGFjZSgnJCcsICcuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHNQcm9wLmdldEphdmFUeXBlQ29kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmxvYXQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURToKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiAic2hvcnQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImxvbmciOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLm1hdGguQmlnRGVjaW1hbCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLm1hdGguQmlnSW50ZWdlciI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEudXRpbC5EYXRlIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLnV0aWwuTGlzdCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLnV0aWwuQ2FsZW5kYXIiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTToKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc1Byb3AuamF2YUJhc2VkT25UeXBlKCkuZ2V0QmFzZUVudW1UeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRKYXZhVHlwZShzVHlwZSkucmVwbGFjZSgnJCcsICcuJykgKyAiLkVudW0iOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS5sYW5nLk9iamVjdCI7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UHJvcGVydHlHZXR0ZXJzKFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGphdmFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwgU3RyaW5nIHh0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5pbGxhYmxlLCBib29sZWFuIG9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldmVyYWwsIGJvb2xlYW4gc2luZ2xldG9uKQotICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3BkZXNjID0gIlwiIiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIlwiIiArIChpc0F0dHIgPyAiIGF0dHJpYnV0ZSIgOiAiIGVsZW1lbnQiKTsKLSAgICAgICAgYm9vbGVhbiB4bWx0eXBlID0gKGphdmFUeXBlID09IFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1QpOwotCi0gICAgICAgIGlmIChzaW5nbGV0b24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJHZXRzIGZpcnN0ICIgOiAiR2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KHR5cGUgKyAiIGdldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiR2V0cyAoYXMgeG1sKSBmaXJzdCAiIDogIkdldHMgKGFzIHhtbCkgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIHhnZXQiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlRlc3RzIGZvciBuaWwgZmlyc3QgIiA6ICJUZXN0cyBmb3IgbmlsICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoImJvb2xlYW4gaXNOaWwiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiVHJ1ZSBpZiBoYXMgYXQgbGVhc3Qgb25lICIgOiAiVHJ1ZSBpZiBoYXMgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJib29sZWFuIGlzU2V0IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXZlcmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJyYXlOYW1lID0gcHJvcGVydHlOYW1lICsgIkFycmF5IjsKLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MgKyAicyIpOwotICAgICAgICAgICAgZW1pdCh0eXBlICsgIltdIGdldCIgKyBhcnJheU5hbWUgKyAiKCk7Iik7Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQodHlwZSArICIgZ2V0IiArIGFycmF5TmFtZSArICIoaW50IGkpOyIpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIChhcyB4bWwpIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MgKyAicyIpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiW10geGdldCIgKyBhcnJheU5hbWUgKyAiKCk7Iik7Ci0KLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgKGFzIHhtbCkgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgeGdldCIgKyBhcnJheU5hbWUgKyAiKGludCBpKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiVGVzdHMgZm9yIG5pbCBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJib29sZWFuIGlzTmlsIiArIGFycmF5TmFtZSArICIoaW50IGkpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIlJldHVybnMgbnVtYmVyIG9mICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJpbnQgc2l6ZU9mIiArIGFycmF5TmFtZSArICIoKTsiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRQcm9wZXJ0eVNldHRlcnMoUU5hbWUgcU5hbWUsIGJvb2xlYW4gaXNBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgamF2YVR5cGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgeHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmlsbGFibGUsIGJvb2xlYW4gb3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V2ZXJhbCwgYm9vbGVhbiBzaW5nbGV0b24pCi0gICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2FmZVZhck5hbWUgPSBOYW1lVXRpbC5ub25KYXZhS2V5d29yZChOYW1lVXRpbC5sb3dlckNhbWVsQ2FzZShwcm9wZXJ0eU5hbWUpKTsKLSAgICAgICAgaWYgKHNhZmVWYXJOYW1lLmVxdWFscygiaSIpKQotICAgICAgICAgICAgc2FmZVZhck5hbWUgPSAiaVZhbHVlIjsKLSAgICAgICAgYm9vbGVhbiB4bWx0eXBlID0gKGphdmFUeXBlID09IFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1QpOwotCi0gICAgICAgIFN0cmluZyBwcm9wZGVzYyA9ICJcIiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIiIgKyAoaXNBdHRyID8gIiBhdHRyaWJ1dGUiIDogIiBlbGVtZW50Iik7Ci0KLSAgICAgICAgaWYgKHNpbmdsZXRvbikKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlNldHMgZmlyc3QgIiA6ICJTZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0IiArIHByb3BlcnR5TmFtZSArICIoIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlNldHMgKGFzIHhtbCkgZmlyc3QgIiA6ICJTZXRzIChhcyB4bWwpIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHhzZXQiICsgcHJvcGVydHlOYW1lICsgIigiICsgeHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeG1sdHlwZSAmJiAhc2V2ZXJhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIiBhZGROZXciICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIk5pbHMgdGhlIGZpcnN0ICIgOiAiTmlscyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXROaWwiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiUmVtb3ZlcyBmaXJzdCAiIDogIlVuc2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHVuc2V0IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXZlcmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJyYXlOYW1lID0gcHJvcGVydHlOYW1lICsgIkFycmF5IjsKLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQiICsgYXJyYXlOYW1lICsgIigiICsgdHlwZSArICJbXSAiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkpOyIpOwotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldCIgKyBhcnJheU5hbWUgKyAiKGludCBpLCAiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgKGFzIHhtbCkgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidm9pZCB4c2V0IiArIGFycmF5TmFtZSArICIoIiArIHh0eXBlICsgIltdIiArIHNhZmVWYXJOYW1lICsgIkFycmF5KTsiKTsKLQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyAoYXMgeG1sKSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHhzZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSwgIiArIHh0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiTmlscyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXROaWwiICsgYXJyYXlOYW1lICsgIihpbnQgaSk7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkluc2VydHMgdGhlIHZhbHVlIGFzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIGluc2VydCIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpLCAiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0KLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgdGhlIHZhbHVlIGFzIHRoZSBsYXN0ICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidm9pZCBhZGQiICsgcHJvcGVydHlOYW1lICsgIigiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiSW5zZXJ0cyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSB2YWx1ZSAoYXMgeG1sKSBhcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgaW5zZXJ0TmV3IiArIHByb3BlcnR5TmFtZSArICIoaW50IGkpOyIpOwotICAgIAotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSB2YWx1ZSAoYXMgeG1sKSBhcyB0aGUgbGFzdCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIGFkZE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiUmVtb3ZlcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHJlbW92ZSIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpKTsiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBnZXRBdG9taWNSZXN0cmljdGlvblR5cGUoU2NoZW1hVHlwZSBzVHlwZSkgewotICAgICAgICBTY2hlbWFUeXBlIHBUeXBlID0gc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpOwotICAgICAgICBzd2l0Y2ggKHBUeXBlLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbEFueVNpbXBsZVR5cGVJbXBsIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJvb2xlYW5Ib2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQmFzZTY0SG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSGV4QmluYXJ5SG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhVXJpSG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVFOYW1lSG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YU5vdGF0aW9uSG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUZsb2F0SG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEb3VibGVIb2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXREZWNpbWFsU2l6ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEZWNpbWFsSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSW50ZWdlckhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfTE9ORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhTG9uZ0hvbGRlckV4IjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfSU5UOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQllURToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSW50SG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgIGlmIChzVHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0hvbGRlckV4IjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFHRGF0ZUhvbGRlckV4IjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUdEdXJhdGlvbkhvbGRlckV4IjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJ1bnJlY29nbml6ZWQgcHJpbWl0aXZlIHR5cGUiOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFNjaGVtYVR5cGUgZmluZEJhc2VUeXBlKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICB3aGlsZSAoc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHNUeXBlID0gc1R5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIHNUeXBlOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRCYXNlQ2xhc3MoU2NoZW1hVHlwZSBzVHlwZSkgewotICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlID0gZmluZEJhc2VUeXBlKHNUeXBlLmdldEJhc2VUeXBlKCkpOwotCi0gICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTk9UX1NJTVBMRToKLSAgICAgICAgICAgICAgICAvLyBub24tc2ltcGxlLWNvbnRlbnQ6IGluaGVyaXQgZnJvbSBiYXNlIHR5cGUgaW1wbAotICAgICAgICAgICAgICAgIGlmICghWG1sT2JqZWN0LnR5cGUuZXF1YWxzKGJhc2VUeXBlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VUeXBlLmdldEZ1bGxKYXZhSW1wbE5hbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sQ29tcGxleENvbnRlbnRJbXBsIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZvciByZXN0cmljdGlvbnMKLSAgICAgICAgICAgICAgICBhc3NlcnQoISBzVHlwZS5pc0J1aWx0aW5UeXBlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXRBdG9taWNSZXN0cmljdGlvblR5cGUoc1R5cGUpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sTGlzdEltcGwiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFVuaW9uSW1wbCI7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludENvbnN0cnVjdG9yKFNjaGVtYVR5cGUgc1R5cGUsIFN0cmluZyBzaG9ydE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHNob3J0TmFtZSArICIob3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlIHNUeXBlKSIpOwotICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgIGVtaXQoInN1cGVyKHNUeXBlIiArIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5OT1RfU0lNUExFID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIgKyAhc1R5cGUuaXNTaW1wbGVUeXBlKCkpICsKLSAgICAgICAgICAgICAiKTsiKTsKLSAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuTk9UX1NJTVBMRSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBlbWl0KCJwcm90ZWN0ZWQgIiArIHNob3J0TmFtZSArICIob3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlIHNUeXBlLCBib29sZWFuIGIpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0KCJzdXBlcihzVHlwZSwgYik7Iik7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydENsYXNzKFNjaGVtYVR5cGUgc1R5cGUsIGJvb2xlYW4gaXNJbm5lcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc1R5cGUuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGJhc2VDbGFzcyA9IGdldEJhc2VDbGFzcyhzVHlwZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBpbnRlcmZhY2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnRlcmZhY2VzLmFwcGVuZChzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSk7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OKSB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlW10gbWVtYmVyVHlwZXMgPSBzVHlwZS5nZXRVbmlvbk1lbWJlclR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtZW1iZXJUeXBlcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlcy5hcHBlbmQoIiwgIiArIG1lbWJlclR5cGVzW2ldLmdldEZ1bGxKYXZhTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXQoInB1YmxpYyAiICsgKCBpc0lubmVyID8gInN0YXRpYyAiOiAiIiApICsgImNsYXNzICIgKyBzaG9ydE5hbWUgKwotICAgICAgICAgICAgIiBleHRlbmRzICIgKyBiYXNlQ2xhc3MgKyAiIGltcGxlbWVudHMgIiArIGludGVyZmFjZXMudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgc3RhcnRCbG9jaygpOwotICAgIH0KLQotICAgIHZvaWQgbWFrZUF0dHJpYnV0ZURlZmF1bHRWYWx1ZShTdHJpbmcganRhcmdldFR5cGUsIFNjaGVtYVByb3BlcnR5IHByb3AsIFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGp0YXJnZXRUeXBlOwotICAgICAgICBpZiAoZnVsbE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGZ1bGxOYW1lID0gcHJvcC5qYXZhQmFzZWRPblR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKTsKLQotICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIGZ1bGxOYW1lICsgIilnZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdmFsdWUoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKLSAgICB9Ci0KLSAgICB2b2lkIG1ha2VNaXNzaW5nVmFsdWUoaW50IGphdmFUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoamF2YVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiBmYWxzZTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDoKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gMC4wZjsiKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIDAuMDsiKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gMDsiKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiAwTDsiKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDoKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gbnVsbDsiKTsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50SkdldEFycmF5VmFsdWUoaW50IGphdmFUeXBlLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3dpdGNoIChqYXZhVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOgotICAgICAgICAgICAgICAgIGVtaXQodHlwZSArICJbXSByZXN1bHQgPSBuZXcgIiArIHR5cGUgKyAiW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXRMaXN0LnRvQXJyYXkocmVzdWx0KTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06Ci0gICAgICAgICAgICAgICAgZW1pdCh0eXBlICsgIltdIHJlc3VsdCA9IG5ldyAiICsgdHlwZSArICJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgiICsgdHlwZSArICIpKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRFbnVtVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgICAgIGVtaXQoImJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCb29sZWFuVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgICAgIGVtaXQoImZsb2F0W10gcmVzdWx0ID0gbmV3IGZsb2F0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEZsb2F0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgICAgICBlbWl0KCJkb3VibGVbXSByZXN1bHQgPSBuZXcgZG91YmxlW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldERvdWJsZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgICAgIGVtaXQoImJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCeXRlVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgotICAgICAgICAgICAgICAgIGVtaXQoInNob3J0W10gcmVzdWx0ID0gbmV3IHNob3J0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldFNob3J0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKLSAgICAgICAgICAgICAgICBlbWl0KCJpbnRbXSByZXN1bHQgPSBuZXcgaW50W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEludFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgICAgIGVtaXQoImxvbmdbXSByZXN1bHQgPSBuZXcgbG9uZ1t0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRMb25nVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEubWF0aC5CaWdEZWNpbWFsW10gcmVzdWx0ID0gbmV3IGphdmEubWF0aC5CaWdEZWNpbWFsW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEJpZ0RlY2ltYWxWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS5tYXRoLkJpZ0ludGVnZXJbXSByZXN1bHQgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS5sYW5nLlN0cmluZ1tdIHJlc3VsdCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldFN0cmluZ1ZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgICAgIGVtaXQoImJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW3RhcmdldExpc3Quc2l6ZSgpXVtdOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5DYWxlbmRhcltdIHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQ2FsZW5kYXJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0Q2FsZW5kYXJWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKLSAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuRGF0ZVtdIHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuRGF0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXREYXRlVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgotICAgICAgICAgICAgICAgIGVtaXQoIm9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGVbXSByZXN1bHQgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRHRGF0ZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgZW1pdCgib3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25bXSByZXN1bHQgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25bdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0R0R1cmF0aW9uVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSByZXN1bHQgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRRTmFtZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0W10gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5MaXN0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldExpc3RWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEubGFuZy5PYmplY3RbXSByZXN1bHQgPSBuZXcgamF2YS5sYW5nLk9iamVjdFt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRPYmplY3RWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLSAgICAgICAgZW1pdCgicmV0dXJuIHJlc3VsdDsiKTsKLSAgICB9Ci0gICAgdm9pZCBwcmludEpHZXRWYWx1ZShpbnQgamF2YVR5cGUsIFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzd2l0Y2ggKGphdmFUeXBlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQ7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCb29sZWFuVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRGbG9hdFZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldERvdWJsZVZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCeXRlVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRTaG9ydFZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEludFZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRMb25nVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCaWdEZWNpbWFsVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0U3RyaW5nVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEJ5dGVBcnJheVZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURToKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0R0RhdGVWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRHRHVyYXRpb25WYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldENhbGVuZGFyVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RBVEU6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldERhdGVWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldFFOYW1lVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldExpc3RWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTToKLSAgICAgICAgICAgIGVtaXQoInJldHVybiAoIiArIHR5cGUgKyAiKXRhcmdldC5nZXRFbnVtVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0T2JqZWN0VmFsdWUoKTsiKTsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcganNldE1ldGhvZChpbnQgamF2YVR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3dpdGNoIChqYXZhVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldCI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJvb2xlYW5WYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRGbG9hdFZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXREb3VibGVWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJ5dGVWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRTaG9ydFZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRJbnRWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldExvbmdWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRCaWdEZWNpbWFsVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0QmlnSW50ZWdlclZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRTdHJpbmdWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJ5dGVBcnJheVZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEdEYXRlVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEdEdXJhdGlvblZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldENhbGVuZGFyVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXREYXRlVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0UU5hbWVWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldExpc3RWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEVudW1WYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0T2JqZWN0VmFsdWUiOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBnZXRJZGVudGlmaWVyKE1hcCBxTmFtZU1hcCwgUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pcU5hbWVNYXAuZ2V0KHFOYW1lKSlbMF07Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldFNldElkZW50aWZpZXIoTWFwIHFOYW1lTWFwLCBRTmFtZSBxTmFtZSkgewotICAgICAgICBTdHJpbmdbXSBpZGVudGlmaWVycyA9IChTdHJpbmdbXSlxTmFtZU1hcC5nZXQocU5hbWUpOwotICAgICAgICByZXR1cm4gaWRlbnRpZmllcnNbMV0gPT0gbnVsbCA/IGlkZW50aWZpZXJzWzBdIDogaWRlbnRpZmllcnNbMV07Ci0gICAgfQotCi0gICAgTWFwIHByaW50U3RhdGljRmllbGRzKFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWFwIHJlc3VsdHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGlkZW50aWZpZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgIGZpbmFsIFNjaGVtYVByb3BlcnR5IHByb3AgPSBwcm9wZXJ0aWVzW2ldOwotICAgICAgICAgICAgZmluYWwgUU5hbWUgbmFtZSA9IHByb3AuZ2V0TmFtZSgpOwotICAgICAgICAgICAgcmVzdWx0cy5wdXQobmFtZSwgaWRlbnRpZmllcnMpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphdmFOYW1lID0gcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCk7Ci0gICAgICAgICAgICBpZGVudGlmaWVyc1swXSA9IChqYXZhTmFtZSArICIkIiArIChpICogMikpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gICJcIiIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIlwiIjsKLQotICAgICAgICAgICAgZW1pdCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSAiICsgaWRlbnRpZmllcnNbMF0gKwotICAgICAgICAgICAgICAgICAiID0gIiApOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBlbWl0KCJuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiICsKLSAgICAgICAgICAgICAgICAgdXJpU3RyaW5nICsgIiwgXCIiICsgbmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIik7Iik7Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLmFjY2VwdGVkTmFtZXMoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFFOYW1lW10gcW5hbWVzID0gcHJvcGVydGllc1tpXS5hY2NlcHRlZE5hbWVzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocW5hbWVzLmxlbmd0aCA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1sxXSA9IChqYXZhTmFtZSArICIkIiArIChpKjIrMSkpLnRvVXBwZXJDYXNlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZW1pdCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldCAiICsgaWRlbnRpZmllcnNbMV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA9IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQuZm9yQXJyYXkoIG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10geyAiICk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCBxbmFtZXMubGVuZ3RoIDsgaisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCJuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZShcIiIgKyBxbmFtZXNbal0uZ2V0TmFtZXNwYWNlVVJJKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgXCIiICsgcW5hbWVzW2pdLmdldExvY2FsUGFydCgpICsgIlwiKSwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ9KTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIHZvaWQgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoInN5bmNocm9uaXplZCAobW9uaXRvcigpKSIpOwotICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBlbWl0KCJjaGVja19vcnBoYW5lZCgpOyIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgZW1pdEFkZFRhcmdldChTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBpc0F0dHIsIGJvb2xlYW4gZGVjbGFyZVRhcmdldCwgU3RyaW5nIHh0eXBlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChkZWNsYXJlVGFyZ2V0KQotICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgdGFyZ2V0OyIpOwotICAgICAgICBpZiAoaXNBdHRyKQotICAgICAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyB4dHlwZSArICIpZ2V0X3N0b3JlKCkuYWRkX2F0dHJpYnV0ZV91c2VyKCIgKyBpZGVudGlmaWVyICsgIik7Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgeHR5cGUgKyAiKWdldF9zdG9yZSgpLmFkZF9lbGVtZW50X3VzZXIoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USElORyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9ORVdfVkFMVUUgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJPV19FWENFUFRJT04gPSA0OwotCi0gICAgdm9pZCBlbWl0R2V0VGFyZ2V0KFN0cmluZyBzZXRJZGVudGlmaWVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBdHRyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZGV4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bGxCZWhhdmlvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB4dHlwZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnQgc2V0SWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIgIT0gbnVsbDsKLQotICAgICAgICBlbWl0KHh0eXBlICsgIiB0YXJnZXQgPSBudWxsOyIpOwotCi0gICAgICAgIGlmIChpc0F0dHIpCi0gICAgICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIHh0eXBlICsgIilnZXRfc3RvcmUoKS5maW5kX2F0dHJpYnV0ZV91c2VyKCIgKyBpZGVudGlmaWVyICsgIik7Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgeHR5cGUgKyAiKWdldF9zdG9yZSgpLmZpbmRfZWxlbWVudF91c2VyKCIgKyBzZXRJZGVudGlmaWVyICsgIiwgIiArIGluZGV4ICsgIik7Iik7Ci0KLSAgICAgICAgaWYgKG51bGxCZWhhdmlvdXIgPT0gTk9USElORykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIik7Ci0KLSAgICAgICAgc3RhcnRCbG9jaygpOwotCi0gICAgICAgIHN3aXRjaCAobnVsbEJlaGF2aW91cikKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBBRERfTkVXX1ZBTFVFOgotICAgICAgICAgICAgICAgIGVtaXRBZGRUYXJnZXQoaWRlbnRpZmllciwgaXNBdHRyLCBmYWxzZSwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRIUk9XX0VYQ0VQVElPTjoKLSAgICAgICAgICAgICAgICBlbWl0KCJ0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5PVEhJTkc6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogIkJhZCBiZWhhdmlvdXIgdHlwZTogIiArIG51bGxCZWhhdmlvdXI7Ci0gICAgICAgIH0KLQotICAgICAgICBlbmRCbG9jaygpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRHZXR0ZXJJbXBscygKLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCwgUU5hbWUgcU5hbWUsIGJvb2xlYW4gaXNBdHRyLCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICBpbnQgamF2YVR5cGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgeHR5cGUsIGJvb2xlYW4gbmlsbGFibGUsCi0gICAgICAgIGJvb2xlYW4gb3B0aW9uYWwsIGJvb2xlYW4gc2V2ZXJhbCwgYm9vbGVhbiBzaW5nbGV0b24sCi0gICAgICAgIGJvb2xlYW4gaXN1bmlvbiwKLSAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIsIFN0cmluZyBzZXRJZGVudGlmaWVyICkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3BkZXNjID0gIlwiIiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIlwiIiArIChpc0F0dHIgPyAiIGF0dHJpYnV0ZSIgOiAiIGVsZW1lbnQiKTsKLSAgICAgICAgYm9vbGVhbiB4bWx0eXBlID0gKGphdmFUeXBlID09IFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1QpOwotICAgICAgICBTdHJpbmcganRhcmdldFR5cGUgPSAoaXN1bmlvbiB8fCAheG1sdHlwZSkgPyAib3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSIgOiB4dHlwZTsKLQotICAgICAgICBpZiAoc2luZ2xldG9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBWYWx1ZSBnZXRQcm9wKCkKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJHZXRzIGZpcnN0ICIgOiAiR2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHR5cGUgKyAiIGdldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0KLSAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIE5PVEhJTkcsIGp0YXJnZXRUeXBlKTsKLQotICAgICAgICAgICAgaWYgKGlzQXR0ciAmJiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZIHx8Ci0gICAgICAgICAgICAgICAgICAgIHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoImlmICh0YXJnZXQgPT0gbnVsbCkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgbWFrZUF0dHJpYnV0ZURlZmF1bHRWYWx1ZShqdGFyZ2V0VHlwZSwgcHJvcCwgaWRlbnRpZmllcik7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVtaXQoImlmICh0YXJnZXQgPT0gbnVsbCkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIG1ha2VNaXNzaW5nVmFsdWUoamF2YVR5cGUpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotCi0gICAgICAgICAgICBwcmludEpHZXRWYWx1ZShqYXZhVHlwZSwgdHlwZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotCi0gICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVmFsdWUgeGdldFByb3AoKQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJHZXRzIChhcyB4bWwpIGZpcnN0ICIgOiAiR2V0cyAoYXMgeG1sKSB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB4dHlwZSArICIgeGdldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBOT1RISU5HLCB4dHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNBdHRyICYmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiaWYgKHRhcmdldCA9PSBudWxsKSIpOwotICAgICAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VBdHRyaWJ1dGVEZWZhdWx0VmFsdWUoeHR5cGUsIHByb3AsIGlkZW50aWZpZXIpOwotICAgICAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQ7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGJvb2xlYW4gaXNOaWxQcm9wKCkKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiVGVzdHMgZm9yIG5pbCBmaXJzdCAiIDogIlRlc3RzIGZvciBuaWwgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIGJvb2xlYW4gaXNOaWwiICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICIwIiwgTk9USElORywgeHR5cGUpOwotCi0gICAgICAgICAgICAgICAgZW1pdCgiaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5pc05pbCgpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9uYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGJvb2xlYW4gaXNTZXRQcm9wKCkKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJUcnVlIGlmIGhhcyBhdCBsZWFzdCBvbmUgIiA6ICJUcnVlIGlmIGhhcyAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBib29sZWFuIGlzU2V0IiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotCi0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotCi0gICAgICAgICAgICBpZiAoaXNBdHRyKQotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiBnZXRfc3RvcmUoKS5maW5kX2F0dHJpYnV0ZV91c2VyKCIgKyBpZGVudGlmaWVyICsiKSAhPSBudWxsOyIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiBnZXRfc3RvcmUoKS5jb3VudF9lbGVtZW50cygiICsgc2V0SWRlbnRpZmllciArICIpICE9IDA7Iik7Ci0KLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXZlcmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJyYXlOYW1lID0gcHJvcGVydHlOYW1lICsgIkFycmF5IjsKLQotICAgICAgICAgICAgLy8gVmFsdWVbXSBnZXRQcm9wKCkKLSAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjICsgInMiKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgdHlwZSArICJbXSBnZXQiICsgYXJyYXlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotCi0gICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCB0YXJnZXRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoImdldF9zdG9yZSgpLmZpbmRfYWxsX2VsZW1lbnRfdXNlcnMoIiArIHNldElkZW50aWZpZXIgKyAiLCB0YXJnZXRMaXN0KTsiKTsKLQotICAgICAgICAgICAgcHJpbnRKR2V0QXJyYXlWYWx1ZShqYXZhVHlwZSwgdHlwZSk7Ci0KLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgLy8gVmFsdWUgZ2V0UHJvcChpbnQgaSkKLSAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgdHlwZSArICIgZ2V0IiArIGFycmF5TmFtZSArICIoaW50IGkpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotCi0gICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiLCBUSFJPV19FWENFUFRJT04sIGp0YXJnZXRUeXBlKTsKLSAgICAgICAgICAgIHByaW50SkdldFZhbHVlKGphdmFUeXBlLCB0eXBlKTsKLQotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVmFsdWVbXSB4Z2V0UHJvcCgpCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIChhcyB4bWwpIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MgKyAicyIpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiW10geGdldCIgKyBhcnJheU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCB0YXJnZXRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJnZXRfc3RvcmUoKS5maW5kX2FsbF9lbGVtZW50X3VzZXJzKCIgKyBzZXRJZGVudGlmaWVyICsgIiwgdGFyZ2V0TGlzdCk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICJbXSByZXN1bHQgPSBuZXcgIiArIHh0eXBlICsgIlt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0TGlzdC50b0FycmF5KHJlc3VsdCk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHJlc3VsdDsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICAgICAgLy8gVmFsdWUgeGdldFByb3AoaW50IGkpCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIChhcyB4bWwpIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiIHhnZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiLCBUSFJPV19FWENFUFRJT04sIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gKCIgKyB4dHlwZSArICIpdGFyZ2V0OyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGJvb2xlYW4gaXNOaWwoaW50IGkpOwotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiVGVzdHMgZm9yIG5pbCBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgYm9vbGVhbiBpc05pbCIgKyBhcnJheU5hbWUgKyAiKGludCBpKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIsIFRIUk9XX0VYQ0VQVElPTiwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuaXNOaWwoKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbnQgY291bnRQcm9wKCk7Ci0gICAgICAgICAgICBwcmludEphdmFEb2MoIlJldHVybnMgbnVtYmVyIG9mICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgaW50IHNpemVPZiIgKyBhcnJheU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gZ2V0X3N0b3JlKCkuY291bnRfZWxlbWVudHMoIiArIHNldElkZW50aWZpZXIgKyIpOyIpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFNldHRlckltcGxzKFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGphdmFUeXBlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHh0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5pbGxhYmxlLCBib29sZWFuIG9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldmVyYWwsIGJvb2xlYW4gc2luZ2xldG9uLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzdW5pb24sCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyLCBTdHJpbmcgc2V0SWRlbnRpZmllcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2FmZVZhck5hbWUgPSBOYW1lVXRpbC5ub25KYXZhS2V5d29yZChOYW1lVXRpbC5sb3dlckNhbWVsQ2FzZShwcm9wZXJ0eU5hbWUpKTsKLSAgICAgICAgaWYgKHNhZmVWYXJOYW1lLmVxdWFscygiaSIpKQotICAgICAgICAgICAgc2FmZVZhck5hbWUgPSAiaVZhbHVlIjsKLSAgICAgICAgZWxzZSBpZiAoc2FmZVZhck5hbWUuZXF1YWxzKCJ0YXJnZXQiKSkKLSAgICAgICAgICAgIHNhZmVWYXJOYW1lID0gInRhcmdldFZhbHVlIjsKLQotICAgICAgICBib29sZWFuIHhtbHR5cGUgPSAoamF2YVR5cGUgPT0gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVCk7Ci0gICAgICAgIGJvb2xlYW4gaXNvYmogPSAoamF2YVR5cGUgPT0gU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1QpOwotICAgICAgICBib29sZWFuIGlzU3Vic3RHcm91cCA9IGlkZW50aWZpZXIgIT0gc2V0SWRlbnRpZmllcjsKLSAgICAgICAgU3RyaW5nIGpTZXQgPSBqc2V0TWV0aG9kKGphdmFUeXBlKTsKLSAgICAgICAgU3RyaW5nIGp0YXJnZXRUeXBlID0gKGlzdW5pb24gfHwgIXhtbHR5cGUpID8gIm9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUiIDogeHR5cGU7Ci0KLSAgICAgICAgU3RyaW5nIHByb3BkZXNjID0gIlwiIiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIlwiIiArIChpc0F0dHIgPyAiIGF0dHJpYnV0ZSIgOiAiIGVsZW1lbnQiKTsKLQotICAgICAgICBpZiAoc2luZ2xldG9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB2b2lkIHNldFByb3AoVmFsdWUgdik7Ci0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiU2V0cyBmaXJzdCAiIDogIlNldHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0IiArIHByb3BlcnR5TmFtZSArICIoIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICIwIiwgQUREX05FV19WQUxVRSwganRhcmdldFR5cGUpOwotICAgICAgICAgICAgZW1pdChqU2V0ICsgIigiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHZvaWQgeHNldFByb3AoVmFsdWUgdikKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiU2V0cyAoYXMgeG1sKSBmaXJzdCAiIDogIlNldHMgKGFzIHhtbCkgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHhzZXQiICsgcHJvcGVydHlOYW1lICsgIigiICsgeHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICIwIiwgQUREX05FV19WQUxVRSwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInRhcmdldC5zZXQoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeG1sdHlwZSAmJiAhc2V2ZXJhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBWYWx1ZSBhZGROZXdQcm9wKCkKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIiBhZGROZXciICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEFkZFRhcmdldChpZGVudGlmaWVyLCBpc0F0dHIsIHRydWUsIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiTmlscyB0aGUgZmlyc3QgIiA6ICJOaWxzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBzZXROaWwiICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICIwIiwgQUREX05FV19WQUxVRSwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInRhcmdldC5zZXROaWwoKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiUmVtb3ZlcyBmaXJzdCAiIDogIlVuc2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCB1bnNldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICBpZiAoaXNBdHRyKQotICAgICAgICAgICAgICAgIGVtaXQoImdldF9zdG9yZSgpLnJlbW92ZV9hdHRyaWJ1dGUoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbWl0KCJnZXRfc3RvcmUoKS5yZW1vdmVfZWxlbWVudCgiICsgc2V0SWRlbnRpZmllciArICIsIDApOyIpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldmVyYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhcnJheU5hbWUgPSBwcm9wZXJ0eU5hbWUgKyAiQXJyYXkiOwotCi0gICAgICAgICAgICAvLyBKU0VUX0lOREVYCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBzZXQiICsgYXJyYXlOYW1lICsgIigiICsgdHlwZSArICJbXSAiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotCi0gICAgICAgICAgICBpZiAoaXNvYmopCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N1YnN0R3JvdXApCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoInVuaW9uQXJyYXlTZXR0ZXJIZWxwZXIoIiArIHNhZmVWYXJOYW1lICsgIkFycmF5IiArICIsICIgKyBpZGVudGlmaWVyICsgIik7IiApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidW5pb25BcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiLCAiICsgc2V0SWRlbnRpZmllciArICIpOyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzU3Vic3RHcm91cCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiYXJyYXlTZXR0ZXJIZWxwZXIoIiArIHNhZmVWYXJOYW1lICsgIkFycmF5IiArICIsICIgKyBpZGVudGlmaWVyICsgIik7IiApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiYXJyYXlTZXR0ZXJIZWxwZXIoIiArIHNhZmVWYXJOYW1lICsgIkFycmF5IiArICIsICIgKyBpZGVudGlmaWVyICsgIiwgIiArIHNldElkZW50aWZpZXIgKyAiKTsiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHNldCIgKyBhcnJheU5hbWUgKyAiKGludCBpLCAiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiLCBUSFJPV19FWENFUFRJT04sIGp0YXJnZXRUeXBlKTsKLSAgICAgICAgICAgIGVtaXQoalNldCArICIoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgKGFzIHhtbCkgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgeHNldCIgKyBhcnJheU5hbWUgKyAiKCIgKyB4dHlwZSArICJbXSIgKyBzYWZlVmFyTmFtZSArICJBcnJheSkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJhcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiKTsiICk7Ci0KLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIChhcyB4bWwpIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHhzZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSwgIiArIHh0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIsIFRIUk9XX0VYQ0VQVElPTiwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInRhcmdldC5zZXQoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiTmlscyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0TmlsIiArIGFycmF5TmFtZSArICIoaW50IGkpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldE5pbCgpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkluc2VydHMgdGhlIHZhbHVlIGFzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBpbnNlcnQiICsgcHJvcGVydHlOYW1lICsgIihpbnQgaSwgIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdChqdGFyZ2V0VHlwZSArICIgdGFyZ2V0ID0gIik7Ci0gICAgICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N1YnN0R3JvdXApCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIigiICsganRhcmdldFR5cGUgKyAiKWdldF9zdG9yZSgpLmluc2VydF9lbGVtZW50X3VzZXIoIiArIGlkZW50aWZpZXIgKyAiLCBpKTsiKTsKLSAgICAgICAgICAgICAgICBlbHNlIC8vIFRoaXMgaXMgYSBzdWJzdCBncm91cCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIGVtaXQgKCIoIiArIGp0YXJnZXRUeXBlICsiKWdldF9zdG9yZSgpLmluc2VydF9lbGVtZW50X3VzZXIoIiArIHNldElkZW50aWZpZXIgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyICsgIiwgaSk7Iik7Ci0gICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgICAgIGVtaXQoalNldCArICIoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyB0aGUgdmFsdWUgYXMgdGhlIGxhc3QgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBhZGQiICsgcHJvcGVydHlOYW1lICsgIigiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0QWRkVGFyZ2V0KGlkZW50aWZpZXIsIGlzQXR0ciwgdHJ1ZSwganRhcmdldFR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoalNldCArICIoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJJbnNlcnRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IHZhbHVlIChhcyB4bWwpIGFzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIiBpbnNlcnROZXciICsgcHJvcGVydHlOYW1lICsgIihpbnQgaSkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIiB0YXJnZXQ7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyB4dHlwZSArICIpZ2V0X3N0b3JlKCkuaW5zZXJ0X2VsZW1lbnRfdXNlcigiICsgaWRlbnRpZmllciArICIsIGkpOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQ7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgdmFsdWUgKGFzIHhtbCkgYXMgdGhlIGxhc3QgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIiBhZGROZXciICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEFkZFRhcmdldChpZGVudGlmaWVyLCBpc0F0dHIsIHRydWUsIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiUmVtb3ZlcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCByZW1vdmUiICsgcHJvcGVydHlOYW1lICsgIihpbnQgaSkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICBlbWl0KCJnZXRfc3RvcmUoKS5yZW1vdmVfZWxlbWVudCgiICsgc2V0SWRlbnRpZmllciArICIsIGkpOyIpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgZ2V0VHlwZU5hbWUoQ2xhc3MgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0gICAgICAgIGludCBhcnJheUNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGMuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBjID0gYy5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICBhcnJheUNvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQoYy5nZXROYW1lKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGFycmF5Q291bnQ7IGkrKykKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiW10iKTsKLQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRJbm5lclR5cGVJbXBsKAotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgYm9vbGVhbiBpc0lubmVyICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc1R5cGUuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKTsKLQotICAgICAgICBwcmludElubmVyVHlwZUphdmFEb2Moc1R5cGUpOwotCi0gICAgICAgIHN0YXJ0Q2xhc3Moc1R5cGUsIGlzSW5uZXIpOwotCi0gICAgICAgIHByaW50Q29uc3RydWN0b3Ioc1R5cGUsIHNob3J0TmFtZSk7Ci0KLSAgICAgICAgaWYgKCFzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBwcm9wZXJ0aWVzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc1R5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHNpbXBsZSBjb250ZW50IHR5cGVzIGltcGxzIGRlcml2ZSBkaXJlY3RseSBmcm9tICJob2xkZXIiIGltcGxzCi0gICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBjYXNlIChmb3IgaW50cyBvciBzdHJpbmcgZW51bXMgZS5nLikgd2hlcmUKLSAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIHNpbXBsZSB0eXBlIHJlc3RyaWN0aW9uLiAgU28gcHJvcGVydHkgZ2V0dGVycyBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy8gYmUgaW1wbGVtZW50ZWQgImZyb20gc2NyYXRjaCIgZm9yIGVhY2ggZGVyaXZlZCBjb21wbGV4IHR5cGUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gc1R5cGUuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNvbXBsZXggY29udGVudCB0eXBlIGltcGxlbWVudGF0aW9ucyBkZXJpdmUgZnJvbSBiYXNlIHR5cGUgaW1wbHMKLSAgICAgICAgICAgICAgICAvLyBzbyBkZXJpdmVkIHByb3BlcnR5IGltcGxzIGNhbiBiZSByZXVzZWQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gc1R5cGUuZ2V0RGVyaXZlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTWFwIHFOYW1lTWFwID0gcHJpbnRTdGF0aWNGaWVsZHMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcHJvcGVydGllc1tpXTsKLQotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwcm9wLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgeG1sVHlwZSA9IHhtbFR5cGVGb3JQcm9wZXJ0eSggcHJvcCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHByaW50R2V0dGVySW1wbHMoCi0gICAgICAgICAgICAgICAgICAgIHByb3AsCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHByb3AuaXNBdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCi0gICAgICAgICAgICAgICAgICAgIGphdmFUeXBlRm9yUHJvcGVydHkocHJvcCksCi0gICAgICAgICAgICAgICAgICAgIHhtbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSAhPSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YU9wdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YVNpbmdsZXRvbigpLAotICAgICAgICAgICAgICAgICAgICB4bWxUeXBlRm9yUHJvcGVydHlJc1VuaW9uKHByb3ApLAotICAgICAgICAgICAgICAgICAgICBnZXRJZGVudGlmaWVyKHFOYW1lTWFwLCBuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2V0SWRlbnRpZmllcihxTmFtZU1hcCwgbmFtZSkKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzUmVhZE9ubHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50U2V0dGVySW1wbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5pc0F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFUeXBlQ29kZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YVR5cGVGb3JQcm9wZXJ0eShwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgIT0gU2NoZW1hUHJvcGVydHkuTkVWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhT3B0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFTaW5nbGV0b24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFR5cGVGb3JQcm9wZXJ0eUlzVW5pb24ocHJvcCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRJZGVudGlmaWVyKHFOYW1lTWFwLCBuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNldElkZW50aWZpZXIocU5hbWVNYXAsIG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnROZXN0ZWRUeXBlSW1wbHMoc1R5cGUsIHN5c3RlbSk7Ci0KLSAgICAgICAgZW5kQmxvY2soKTsKLSAgICB9Ci0gICAgdm9pZCBwcmludE5lc3RlZFR5cGVJbXBscyhTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlW10gYW5vblR5cGVzID0gc1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9uVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbm9uVHlwZXNbaV0uaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpKQotICAgICAgICAgICAgICAgIHByaW50TmVzdGVkVHlwZUltcGxzKGFub25UeXBlc1tpXSwgc3lzdGVtKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludElubmVyVHlwZUltcGwoYW5vblR5cGVzW2ldLCBzeXN0ZW0sIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMWIyMWMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMDQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU2NoZW1hVHlwZUltcGwgaW1wbGVtZW50cyBTY2hlbWFUeXBlLCBUeXBlU3RvcmVVc2VyRmFjdG9yeQotewotICAgIC8vIGdsb2JhbCB0eXBlcyBoYXZlIG5hbWVzCi0gICAgcHJpdmF0ZSBRTmFtZSBfbmFtZTsKLQotICAgIC8vIGNvbXBpbGF0aW9uIHN1cHBvcnQKLSAgICBwcml2YXRlIGludCBfcmVzb2x2ZVBoYXNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlJFU09MVkVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xWSU5HX1NHUyA9IDE7IC8vIEZvciBkb2N1bWVudCB0eXBlcyBvbmx5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVkVEX1NHUyA9IDI7ICAvLyBGb3IgZG9jdW1lbnQgdHlwZXMgb25seQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZFRCA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFJWklORyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFJWkVEID0gNjsKLQotICAgIC8vIGFub255bW91cyB0eXBlIHN1cHBvcnQKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9vdXRlclNjaGVtYVR5cGVSZWY7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFDb21wb25lbnQuUmVmIF9jb250YWluZXJGaWVsZFJlZjsKLSAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVtYUZpZWxkIF9jb250YWluZXJGaWVsZDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGludCBfY29udGFpbmVyRmllbGRDb2RlOwotICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IF9jb250YWluZXJGaWVsZEluZGV4OwotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWZbXSBfYW5vbnltb3VzVHlwZXJlZnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0RvY3VtZW50VHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzQXR0cmlidXRlVHlwZTsKLSAgICAvLyBwcml2YXRlIGJvb2xlYW4gX3NraXBwZWRBbm9ueW1vdXNUeXBlOwotCi0gICAgLy8gY29tcGlsZXRpbWUgamF2YSB0eXBlIHN1cHBvcnQKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzQ29tcGlsZWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Nob3J0SmF2YU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxKYXZhTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc2hvcnRKYXZhSW1wbE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxKYXZhSW1wbE5hbWU7Ci0KLSAgICAvLyBydW50aW1lIGphdmEgdHlwZSBzdXBwb3J0OiB2b2xhdGlsZSBiZWNhdXNlIHRoZXkncmUgY2FjaGVkCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBDbGFzcyBfamF2YUNsYXNzOwotICAgIHByaXZhdGUgdm9sYXRpbGUgQ2xhc3MgX2phdmFFbnVtQ2xhc3M7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBDbGFzcyBfamF2YUltcGxDbGFzczsKLSAgICBwcml2YXRlIHZvbGF0aWxlIENvbnN0cnVjdG9yIF9qYXZhSW1wbENvbnN0cnVjdG9yOwotICAgIHByaXZhdGUgdm9sYXRpbGUgQ29uc3RydWN0b3IgX2phdmFJbXBsQ29uc3RydWN0b3IyOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBfaW1wbE5vdEF2YWlsYWJsZTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gX2N0ckFyZ3MgPSBuZXcgT2JqZWN0W10geyB0aGlzIH07Ci0KLSAgICAvLyByZWZsZWN0aXZlIHN1cHBvcnQKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW0gX3R5cGVTeXN0ZW07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2ZpbGVuYW1lOwotCi0gICAgLy8gY29tcGxleCBjb250ZW50IHN1cHBvcnQKLSAgICBwcml2YXRlIFNjaGVtYVBhcnRpY2xlIF9jb250ZW50TW9kZWw7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFMb2NhbEVsZW1lbnRbXSBfbG9jYWxFbHRzOyAvLyBsYXppbHkgY29tcHV0ZWQKLSAgICBwcml2YXRlIHZvbGF0aWxlIE1hcCBfZWx0VG9JbmRleE1hcDsgLy8gbGF6aWx5IGNvbXB1dGVkCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBNYXAgX2F0dHJUb0luZGV4TWFwOyAvLyBsYXppbHkgY29tcHV0ZWQKLSAgICBwcml2YXRlIE1hcCBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWU7Ci0gICAgcHJpdmF0ZSBNYXAgX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9oYXNBbGxDb250ZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBfb3JkZXJTZW5zaXRpdmU7Ci0gICAgcHJpdmF0ZSBRTmFtZVNldCBfdHlwZWRXaWxkY2FyZEVsZW1lbnRzOwotICAgIHByaXZhdGUgUU5hbWVTZXQgX3R5cGVkV2lsZGNhcmRBdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzV2lsZGNhcmRFbGVtZW50czsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2hhc1dpbGRjYXJkQXR0cmlidXRlczsKLSAgICAvLyBzZXQgb2YgdmFsaWQgUU5hbWVzIHRoYXQgY2FuIGJlIHN1YnN0aXR1dGVkIGZvciBhIHByb3BlcnR5Ci0gICAgcHJpdmF0ZSBTZXQgX3ZhbGlkU3Vic3RpdHV0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQotICAgIC8vIHNpbXBsZSBjb250ZW50IHN1cHBvcnQKLSAgICBwcml2YXRlIGludCBfY29tcGxleFR5cGVWYXJpZXR5OwotICAgIHByaXZhdGUgU2NoZW1hQXR0cmlidXRlTW9kZWwgX2F0dHJpYnV0ZU1vZGVsOwotCi0gICAgLy8gc2ltcGxlIHR5cGUgc3VwcG9ydAotICAgIHByaXZhdGUgaW50IF9idWlsdGluVHlwZUNvZGU7Ci0KLSAgICBwcml2YXRlIGludCBfc2ltcGxlVHlwZVZhcmlldHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc1NpbXBsZVR5cGU7Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9iYXNlVHlwZXJlZjsgLy8gdmlhIHJlc3RyaWN0aW9uIG9yIGV4dGVuc2lvbgotICAgIHByaXZhdGUgaW50IF9iYXNlRGVwdGg7IC8vIGhvdyBtYW55IGluaGVyaXRhbmNlIHN0ZXBzIHRvIEFueVR5cGUKLSAgICBwcml2YXRlIGludCBfZGVyaXZhdGlvblR5cGU7Ci0KLSAgICAvLyBmYWNldHMKLSAgICBwcml2YXRlIFhtbFZhbHVlUmVmW10gX2ZhY2V0QXJyYXk7Ci0gICAgcHJpdmF0ZSBib29sZWFuW10gX2ZpeGVkRmFjZXRBcnJheTsKLQotICAgIC8vIGZ1bmRhbWVudGFsIGZhY2V0cwotICAgIHByaXZhdGUgaW50IF9vcmRlcmVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNGaW5pdGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0JvdW5kZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc051bWVyaWM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2FiczsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsRXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxSZXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxMaXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxVbmlvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrRXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfYmxvY2tSZXN0OwotCi0gICAgLy8gd2hpdGVzcGFjZSBmYWNldAotICAgIHByaXZhdGUgaW50IF93aGl0ZVNwYWNlUnVsZTsKLQotICAgIC8vIHJlZ2V4IHBhdHRlcm5zCi0gICAgcHJpdmF0ZSBib29sZWFuIF9oYXNQYXR0ZXJuczsgLy8gYWxzbyB0YWtlcyBpbnRvIGFjY291bnQgYmFzZSBjbGFzc2VzCi0gICAgcHJpdmF0ZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBfcGF0dGVybnM7Ci0KLSAgICAvLyBlbnVtZXJhdGVkIHZhbHVlcwotICAgIHByaXZhdGUgWG1sVmFsdWVSZWZbXSBfZW51bWVyYXRpb25WYWx1ZXM7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfYmFzZUVudW1UeXBlcmVmOwotICAgIHByaXZhdGUgYm9vbGVhbiBfc3RyaW5nRW51bUVuc3VyZWQ7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBNYXAgX2xvb2t1cFN0cmluZ0VudW07Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBMaXN0IF9saXN0T2ZTdHJpbmdFbnVtOwotICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwIF9sb29rdXBTdHJpbmdFbnVtRW50cnk7Ci0gICAgcHJpdmF0ZSBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBfc3RyaW5nRW51bUVudHJpZXM7Ci0KLSAgICAvLyBmb3IgbGlzdHMgb25seQotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX2xpc3RJdGVtVHlwZXJlZjsKLQotICAgIC8vIGZvciB1bmlvbnMgb25seQotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNVbmlvbk9mTGlzdHM7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZltdIF91bmlvbk1lbWJlclR5cGVyZWZzOwotICAgIHByaXZhdGUgaW50IF9hbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWw7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFUeXBlW10gX3VuaW9uQ29uc3RpdHVlbnRUeXBlczsKLSAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVtYVR5cGVbXSBfdW5pb25TdWJUeXBlczsKLSAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVtYVR5cGUgX3VuaW9uQ29tbW9uQmFzZVR5cGU7Ci0KLSAgICAvLyBmb3IgYXRvbWljIHR5cGVzIG9ubHkKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9wcmltaXRpdmVUeXBlUmVmOwotCi0gICAgLy8gZm9yIGRlY2ltYWwgcmVzdHJpY3Rpb25zIG9ubHkKLSAgICBwcml2YXRlIGludCBfZGVjaW1hbFNpemU7Ci0KLSAgICAvLyBsYXp5IGxvYWRpbmcgc3VwcG9ydAotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBfdW5sb2FkZWQ7Ci0KLSAgICAvLyBmb3IgZG9jdW1lbnQgdHlwZXMgb25seSAtIG9ubHkgdmFsaWQgZHVyaW5nIGNvbXBpbGF0aW9uCi0gICAgcHJpdmF0ZSBRTmFtZSBfc2c7Ci0gICAgcHJpdmF0ZSBMaXN0IF9zZ01lbWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VubG9hZGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdW5sb2FkZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluaXNoTG9hZGluZygpCi0gICAgewotICAgICAgICBfdW5sb2FkZWQgPSBmYWxzZTsKLSAgICB9Ci0KLQotCi0gICAgU2NoZW1hVHlwZUltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQotICAgIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOwotICAgIH0KLQotICAgIFNjaGVtYVR5cGVJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSwgYm9vbGVhbiB1bmxvYWRlZCkKLSAgICB7Ci0gICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKLSAgICAgICAgX3VubG9hZGVkID0gdW5sb2FkZWQ7Ci0gICAgICAgIGlmICh1bmxvYWRlZCkKLSAgICAgICAgICAgIGZpbmlzaFF1aWNrKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTR1Jlc29sdmVkKCkKLSAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA+PSBSRVNPTFZFRF9TR1M7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU0dSZXNvbHZpbmcoKQotICAgICAgICB7IHJldHVybiBfcmVzb2x2ZVBoYXNlID49IFJFU09MVklOR19TR1M7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKQotICAgICAgICB7IHJldHVybiBfcmVzb2x2ZVBoYXNlID49IFJFU09MVkVEOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmluZygpCi0gICAgICAgIHsgcmV0dXJuIF9yZXNvbHZlUGhhc2UgPT0gUkVTT0xWSU5HOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VuamF2YWl6ZWQoKQotICAgICAgICB7IHJldHVybiBfcmVzb2x2ZVBoYXNlIDwgSkFWQUlaRUQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSmF2YWl6ZWQoKQotICAgICAgICB7IHJldHVybiBfcmVzb2x2ZVBoYXNlID09IEpBVkFJWkVEOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFJlc29sdmluZ1NHcygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBVTlJFU09MVkVEKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfcmVzb2x2ZVBoYXNlID0gUkVTT0xWSU5HX1NHUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXNvbHZpbmdTR3MoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWSU5HX1NHUykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3Jlc29sdmVQaGFzZSA9IFJFU09MVkVEX1NHUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFJlc29sdmluZygpCi0gICAgewotICAgICAgICBpZiAoIChfaXNEb2N1bWVudFR5cGUgJiYgX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZFRF9TR1MpIHx8Ci0gICAgICAgICAgICAgKCFfaXNEb2N1bWVudFR5cGUgJiYgX3Jlc29sdmVQaGFzZSAhPSBVTlJFU09MVkVEKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3Jlc29sdmVQaGFzZSA9IFJFU09MVklORzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXNvbHZpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWSU5HKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfcmVzb2x2ZVBoYXNlID0gUkVTT0xWRUQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRKYXZhaXppbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWRUQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF9yZXNvbHZlUGhhc2UgPSBKQVZBSVpJTkc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluaXNoSmF2YWl6aW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IEpBVkFJWklORykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3Jlc29sdmVQaGFzZSA9IEpBVkFJWkVEOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaW5pc2hRdWljaygpCi0gICAgewotICAgICAgICBfcmVzb2x2ZVBoYXNlID0gSkFWQUlaRUQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFVucmVzb2x2ZWQoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gVU5SRVNPTFZFRCAmJiAhX3VubG9hZGVkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTR1Jlc29sdmluZygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZJTkdfU0dTICYmICFfdW5sb2FkZWQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNHUmVzb2x2ZWQoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWRURfU0dTICYmICFfdW5sb2FkZWQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc29sdmluZygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZJTkcgJiYgIV91bmxvYWRlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVzb2x2ZWQoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWRUQgJiYgIV91bmxvYWRlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SmF2YWl6aW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IEpBVkFJWklORyAmJiAhX3VubG9hZGVkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX25hbWU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoUU5hbWUgbmFtZSkKLSAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9uYW1lID0gbmFtZTsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZmlsZW5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfZmlsZW5hbWU7Ci0gICAgICAgIGlmIChnZXRPdXRlclR5cGUoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGdldE91dGVyVHlwZSgpLmdldFNvdXJjZU5hbWUoKTsKLQotICAgICAgICBTY2hlbWFGaWVsZCBmaWVsZCA9IGdldENvbnRhaW5lckZpZWxkKCk7Ci0gICAgICAgIGlmIChmaWVsZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxFbGVtZW50KQotICAgICAgICAgICAgICAgIHJldHVybiAoKFNjaGVtYUdsb2JhbEVsZW1lbnQpZmllbGQpLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpZmllbGQpLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfZmlsZW5hbWUgPSBmaWxlbmFtZTsgfQotCi0gICAgcHVibGljIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gU2NoZW1hQ29tcG9uZW50LlRZUEU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9uYW1lID09IG51bGw7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnRUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2lzRG9jdW1lbnRUeXBlOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVR5cGUoKQotICAgICAgICB7IHJldHVybiBfaXNBdHRyaWJ1dGVUeXBlOyB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpCi0gICAgewotICAgICAgICBpZiAoX2lzRG9jdW1lbnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBzcCA9IGdldENvbnRlbnRNb2RlbCgpOwotICAgICAgICAgICAgaWYgKHNwICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNwLmdldE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpCi0gICAgewotICAgICAgICBpZiAoX2lzQXR0cmlidXRlVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgc2FtID0gZ2V0QXR0cmlidXRlTW9kZWwoKTsKLSAgICAgICAgICAgIGlmIChzYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIHNsYUFycmF5ID0gc2FtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2xhQXJyYXkgIT0gbnVsbCAmJiBzbGFBcnJheS5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgc2xhID0gc2xhQXJyYXlbMF07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzbGEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50VHlwZShib29sZWFuIGlzRG9jdW1lbnQpCi0gICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfaXNEb2N1bWVudFR5cGUgPSBpc0RvY3VtZW50OyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKGJvb2xlYW4gaXNBdHRyaWJ1dGUpCi0gICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfaXNBdHRyaWJ1dGVUeXBlID0gaXNBdHRyaWJ1dGU7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKQotICAgICAgICB7IHJldHVybiBfY29tcGxleFR5cGVWYXJpZXR5OyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wbGV4VHlwZVZhcmlldHkoaW50IGNvbXBsZXhUeXBlVmFyaWV0eSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2NvbXBsZXhUeXBlVmFyaWV0eSA9IGNvbXBsZXhUeXBlVmFyaWV0eTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVFbGVtZW50U2VxdWVuY2VyIGdldEVsZW1lbnRTZXF1ZW5jZXIoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb21wbGV4VHlwZVZhcmlldHkgPT0gTk9UX0NPTVBMRVhfVFlQRSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VxdWVuY2VySW1wbChudWxsKTsKLQotICAgICAgICByZXR1cm4gbmV3IFNlcXVlbmNlckltcGwobmV3IFNjaGVtYVR5cGVWaXNpdG9ySW1wbChfY29udGVudE1vZGVsKSk7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgYWJzdHJhY3QgYW5kIGZpbmFsIGZsYWdzIGZvciBhIGNvbXBsZXggdHlwZSAqLwotICAgIHZvaWQgc2V0QWJzdHJhY3RGaW5hbCgKLSAgICAgICAgYm9vbGVhbiBhYnMsIGJvb2xlYW4gZmluYWxFeHQsIGJvb2xlYW4gZmluYWxSZXN0LCBib29sZWFuIGZpbmFsTGlzdCwgYm9vbGVhbiBmaW5hbFVuaW9uKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2aW5nKCk7Ci0gICAgICAgIF9hYnMgPSBhYnM7Ci0gICAgICAgIF9maW5hbEV4dCA9IGZpbmFsRXh0OyBfZmluYWxSZXN0ID0gZmluYWxSZXN0OwotICAgICAgICBfZmluYWxMaXN0ID0gZmluYWxMaXN0OyBfZmluYWxVbmlvbiA9IGZpbmFsVW5pb247Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgZmluYWwgZmxhZ3MgZm9yIGEgc2ltcGxlIHR5cGUgKi8KLSAgICB2b2lkIHNldFNpbXBsZUZpbmFsKGJvb2xlYW4gZmluYWxSZXN0LCBib29sZWFuIGZpbmFsTGlzdCwgYm9vbGVhbiBmaW5hbFVuaW9uKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2aW5nKCk7IF9maW5hbFJlc3QgPSBmaW5hbFJlc3Q7IF9maW5hbExpc3QgPSBmaW5hbExpc3QgOyBfZmluYWxVbmlvbiA9IGZpbmFsVW5pb247Ci0gICAgfQotCi0gICAgdm9pZCBzZXRCbG9jayhib29sZWFuIGJsb2NrRXh0LCBib29sZWFuIGJsb2NrUmVzdCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmluZygpOyBfYmxvY2tFeHQgPSBibG9ja0V4dCA7IF9ibG9ja1Jlc3QgPSBibG9ja1Jlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tSZXN0cmljdGlvbigpCi0gICAgeyByZXR1cm4gX2Jsb2NrUmVzdDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tFeHRlbnNpb24oKQotICAgIHsgcmV0dXJuIF9ibG9ja0V4dDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpCi0gICAgeyByZXR1cm4gX2FiczsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxFeHRlbnNpb24oKQotICAgIHsgcmV0dXJuIF9maW5hbEV4dDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxSZXN0cmljdGlvbigpCi0gICAgeyByZXR1cm4gX2ZpbmFsUmVzdDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxMaXN0KCkKLSAgICB7IHJldHVybiBfZmluYWxMaXN0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFVuaW9uKCkKLSAgICB7IHJldHVybiBfZmluYWxVbmlvbjsgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTY2hlbWFGaWVsZCBnZXRDb250YWluZXJGaWVsZCgpCi0gICAgewotICAgICAgICBpZiAoX2NvbnRhaW5lckZpZWxkQ29kZSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBvdXRlciA9IGdldE91dGVyVHlwZSgpOwotICAgICAgICAgICAgaWYgKF9jb250YWluZXJGaWVsZENvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICBfY29udGFpbmVyRmllbGQgPSBfY29udGFpbmVyRmllbGRSZWYgPT0gbnVsbCA/IG51bGwgOiAoU2NoZW1hRmllbGQpX2NvbnRhaW5lckZpZWxkUmVmLmdldENvbXBvbmVudCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoX2NvbnRhaW5lckZpZWxkQ29kZSA9PSAxKQotICAgICAgICAgICAgICAgIF9jb250YWluZXJGaWVsZCA9IG91dGVyLmdldEF0dHJpYnV0ZU1vZGVsKCkuZ2V0QXR0cmlidXRlcygpW19jb250YWluZXJGaWVsZEluZGV4XTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfY29udGFpbmVyRmllbGQgPSAoKFNjaGVtYVR5cGVJbXBsKW91dGVyKS5nZXRMb2NhbEVsZW1lbnRCeUluZGV4KF9jb250YWluZXJGaWVsZEluZGV4KTsKLSAgICAgICAgICAgIF9jb250YWluZXJGaWVsZENvZGUgPSAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX2NvbnRhaW5lckZpZWxkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lckZpZWxkKFNjaGVtYUZpZWxkIGZpZWxkKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VW5yZXNvbHZlZCgpOwotICAgICAgICBfY29udGFpbmVyRmllbGQgPSBmaWVsZDsKLSAgICAgICAgX2NvbnRhaW5lckZpZWxkQ29kZSA9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lckZpZWxkUmVmKFNjaGVtYUNvbXBvbmVudC5SZWYgcmVmKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VW5yZXNvbHZlZCgpOwotICAgICAgICBfY29udGFpbmVyRmllbGRSZWYgPSByZWY7Ci0gICAgICAgIF9jb250YWluZXJGaWVsZENvZGUgPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lckZpZWxkSW5kZXgoc2hvcnQgY29kZSwgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgYXNzZXJ0VW5yZXNvbHZlZCgpOwotICAgICAgICBfY29udGFpbmVyRmllbGRDb2RlID0gY29kZTsKLSAgICAgICAgX2NvbnRhaW5lckZpZWxkSW5kZXggPSBpbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRPdXRlclR5cGUoKQotICAgICAgICB7IHJldHVybiBfb3V0ZXJTY2hlbWFUeXBlUmVmID09IG51bGwgPyBudWxsIDogX291dGVyU2NoZW1hVHlwZVJlZi5nZXQoKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfb3V0ZXJTY2hlbWFUeXBlUmVmID0gdHlwZXJlZjsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21waWxlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0NvbXBpbGVkOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21waWxlZChib29sZWFuIGYpCi0gICAgICAgIHsgYXNzZXJ0SmF2YWl6aW5nKCk7IF9pc0NvbXBpbGVkID0gZjsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9vdXRlclNjaGVtYVR5cGVSZWYuZ2V0KCkuZ2V0QmFzZVR5cGUoKSA9PSB0aGlzOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0SmF2YU5hbWUoKQotICAgICAgICB7IHJldHVybiBfc2hvcnRKYXZhTmFtZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2hvcnRKYXZhTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmVkKCk7Ci0gICAgICAgIF9zaG9ydEphdmFOYW1lID0gbmFtZTsKLSAgICAgICAgU2NoZW1hVHlwZSBvdXRlciA9IF9vdXRlclNjaGVtYVR5cGVSZWYuZ2V0KCk7Ci0gICAgICAgIHdoaWxlIChvdXRlci5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgb3V0ZXIgPSBvdXRlci5nZXRPdXRlclR5cGUoKTsKLQotICAgICAgICBfZnVsbEphdmFOYW1lID0gb3V0ZXIuZ2V0RnVsbEphdmFOYW1lKCkgKyAiJCIgKyBfc2hvcnRKYXZhTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxKYXZhTmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9mdWxsSmF2YU5hbWU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxKYXZhTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmVkKCk7Ci0gICAgICAgIF9mdWxsSmF2YU5hbWUgPSBuYW1lOwotICAgICAgICBpbnQgaW5kZXggPSBNYXRoLm1heChfZnVsbEphdmFOYW1lLmxhc3RJbmRleE9mKCckJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mdWxsSmF2YU5hbWUubGFzdEluZGV4T2YoJy4nKSkgKyAxOwotICAgICAgICBfc2hvcnRKYXZhTmFtZSA9IF9mdWxsSmF2YU5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydEphdmFJbXBsTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmVkKCk7Ci0gICAgICAgIF9zaG9ydEphdmFJbXBsTmFtZSA9IG5hbWU7Ci0gICAgICAgIFNjaGVtYVR5cGUgb3V0ZXIgPSBfb3V0ZXJTY2hlbWFUeXBlUmVmLmdldCgpOwotICAgICAgICB3aGlsZSAob3V0ZXIuZ2V0RnVsbEphdmFJbXBsTmFtZSgpID09IG51bGwpCi0gICAgICAgICAgICBvdXRlciA9IG91dGVyLmdldE91dGVyVHlwZSgpOwotCi0gICAgICAgIF9mdWxsSmF2YUltcGxOYW1lID0gb3V0ZXIuZ2V0RnVsbEphdmFJbXBsTmFtZSgpICsgIiQiICsgX3Nob3J0SmF2YUltcGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxKYXZhSW1wbE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOwotICAgICAgICBfZnVsbEphdmFJbXBsTmFtZSA9IG5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IE1hdGgubWF4KF9mdWxsSmF2YUltcGxOYW1lLmxhc3RJbmRleE9mKCckJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mdWxsSmF2YUltcGxOYW1lLmxhc3RJbmRleE9mKCcuJykpICsgMTsKLSAgICAgICAgX3Nob3J0SmF2YUltcGxOYW1lID0gX2Z1bGxKYXZhSW1wbE5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxKYXZhSW1wbE5hbWUoKSB7IHJldHVybiBfZnVsbEphdmFJbXBsTmFtZTt9Ci0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydEphdmFJbXBsTmFtZSgpIHsgcmV0dXJuIF9zaG9ydEphdmFJbXBsTmFtZTt9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKLSAgICAgICAgeyByZXR1cm4gX3R5cGVTeXN0ZW07IH0KLQotICAgIHB1YmxpYyBTY2hlbWFQYXJ0aWNsZSBnZXRDb250ZW50TW9kZWwoKQotICAgICAgICB7IHJldHVybiBfY29udGVudE1vZGVsOyB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkRWx0TGlzdChMaXN0IGVsdExpc3QsIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZW50TW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBzd2l0Y2ggKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIGVsdExpc3QuYWRkKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50TW9kZWwuY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsgaSsrKQotICAgICAgICAgICAgICAgICAgICBidWlsZEVsdExpc3QoZWx0TGlzdCwgY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkTG9jYWxFbHRzKCkKLSAgICB7Ci0gICAgICAgIExpc3QgZWx0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYnVpbGRFbHRMaXN0KGVsdExpc3QsIF9jb250ZW50TW9kZWwpOwotICAgICAgICBfbG9jYWxFbHRzID0gKFNjaGVtYUxvY2FsRWxlbWVudFtdKWVsdExpc3QudG9BcnJheShuZXcgU2NoZW1hTG9jYWxFbGVtZW50W2VsdExpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUxvY2FsRWxlbWVudCBnZXRMb2NhbEVsZW1lbnRCeUluZGV4KGludCBpKQotICAgIHsKLSAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50W10gZWx0cyA9IF9sb2NhbEVsdHM7Ci0gICAgICAgIGlmIChlbHRzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkTG9jYWxFbHRzKCk7Ci0gICAgICAgICAgICBlbHRzID0gX2xvY2FsRWx0czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWx0c1tpXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEluZGV4Rm9yTG9jYWxFbGVtZW50KFNjaGVtYUxvY2FsRWxlbWVudCBlbHQpCi0gICAgewotICAgICAgICBNYXAgbG9jYWxFbHRNYXAgPSBfZWx0VG9JbmRleE1hcDsKLSAgICAgICAgaWYgKGxvY2FsRWx0TWFwID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbG9jYWxFbHRzID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnVpbGRMb2NhbEVsdHMoKTsKLSAgICAgICAgICAgIGxvY2FsRWx0TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xvY2FsRWx0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbEVsdE1hcC5wdXQoX2xvY2FsRWx0c1tpXSwgbmV3IEludGVnZXIoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2VsdFRvSW5kZXhNYXAgPSBsb2NhbEVsdE1hcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChJbnRlZ2VyKWxvY2FsRWx0TWFwLmdldChlbHQpKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhGb3JMb2NhbEF0dHJpYnV0ZShTY2hlbWFMb2NhbEF0dHJpYnV0ZSBhdHRyKQotICAgIHsKLSAgICAgICAgTWFwIGxvY2FsQXR0ck1hcCA9IF9hdHRyVG9JbmRleE1hcDsKLSAgICAgICAgaWYgKGxvY2FsQXR0ck1hcCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhbEF0dHJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBhdHRycyA9IHRoaXMuX2F0dHJpYnV0ZU1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYWxBdHRyTWFwLnB1dChhdHRyc1tpXSwgbmV3IEludGVnZXIoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2F0dHJUb0luZGV4TWFwID0gbG9jYWxBdHRyTWFwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKEludGVnZXIpbG9jYWxBdHRyTWFwLmdldChhdHRyKSkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlTW9kZWwgZ2V0QXR0cmlidXRlTW9kZWwoKQotICAgICAgICB7IHJldHVybiBfYXR0cmlidXRlTW9kZWw7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eVtdIGdldFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVByb3BlcnRpZXMoKTsKLQotICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50UHJvcGVydGllcygpOwotCi0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLnZhbHVlcygpKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUudmFsdWVzKCkpOwotICAgICAgICByZXR1cm4gKFNjaGVtYVByb3BlcnR5W10pbGlzdC50b0FycmF5KG5ldyBTY2hlbWFQcm9wZXJ0eVtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYVByb3BlcnR5W10gTk9fUFJPUEVSVElFUyA9IG5ldyBTY2hlbWFQcm9wZXJ0eVswXTsKLQotICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eVtdIGdldERlcml2ZWRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBnZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdHMuYWRkQWxsKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS52YWx1ZXMoKSk7Ci0KLSAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHRzLmFkZEFsbChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZS52YWx1ZXMoKSk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHJlc3VsdHMuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IChTY2hlbWFQcm9wZXJ0eSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBiYXNlUHJvcCA9IHByb3AuaXNBdHRyaWJ1dGUoKSA/Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUuZ2V0QXR0cmlidXRlUHJvcGVydHkocHJvcC5nZXROYW1lKCkpIDoKLSAgICAgICAgICAgICAgICBiYXNlVHlwZS5nZXRFbGVtZW50UHJvcGVydHkocHJvcC5nZXROYW1lKCkpOwotCi0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZGVyaXZlZCBwcm9wZXJ0eSBmcm9tIHRoZSByZXN1bHRzIGlmIGl0IGlzCi0gICAgICAgICAgICAvLyBBKSBwcmVzZW50IGluIHRoZSBiYXNlIHR5cGUgYW5kCi0gICAgICAgICAgICAvLyBCKSBhbGwgdGhlIGRldGFpbHMgYXJlIHRoZSBzYW1lIChjYXJkaW5hbGl0eSwgbmlsbGFiaWxpdHkpCi0KLSAgICAgICAgICAgIGlmIChiYXNlUHJvcCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggZXEocHJvcC5nZXRNaW5PY2N1cnMoKSwgYmFzZVByb3AuZ2V0TWluT2NjdXJzKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICBlcShwcm9wLmdldE1heE9jY3VycygpLCBiYXNlUHJvcC5nZXRNYXhPY2N1cnMoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSA9PSBiYXNlUHJvcC5oYXNOaWxsYWJsZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoU2NoZW1hUHJvcGVydHlbXSlyZXN1bHRzLnRvQXJyYXkobmV3IFNjaGVtYVByb3BlcnR5W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShCaWdJbnRlZ2VyIGEsIEJpZ0ludGVnZXIgYikKLSAgICB7Ci0gICAgICAgIGlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChhPT0gbnVsbCB8fCBiID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHlbXSBnZXRFbGVtZW50UHJvcGVydGllcygpCi0gICAgewotICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gTk9fUFJPUEVSVElFUzsKLQotICAgICAgICByZXR1cm4gKFNjaGVtYVByb3BlcnR5W10pCi0gICAgICAgICAgICAgICAgX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVByb3BlcnR5W19wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHlbXSBnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIE5PX1BST1BFUlRJRVM7Ci0KLSAgICAgICAgcmV0dXJuIChTY2hlbWFQcm9wZXJ0eVtdKQotICAgICAgICAgICAgICAgIF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVByb3BlcnR5W19wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eSBnZXRFbGVtZW50UHJvcGVydHkoUU5hbWUgZWx0TmFtZSkKLSAgICAgICAgeyByZXR1cm4gX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lID09IG51bGwgPyBudWxsIDogKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5nZXQoZWx0TmFtZSk7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eSBnZXRBdHRyaWJ1dGVQcm9wZXJ0eShRTmFtZSBhdHRyTmFtZSkKLSAgICAgICAgeyByZXR1cm4gX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUgPT0gbnVsbCA/IG51bGwgOiAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuZ2V0KGF0dHJOYW1lKTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQWxsQ29udGVudCgpCi0gICAgICAgIHsgcmV0dXJuIF9oYXNBbGxDb250ZW50OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09yZGVyU2Vuc2l0aXZlKCkKLSAgICAgICAgeyByZXR1cm4gX29yZGVyU2Vuc2l0aXZlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcmRlclNlbnNpdGl2ZShib29sZWFuIHNlbnNpdGl2ZSkKLSAgICAgICAgeyBhc3NlcnRKYXZhaXppbmcoKTsgX29yZGVyU2Vuc2l0aXZlID0gc2Vuc2l0aXZlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWwoCi0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwsCi0gICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBhdHRyTW9kZWwsCi0gICAgICAgICAgICBNYXAgcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUsCi0gICAgICAgICAgICBNYXAgcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNBbGwpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKLSAgICAgICAgX2NvbnRlbnRNb2RlbCA9IGNvbnRlbnRNb2RlbDsKLSAgICAgICAgX2F0dHJpYnV0ZU1vZGVsID0gYXR0ck1vZGVsOwotICAgICAgICBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgPSBwcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZTsKLSAgICAgICAgX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lOwotICAgICAgICBfaGFzQWxsQ29udGVudCA9IGlzQWxsOwotCi0KLSAgICAgICAgLy8gQWRkIGVudHJpZXMgZm9yIGVhY2ggZWxlbWVudCBwcm9wZXJ0eSBmb3Igc3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMKLSAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdmFsaWRTdWJzdGl0dXRpb25zID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gZWx0UHJvcHMgPSBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUudmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZWx0UHJvcHMuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gKFNjaGVtYVByb3BlcnR5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBRTmFtZVtdIG5hbWVzID0gcHJvcC5hY2NlcHRlZE5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbmFtZXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEgX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLmNvbnRhaW5zS2V5KG5hbWVzW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF92YWxpZFN1YnN0aXR1dGlvbnMuYWRkKG5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNFbGVtZW50cygpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q29udGVudFR5cGUoKSA9PSBFTEVNRU5UX0NPTlRFTlQgfHwKLSAgICAgICAgICAgICAgIGdldENvbnRlbnRUeXBlKCkgPT0gTUlYRURfQ09OVEVOVDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVXaWxkY2FyZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9oYXNXaWxkY2FyZEF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRWxlbWVudFdpbGRjYXJkcygpCi0gICAgewotICAgICAgICByZXR1cm4gX2hhc1dpbGRjYXJkRWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFN1YnN0aXR1dGlvbihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWxpZFN1YnN0aXR1dGlvbnMuY29udGFpbnMobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0RWxlbWVudFR5cGUoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpCi0gICAgewotICAgICAgICBpZiAoaXNTaW1wbGVUeXBlKCkgfHwgIWNvbnRhaW5zRWxlbWVudHMoKSB8fCBpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlOwotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5nZXQoZWx0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9wICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGUgPSBwcm9wLmdldFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3R5cGVkV2lsZGNhcmRFbGVtZW50cy5jb250YWlucyhlbHROYW1lKSB8fCB3aWxkY2FyZFR5cGVMb2FkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLQotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQgPSB3aWxkY2FyZFR5cGVMb2FkZXIuZmluZEVsZW1lbnQoZWx0TmFtZSk7Ci0gICAgICAgICAgICBpZiAoZWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2tleS1sdmEsCi0gICAgICAgICAgICAvLyB0aGUgbGluZSBhYm92ZSBzaG91bGQgcmV0dXJuIFNUX0FOWV9UWVBFLgotICAgICAgICAgICAgdHlwZSA9IGVsdC5nZXRUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeHNpVHlwZSAhPSBudWxsICYmIHdpbGRjYXJkVHlwZUxvYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGl0eXBlID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRUeXBlKHhzaVR5cGUpOwotCi0gICAgICAgICAgICAvLyBOT1RFOiBhIHByZXZpb3VzIHZlcnNpb24gb2YgWE1MQmVhbnMgdXNlZCBTVF9OT19UWVBFIGlmIHRoZQotICAgICAgICAgICAgLy8geHNpVHlwZSB3YXMgbm90IGRlcml2ZWQgZnJvbSAndHlwZScsIGJ1dCB0aGlzIHJlc3VsdHMgaW4gYQotICAgICAgICAgICAgLy8gQ2xhc3NDYXN0RXhjZXB0aW9uLiAgSW5zdGVhZCB3ZSBpZ25vcmUgeHNpOnR5cGUgaWYgaXQncyBub3QKLSAgICAgICAgICAgIC8vIGZvdW5kIG9yIGEgZGVyaXZlZCB0eXBlLgotICAgICAgICAgICAgaWYgKGl0eXBlICE9IG51bGwgJiYgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGl0eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldEF0dHJpYnV0ZVR5cGUoUU5hbWUgYXR0ck5hbWUsIFNjaGVtYVR5cGVMb2FkZXIgd2lsZGNhcmRUeXBlTG9hZGVyKQotICAgIHsKLSAgICAgICAgaWYgKGlzU2ltcGxlVHlwZSgpIHx8IGlzTm9UeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLQotICAgICAgICBpZiAoaXNVUlR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuZ2V0KGF0dHJOYW1lKTsKLSAgICAgICAgaWYgKHByb3AgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwcm9wLmdldFR5cGUoKTsKLQotICAgICAgICBpZiAoIV90eXBlZFdpbGRjYXJkQXR0cmlidXRlcy5jb250YWlucyhhdHRyTmFtZSkgfHwgd2lsZGNhcmRUeXBlTG9hZGVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLQotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgYXR0ciA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kQXR0cmlidXRlKGF0dHJOYW1lKTsKLSAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOwotICAgICAgICByZXR1cm4gYXR0ci5nZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBjcmVhdGVFbGVtZW50VHlwZShRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlLCBTY2hlbWFUeXBlTG9hZGVyIHdpbGRjYXJkVHlwZUxvYWRlcikKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IG51bGw7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBudWxsOwotICAgICAgICBpZiAoaXNTaW1wbGVUeXBlKCkgfHwgIWNvbnRhaW5zRWxlbWVudHMoKSB8fCBpc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLmdldChlbHROYW1lKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IHByb3AuZ2V0VHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIV90eXBlZFdpbGRjYXJkRWxlbWVudHMuY29udGFpbnMoZWx0TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICFfdmFsaWRTdWJzdGl0dXRpb25zLmNvbnRhaW5zKGVsdE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0ID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRFbGVtZW50KGVsdE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChlbHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGVsdC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHhzaVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIGl0eXBlID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRUeXBlKHhzaVR5cGUpOwotCi0gICAgICAgICAgICAgICAgLy8gTk9URTogYSBwcmV2aW91cyB2ZXJzaW9uIG9mIFhNTEJlYW5zIHVzZWQgU1RfTk9fVFlQRSBpZiB0aGUKLSAgICAgICAgICAgICAgICAvLyB4c2lUeXBlIHdhcyBub3QgZGVyaXZlZCBmcm9tICd0eXBlJywgYnV0IHRoaXMgcmVzdWx0cyBpbiBhCi0gICAgICAgICAgICAgICAgLy8gQ2xhc3NDYXN0RXhjZXB0aW9uLiAgSW5zdGVhZCB3ZSBpZ25vcmUgeHNpOnR5cGUgaWYgaXQncyBub3QKLSAgICAgICAgICAgICAgICAvLyBmb3VuZCBvciBhIGRlcml2ZWQgdHlwZS4KLSAgICAgICAgICAgICAgICBpZiAoaXR5cGUgIT0gbnVsbCAmJiB0eXBlLmlzQXNzaWduYWJsZUZyb20oaXR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBpdHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuY3JlYXRlVW5hdHRhY2hlZE5vZGUocHJvcCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY3JlYXRlQXR0cmlidXRlVHlwZShRTmFtZSBhdHRyTmFtZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlSW1wbCB0eXBlID0gbnVsbDsKLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IG51bGw7Ci0gICAgICAgIGlmIChpc1NpbXBsZVR5cGUoKSB8fCBpc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1VSVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuZ2V0KGF0dHJOYW1lKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IChTY2hlbWFUeXBlSW1wbClwcm9wLmdldFR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0ck5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoU2NoZW1hVHlwZUltcGwpYXR0ci5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHlwZS5jcmVhdGVVbmF0dGFjaGVkTm9kZShwcm9wKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQgZWxlbWVudFNldCwgYm9vbGVhbiBoYXN3Y0VsdCwgUU5hbWVTZXQgYXR0cmlidXRlU2V0LCBib29sZWFuIGhhc3djQXR0KQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2aW5nKCk7IF90eXBlZFdpbGRjYXJkRWxlbWVudHMgPSBlbGVtZW50U2V0OyBfaGFzV2lsZGNhcmRFbGVtZW50cyA9IGhhc3djRWx0OyBfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVTZXQ7IF9oYXNXaWxkY2FyZEF0dHJpYnV0ZXMgPSBoYXN3Y0F0dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGdldEFub255bW91c1R5cGVzKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfYW5vbnltb3VzVHlwZXJlZnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSBfYW5vbnltb3VzVHlwZXJlZnNbaV0uZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzVHlwZVJlZnMoU2NoZW1hVHlwZS5SZWZbXSBhbm9ueW1vdXNUeXBlcmVmcykKLSAgICB7Ci0gICAgICAgIF9hbm9ueW1vdXNUeXBlcmVmcyA9IGFub255bW91c1R5cGVyZWZzOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZVtdIHN0YUNvcHkoU2NoZW1hVHlwZVtdIGEpCi0gICAgewotICAgICAgICBpZiAoYSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW2EubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLCAwLCByZXN1bHQsIDAsIGEubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuW10gYm9hQ29weShib29sZWFuW10gYSkKLSAgICB7Ci0gICAgICAgIGlmIChhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bYS5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGEsIDAsIHJlc3VsdCwgMCwgYS5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlVmFyaWV0eShpbnQgdmFyaWV0eSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3NpbXBsZVR5cGVWYXJpZXR5ID0gdmFyaWV0eTsgfQotCi0gICAgcHVibGljIGludCBnZXRTaW1wbGVWYXJpZXR5KCkKLSAgICAgICAgeyByZXR1cm4gX3NpbXBsZVR5cGVWYXJpZXR5OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VSVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9idWlsdGluVHlwZUNvZGUgPT0gQlRDX0FOWV9UWVBFIHx8IF9idWlsdGluVHlwZUNvZGUgPT0gQlRDX0FOWV9TSU1QTEU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTm9UeXBlKCkKLSAgICAgICAgeyByZXR1cm4gdGhpcyA9PSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKQotICAgICAgICB7IHJldHVybiBfaXNTaW1wbGVUeXBlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlKGJvb2xlYW4gZikKLSAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9pc1NpbXBsZVR5cGUgPSBmOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaW9uT2ZMaXN0cygpCi0gICAgICAgIHsgcmV0dXJuIF9pc1VuaW9uT2ZMaXN0czsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5pb25PZkxpc3RzKGJvb2xlYW4gZikKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2lzVW5pb25PZkxpc3RzID0gZjsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9wcmltaXRpdmVUeXBlUmVmID09IG51bGwgPyBudWxsIDogX3ByaW1pdGl2ZVR5cGVSZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByaW1pdGl2ZVR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3ByaW1pdGl2ZVR5cGVSZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlY2ltYWxTaXplKCkKLSAgICAgICAgeyByZXR1cm4gX2RlY2ltYWxTaXplOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNpbWFsU2l6ZShpbnQgYml0cykKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2RlY2ltYWxTaXplID0gYml0czsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0QmFzZVR5cGUoKQotICAgICAgICB7IHJldHVybiBfYmFzZVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfYmFzZVR5cGVyZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9iYXNlVHlwZXJlZiA9IHR5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QmFzZURlcHRoKCkKLSAgICAgICAgeyByZXR1cm4gX2Jhc2VEZXB0aDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZURlcHRoKGludCBkZXB0aCkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2Jhc2VEZXB0aCA9IGRlcHRoOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcml2YXRpb25UeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2Rlcml2YXRpb25UeXBlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXJpdmF0aW9uVHlwZShpbnQgdHlwZSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2Rlcml2YXRpb25UeXBlID0gdHlwZTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0TGlzdEl0ZW1UeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2xpc3RJdGVtVHlwZXJlZiA9PSBudWxsID8gbnVsbCA6IF9saXN0SXRlbVR5cGVyZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpc3RJdGVtVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfbGlzdEl0ZW1UeXBlcmVmID0gdHlwZXJlZjsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBnZXRVbmlvbk1lbWJlclR5cGVzKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfdW5pb25NZW1iZXJUeXBlcmVmcyA9PW51bGwgPyAwIDogX3VuaW9uTWVtYmVyVHlwZXJlZnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSBfdW5pb25NZW1iZXJUeXBlcmVmc1tpXS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVbmlvbk1lbWJlclR5cGVSZWZzKFNjaGVtYVR5cGUuUmVmW10gdHlwZXJlZnMpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF91bmlvbk1lbWJlclR5cGVyZWZzID0gdHlwZXJlZnM7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCkKLSAgICAgICAgeyByZXR1cm4gX2Fub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKGludCBpKQotICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2Fub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCA9IGk7IH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hVHlwZVtdIGdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpCi0gICAgewotICAgICAgICBpZiAoX3VuaW9uQ29tbW9uQmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpOwotICAgICAgICByZXR1cm4gc3RhQ29weShfdW5pb25Db25zdGl0dWVudFR5cGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VW5pb25Db25zdGl0dWVudFR5cGVzKFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICAgICAgeyBfdW5pb25Db25zdGl0dWVudFR5cGVzID0gdHlwZXM7IH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hVHlwZVtdIGdldFVuaW9uU3ViVHlwZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF91bmlvbkNvbW1vbkJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICBjb21wdXRlRmxhdFVuaW9uTW9kZWwoKTsKLSAgICAgICAgcmV0dXJuIHN0YUNvcHkoX3VuaW9uU3ViVHlwZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRVbmlvblN1YlR5cGVzKFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICAgICAgeyBfdW5pb25TdWJUeXBlcyA9IHR5cGVzOyB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFNjaGVtYVR5cGUgZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpCi0gICAgewotICAgICAgICBpZiAoX3VuaW9uQ29tbW9uQmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpOwotICAgICAgICByZXR1cm4gX3VuaW9uQ29tbW9uQmFzZVR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFVuaW9uQ29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICB7IF91bmlvbkNvbW1vbkJhc2VUeXBlID0gdHlwZTsgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpCi0gICAgewotICAgICAgICBTZXQgY29uc3RpdHVlbnRNZW1iZXJUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBhbGxTdWJUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIFNjaGVtYVR5cGUgY29tbW9uQmFzZVR5cGUgPSBudWxsOwotCi0gICAgICAgIGFsbFN1YlR5cGVzLmFkZCh0aGlzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF91bmlvbk1lbWJlclR5cGVyZWZzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbClfdW5pb25NZW1iZXJUeXBlcmVmc1tpXS5nZXQoKTsKLQotICAgICAgICAgICAgc3dpdGNoIChtSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0aXR1ZW50TWVtYmVyVHlwZXMuYWRkKG1JbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgYWxsU3ViVHlwZXMuYWRkKG1JbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uQmFzZVR5cGUgPSBtSW1wbC5nZXRDb21tb25CYXNlVHlwZShjb21tb25CYXNlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtSW1wbC5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSkpOwotICAgICAgICAgICAgICAgICAgICBhbGxTdWJUeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtSW1wbC5nZXRVbmlvblN1YlR5cGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBvdGhlckNvbW1vbkJhc2VUeXBlID0gbUltcGwuZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXJDb21tb25CYXNlVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uQmFzZVR5cGUgPSBvdGhlckNvbW1vbkJhc2VUeXBlLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy5hZGQobUltcGwpOwotICAgICAgICAgICAgICAgICAgICBhbGxTdWJUeXBlcy5hZGQobUltcGwpOwotICAgICAgICAgICAgICAgICAgICBjb21tb25CYXNlVHlwZSA9IG1JbXBsLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygoU2NoZW1hVHlwZVtdKQotICAgICAgICAgICAgICAgIGNvbnN0aXR1ZW50TWVtYmVyVHlwZXMudG9BcnJheShTdHNjU3RhdGUuRU1QVFlfU1RfQVJSQVkpKTsKLSAgICAgICAgc2V0VW5pb25TdWJUeXBlcygoU2NoZW1hVHlwZVtdKQotICAgICAgICAgICAgICAgIGFsbFN1YlR5cGVzLnRvQXJyYXkoU3RzY1N0YXRlLkVNUFRZX1NUX0FSUkFZKSk7Ci0gICAgICAgIHNldFVuaW9uQ29tbW9uQmFzZVR5cGUoY29tbW9uQmFzZVR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgICAgIHsgcmV0dXJuIF9zZzsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uR3JvdXAoUU5hbWUgc2cpCi0gICAgICAgIHsgYXNzZXJ0U0dSZXNvbHZpbmcoKTsgX3NnID0gc2c7IH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVyKFFOYW1lIG1lbWJlcikKLSAgICAgICAgeyBhc3NlcnRTR1Jlc29sdmVkKCk7IF9zZ01lbWJlcnMuYWRkKG1lbWJlcik7IH0KLQotICAgIHB1YmxpYyBRTmFtZVtdIGdldFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpCi0gICAgewotICAgICAgICBRTmFtZVtdIHJlc3VsdCA9IG5ldyBRTmFtZVtfc2dNZW1iZXJzLnNpemUoKV07Ci0gICAgICAgIHJldHVybiAoUU5hbWVbXSlfc2dNZW1iZXJzLnRvQXJyYXkocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdoaXRlU3BhY2VSdWxlKCkKLSAgICAgICAgeyByZXR1cm4gX3doaXRlU3BhY2VSdWxlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaGl0ZVNwYWNlUnVsZShpbnQgd3MpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF93aGl0ZVNwYWNlUnVsZSA9IHdzOyB9Ci0KLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZSBnZXRGYWNldChpbnQgZmFjZXRDb2RlKQotICAgIHsKLSAgICAgICAgaWYgKF9mYWNldEFycmF5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgWG1sVmFsdWVSZWYgcmVmID0gX2ZhY2V0QXJyYXlbZmFjZXRDb2RlXTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiByZWYuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWNldEZpeGVkKGludCBmYWNldENvZGUpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpeGVkRmFjZXRBcnJheVtmYWNldENvZGVdOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0QmFzaWNGYWNldHMoKQotICAgIHsKLSAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIHJlc3VsdCA9IG5ldyBYbWxBbnlTaW1wbGVUeXBlW1NjaGVtYVR5cGUuTEFTVF9GQUNFVCArIDFdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBTY2hlbWFUeXBlLkxBU1RfRkFDRVQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gZ2V0RmFjZXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbltdIGdldEZpeGVkRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBib2FDb3B5KF9maXhlZEZhY2V0QXJyYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2ljRmFjZXRzKFhtbFZhbHVlUmVmW10gdmFsdWVzLCBib29sZWFuW10gZml4ZWQpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKLSAgICAgICAgX2ZhY2V0QXJyYXkgPSB2YWx1ZXM7Ci0gICAgICAgIF9maXhlZEZhY2V0QXJyYXkgPSBmaXhlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG9yZGVyZWQoKQotICAgICAgICB7IHJldHVybiBfb3JkZXJlZDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3JkZXJlZChpbnQgb3JkZXJpbmcpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9vcmRlcmVkID0gb3JkZXJpbmc7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQm91bmRlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0JvdW5kZWQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kZWQoYm9vbGVhbiBmKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaXNCb3VuZGVkID0gZjsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaW5pdGUoKQotICAgICAgICB7IHJldHVybiBfaXNGaW5pdGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbml0ZShib29sZWFuIGYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9pc0Zpbml0ZSA9IGY7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTnVtZXJpYygpCi0gICAgICAgIHsgcmV0dXJuIF9pc051bWVyaWM7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bWVyaWMoYm9vbGVhbiBmKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaXNOdW1lcmljID0gZjsgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXR0ZXJuRmFjZXQoKQotICAgICAgICB7IHJldHVybiBfaGFzUGF0dGVybnM7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5GYWNldChib29sZWFuIGhhc1BhdHRlcm5zKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaGFzUGF0dGVybnMgPSBoYXNQYXR0ZXJuczsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuRmFjZXQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoIV9oYXNQYXR0ZXJucykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChfcGF0dGVybnMgIT0gbnVsbCAmJiBfcGF0dGVybnMubGVuZ3RoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3BhdHRlcm5zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcGF0dGVybnNbaV0ubWF0Y2hlcyhzKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA+PSBfcGF0dGVybnMubGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRCYXNlVHlwZSgpLm1hdGNoUGF0dGVybkZhY2V0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXR0ZXJucygpCi0gICAgewotICAgICAgICBpZiAoX3BhdHRlcm5zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSBuZXcgU3RyaW5nW19wYXR0ZXJucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8IF9wYXR0ZXJucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHBhdHRlcm5zW2ldID0gX3BhdHRlcm5zW2ldLmdldFBhdHRlcm4oKTsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm5zOwotICAgIH0KLQotICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBnZXRQYXR0ZXJuRXhwcmVzc2lvbnMoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXR0ZXJucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bMF07Ci0gICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHJlc3VsdCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bX3BhdHRlcm5zLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3BhdHRlcm5zLCAwLCByZXN1bHQsIDAsIF9wYXR0ZXJucy5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5zKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIGxpc3QpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9wYXR0ZXJucyA9IGxpc3Q7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0RW51bWVyYXRpb25WYWx1ZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9lbnVtZXJhdGlvblZhbHVlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSByZXN1bHQgPSBuZXcgWG1sQW55U2ltcGxlVHlwZVtfZW51bWVyYXRpb25WYWx1ZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFZhbHVlUmVmIHJlZiA9IF9lbnVtZXJhdGlvblZhbHVlc1tpXTsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IChyZWYgPT0gbnVsbCA/IG51bGwgOiByZWYuZ2V0KCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGlvblZhbHVlcyhYbWxWYWx1ZVJlZltdIGEpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9lbnVtZXJhdGlvblZhbHVlcyA9IGE7IH0KLQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JTdHJpbmcoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOwotICAgICAgICBpZiAoX2xvb2t1cFN0cmluZ0VudW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xvb2t1cFN0cmluZ0VudW0uZ2V0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JJbnQoaW50IGkpCi0gICAgewotICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOwotICAgICAgICBpZiAoX2xpc3RPZlN0cmluZ0VudW0gPT0gbnVsbCB8fCBpIDwgMCB8fCBpID49IF9saXN0T2ZTdHJpbmdFbnVtLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xpc3RPZlN0cmluZ0VudW0uZ2V0KGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnkgZW51bUVudHJ5Rm9yU3RyaW5nKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgZW5zdXJlU3RyaW5nRW51bUluZm8oKTsKLSAgICAgICAgaWYgKF9sb29rdXBTdHJpbmdFbnVtRW50cnkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFNjaGVtYVN0cmluZ0VudW1FbnRyeSlfbG9va3VwU3RyaW5nRW51bUVudHJ5LmdldChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRCYXNlRW51bVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iYXNlRW51bVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfYmFzZUVudW1UeXBlcmVmLmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VFbnVtVHlwZVJlZihTY2hlbWFUeXBlLlJlZiBiYXNlRW51bVR5cGVyZWYpCi0gICAgewotICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUVudW1UeXBlcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBnZXRTdHJpbmdFbnVtRW50cmllcygpCi0gICAgewotICAgICAgICBpZiAoX3N0cmluZ0VudW1FbnRyaWVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gcmVzdWx0ID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeVtfc3RyaW5nRW51bUVudHJpZXMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfc3RyaW5nRW51bUVudHJpZXMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nRW51bUVudHJpZXMoU2NoZW1hU3RyaW5nRW51bUVudHJ5IHNFbnVtc1tdKQotICAgIHsKLSAgICAgICAgYXNzZXJ0SmF2YWl6aW5nKCk7Ci0gICAgICAgIF9zdHJpbmdFbnVtRW50cmllcyA9IHNFbnVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU3RyaW5nRW51bUluZm8oKQotICAgIHsKLSAgICAgICAgaWYgKF9zdHJpbmdFbnVtRW5zdXJlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBzRW51bXMgPSBfc3RyaW5nRW51bUVudHJpZXM7Ci0gICAgICAgIGlmIChzRW51bXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0cmluZ0VudW1FbnN1cmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBsb29rdXBTdHJpbmdFbnVtID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7Ci0gICAgICAgIExpc3QgbGlzdE9mU3RyaW5nRW51bSA9IG5ldyBBcnJheUxpc3Qoc0VudW1zLmxlbmd0aCArIDEpOwotICAgICAgICBNYXAgbG9va3VwU3RyaW5nRW51bUVudHJ5ID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW1FbnRyeS5wdXQoc0VudW1zW2ldLmdldFN0cmluZygpLCBzRW51bXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgamMgPSBfYmFzZUVudW1UeXBlcmVmLmdldCgpLmdldEVudW1KYXZhQ2xhc3MoKTsKLSAgICAgICAgaWYgKGpjICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUgdGFibGUgPSAoU3RyaW5nRW51bUFic3RyYWN0QmFzZS5UYWJsZSlqYy5nZXRGaWVsZCgidGFibGUiKS5nZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IHNFbnVtc1tpXS5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWwgPSB0YWJsZS5mb3JJbnQoaik7Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW0ucHV0KHNFbnVtc1tpXS5nZXRTdHJpbmcoKSwgZW51bVZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsaXN0T2ZTdHJpbmdFbnVtLnNpemUoKSA8PSBqKQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RPZlN0cmluZ0VudW0uc2V0KGosIGVudW1WYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNvbWV0aGluZyB3cm9uZzogY291bGQgbm90IGxvY2F0ZSBlbnVtIHRhYmxlIGZvciAiICsgamMpOwotICAgICAgICAgICAgICAgIGpjID0gbnVsbDsKLSAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGpjID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0VudW1zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBqID0gc0VudW1zW2ldLmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBzRW51bXNbaV0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsID0gbmV3IFN0cmluZ0VudW1WYWx1ZShzLCBqKTsKLSAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLnB1dChzLCBlbnVtVmFsKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGlzdE9mU3RyaW5nRW51bS5zaXplKCkgPD0gaikKLSAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5zZXQoaiwgZW51bVZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmluZ0VudW1FbnN1cmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sb29rdXBTdHJpbmdFbnVtID0gbG9va3VwU3RyaW5nRW51bTsKLSAgICAgICAgICAgICAgICBfbGlzdE9mU3RyaW5nRW51bSA9IGxpc3RPZlN0cmluZ0VudW07Ci0gICAgICAgICAgICAgICAgX2xvb2t1cFN0cmluZ0VudW1FbnRyeSA9IGxvb2t1cFN0cmluZ0VudW1FbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBIQUNLSEFDSzogdHdvIHN5bmNyaG9uaXplZCBibG9ja3MgZm9yY2UgYSBtZW1vcnkgYmFycmllcjoKLSAgICAgICAgLy8gQlVHQlVHOiB0aGlzIGJlaGF2aW9yIGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gZnV0dXJlIFZNcwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdHJpbmdFbnVtRW5zdXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdHJpbmdFbnVtVmFsdWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RyaW5nRW51bUVudHJpZXMgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRpb25WYWx1ZXMoU2NoZW1hVHlwZUltcGwgYmFzZUltcGwpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKLSAgICAgICAgX2VudW1lcmF0aW9uVmFsdWVzID0gYmFzZUltcGwuX2VudW1lcmF0aW9uVmFsdWVzOwotICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUltcGwuX2Jhc2VFbnVtVHlwZXJlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpCi0gICAgICAgIHsgcmV0dXJuIF9idWlsdGluVHlwZUNvZGU7IH0gLy8gc3BlY2lhbDogc2V0IHVwIHByZS1pbml0Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsdGluVHlwZUNvZGUoaW50IGJ1aWx0aW5UeXBlQ29kZSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2J1aWx0aW5UeXBlQ29kZSA9IGJ1aWx0aW5UeXBlQ29kZTsgfQotCi0gICAgcHVibGljIENsYXNzIGdldEphdmFDbGFzcygpCi0gICAgewotICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgotICAgICAgICBpZiAoX2phdmFDbGFzcyA9PSBudWxsICYmIGdldEZ1bGxKYXZhTmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsgX2phdmFDbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0RnVsbEphdmFOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsgfQotICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBmaW5kIGNsYXNzIG5hbWUgIiArIGdldEZ1bGxKYXZhTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlYXJjaGVkIGluIGNsYXNzbG9hZGVyICIgKyBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICBfamF2YUNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhSW1wbENsYXNzKCkgewotICAgICAgICBpZiAoX2ltcGxOb3RBdmFpbGFibGUpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX2phdmFJbXBsQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RnVsbEphdmFJbXBsTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF9qYXZhSW1wbENsYXNzID0gQ2xhc3MuZm9yTmFtZShnZXRGdWxsSmF2YUltcGxOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9pbXBsTm90QXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBfaW1wbE5vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2phdmFJbXBsQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnN0cnVjdG9yIGdldEphdmFJbXBsQ29uc3RydWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yID09IG51bGwgJiYgIV9pbXBsTm90QXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBpbXBsID0gZ2V0SmF2YUltcGxDbGFzcygpOwotICAgICAgICAgICAgaWYgKGltcGwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfamF2YUltcGxDb25zdHJ1Y3RvciA9IGltcGwuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBTY2hlbWFUeXBlLmNsYXNzIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2phdmFJbXBsQ29uc3RydWN0b3I7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uc3RydWN0b3IgZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcjIoKQotICAgIHsKLSAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yMiA9PSBudWxsICYmICFfaW1wbE5vdEF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgaW1wbCA9IGdldEphdmFJbXBsQ2xhc3MoKTsKLSAgICAgICAgICAgIGlmIChpbXBsID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2phdmFJbXBsQ29uc3RydWN0b3IyID0gaW1wbC5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGUuY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUltcGxDb25zdHJ1Y3RvcjI7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0RW51bUphdmFDbGFzcygpCi0gICAgewotICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgotICAgICAgICBpZiAoX2phdmFFbnVtQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0QmFzZUVudW1UeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCkgKyAiJEVudW0iLCBmYWxzZSwgX3R5cGVTeXN0ZW0uZ2V0Q2xhc3NMb2FkZXIoKSk7IH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IG51bGw7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUVudW1DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoQ2xhc3MgamF2YUNsYXNzKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKLSAgICAgICAgX2phdmFDbGFzcyA9IGphdmFDbGFzczsKLSAgICAgICAgc2V0RnVsbEphdmFOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKGdldEJ1aWx0aW5UeXBlQ29kZSgpID49IEJUQ19GSVJTVF9QUklNSVRJVkUgJiYKLSAgICAgICAgICAgICAgICBnZXRCdWlsdGluVHlwZUNvZGUoKSA8PSBCVENfTEFTVF9QUklNSVRJVkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVpbHRpblR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBjcmVhdGVVbndyYXBwZWROb2RlKCkKLSAgICB7Ci0gICAgICAgIC8vIFRvZG86IGF0dGFjaCBhIG5ldyB4bWwgc3RvcmUhCi0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjcmVhdGVVbmF0dGFjaGVkTm9kZShudWxsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUeXBlU3RvcmVVc2VyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZVR5cGVTdG9yZVVzZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKWNyZWF0ZVVuYXR0YWNoZWROb2RlKG51bGwpOwotICAgIH0KLQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsaWRhdGluZ1ZhbHVlKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCB0cnVlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgc2ltcGxlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsdWUoT2JqZWN0IG9iaiwgYm9vbGVhbiB2YWxpZGF0ZU9uU2V0KQotICAgIHsKLSAgICAgICAgaWYgKCFpc1NpbXBsZVR5cGUoKSAmJiBnZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IC8vIHZhbHVlcyBtdXN0IGJlIHNpbXBsZQotCi0gICAgICAgIFhtbE9iamVjdEJhc2UgcmVzdWx0ID0gKFhtbE9iamVjdEJhc2UpY3JlYXRlVW5hdHRhY2hlZE5vZGUobnVsbCk7Ci0gICAgICAgIGlmICh2YWxpZGF0ZU9uU2V0KQotICAgICAgICAgICAgcmVzdWx0LnNldFZhbGlkYXRlT25TZXQoKTsKLQotICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiB0cmVlIGNvcHksIG5lZWQgdG8gY2FsbCBhIHNwZWNsYSBzZXR0ZXIgdG8gYXZvaWQKLSAgICAgICAgLy8gc2V0KFhtbE9iamVjdCkKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdCkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRfbmV3VmFsdWUoKFhtbE9iamVjdClvYmopOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQub2JqZWN0U2V0KG9iaik7Ci0KLSAgICAgICAgcmVzdWx0LmNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRJbW11dGFibGUoKTsKLQotICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkTm9kZShTY2hlbWFQcm9wZXJ0eSBwcm9wKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCFpc0J1aWx0aW5UeXBlKCkgJiYgIWlzTm9UeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXR0ZW1wdGluZyB0byBsb2FkIGltcGwgY2xhc3M6ICIgKyBnZXRGdWxsSmF2YUltcGxOYW1lKCkpOwotICAgICAgICAgICAgQ29uc3RydWN0b3IgY3RyID0gZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcigpOwotICAgICAgICAgICAgaWYgKGN0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZWVkZWQhIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KWN0ci5uZXdJbnN0YW5jZShfY3RyQXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUJ1aWx0aW5JbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm8gcmVzdWx0LCB3ZSBtdXN0IGJlIGEgcmVzdHJpY3Rpb24gb2Ygc29tZSBjb21waWxlZCB0eXBlCi0gICAgICAgIGZvciAoU2NoZW1hVHlwZSBzVHlwZSA9IHRoaXM7IHJlc3VsdCA9PSBudWxsOyBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCkpCi0gICAgICAgICAgICByZXN1bHQgPSAoKFNjaGVtYVR5cGVJbXBsKXNUeXBlKS5jcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3ModGhpcyk7Ci0KLSAgICAgICAgKChYbWxPYmplY3RCYXNlKXJlc3VsdCkuaW5pdF9mbGFncyhwcm9wKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3MoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICghaXNCdWlsdGluVHlwZSgpICYmICFpc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkF0dGVtcHRpbmcgdG8gbG9hZCBpbXBsIGNsYXNzOiAiICsgZ2V0RnVsbEphdmFJbXBsTmFtZSgpKTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0ciA9IGdldEphdmFJbXBsQ29uc3RydWN0b3IyKCk7Ci0gICAgICAgICAgICBpZiAoY3RyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2NlZWRlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpY3RyLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHNUeXBlLCBzVHlwZS5pc1NpbXBsZVR5cGUoKSA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUUgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0aW5TdWJjbGFzcyhzVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVCdWlsdGluSW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChnZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBCVENfTk9UX0JVSUxUSU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlUeXBlSW1wbChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJvb2xlYW5JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJhc2U2NEJpbmFyeUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxIZXhCaW5hcnlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VXJpSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxRTmFtZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm90YXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZsb2F0SW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRG91YmxlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbERlY2ltYWxJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbER1cmF0aW9uSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVGltZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEYXRlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdZZWFySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhEYXlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludGVnZXJJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTG9uZ0ltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2hvcnRJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5lZ2F0aXZlSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFBvc2l0aXZlSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0xPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZExvbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRTaG9ydEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEJ5dGVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19UT0tFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFRva2VuSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19MQU5HVUFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExhbmd1YWdlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19JRFJFRlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZFJlZnNJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxFbnRpdHlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5zSW1wbCgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgY3JlYXRlQnVpbHRpblN1YmNsYXNzKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBib29sZWFuIGNvbXBsZXggPSAhc1R5cGUuaXNTaW1wbGVUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAoZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PVF9CVUlMVElOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRSk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19BTllfVFlQRToKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE5PVF9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbENvbXBsZXhDb250ZW50SW1wbChzVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVRPTUlDOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExpc3RJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBVTklPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5pb25JbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQm9vbGVhblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlVcmlSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFFOYW1lUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb3RhdGlvblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRmxvYXRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEb3VibGVSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGVjaW1hbFJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICBpZiAoc1R5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFN0cmluZ0VudW1lcmF0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU3RyaW5nUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEdXJhdGlvbkltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxUaW1lSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19EQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoRGF5SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRlZ2VyUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExvbmdSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19TSE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk9OX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOZWdhdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRMb25nSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRCeXRlSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1RPS0VOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVG9rZW5JbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0xBTkdVQUdFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTGFuZ3VhZ2VJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbElkUmVmc0ltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfRU5USVRZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRW50aXR5SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm1Ub2tlbkltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxObVRva2Vuc0ltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0Q29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgLy8gbnVsbCB0eXBlIGlzIHRyZWF0ZWQgYXMgdGhlIG5vLXR5cGUKLSAgICAgICAgaWYgKHRoaXMgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgdHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIC8vIGFueSB0eXBlIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlOyBub1R5cGUgaXMgdGhlIHVuaXZlcnNhbCBkZXJpdmVkIHR5cGUKLSAgICAgICAgaWYgKHR5cGUgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotCi0gICAgICAgIC8vIHRoZSByZWd1bGFyIGNhc2U6Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMSA9IChTY2hlbWFUeXBlSW1wbCl0eXBlOwotICAgICAgICB3aGlsZSAoc0ltcGwxLmdldEJhc2VEZXB0aCgpID4gZ2V0QmFzZURlcHRoKCkpCi0gICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMiA9IHRoaXM7Ci0gICAgICAgIHdoaWxlIChzSW1wbDIuZ2V0QmFzZURlcHRoKCkgPiBzSW1wbDEuZ2V0QmFzZURlcHRoKCkpCi0gICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbDEuZXF1YWxzKHNJbXBsMikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnQoc0ltcGwxICE9IG51bGwgJiYgc0ltcGwyICE9IG51bGwpOyAvLyBtdXN0IG1lZXQgYXQgYW55VHlwZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzSW1wbDE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGludCBkZXB0aCA9ICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuZ2V0QmFzZURlcHRoKCkgLSBnZXRCYXNlRGVwdGgoKTsKLSAgICAgICAgaWYgKGRlcHRoIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGRlcHRoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgIGRlcHRoIC09IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh0eXBlLmVxdWFscyh0aGlzKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChnZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiVD0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKGlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gIkQ9IiArIFFOYW1lSGVscGVyLnByZXR0eShnZXREb2N1bWVudEVsZW1lbnROYW1lKCkpOwotCi0gICAgICAgIGlmIChpc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAiUj0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkpOwotCi0gICAgICAgIFN0cmluZyBwcmVmaXg7Ci0KLSAgICAgICAgaWYgKGdldENvbnRhaW5lckZpZWxkKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gKGdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJRPSIgOiAiRT0iKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJBPSIgOiAiVT0iKSkKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGlmIChnZXRPdXRlclR5cGUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiQCIgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuICJOPSI7Ci0gICAgICAgIGVsc2UgaWYgKGdldE91dGVyVHlwZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIm5vb3V0ZXIiOwotICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRCYXNlVHlwZSgpID09IHRoaXMpCi0gICAgICAgICAgICBwcmVmaXggPSAiQj0iOwotICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgcHJlZml4ID0gIkk9IjsKLSAgICAgICAgZWxzZSBpZiAoZ2V0T3V0ZXJUeXBlKCkuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgICAgICBwcmVmaXggPSAiTT0iICsgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZWZpeCA9ICJzdHJhbmdlPSI7Ci0KLSAgICAgICAgcmV0dXJuIHByZWZpeCArICJ8IiArIGdldE91dGVyVHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlZGVmaW5pdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgcGFyc2VPYmplY3QsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgICAgIF9yZWRlZmluaXRpb24gPSByZWRlZmluaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbWVsZW9uICggKQotICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZGVmaW5pdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9yZWRlZmluaXRpb247IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hVHlwZS5SZWYodGhpcyk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFscyBvZiBlbGVtZW50IHZhbGlkYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXF1ZW5jZXJJbXBsIGltcGxlbWVudHMgU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIF92aXNpdG9yOwotCi0gICAgICAgIHByaXZhdGUgU2VxdWVuY2VySW1wbChTY2hlbWFUeXBlVmlzaXRvckltcGwgdmlzaXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgX3Zpc2l0b3IgPSB2aXNpdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbmV4dChRTmFtZSBlbGVtZW50TmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF92aXNpdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICByZXR1cm4gX3Zpc2l0b3IudmlzaXQoZWxlbWVudE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcGVlayhRTmFtZSBlbGVtZW50TmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF92aXNpdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICByZXR1cm4gX3Zpc2l0b3IudGVzdFZhbGlkKGVsZW1lbnROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjUzYWE2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsaWRhdG9yLlZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEZhY3RvcnlIb29rOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNjaGVtYVR5cGVMb2FkZXJCYXNlIGltcGxlbWVudHMgU2NoZW1hVHlwZUxvYWRlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfcm9vdEJ1aWxkZXIgPSBnZXRNZXRob2QoICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdCIsICJuZXdTdG9yZSIsIG5ldyBDbGFzc1tdIHsgU2NoZW1hVHlwZUxvYWRlci5jbGFzcywgU2NoZW1hVHlwZS5jbGFzcywgWG1sT3B0aW9ucy5jbGFzcyB9ICk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9wYXRoQ29tcGlsZXIgPSBnZXRNZXRob2QoICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUGF0aCIsICJnZXRDb21waWxlZFBhdGgiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgWG1sT3B0aW9ucy5jbGFzcyB9ICk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9xdWVyeUNvbXBpbGVyID0gZ2V0TWV0aG9kKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlBhdGgiLCAiZ2V0Q29tcGlsZWRRdWVyeSIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBYbWxPcHRpb25zLmNsYXNzIH0gKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QgKCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCBjbGFzc05hbWUgKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0RGVjbGFyZWRNZXRob2QoIG1ldGhvZE5hbWUsIGFyZ3MgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNhbm5vdCBmaW5kICIgKyBjbGFzc05hbWUgKyAiLiIgKyBtZXRob2ROYW1lICsKLSAgICAgICAgICAgICAgICAgICAgIi4gIHZlcmlmeSB0aGF0IHhtbHN0b3JlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIihmcm9tIHhiZWFuLmphcikgaXMgb24gY2xhc3NwYXRoIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZCAoIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKCBtZXRob2QsIGFyZ3MgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICBpc2UuaW5pdENhdXNlKCBlICk7Ci0gICAgICAgICAgICB0aHJvdyBpc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgaXNlLmluaXRDYXVzZSggZSApOwotICAgICAgICAgICAgdGhyb3cgaXNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxTdG9yZSBjcmVhdGVOZXdTdG9yZSAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKFhtbFN0b3JlKQotICAgICAgICAgICAgICAgIGludm9rZU1ldGhvZCggX3Jvb3RCdWlsZGVyLCBuZXcgT2JqZWN0W10geyB0aGlzLCB0eXBlLCBvcHRpb25zIH0gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG9Db21waWxlUGF0aCAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkgeyByZXR1cm4gKFN0cmluZykgaW52b2tlTWV0aG9kKCBfcGF0aENvbXBpbGVyLCBuZXcgT2JqZWN0W10geyBwYXRoRXhwciwgb3B0aW9ucyB9ICk7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG9Db21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB7IHJldHVybiAoU3RyaW5nKSBpbnZva2VNZXRob2QoIF9xdWVyeUNvbXBpbGVyLCBuZXcgT2JqZWN0W10geyBxdWVyeUV4cHIsIG9wdGlvbnMgfSApOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kVHlwZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVmID0gZmluZFR5cGVSZWYobmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTY2hlbWFUeXBlIHJlc3VsdCA9IHJlZi5nZXQoKTsKLSAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kRG9jdW1lbnRUeXBlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZWYgPSBmaW5kRG9jdW1lbnRUeXBlUmVmKG5hbWUpOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hVHlwZSByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZEF0dHJpYnV0ZVR5cGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlZiA9IGZpbmRBdHRyaWJ1dGVUeXBlUmVmKG5hbWUpOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hVHlwZSByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAgZmluZE1vZGVsR3JvdXAoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXAuUmVmIHJlZiA9IGZpbmRNb2RlbEdyb3VwUmVmKG5hbWUpOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hTW9kZWxHcm91cCByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGZpbmRBdHRyaWJ1dGVHcm91cChRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIHJlZiA9IGZpbmRBdHRyaWJ1dGVHcm91cFJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIHJlc3VsdCA9IHJlZi5nZXQoKTsKLSAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudCBmaW5kRWxlbWVudChRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgcmVmID0gZmluZEVsZW1lbnRSZWYobmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IHJlc3VsdCA9IHJlZi5nZXQoKTsKLSAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGZpbmRBdHRyaWJ1dGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgcmVmID0gZmluZEF0dHJpYnV0ZVJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IG5ld0luc3RhbmNlICggU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOwotICAgICAgICBpZiAoaG9vayAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGhvb2submV3SW5zdGFuY2UoIHRoaXMsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIHR5cGUsIG9wdGlvbnMgKS5nZXRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggU3RyaW5nIHhtbFRleHQsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOwotICAgICAgICBpZiAoaG9vayAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGhvb2sucGFyc2UoIHRoaXMsIHhtbFRleHQsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5sb2FkWG1sKCB4bWxUZXh0LCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFhNTElucHV0U3RyZWFtIHhpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5sb2FkWG1sKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggRmlsZSBmaWxlLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FLCBmaWxlLnRvVVJJKCkubm9ybWFsaXplKCkudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoISBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCBvcHRpb25zICk7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSwgZmlsZS50b1VSSSgpLm5vcm1hbGl6ZSgpLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIElucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGUgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlKCBmaXMsIHR5cGUsIG9wdGlvbnMgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFVSTCB1cmwsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUsIHVybC50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIGlmICghIG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FLCB1cmwudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgZG93bmxvYWQ6IHRyeQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVkaXJlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsICJBcGFjaGUgWE1MQmVhbnMvMS4wLjIiKTsKLSAgICAgICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiIpOwotICAgICAgICAgICAgICAgIGlmIChjb25uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBodHRwY29uID0gKEh0dHBVUkxDb25uZWN0aW9uKWNvbm47Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gaHR0cGNvbi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZCA9IChjb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTU9WRURfUEVSTSB8fCBjb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTU9WRURfVEVNUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdGVkICYmIGNvdW50ID4gNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld0xvY2F0aW9uID0gaHR0cGNvbi5nZXRIZWFkZXJGaWVsZCgiTG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKG5ld0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHJlZGlyZWN0ZWQpOwotCi0gICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2UoIHN0cmVhbSwgdHlwZSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIElucHV0U3RyZWFtIGppb2lzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7Ci0gICAgICAgIERpZ2VzdElucHV0U3RyZWFtIGRpZ2VzdFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHNldHVwRGlnZXN0OiBpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuTE9BRF9NRVNTQUdFX0RJR0VTVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3Qgc2hhOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hhID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0dXBEaWdlc3Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpZ2VzdFN0cmVhbSA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShqaW9pcywgc2hhKTsKLSAgICAgICAgICAgIGppb2lzID0gZGlnZXN0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCBqaW9pcywgdHlwZSwgb3B0aW9ucyApOwotCi0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjcmVhdGVOZXdTdG9yZSggbnVsbCwgb3B0aW9ucyApLmxvYWRYbWwoIGppb2lzLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgaWYgKGRpZ2VzdFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50UHJvcGVydGllcygpLnNldE1lc3NhZ2VEaWdlc3QoZGlnZXN0U3RyZWFtLmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIGppb3IsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCBqaW9yLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggamlvciwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOwotICAgICAgICBpZiAoaG9vayAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGhvb2sucGFyc2UoIHRoaXMsIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5sb2FkWG1sKCBub2RlLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLm5ld1htbFNheEhhbmRsZXIoIHRoaXMsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5uZXdTYXhIYW5kbGVyKCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHRoaXMsIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVQYXRoKCBwYXRoRXhwciwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4gZG9Db21waWxlUGF0aCggcGF0aEV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXBpbGVRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVRdWVyeSggcXVlcnlFeHByLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvQ29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGxvYWQgYSB0eXBlIGZyb20gYSBzaWduYXR1cmUuCi0gICAgICoKLSAgICAgKiBBIHNpZ25hdHVyZSBpcyB0aGUgc3RyaW5nIHlvdSBnZXQgZnJvbSB0eXBlLnRvU3RyaW5nKCkuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvclNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKQotICAgIHsKLSAgICAgICAgaW50IGVuZCA9IHNpZ25hdHVyZS5pbmRleE9mKCdAJyk7Ci0gICAgICAgIFN0cmluZyB1cmk7Ci0KLSAgICAgICAgaWYgKGVuZCA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICAgICAgZW5kID0gc2lnbmF0dXJlLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdXJpID0gc2lnbmF0dXJlLnN1YnN0cmluZyhlbmQgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVuZDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbmV4dGMgPSBzaWduYXR1cmUuaW5kZXhPZignOicsIGluZGV4KTsKLSAgICAgICAgICAgIGludCBuZXh0ZCA9IHNpZ25hdHVyZS5pbmRleE9mKCd8JywgaW5kZXgpOwotICAgICAgICAgICAgaW50IG5leHQgPSAobmV4dGMgPCAwID8gbmV4dGQgOiBuZXh0ZCA8IDAgPyBuZXh0YyA6IG5leHRjIDwgbmV4dGQgPyBuZXh0YyA6IG5leHRkKTsKLSAgICAgICAgICAgIGlmIChuZXh0IDwgMCB8fCBuZXh0ID4gZW5kKQotICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydCA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoaW5kZXgsIG5leHQpOwotICAgICAgICAgICAgcGFydHMuYWRkKHBhcnQpOwotICAgICAgICAgICAgaW5kZXggPSBuZXh0ICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUgY3VyVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgb3V0ZXI6IGZvciAoaW50IGkgPSBwYXJ0cy5zaXplKCkgLSAxOyBpID49IDA7IGkgLT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSAoU3RyaW5nKXBhcnRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCgpIDwgMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKHBhcnQubGVuZ3RoKCkgPj0gMiAmJiBwYXJ0LmNoYXJBdCgxKSA9PSAnPScpID8gMiA6IDE7Ci0gICAgICAgICAgICBjYXNlczogc3dpdGNoIChwYXJ0LmNoYXJBdCgwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGZpbmRUeXBlKFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjdXJUeXBlID0gZmluZERvY3VtZW50VHlwZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdDJzogLy8gZGVwcmVjYXRlZAotICAgICAgICAgICAgICAgIGNhc2UgJ1InOiAvLyBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBmaW5kQXR0cmlidXRlVHlwZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgICAgICBjYXNlICdVJzogLy8gZGlzdGluZ3Vpc2ggcXVhbGlmaWVkL3VucXVhbGlmaWVkIFRCRAotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZS5nZXRDb250ZW50VHlwZSgpIDwgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFydC5zdWJzdHJpbmcob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViVHlwZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzdWJUeXBlc1tqXS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmICFmaWVsZC5pc0F0dHJpYnV0ZSgpICYmIGZpZWxkLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2FzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCA9IGZpbmRFbGVtZW50KFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnUSc6IC8vIGRpc3Rpbmd1aXNoIHF1YWxpZmllZC91bnF1YWxpZmllZCBUQkQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFydC5zdWJzdHJpbmcob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViVHlwZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzdWJUeXBlc1tqXS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmlzQXR0cmlidXRlKCkgJiYgZmllbGQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBjYXNlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyID0gZmluZEF0dHJpYnV0ZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGF0dHIuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBzdWJUeXBlcyA9IGN1clR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJUeXBlcy5sZW5ndGggIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIHN1YlR5cGVzID0gY3VyVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGVzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gSW50ZWdlci5wYXJzZUludChwYXJ0LnN1YnN0cmluZyhvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIHN1YlR5cGVzID0gY3VyVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGVzLmxlbmd0aCA8PSBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1clR5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTBlMTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFUeXBlTG9hZGVySW1wbCBleHRlbmRzIFNjaGVtYVR5cGVMb2FkZXJCYXNlCi17Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZUxvYWRlciBfcmVzb3VyY2VMb2FkZXI7Ci0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfY2xhc3NMb2FkZXI7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyW10gX3NlYXJjaFBhdGg7Ci0KLSAgICBwcml2YXRlIE1hcCBfY2xhc3NwYXRoVHlwZVN5c3RlbXM7Ci0gICAgcHJpdmF0ZSBNYXAgX2NsYXNzTG9hZGVyVHlwZVN5c3RlbXM7Ci0gICAgcHJpdmF0ZSBNYXAgX2VsZW1lbnRDYWNoZTsKLSAgICBwcml2YXRlIE1hcCBfYXR0cmlidXRlQ2FjaGU7Ci0gICAgcHJpdmF0ZSBNYXAgX21vZGVsR3JvdXBDYWNoZTsKLSAgICBwcml2YXRlIE1hcCBfYXR0cmlidXRlR3JvdXBDYWNoZTsKLSAgICBwcml2YXRlIE1hcCBfaWRDb25zdHJhaW50Q2FjaGU7Ci0gICAgcHJpdmF0ZSBNYXAgX3R5cGVDYWNoZTsKLSAgICBwcml2YXRlIE1hcCBfZG9jdW1lbnRDYWNoZTsKLSAgICBwcml2YXRlIE1hcCBfY2xhc3NuYW1lQ2FjaGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVySW1wbCBidWlsZENvbnRleHRUeXBlTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZUxvYWRlckltcGwobmV3IFNjaGVtYVR5cGVMb2FkZXJbXSB7IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmdldCgpIH0gLCBudWxsLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbCBfdGhyZWFkVHlwZVN5c3RlbXMgPQotICAgICAgICBuZXcgVGhyZWFkTG9jYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpIHsgcmV0dXJuIG5ldyBXZWFrSGFzaE1hcCgpOyB9Ci0gICAgICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXJJbXBsIGdldENvbnRleHRUeXBlTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIFdlYWtIYXNoTWFwIGNhbmRpZGF0ZXMgPSAoV2Vha0hhc2hNYXApIF90aHJlYWRUeXBlU3lzdGVtcy5nZXQoKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlckltcGwgY2FuZGlkYXRlID0gKFNjaGVtYVR5cGVMb2FkZXJJbXBsKSBjYW5kaWRhdGVzLmdldCggdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyICk7Ci0KLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYW5kaWRhdGUgPSBidWlsZENvbnRleHRUeXBlTG9hZGVyKCk7Ci0gICAgICAgICAgICBjYW5kaWRhdGVzLnB1dCggdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyLCBjYW5kaWRhdGUgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuZGlkYXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgYnVpbGQoU2NoZW1hVHlwZUxvYWRlcltdIHNlYXJjaFBhdGgsIFJlc291cmNlTG9hZGVyIHJlc291cmNlTG9hZGVyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICB7Ci0gICAgICAgIGlmIChzZWFyY2hQYXRoID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlYXJjaFBhdGggPSBFTVBUWV9TQ0hFTUFUWVBFTE9BREVSX0FSUkFZOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYXNzZW1ibGUgYSBmbGF0dGVuZWQgc2VhcmNoIHBhdGggd2l0aCBubyBkdXBsaWNhdGVzCi0gICAgICAgICAgICBTdWJMb2FkZXJMaXN0IGxpc3QgPSBuZXcgU3ViTG9hZGVyTGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZWFyY2hQYXRoW2ldID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlYXJjaFBhdGhbIiArIGkgKyAiXSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgaWYgKCEoc2VhcmNoUGF0aFtpXSBpbnN0YW5jZW9mIFNjaGVtYVR5cGVMb2FkZXJJbXBsKSkKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoc2VhcmNoUGF0aFtpXSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZUxvYWRlckltcGwgc3ViID0gKFNjaGVtYVR5cGVMb2FkZXJJbXBsKXNlYXJjaFBhdGhbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdWIuX2NsYXNzTG9hZGVyICE9IG51bGwgfHwgc3ViLl9yZXNvdXJjZUxvYWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoc3ViKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBmb3IgKGludCBqID0gMDsgaiA8IHN1Yi5fc2VhcmNoUGF0aC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHN1Yi5fc2VhcmNoUGF0aFtqXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VhcmNoUGF0aCA9IGxpc3QudG9BcnJheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlYXJjaFBhdGgubGVuZ3RoID09IDEgJiYgcmVzb3VyY2VMb2FkZXIgPT0gbnVsbCAmJiBjbGFzc0xvYWRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFBhdGhbMF07Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlTG9hZGVySW1wbChzZWFyY2hQYXRoLCByZXNvdXJjZUxvYWRlciwgY2xhc3NMb2FkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEp1c3QgdXNlZCB0byBhdm9pZCBkdXBsaWNhdGUgcGF0aCBlbnRyaWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViTG9hZGVyTGlzdAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IHRoZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByaXZhdGUgTWFwIHNlZW4gPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZChTY2hlbWFUeXBlTG9hZGVyIGxvYWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNlZW4uY29udGFpbnNLZXkobG9hZGVyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB0aGVMaXN0LmFkZChsb2FkZXIpOwotICAgICAgICAgICAgc2Vlbi5wdXQobG9hZGVyLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyW10gdG9BcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcltdKXRoZUxpc3QudG9BcnJheShFTVBUWV9TQ0hFTUFUWVBFTE9BREVSX0FSUkFZKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBTY2hlbWFUeXBlTG9hZGVySW1wbCB0aGF0IHNlYXJjaGVzIGZvciBvYmplY3RzCi0gICAgICogaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAgICAgKgotICAgICAqICgxKSBGaXJzdCBvbiB0aGUgc2VhcmNoUGF0aCBvZiBvdGhlciBTY2hlbWFUeXBlU3lzdGVtcyBzdXBwbGllZCwKLSAgICAgKiAgICAgaW4gb3JkZXIgdGhhdCB0aGV5IGFyZSBsaXN0ZWQuCi0gICAgICogKDIpIE5leHQgb24gdGhlIGNsYXNzcGF0aCBvZiAuamFyIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHN1cHBsaWVkLAotICAgICAqICAgICBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBsaXN0ZWQuIFdoZW4gdHlwZXMgYXJlIHJldHVybmVkIGluCi0gICAgICogICAgIHRoaXMgd2F5LCB0aGV5IGFyZSBpbnN0YW50aWF0ZWQgZnJvbSBhIHByaXZhdGUgdHlwZXN5c3RlbS4KLSAgICAgKiAgICAgSW4gb3RoZXIgd29yZHMsIGlmIGEgdHlwZSBpcyBsb2FkZWQgZnJvbSBhbm90aGVyIFNjaGVtYVR5cGVMb2FkZXJJbXBsCi0gICAgICogICAgIHRoYXQgd2FzIGluaXRpYWxpemVkIG9uIHRoZSBzYW1lIGZpbGUsIHRoZSBpbnN0YW5jZSBvZiB0aGUgdHlwZSB3aWxsCi0gICAgICogICAgIGJlIGRpZmZlcmVudC4KLSAgICAgKiAoMykgRmluYWxseSBvbiB0aGUgY2xhc3Nsb2FkZXIgc3VwcGxpZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVySW1wbChTY2hlbWFUeXBlTG9hZGVyW10gc2VhcmNoUGF0aCwgUmVzb3VyY2VMb2FkZXIgcmVzb3VyY2VMb2FkZXIsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAgIHsKLSAgICAgICAgaWYgKHNlYXJjaFBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIF9zZWFyY2hQYXRoID0gRU1QVFlfU0NIRU1BVFlQRUxPQURFUl9BUlJBWTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX3NlYXJjaFBhdGggPSBzZWFyY2hQYXRoOwotICAgICAgICBfcmVzb3VyY2VMb2FkZXIgPSByZXNvdXJjZUxvYWRlcjsKLSAgICAgICAgX2NsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0KLSAgICAgICAgaW5pdENhY2hlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBjYWNoZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGluaXRDYWNoZXMoKQotICAgIHsKLSAgICAgICAgX2NsYXNzcGF0aFR5cGVTeXN0ZW1zID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfY2xhc3NMb2FkZXJUeXBlU3lzdGVtcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX2VsZW1lbnRDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX2F0dHJpYnV0ZUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfbW9kZWxHcm91cENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfYXR0cmlidXRlR3JvdXBDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX2lkQ29uc3RyYWludENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfdHlwZUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfZG9jdW1lbnRDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX2NsYXNzbmFtZUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgIH0KLQotICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoU3RyaW5nIHNlYXJjaGRpciwgUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzZWFyY2hmb3IgPSBzZWFyY2hkaXIgKyBRTmFtZUhlbHBlci5oZXhzYWZlZGlyKG5hbWUpICsgIi54c2IiOwotICAgICAgICBTdHJpbmcgdHNuYW1lID0gbnVsbDsKLQotICAgICAgICBpZiAoX3Jlc291cmNlTG9hZGVyICE9IG51bGwpCi0gICAgICAgICAgICB0c25hbWUgPSBjcmFja0VudHJ5KF9yZXNvdXJjZUxvYWRlciwgc2VhcmNoZm9yKTsKLQotICAgICAgICBpZiAoX2NsYXNzTG9hZGVyICE9IG51bGwpCi0gICAgICAgICAgICB0c25hbWUgPSBjcmFja0VudHJ5KF9jbGFzc0xvYWRlciwgc2VhcmNoZm9yKTsKLQotICAgICAgICBpZiAodHNuYW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVTeXN0ZW1JbXBsKXR5cGVTeXN0ZW1Gb3JOYW1lKHRzbmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbUZvck5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX3Jlc291cmNlTG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gcmVzdWx0ID0gZ2V0VHlwZVN5c3RlbU9uQ2xhc3NwYXRoKG5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX2NsYXNzTG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gcmVzdWx0ID0gZ2V0VHlwZVN5c3RlbU9uQ2xhc3Nsb2FkZXIobmFtZSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCB0eXBlU3lzdGVtRm9yQ2xhc3NuYW1lKFN0cmluZyBzZWFyY2hkaXIsIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHNlYXJjaGZvciA9IHNlYXJjaGRpciArIG5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLnhzYiI7Ci0KLSAgICAgICAgaWYgKF9yZXNvdXJjZUxvYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdHNuYW1lID0gY3JhY2tFbnRyeShfcmVzb3VyY2VMb2FkZXIsIHNlYXJjaGZvcik7Ci0gICAgICAgICAgICBpZiAodHNuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVTeXN0ZW1PbkNsYXNzcGF0aCh0c25hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9jbGFzc0xvYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdHNuYW1lID0gY3JhY2tFbnRyeShfY2xhc3NMb2FkZXIsIHNlYXJjaGZvcik7Ci0gICAgICAgICAgICBpZiAodHNuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVTeXN0ZW1PbkNsYXNzbG9hZGVyKHRzbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCBnZXRUeXBlU3lzdGVtT25DbGFzc3BhdGgoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZVN5c3RlbUltcGwpX2NsYXNzcGF0aFR5cGVTeXN0ZW1zLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVN5c3RlbUltcGwoX3Jlc291cmNlTG9hZGVyLCBuYW1lLCB0aGlzKTsKLSAgICAgICAgICAgIF9jbGFzc3BhdGhUeXBlU3lzdGVtcy5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGdldFR5cGVTeXN0ZW1PbkNsYXNzbG9hZGVyKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiRmluZGluZyB0eXBlIHN5c3RlbSAiICsgbmFtZSArICIgb24gY2xhc3Nsb2FkZXIiLCAwKTsKLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgcmVzdWx0ID0gKFNjaGVtYVR5cGVTeXN0ZW1JbXBsKV9jbGFzc0xvYWRlclR5cGVTeXN0ZW1zLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJUeXBlIHN5c3RlbSAiICsgbmFtZSArICIgbm90IGNhY2hlZCAtIGNvbnN1bHRpbmcgZmllbGQiLCAwKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFNjaGVtYVR5cGVTeXN0ZW1JbXBsLmZvck5hbWUobmFtZSwgX2NsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIF9jbGFzc0xvYWRlclR5cGVTeXN0ZW1zLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBjcmFja0VudHJ5KFJlc291cmNlTG9hZGVyIGxvYWRlciwgU3RyaW5nIHNlYXJjaGZvcikKLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oc2VhcmNoZm9yKTsKLSAgICAgICAgaWYgKGlzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGNyYWNrUG9pbnRlcihpcyk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBjcmFja0VudHJ5KENsYXNzTG9hZGVyIGxvYWRlciwgU3RyaW5nIHNlYXJjaGZvcikKLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHNlYXJjaGZvcik7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gY3JhY2tQb2ludGVyKHN0cmVhbSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBjcmFja1BvaW50ZXIoSW5wdXRTdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLmNyYWNrUG9pbnRlcihzdHJlYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRGVmaW5lZChTdHJpbmcgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmIChfc2VhcmNoUGF0aFtpXS5pc05hbWVzcGFjZURlZmluZWQobmFtZXNwYWNlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gc3RzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL25hbWVzcGFjZS8iLCBuZXcgUU5hbWUobmFtZXNwYWNlLCAieG1sbnMiKSk7Ci0gICAgICAgIHJldHVybiAoc3RzICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kVHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVzdWx0ID0gKFNjaGVtYVR5cGUuUmVmKV90eXBlQ2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV90eXBlQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRUeXBlUmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS90eXBlLyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZFR5cGVSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCB0eXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF90eXBlQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9yQ2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpCi0gICAgewotICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUucmVwbGFjZSgnJCcsICcuJyk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSByZXN1bHQgPSAoU2NoZW1hVHlwZSlfY2xhc3NuYW1lQ2FjaGUuZ2V0KGNsYXNzbmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2NsYXNzbmFtZUNhY2hlLmNvbnRhaW5zS2V5KGNsYXNzbmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLnR5cGVGb3JDbGFzc25hbWUoY2xhc3NuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ2xhc3NuYW1lKCJzY2hlbWEvamF2YW5hbWUvIiwgY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLnR5cGVGb3JDbGFzc25hbWUoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIHR5cGUgIiArIGNsYXNzbmFtZSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2NsYXNzbmFtZUNhY2hlLnB1dChjbGFzc25hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZERvY3VtZW50VHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVzdWx0ID0gKFNjaGVtYVR5cGUuUmVmKV9kb2N1bWVudENhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfZG9jdW1lbnRDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZERvY3VtZW50VHlwZVJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvZWxlbWVudC8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmREb2N1bWVudFR5cGVSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBlbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCBjb250YWluIGRvY3VtZW50IHR5cGUiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9kb2N1bWVudENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRBdHRyaWJ1dGVUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZXN1bHQgPSAoU2NoZW1hVHlwZS5SZWYpX2F0dHJpYnV0ZUNhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfYXR0cmlidXRlQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRBdHRyaWJ1dGVUeXBlUmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9hdHRyaWJ1dGUvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kQXR0cmlidXRlVHlwZVJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGF0dHJpYnV0ZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgY29udGFpbiBhdHRyaWJ1dGUgdHlwZSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2F0dHJpYnV0ZUNhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIGZpbmRFbGVtZW50UmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiByZXN1bHQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYpX2VsZW1lbnRDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2VsZW1lbnRDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZEVsZW1lbnRSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL2VsZW1lbnQvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kRWxlbWVudFJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2VsZW1lbnRDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIGZpbmRBdHRyaWJ1dGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYpX2F0dHJpYnV0ZUNhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfYXR0cmlidXRlQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRBdHRyaWJ1dGVSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL2F0dHJpYnV0ZS8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRBdHRyaWJ1dGVSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2F0dHJpYnV0ZUNhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwLlJlZiByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cC5SZWYpX21vZGVsR3JvdXBDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX21vZGVsR3JvdXBDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZE1vZGVsR3JvdXBSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL21vZGVsZ3JvdXAvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kTW9kZWxHcm91cFJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIG1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9tb2RlbEdyb3VwQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIGZpbmRBdHRyaWJ1dGVHcm91cFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIHJlc3VsdCA9IChTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYpX2F0dHJpYnV0ZUdyb3VwQ2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9hdHRyaWJ1dGVHcm91cENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kQXR0cmlidXRlR3JvdXBSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL2F0dHJpYnV0ZWdyb3VwLyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZEF0dHJpYnV0ZUdyb3VwUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgYXR0cmlidXRlIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9hdHRyaWJ1dGVHcm91cENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgZmluZElkZW50aXR5Q29uc3RyYWludFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiByZXN1bHQgPSAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZilfaWRDb25zdHJhaW50Q2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9pZENvbnN0cmFpbnRDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZElkZW50aXR5Q29uc3RyYWludFJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvaWRlbnRpdHljb25zdHJhaW50LyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZElkZW50aXR5Q29uc3RyYWludFJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGlkZW50aXR5IGNvbnN0cmFpbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2lkQ29uc3RyYWludENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFNvdXJjZUFzU3RyZWFtKFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoIXNvdXJjZU5hbWUuc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICAgICAgc291cmNlTmFtZSA9ICIvIiArIHNvdXJjZU5hbWU7Ci0KLSAgICAgICAgaWYgKF9yZXNvdXJjZUxvYWRlciAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gX3Jlc291cmNlTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oInNjaGVtYS9zcmMiICsgc291cmNlTmFtZSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIF9jbGFzc0xvYWRlciAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9jbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJzY2hlbWEvc3JjIiArIHNvdXJjZU5hbWUpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUxvYWRlcltdIEVNUFRZX1NDSEVNQVRZUEVMT0FERVJfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZUxvYWRlclswXTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOWNmNzkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50LkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuU2NoZW1hQ29uZmlnOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcnMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgU2NoZW1hW10gc2NoZW1hczsKLSAgICAgICAgcHJpdmF0ZSBDb25maWdbXSBjb25maWdzOwotICAgICAgICBwcml2YXRlIFNjaGVtYVR5cGVMb2FkZXIgbGlua1RvOwotICAgICAgICBwcml2YXRlIFhtbE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXI7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhaXplOwotICAgICAgICBwcml2YXRlIFVSSSBiYXNlVVJJOwotICAgICAgICBwcml2YXRlIE1hcCBzb3VyY2VzVG9Db3B5TWFwOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSBnZXRTY2hlbWFzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNjaGVtYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFzKFNjaGVtYURvY3VtZW50LlNjaGVtYVtdIHNjaGVtYXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29uZmlnRG9jdW1lbnQuQ29uZmlnW10gZ2V0Q29uZmlncygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb25maWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uZmlncyhDb25maWdEb2N1bWVudC5Db25maWdbXSBjb25maWdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3MgPSBjb25maWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgZ2V0TGlua1RvKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxpbmtUbzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExpbmtUbyhTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5saW5rVG8gPSBsaW5rVG87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWG1sT3B0aW9ucyBnZXRPcHRpb25zKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVycm9yTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3JMaXN0ZW5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTGlzdGVuZXIoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmVycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNKYXZhaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGphdmFpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRKYXZhaXplKGJvb2xlYW4gamF2YWl6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5qYXZhaXplID0gamF2YWl6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVSSSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiYXNlVVJJOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZVVSSShVUkkgYmFzZVVSSSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5iYXNlVVJJID0gYmFzZVVSSTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXAgZ2V0U291cmNlc1RvQ29weU1hcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzb3VyY2VzVG9Db3B5TWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U291cmNlc1RvQ29weU1hcChNYXAgc291cmNlc1RvQ29weU1hcCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zb3VyY2VzVG9Db3B5TWFwID0gc291cmNlc1RvQ29weU1hcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZVN5c3RlbSBjb21waWxlKFBhcmFtZXRlcnMgcGFyYW1zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVJbXBsKHBhcmFtcy5nZXROYW1lKCksIHBhcmFtcy5nZXRTY2hlbWFzKCksIHBhcmFtcy5nZXRDb25maWdzKCksIHBhcmFtcy5nZXRMaW5rVG8oKSwgcGFyYW1zLmdldE9wdGlvbnMoKSwgcGFyYW1zLmdldEVycm9yTGlzdGVuZXIoKSwgcGFyYW1zLmlzSmF2YWl6ZSgpLCBwYXJhbXMuZ2V0QmFzZVVSSSgpLCBwYXJhbXMuZ2V0U291cmNlc1RvQ29weU1hcCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyogcGFja2FnZSEhISAqLyBzdGF0aWMgU2NoZW1hVHlwZVN5c3RlbUltcGwgY29tcGlsZUltcGwoCi0gICAgICAgIFN0cmluZyBuYW1lLCBTY2hlbWFbXSBzY2hlbWFzLCBDb25maWdbXSBjb25maWdzLAotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbywgWG1sT3B0aW9ucyBvcHRpb25zLCBDb2xsZWN0aW9uIG91dHNpZGVFcnJvcnMsIGJvb2xlYW4gamF2YWl6ZSwgVVJJIGJhc2VVUkksIE1hcCBzb3VyY2VzVG9Db3B5TWFwKQotICAgIHsKLSAgICAgICAgaWYgKGxpbmtUbyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBzdXBwbHkgbGlua1RvIik7Ci0KLSAgICAgICAgWG1sRXJyb3JXYXRjaGVyIGVycm9yV2F0Y2hlciA9IG5ldyBYbWxFcnJvcldhdGNoZXIob3V0c2lkZUVycm9ycyk7Ci0KLSAgICAgICAgLy8gY29uc3RydWN0IHRoZSBzdGF0ZQotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuc3RhcnQoKTsKLSAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZSA9IChvcHRpb25zID09IG51bGwgfHwgIW9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ09NUElMRV9OT19WQUxJREFUSU9OKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRFcnJvckxpc3RlbmVyKGVycm9yV2F0Y2hlcik7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRTY2hlbWFDb25maWcoU2NoZW1hQ29uZmlnLmZvckNvbmZpZ0RvY3VtZW50cyhjb25maWdzKSk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgc3RhdGUuc2V0R2l2ZW5UeXBlU3lzdGVtTmFtZShuYW1lKTsKLSAgICAgICAgICAgIGlmIChiYXNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuc2V0QmFzZVVyaShiYXNlVVJJKTsKLQotICAgICAgICAgICAgLy8gY29uc3RydWN0IHRoZSBjbGFzc3BhdGggKHlvdSBhbHdheXMgZ2V0IHRoZSBidWlsdGluIHR5cGVzKQotICAgICAgICAgICAgbGlua1RvID0gU2NoZW1hVHlwZUxvYWRlckltcGwuYnVpbGQobmV3IFNjaGVtYVR5cGVMb2FkZXJbXSB7IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmdldCgpLCBsaW5rVG8gfSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRJbXBvcnRpbmdUeXBlTG9hZGVyKGxpbmtUbyk7Ci0KLSAgICAgICAgICAgIExpc3QgdmFsaWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdChzY2hlbWFzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIC8vIGxvYWQgYWxsIHRoZSB4c2QgZmlsZXMgaW50byBpdAotICAgICAgICAgICAgaWYgKHZhbGlkYXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFzW2ldLnZhbGlkYXRlKG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcldhdGNoZXIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkU2NoZW1hcy5hZGQoc2NoZW1hc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkU2NoZW1hcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzY2hlbWFzKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNjaGVtYVtdIHN0YXJ0V2l0aCA9IChTY2hlbWFbXSl2YWxpZFNjaGVtYXMudG9BcnJheShuZXcgU2NoZW1hW3ZhbGlkU2NoZW1hcy5zaXplKCldKTsKLQotICAgICAgICAgICAgLy8gZGVhbCB3aXRoIGltcG9ydHMgYW5kIGluY2x1ZGVzCi0gICAgICAgICAgICBTdHNjSW1wb3J0ZXIuU2NoZW1hVG9Qcm9jZXNzW10gc2NoZW1hc0FuZENoYW1lbGVvbnMgPSBTdHNjSW1wb3J0ZXIucmVzb2x2ZUltcG9ydHNBbmRJbmNsdWRlcyhzdGFydFdpdGgpOwotCi0gICAgICAgICAgICAvLyBjYWxsIHRoZSB0cmFuc2xhdG9yIHNvIHRoYXQgaXQgbWF5IGFsc28gcGVyZm9ybSBtYWdpYwotICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IuYWRkQWxsRGVmaW5pdGlvbnMoc2NoZW1hc0FuZENoYW1lbGVvbnMpOwotCi0gICAgICAgICAgICAvLyBjYWxsIHRoZSByZXNvbHZlciB0byBkbyBpdHMgbWFnaWMKLSAgICAgICAgICAgIFN0c2NSZXNvbHZlci5yZXNvbHZlQWxsKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNoZWNrZXIgdG8gY2hlY2sgYm90aCByZXN0cmljdGlvbnMgYW5kIGRlZmF1bHRzCi0gICAgICAgICAgICBTdHNjQ2hlY2tlci5jaGVja0FsbCgpOwotCi0gICAgICAgICAgICAvLyBjYWxsIHRoZSBqYXZhaXplciB0byBkbyBpdHMgbWFnaWMKLSAgICAgICAgICAgIFN0c2NKYXZhaXplci5qYXZhaXplQWxsVHlwZXMoamF2YWl6ZSk7Ci0KLSAgICAgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgbG9hZGVyIG91dCBvZiB0aGUgc3RhdGUKLSAgICAgICAgICAgIHN0YXRlLmdldCgpLnN0cygpLmxvYWRGcm9tU3RzY1N0YXRlKHN0YXRlKTsKLQotICAgICAgICAgICAgLy8gZmlsbCBpbiB0aGUgc291cmNlLWNvcHkgbWFwCi0gICAgICAgICAgICBpZiAoc291cmNlc1RvQ29weU1hcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNvdXJjZXNUb0NvcHlNYXAucHV0QWxsKHN0YXRlLnNvdXJjZUNvcHlNYXAoKSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIGFueSBlcnJvcnMsIHJldHVybiBudWxsCi0gICAgICAgICAgICBpZiAoZXJyb3JXYXRjaGVyLmhhc0Vycm9yKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5nZXQoKS5zdHMoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5lbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyN2FmYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExOSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sT2JqZWN0QmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU2NoZW1hV1NETEFycmF5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50LkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Hcm91cERvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuQXR0cmlidXRlR3JvdXBEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLQotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGV4dGVuZHMgU2NoZW1hVHlwZUxvYWRlckJhc2UgaW1wbGVtZW50cyBTY2hlbWFUeXBlU3lzdGVtCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9CQUJFID0gMHhEQTdBQkFCRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9WRVJTSU9OID0gMjsgIC8vIG11c3QgbWF0Y2ggPT0gdG8gYmUgY29tcGF0aWJsZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX1ZFUlNJT04gPSAxODsgLy8gbXVzdCBiZSA8PSB0byBiZSBjb21wYXRpYmxlCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMRUFTRV9OVU1CRVIgPSAwOyAvLyBzaG91bGQgYmUgY29tcGF0aWJsZSBldmVuIGlmIDwgb3IgPgotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BSU5ERVggPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQVRZUEUgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BUE9JTlRFUiA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVAgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVCA9IDg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfU0tJUFBBQkxFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklYRUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9OSUxMQUJMRSA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLRVhUID0gMTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLUkVTVCA9IDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9CTE9DS1NVQlNUID0gNjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0FCU1RSQUNUID0gMTI4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSU5BTEVYVCA9IDI1NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklOQUxSRVNUID0gNTEyOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0lTQVRUUiA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBQVJSQVkgPSA4OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTk9ORSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfR0xPQkFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9MT0NBTEFUVFIgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0xPQ0FMRUxUID0gMzsKLQotICAgIC8vIHR5cGUgZmxhZ3MKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0lNUExFX1RZUEUgICAgID0gMHgxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NVTUVOVF9UWVBFICAgPSAweDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX09SREVSRUQgICAgICAgICA9IDB4NDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQk9VTkRFRCAgICAgICAgID0gMHg4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5JVEUgICAgICAgICAgPSAweDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OVU1FUklDICAgICAgICAgPSAweDIwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVFJJTkdFTlVNICAgICAgPSAweDQwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTklPTl9PRl9MSVNUUyAgPSAweDgwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNfUEFUVEVSTiAgICAgPSAweDEwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JERVJfU0VOU0lUSVZFID0gMHgyMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1RPVEFMX09SREVSICAgICA9IDB4NDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QSUxFRCAgICAgICAgPSAweDgwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQkxPQ0tfRVhUICAgICAgID0gMHgxMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CTE9DS19SRVNUICAgICAgPSAweDIwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX0VYVCAgICAgICA9IDB4NDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfUkVTVCAgICAgID0gMHg4MDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9VTklPTiAgICAgPSAweDEwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9MSVNUICAgICAgPSAweDIwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BQlNUUkFDVCAgICAgICAgPSAweDQwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BVFRSSUJVVEVfVFlQRSAgPSAweDgwMDAwOwotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZVRvUGF0aFN0cmluZyhTdHJpbmcgbmFtZUZvclN5c3RlbSkKLSAgICB7Ci0gICAgICAgIG5hbWVGb3JTeXN0ZW0gPSBuYW1lRm9yU3lzdGVtLnJlcGxhY2UoJy4nLCAnLycpOwotCi0gICAgICAgIGlmICghbmFtZUZvclN5c3RlbS5lbmRzV2l0aCgiLyIpICYmIG5hbWVGb3JTeXN0ZW0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgbmFtZUZvclN5c3RlbSA9IG5hbWVGb3JTeXN0ZW0gKyAiLyI7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWVGb3JTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsKENsYXNzIGluZGV4Y2xhc3MpCi0gICAgewotICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPSBpbmRleGNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgX25hbWUgPSBmdWxsbmFtZS5zdWJzdHJpbmcoMCwgZnVsbG5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0gICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIkxvYWRpbmcgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAxKTsKLSAgICAgICAgX2Jhc2VQYWNrYWdlID0gbmFtZVRvUGF0aFN0cmluZyhfbmFtZSk7Ci0gICAgICAgIF9jbGFzc2xvYWRlciA9IGluZGV4Y2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgX2xpbmtlciA9IFNjaGVtYVR5cGVMb2FkZXJJbXBsLmJ1aWxkKG51bGwsIG51bGwsIF9jbGFzc2xvYWRlcik7Ci0gICAgICAgIF9yZXNvdXJjZUxvYWRlciA9IG5ldyBDbGFzc0xvYWRlclJlc291cmNlTG9hZGVyKF9jbGFzc2xvYWRlcik7Ci0gICAgICAgIGluaXRGcm9tSGVhZGVyKCk7Ci0gICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIkZpbmlzaGVkIGxvYWRpbmcgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAtMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hW10gRU1QVFlfU0NIRU1BX0FSUkFZID0gbmV3IFNjaGVtYVswXTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWdbXSBFTVBUWV9DT05GSUdfQVJSQVkgPSBuZXcgQ29uZmlnWzBdOwotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbCBmb3JTY2hlbWFYbWwoCi0gICAgICAgIFhtbE9iamVjdFtdIGlucHV0LCBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbywgWG1sT3B0aW9ucyBvcHRpb25zKQotICAgICAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwob3B0aW9ucyk7Ci0gICAgICAgIEFycmF5TGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBcnJheUxpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRbaV0gaW5zdGFuY2VvZiBTY2hlbWEpCi0gICAgICAgICAgICAgICAgc2NoZW1hcy5hZGQoaW5wdXRbaV0pOwotICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRbaV0gaW5zdGFuY2VvZiBTY2hlbWFEb2N1bWVudCAmJiAoKFNjaGVtYURvY3VtZW50KWlucHV0W2ldKS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKCgoU2NoZW1hRG9jdW1lbnQpaW5wdXRbaV0pLmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0W2ldIGluc3RhbmNlb2YgQ29uZmlnKQotICAgICAgICAgICAgICAgIGNvbmZpZ3MuYWRkKGlucHV0W2ldKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0W2ldIGluc3RhbmNlb2YgQ29uZmlnRG9jdW1lbnQgJiYgKChDb25maWdEb2N1bWVudClpbnB1dFtpXSkuZ2V0Q29uZmlnKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb25maWdzLmFkZCgoKENvbmZpZ0RvY3VtZW50KWlucHV0W2ldKS5nZXRDb25maWcoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbigiVGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICAiOiBUaGUgIiArIGkgKyAidGggc3VwcGxpZWQgaW5wdXQgaXMgbm90IGEgc2NoZW1hIG9yIGEgY29uZmlnIGRvY3VtZW50OiBpdHMgdHlwZSBpcyAiICsgaW5wdXRbaV0uc2NoZW1hVHlwZSgpKTsKLSAgICAgICAgfQotCi0KLQotICAgICAgICBDb2xsZWN0aW9uIHVzZXJFcnJvcnMgPSAoQ29sbGVjdGlvbilvcHRpb25zLmdldChYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSKTsKLSAgICAgICAgWG1sRXJyb3JXYXRjaGVyIGVycm9yV2F0Y2hlciA9IG5ldyBYbWxFcnJvcldhdGNoZXIodXNlckVycm9ycyk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgc3RzaSA9Ci0gICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuY29tcGlsZUltcGwoCi0gICAgICAgICAgICAgICAgbnVsbCwgKFNjaGVtYVtdKXNjaGVtYXMudG9BcnJheShFTVBUWV9TQ0hFTUFfQVJSQVkpLAotICAgICAgICAgICAgICAgIChDb25maWdbXSljb25maWdzLnRvQXJyYXkoRU1QVFlfQ09ORklHX0FSUkFZKSwgbGlua1RvLCBvcHRpb25zLCBlcnJvcldhdGNoZXIsIGZhbHNlLCBudWxsLCBudWxsKTsKLQotICAgICAgICBpZiAoZXJyb3JXYXRjaGVyLmhhc0Vycm9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oZXJyb3JXYXRjaGVyLmZpcnN0RXJyb3IoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RzaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUNvbnRhaW5zVHlwZVN5c3RlbShGaWxlIGZpbGUsIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGluZGV4bmFtZSA9IG5hbWVUb1BhdGhTdHJpbmcobmFtZSkgKyAiaW5kZXgueHNiIjsKLQotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKG5ldyBGaWxlKGZpbGUsIGluZGV4bmFtZSkpLmlzRmlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgWmlwRmlsZSB6aXBmaWxlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHppcGZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcGZpbGUuZ2V0RW50cnkoaW5kZXhuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5ICE9IG51bGwgJiYgIWVudHJ5LmlzRGlyZWN0b3J5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2coIlByb2JsZW0gbG9hZGluZyBTY2hlbWFUeXBlU3lzdGVtLCB6aXBmaWxlbmFtZSAiICsgZmlsZSk7Ci0gICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIG5hbWUsICJpbmRleCIsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoemlwZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0cnkgeyB6aXBmaWxlLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGZvck5hbWUoU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShuYW1lICsgIi4iICsgU2NoZW1hVHlwZUNvZGVQcmludGVyLklOREVYX0NMQVNTTkFNRSwgdHJ1ZSwgbG9hZGVyKTsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbUltcGwpYy5nZXRGaWVsZCgidHlwZVN5c3RlbSIpLmdldChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsKFJlc291cmNlTG9hZGVyIHJlc291cmNlTG9hZGVyLCBTdHJpbmcgbmFtZSwgU2NoZW1hVHlwZUxvYWRlciBsaW5rZXIpCi0gICAgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgIF9iYXNlUGFja2FnZSA9IG5hbWVUb1BhdGhTdHJpbmcoX25hbWUpOwotICAgICAgICBfbGlua2VyID0gbGlua2VyOwotICAgICAgICBfcmVzb3VyY2VMb2FkZXIgPSByZXNvdXJjZUxvYWRlcjsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRGcm9tSGVhZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFcnJvciBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBYQmVhbkRlYnVnLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZyb21IZWFkZXIoKQotICAgIHsKLSAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVhZGluZyB1bnJlc29sdmVkIGhhbmRsZXMgZm9yIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgMCk7Ci0gICAgICAgIFhzYlJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSwgd2hpY2ggc3RhcnRzIHdpdGggYSBoZWFkZXIuCi0gICAgICAgICAgICByZWFkZXIgPSBuZXcgWHNiUmVhZGVyKCJpbmRleCIsIEZJTEVUWVBFX1NDSEVNQUlOREVYKTsKLQotICAgICAgICAgICAgLy8gaGFzIGEgaGFuZGxlIHBvb2wgKGNvdW50LCBoYW5kbGUvdHlwZSwgaGFuZGxlL3R5cGUuLi4pCi0gICAgICAgICAgICBfbG9jYWxIYW5kbGVzID0gbmV3IEhhbmRsZVBvb2woKTsKLSAgICAgICAgICAgIHJlYWRlci5yZWFkSGFuZGxlUG9vbChfbG9jYWxIYW5kbGVzKTsKLQotICAgICAgICAgICAgLy8gdGhlbiBhIHFuYW1lIG1hcCBvZiBnbG9iYWwgZWxlbWVudHMgKGNvdW50LCBxbmFtZS9oYW5kbGUsIHFuYW1lL2hhbmRsZS4uLikKLSAgICAgICAgICAgIF9nbG9iYWxFbGVtZW50cyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICBfZ2xvYmFsQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIG1vZGVsIGdyb3VwcwotICAgICAgICAgICAgX21vZGVsR3JvdXBzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgYXR0cmlidXRlIGdyb3VwcwotICAgICAgICAgICAgX2F0dHJpYnV0ZUdyb3VwcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgX2lkZW50aXR5Q29uc3RyYWludHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBnbG9iYWwgdHlwZXMKLSAgICAgICAgICAgIF9nbG9iYWxUeXBlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGRvY3VtZW50IHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBlbGVtZW50Ci0gICAgICAgICAgICBfZG9jdW1lbnRUeXBlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwZSBvZiBhdHRyaWJ1dGUgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGF0dHJpYnV0ZQotICAgICAgICAgICAgX2F0dHJpYnV0ZVR5cGVzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICAvLyBzdHJpbmcgbWFwIG9mIGFsbCB0eXBlcywgYnkgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZQotICAgICAgICAgICAgX3R5cGVSZWZzQnlDbGFzc25hbWUgPSByZWFkZXIucmVhZENsYXNzbmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICBfbmFtZXNwYWNlcyA9IHJlYWRlci5yZWFkTmFtZXNwYWNlcygpOwotCi0gICAgICAgICAgICAvLyBzdXBwb3J0IGZvciByZWRlZmluZSwgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQotICAgICAgICAgICAgaWYgKHJlYWRlci5hdExlYXN0KDIsIDE1LCAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcmVkZWZpbmVkR2xvYmFsVHlwZXMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0gICAgICAgICAgICAgICAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotICAgICAgICAgICAgICAgIF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRFbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2F2ZUluZGV4KCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSAiaW5kZXgiOwotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlSW5kZXhEYXRhKCk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUlOREVYKTsKLSAgICAgICAgc2F2ZXIud3JpdGVJbmRleERhdGEoKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVQb2ludGVycygpCi0gICAgewotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKGdsb2JhbEVsZW1lbnRzKCksICJzY2hlbWEvZWxlbWVudC8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhnbG9iYWxBdHRyaWJ1dGVzKCksICJzY2hlbWEvYXR0cmlidXRlLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKG1vZGVsR3JvdXBzKCksICJzY2hlbWEvbW9kZWxncm91cC8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhhdHRyaWJ1dGVHcm91cHMoKSwgInNjaGVtYS9hdHRyaWJ1dGVncm91cC8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhnbG9iYWxUeXBlcygpLCAic2NoZW1hL3R5cGUvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoaWRlbnRpdHlDb25zdHJhaW50cygpLCAic2NoZW1hL2lkZW50aXR5Y29uc3RyYWludC8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yTmFtZXNwYWNlcyhfbmFtZXNwYWNlcywgInNjaGVtYS9uYW1lc3BhY2UvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNsYXNzbmFtZXMoX3R5cGVSZWZzQnlDbGFzc25hbWUua2V5U2V0KCksICJzY2hlbWEvamF2YW5hbWUvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMocmVkZWZpbmVkTW9kZWxHcm91cHMoKSwgInNjaGVtYS9yZWRlZmluZWRtb2RlbGdyb3VwLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKHJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcygpLCAic2NoZW1hL3JlZGVmaW5lZGF0dHJpYnV0ZWdyb3VwLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKHJlZGVmaW5lZEdsb2JhbFR5cGVzKCksICJzY2hlbWEvcmVkZWZpbmVkdHlwZS8iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoU2NoZW1hQ29tcG9uZW50W10gY29tcG9uZW50cywgU3RyaW5nIGRpcikKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZVBvaW50ZXJGaWxlKGRpciArIFFOYW1lSGVscGVyLmhleHNhZmVkaXIoY29tcG9uZW50c1tpXS5nZXROYW1lKCkpLCBfbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVQb2ludGVyc0ZvckNsYXNzbmFtZXMoU2V0IGNsYXNzbmFtZXMsIFN0cmluZyBkaXIpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbGFzc25hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgc2F2ZVBvaW50ZXJGaWxlKGRpciArIGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgJy8nKSwgX25hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlUG9pbnRlcnNGb3JOYW1lc3BhY2VzKFNldCBuYW1lc3BhY2VzLCBTdHJpbmcgZGlyKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgc2F2ZVBvaW50ZXJGaWxlKGRpciArIFFOYW1lSGVscGVyLmhleHNhZmVkaXIobmV3IFFOYW1lKG5zLCAieG1sbnMiKSksIF9uYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2F2ZVBvaW50ZXJGaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGZpbGVuYW1lKTsKLSAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcobmFtZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihmaWxlbmFtZSwgRklMRVRZUEVfU0NIRU1BUE9JTlRFUik7Ci0gICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKG5hbWUpOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9ubHkgdXNlZCBpbiB0aGUgbm9uYm9vdHN0cmFwcGVkIGNhc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgYnVpbGRUeXBlUmVmc0J5Q2xhc3NuYW1lKCkKLSAgICB7Ci0gICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGRvY3VtZW50VHlwZXMoKSkpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXR0cmlidXRlVHlwZXMoKSkpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2xvYmFsVHlwZXMoKSkpOwotCi0gICAgICAgIC8vIG5vdyBmdWxseSBqYXZhaXplIGV2ZXJ5dGhpbmcgZGVlcGx5LgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBnVHlwZSA9IChTY2hlbWFUeXBlKWFsbFNlZW5UeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ1R5cGUuZ2V0RnVsbEphdmFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChjbGFzc05hbWUucmVwbGFjZSgnJCcsICcuJyksIGdUeXBlLmdldFJlZigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBidWlsZFR5cGVSZWZzQnlDbGFzc25hbWUoTWFwIHR5cGVzQnlDbGFzc25hbWUpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZXNCeUNsYXNzbmFtZS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoY2xhc3NOYW1lLCAoKFNjaGVtYVR5cGUpdHlwZXNCeUNsYXNzbmFtZS5nZXQoY2xhc3NOYW1lKSkuZ2V0UmVmKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkQ29tcG9uZW50UmVmTWFwKFNjaGVtYUNvbXBvbmVudFtdIGNvbXBvbmVudHMpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0LnB1dChjb21wb25lbnRzW2ldLmdldE5hbWUoKSwgY29tcG9uZW50c1tpXS5nZXRDb21wb25lbnRSZWYoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkRG9jdW1lbnRNYXAoU2NoZW1hVHlwZVtdIHR5cGVzKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQucHV0KHR5cGVzW2ldLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSwgdHlwZXNbaV0uZ2V0UmVmKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZEF0dHJpYnV0ZVR5cGVNYXAoU2NoZW1hVHlwZVtdIHR5cGVzKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQucHV0KHR5cGVzW2ldLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCksIHR5cGVzW2ldLmdldFJlZigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBSYW5kb20gX3JhbmRvbTsKLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gX21hc2sgPSBuZXcgYnl0ZVsxMjggLyA4XTsKLQotICAgIC8qKgotICAgICAqIEZ1biwgZnVuLiAgUHJvZHVjZSAxMjggYml0cyBvZiB1bmlxdWVuZXNzIHJhbmRvbWx5LgotICAgICAqIFdlIHVzZWQgdG8gdXNlIFNlY3VyZVJhbmRvbSwgYnV0IG5vdyB3ZSBkb24ndCBiZWNhdXNlIFNlY3VyZVJhbmRvbQotICAgICAqIGhpdHMgdGhlIGZpbGVzeXN0ZW0gYW5kIGhhbmdzIHVzIG9uIGEgZmlsZXN5c3RlbSBsb2NrLiAgSXQgYWxzbyBlYXRzCi0gICAgICogYSB0aHJlYWQgYW5kIG90aGVyIGV4cGVuc2l2ZSByZXNvdXJjZXMuLiA6LSkuCi0gICAgICoKLSAgICAgKiBXZSBkb24ndCByZWFsbHkgY2FyZSB0aGF0IG5vbi1zZWN1cmUgUmFuZG9tKCkgY2FuIG9ubHkgZG8gNDggYml0cyBvZgotICAgICAqIHJhbmRvbW5lc3MsIHNpbmNlIHdlJ3JlIGNlcnRhaW5seSBub3QgZ29pbmcgdG8gYmUgY2FsbGVkIG1vcmUgdGhhbiAyXjQ4Ci0gICAgICogdGltZXMgd2l0aGluIG91ciBwcm9jZXNzIGxpZmV0aW1lLgotICAgICAqCi0gICAgICogT3VyIHJlYWwgY29uY2VybiBpcyB0aGF0IGJ5IHNlZWRpbmcgUmFuZG9tKCkgd2l0aCB0aGUgY3VycmVudAotICAgICAqIHRpbWUsIHR3byB1c2VycyB3aWxsIGVuZCB1cCB3aXRoIHRoZSBzYW1lIGJpdHMgaWYgdGhleSBzdGFydCBhCi0gICAgICogc2NoZW1hIGNvbXBpbGF0aW9uIHdpdGhpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC4gIFRoYXQgbWFrZXMgdGhlCi0gICAgICogcHJvYmFiaWxpdHkgb2YgY29sbGlzaW9uIGluIHRoZSByZWFsIHdvcmxkIHNsaWdodGx5IHRvbyBoaWdoLgotICAgICAqIFdlJ3JlIGdvaW5nIHRvIGhhdmUgbWlsbGlvbnMgb2YgdXNlcnMsIHJlbWVtYmVyPyAgV2l0aCBhIG1pbGxpb24KLSAgICAgKiB1c2VycywgYW5kIG9uZS1jb21waWxhdGlvbi1wZXItZGF5IGVhY2gsIHdlJ2Qgc2VlIGEgY29sbGlzaW9uIGV2ZXJ5Ci0gICAgICogZmV3IG1vbnRocy4KLSAgICAgKgotICAgICAqIFNvIHdlJ2xsIGp1c3QgeG9yIHRoZSByZXN1bHRzIG9mIHJhbmRvbSB3aXRoIG91ciBmZXcgZXh0cmEKLSAgICAgKiBiaXRzIG9mIGluZm9ybWF0aW9uIGNvbXB1dGVkIGJlbG93IHRvIGhlbHAgcmVkdWNlIHRoZSBwcm9iYWJpbGl0eQotICAgICAqIG9mIGNvbGxpc2lvbiBieSBhIGZldyBkZWNpbWFsIHBsYWNlcy4gIFRvIGNvbGxpZGUsIHlvdSB3aWxsIGhhdmUgaGFkCi0gICAgICogdG8gaGF2ZSB0aGUgc2FtZSBhbW91bnQgb2YgZnJlZSBtZW1vcnksIHRoZSBzYW1lIHVzZXIgbmFtZSwgdGltZXpvbmUsCi0gICAgICogYW5kIGNvdW50cnksIHRoZSBzYW1lIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGUgc2FtZSBqYXZhIGNsYXNzcGF0aCwKLSAgICAgKiB0aGUgc2FtZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBqdm0gdmVyc2lvbiwgYW5kIHRoZSBzYW1lIGNob2ljZXMgb2YKLSAgICAgKiBpZGVudGl0eSBoYXNoY29kZXMgZm9yIGEgZmV3IG9iamVjdHMuIEFuZCBiZSBzdGFydGVkIHdpdGhpbiB0aGUgc2FtZQotICAgICAqIG1pbGxpc2Vjb25kLiBPciB5b3UgY2FuIGNvbGxpZGUgaWYgeW91IGhhdmUgYSBjb3NtaWMgMTI4LWJpdCBtYXRoZW1hdGljYWwKLSAgICAgKiBjb2luY2lkZW5jZS4gTm8gd29ycmllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBuZXh0Qnl0ZXMoYnl0ZVtdIHJlc3VsdCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmFuZG9tID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZGFvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOwotCi0gICAgICAgICAgICAgICAgLy8gYXQgbGVhc3QgMTAgYml0cyBvZiB1bnFpZXVlbmVzcywgcmlnaHQ/ICBNYXliZSBldmVuIDUwIG9yIDYwLgotICAgICAgICAgICAgICAgIGRhb3Mud3JpdGVJbnQoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoU2NoZW1hVHlwZVN5c3RlbUltcGwuY2xhc3MpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9wcyA9IG5ldyBTdHJpbmdbXSB7ICJ1c2VyLm5hbWUiLCAidXNlci5kaXIiLCAidXNlci50aW1lem9uZSIsICJ1c2VyLmNvdW50cnkiLCAiamF2YS5jbGFzcy5wYXRoIiwgImphdmEuaG9tZSIsICJqYXZhLnZlbmRvciIsICJqYXZhLnZlcnNpb24iLCAib3MudmVyc2lvbiIgfTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcHNbaV0pOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYW9zLndyaXRlVVRGKHByb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgZGFvcy53cml0ZUludChTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShwcm9wKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGFvcy53cml0ZUxvbmcoUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKTsKLSAgICAgICAgICAgICAgICBkYW9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gYmFvcy50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGkgJSBfbWFzay5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIF9tYXNrW2pdICo9IDIxOwotICAgICAgICAgICAgICAgICAgICBfbWFza1tqXSArPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhCZWFuRGVidWcubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfcmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgX3JhbmRvbS5uZXh0Qnl0ZXMocmVzdWx0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBqID0gaSAmIF9tYXNrLmxlbmd0aDsKLSAgICAgICAgICAgIHJlc3VsdFtpXSBePSBfbWFza1tqXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbChTdHJpbmcgbmFtZUZvclN5c3RlbSkKLSAgICB7Ci0gICAgICAgIC8vIGlmIHdlIGhhdmUgbm8gbmFtZSwgc2VsZWN0IGEgcmFuZG9tIG9uZQotICAgICAgICBpZiAobmFtZUZvclN5c3RlbSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBnZXQgMTI4IHJhbmRvbSBiaXRzICh0aGF0J2xsIGJlIDMyIGhleCBkaWdpdHMpCi0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMjgvOF07Ci0gICAgICAgICAgICBuZXh0Qnl0ZXMoYnl0ZXMpOwotICAgICAgICAgICAgbmFtZUZvclN5c3RlbSA9ICJzIiArIG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShieXRlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgX25hbWUgPSAic2NoZW1hLnN5c3RlbS4iICsgbmFtZUZvclN5c3RlbTsKLSAgICAgICAgX2Jhc2VQYWNrYWdlID0gbmFtZVRvUGF0aFN0cmluZyhfbmFtZSk7Ci0gICAgICAgIF9jbGFzc2xvYWRlciA9IG51bGw7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkRnJvbUJ1aWxkZXIoU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBnbG9iYWxBdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gZ2xvYmFsVHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBkb2N1bWVudFR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gYXR0cmlidXRlVHlwZXMpCi0gICAgewotICAgICAgICBhc3NlcnQoX2NsYXNzbG9hZGVyID09IG51bGwpOwotICAgICAgICBfbG9jYWxIYW5kbGVzID0gbmV3IEhhbmRsZVBvb2woKTsKLSAgICAgICAgX2dsb2JhbEVsZW1lbnRzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoZ2xvYmFsRWxlbWVudHMpOwotICAgICAgICBfZ2xvYmFsQXR0cmlidXRlcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKGdsb2JhbEF0dHJpYnV0ZXMpOwotICAgICAgICBfZ2xvYmFsVHlwZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChnbG9iYWxUeXBlcyk7Ci0gICAgICAgIF9kb2N1bWVudFR5cGVzID0gYnVpbGREb2N1bWVudE1hcChkb2N1bWVudFR5cGVzKTsKLSAgICAgICAgX2F0dHJpYnV0ZVR5cGVzID0gYnVpbGREb2N1bWVudE1hcChhdHRyaWJ1dGVUeXBlcyk7Ci0gICAgICAgIF90eXBlUmVmc0J5Q2xhc3NuYW1lID0gYnVpbGRUeXBlUmVmc0J5Q2xhc3NuYW1lKCk7Ci0gICAgICAgIF9uYW1lc3BhY2VzID0gbmV3IEhhc2hTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkRnJvbVN0c2NTdGF0ZShTdHNjU3RhdGUgc3RhdGUpCi0gICAgewotICAgICAgICBhc3NlcnQoX2NsYXNzbG9hZGVyID09IG51bGwpOwotICAgICAgICBfbG9jYWxIYW5kbGVzID0gbmV3IEhhbmRsZVBvb2woKTsKLSAgICAgICAgX2dsb2JhbEVsZW1lbnRzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuZ2xvYmFsRWxlbWVudHMoKSk7Ci0gICAgICAgIF9nbG9iYWxBdHRyaWJ1dGVzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuZ2xvYmFsQXR0cmlidXRlcygpKTsKLSAgICAgICAgX21vZGVsR3JvdXBzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUubW9kZWxHcm91cHMoKSk7Ci0gICAgICAgIF9yZWRlZmluZWRNb2RlbEdyb3VwcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLnJlZGVmaW5lZE1vZGVsR3JvdXBzKCkpOwotICAgICAgICBfYXR0cmlidXRlR3JvdXBzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuYXR0cmlidXRlR3JvdXBzKCkpOwotICAgICAgICBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUucmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkpOwotICAgICAgICBfZ2xvYmFsVHlwZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5nbG9iYWxUeXBlcygpKTsKLSAgICAgICAgX3JlZGVmaW5lZEdsb2JhbFR5cGVzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUucmVkZWZpbmVkR2xvYmFsVHlwZXMoKSk7Ci0gICAgICAgIF9kb2N1bWVudFR5cGVzID0gYnVpbGREb2N1bWVudE1hcChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpOwotICAgICAgICBfYXR0cmlidXRlVHlwZXMgPSBidWlsZEF0dHJpYnV0ZVR5cGVNYXAoc3RhdGUuYXR0cmlidXRlVHlwZXMoKSk7Ci0gICAgICAgIF90eXBlUmVmc0J5Q2xhc3NuYW1lID0gYnVpbGRUeXBlUmVmc0J5Q2xhc3NuYW1lKHN0YXRlLnR5cGVzQnlDbGFzc25hbWUoKSk7Ci0gICAgICAgIF9pZGVudGl0eUNvbnN0cmFpbnRzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuaWRDb25zdHJhaW50cygpKTsKLSAgICAgICAgX25hbWVzcGFjZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHN0YXRlLmdldE5hbWVzcGFjZXMoKSkpOwotICAgIH0KLQotICAgIGZpbmFsIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGdldFR5cGVTeXN0ZW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFN0cmluZ1Bvb2wKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTGlzdCBpbnRzVG9TdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIE1hcCBzdHJpbmdzVG9JbnRzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2hhbmRsZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgU3RyaW5nUG9vbCB0byBiZSBmaWxsZWQgd2l0aCBzdHJpbmdzLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nUG9vbChTdHJpbmcgaGFuZGxlLCBTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2hhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIGludHNUb1N0cmluZ3MuYWRkKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvZGVGb3JTdHJpbmcoU3RyaW5nIHN0cikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcilzdHJpbmdzVG9JbnRzLmdldChzdHIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnRlZ2VyKGludHNUb1N0cmluZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBpbnRzVG9TdHJpbmdzLmFkZChzdHIpOwotICAgICAgICAgICAgICAgIHN0cmluZ3NUb0ludHMucHV0KHN0ciwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzdHJpbmdGb3JDb2RlKGludCBjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpaW50c1RvU3RyaW5ncy5nZXQoY29kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVG8oRGF0YU91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnRzVG9TdHJpbmdzLnNpemUoKSA+IFNob3J0Lk1BWF9WQUxVRSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiVG9vIG1hbnkgc3RyaW5ncyAoIiArIGludHNUb1N0cmluZ3Muc2l6ZSgpICsgIikiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JTlRfVE9PX0xBUkdFKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlU2hvcnQoaW50c1RvU3RyaW5ncy5zaXplKCkpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBpbnRzVG9TdHJpbmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpLm5leHQoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVVVEYoc3RyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVhZEZyb20oRGF0YUlucHV0U3RyZWFtIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW50c1RvU3RyaW5ncy5zaXplKCkgIT0gMSB8fCBzdHJpbmdzVG9JbnRzLnNpemUoKSAhPSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBpbnB1dC5yZWFkVVRGKCkuaW50ZXJuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gY29kZUZvclN0cmluZyhzdHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6ICJJTyBFeGNlcHRpb24iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgSGFuZGxlUG9vbAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBNYXAgX2hhbmRsZXNUb1JlZnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBwcml2YXRlIE1hcCBfY29tcG9uZW50c1RvSGFuZGxlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7IC8vIHBvcHVsYXRlZCBvbiB3cml0ZQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX3N0YXJ0ZWQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgSGFuZGxlUG9vbCB0byBiZSBwb3B1bGF0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBIYW5kbGVQb29sKCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYWRkVW5pcXVlSGFuZGxlKFNjaGVtYUNvbXBvbmVudCBvYmosIFN0cmluZyBiYXNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gYmFzZS50b0xvd2VyQ2FzZSgpOyAgLy8gd2UgbG93ZXJjYXNlIGhhbmRsZXMgYmVjYXVzZSBvZiBjYXNlLWluc2Vuc2l0aXZlIFdpbmRvd3MgZmlsZW5hbWVzISEhCi0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gYmFzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMjsgX2hhbmRsZXNUb1JlZnMuY29udGFpbnNLZXkoaGFuZGxlKTsgaW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBiYXNlICsgaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfaGFuZGxlc1RvUmVmcy5wdXQoaGFuZGxlLCBvYmouZ2V0Q29tcG9uZW50UmVmKCkpOwotICAgICAgICAgICAgX2NvbXBvbmVudHNUb0hhbmRsZXMucHV0KG9iaiwgaGFuZGxlKTsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGFuZGxlRm9yQ29tcG9uZW50KFNjaGVtYUNvbXBvbmVudCBjb21wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKGNvbXAuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOwotICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFUeXBlKQotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JUeXBlKChTY2hlbWFUeXBlKWNvbXApOwotICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxFbGVtZW50KQotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JFbGVtZW50KChTY2hlbWFHbG9iYWxFbGVtZW50KWNvbXApOwotICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvckF0dHJpYnV0ZSgoU2NoZW1hR2xvYmFsQXR0cmlidXRlKWNvbXApOwotICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFNb2RlbEdyb3VwKQotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JNb2RlbEdyb3VwKChTY2hlbWFNb2RlbEdyb3VwKWNvbXApOwotICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFBdHRyaWJ1dGVHcm91cCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRm9yQXR0cmlidXRlR3JvdXAoKFNjaGVtYUF0dHJpYnV0ZUdyb3VwKWNvbXApOwotICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvcklkZW50aXR5Q29uc3RyYWludCgoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50KWNvbXApOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29tcG9uZW50IHR5cGUgY2Fubm90IGhhdmUgYSBoYW5kbGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoYW5kbGVGb3JFbGVtZW50KFNjaGVtYUdsb2JhbEVsZW1lbnQgZWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKV9jb21wb25lbnRzVG9IYW5kbGVzLmdldChlbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoZWxlbWVudCwgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoZWxlbWVudC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpICsgIkVsZW1lbnQiKTsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGFuZGxlRm9yQXR0cmlidXRlKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOwotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKGF0dHJpYnV0ZSwgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoYXR0cmlidXRlLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiQXR0cmlidXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhhbmRsZUZvck1vZGVsR3JvdXAoU2NoZW1hTW9kZWxHcm91cCBncm91cCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOwotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGdyb3VwKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoZ3JvdXAsIE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGdyb3VwLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiTW9kZWxHcm91cCIpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoYW5kbGVGb3JBdHRyaWJ1dGVHcm91cChTY2hlbWFBdHRyaWJ1dGVHcm91cCBncm91cCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOwotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGdyb3VwKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoZ3JvdXAsIE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGdyb3VwLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiQXR0cmlidXRlR3JvdXAiKTsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGFuZGxlRm9ySWRlbnRpdHlDb25zdHJhaW50KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBpZGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpZGMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChpZGMuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOwotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGlkYyk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKGlkYywgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoaWRjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiSWRlbnRpdHlDb25zdHJhaW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhhbmRsZUZvclR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOwotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KHR5cGUpOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3VmZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0eXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJEb2MiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0eXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiQXR0clR5cGUiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gdHlwZS5nZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5pc0F0dHJpYnV0ZSgpID8gIkF0dHIiIDogIkVsZW0iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lOwotICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxID0gSW50ZWdlci50b0hleFN0cmluZyh0eXBlLnRvU3RyaW5nKCkuaGFzaENvZGUoKSB8IDB4ODAwMDAwMDApLnN1YnN0cmluZyg0KS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gIkFub24iICsgdW5pcSArICJUeXBlIjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gTmFtZVV0aWwudXBwZXJDYW1lbENhc2UobmFtZS5nZXRMb2NhbFBhcnQoKSkgKyB1bmlxICsgc3VmZml4ICsgIlR5cGUiOwotCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKHR5cGUsIGJhc2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgcmVmRm9ySGFuZGxlKFN0cmluZyBoYW5kbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFDb21wb25lbnQuUmVmKV9oYW5kbGVzVG9SZWZzLmdldChoYW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0IGdldEFsbEhhbmRsZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2hhbmRsZXNUb1JlZnMua2V5U2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHN0YXJ0V3JpdGVNb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgX2NvbXBvbmVudHNUb0hhbmRsZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2hhbmRsZXNUb1JlZnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylpLm5leHQoKTsKLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV3JpdGluZyBwcmVleGlzdGluZyBoYW5kbGUgIiArIGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50IGNvbXAgPSAoKFNjaGVtYUNvbXBvbmVudC5SZWYpX2hhbmRsZXNUb1JlZnMuZ2V0KGhhbmRsZSkpLmdldENvbXBvbmVudCgpOwotICAgICAgICAgICAgICAgIF9jb21wb25lbnRzVG9IYW5kbGVzLnB1dChjb21wLCBoYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfYmFzZVBhY2thZ2U7Ci0KLSAgICAvLyBjbGFzc2xvYWRlciBpcyBhdmFpbGFibGUgZm9yIHN0cydzIHRoYXQgd2VyZSBjb21waWxlZCBhbmQgbG9hZGVkLCBub3QgZHluYW1pYyBvbmVzCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfY2xhc3Nsb2FkZXI7Ci0KLSAgICAvLyB0aGUgbG9hZGVyIGZvciBsb2FkaW5nIC54c2IgcmVzb3VyY2VzCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUxvYWRlciBfcmVzb3VyY2VMb2FkZXI7Ci0KLSAgICAvLyB0aGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gbGluayByZWZlcmVuY2VzIGR1cmluZyBsb2FkCi0gICAgU2NoZW1hVHlwZUxvYWRlciBfbGlua2VyOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVQb29sIF9sb2NhbEhhbmRsZXM7Ci0gICAgcHJpdmF0ZSBGaWxlIF9iYXNlU2F2ZURpcjsKLQotICAgIC8vIGFjdHVhbCB0eXBlIHN5c3RlbSBkYXRhLCBtYXAgUU5hbWVzIC0+IFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkTW9kZWxHcm91cHM7Ci0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwczsKLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkR2xvYmFsVHlwZXM7Ci0KLSAgICBwcml2YXRlIE1hcCBfZ2xvYmFsRWxlbWVudHM7Ci0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEF0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBNYXAgX21vZGVsR3JvdXBzOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVHcm91cHM7Ci0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbFR5cGVzOwotICAgIHByaXZhdGUgTWFwIF9kb2N1bWVudFR5cGVzOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVUeXBlczsKLSAgICBwcml2YXRlIE1hcCBfaWRlbnRpdHlDb25zdHJhaW50cyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICBwcml2YXRlIE1hcCBfdHlwZVJlZnNCeUNsYXNzbmFtZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXQgX25hbWVzcGFjZXM7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFUeXBlW10gRU1QVFlfU1RfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZVswXTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFHbG9iYWxFbGVtZW50W10gRU1QVFlfR0VfQVJSQVkgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudFswXTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBFTVBUWV9HQV9BUlJBWSA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbMF07Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hTW9kZWxHcm91cFtdIEVNUFRZX01HX0FSUkFZID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBbMF07Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBFTVBUWV9BR19BUlJBWSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFswXTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBFTVBUWV9JQ19BUlJBWSA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbMF07Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlVG9EaXJlY3RvcnkoRmlsZSBjbGFzc0RpcikKLSAgICB7Ci0gICAgICAgIF9iYXNlU2F2ZURpciA9IGNsYXNzRGlyOwotCi0gICAgICAgIF9sb2NhbEhhbmRsZXMuc3RhcnRXcml0ZU1vZGUoKTsKLSAgICAgICAgc2F2ZVR5cGVzUmVjdXJzaXZlbHkoZ2xvYmFsVHlwZXMoKSk7Ci0gICAgICAgIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KGRvY3VtZW50VHlwZXMoKSk7Ci0gICAgICAgIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KGF0dHJpYnV0ZVR5cGVzKCkpOwotICAgICAgICBzYXZlR2xvYmFsRWxlbWVudHMoZ2xvYmFsRWxlbWVudHMoKSk7Ci0gICAgICAgIHNhdmVHbG9iYWxBdHRyaWJ1dGVzKGdsb2JhbEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIHNhdmVNb2RlbEdyb3Vwcyhtb2RlbEdyb3VwcygpKTsKLSAgICAgICAgc2F2ZUF0dHJpYnV0ZUdyb3VwcyhhdHRyaWJ1dGVHcm91cHMoKSk7Ci0gICAgICAgIHNhdmVJZGVudGl0eUNvbnN0cmFpbnRzKGlkZW50aXR5Q29uc3RyYWludHMoKSk7Ci0KLSAgICAgICAgc2F2ZVR5cGVzUmVjdXJzaXZlbHkocmVkZWZpbmVkR2xvYmFsVHlwZXMoKSk7Ci0gICAgICAgIHNhdmVNb2RlbEdyb3VwcyhyZWRlZmluZWRNb2RlbEdyb3VwcygpKTsKLSAgICAgICAgc2F2ZUF0dHJpYnV0ZUdyb3VwcyhyZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKSk7Ci0KLSAgICAgICAgc2F2ZUluZGV4KCk7Ci0gICAgICAgIHNhdmVQb2ludGVycygpOwotICAgIH0KLQotICAgIHZvaWQgc2F2ZVR5cGVzUmVjdXJzaXZlbHkoU2NoZW1hVHlwZVtdIHR5cGVzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBzYXZlVHlwZSh0eXBlc1tpXSk7Ci0gICAgICAgICAgICBzYXZlVHlwZXNSZWN1cnNpdmVseSh0eXBlc1tpXS5nZXRBbm9ueW1vdXNUeXBlcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVHbG9iYWxFbGVtZW50cyhTY2hlbWFHbG9iYWxFbGVtZW50W10gZWx0cykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWx0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZUdsb2JhbEVsZW1lbnQoZWx0c1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlR2xvYmFsQXR0cmlidXRlcyhTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBhdHRycykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmVHbG9iYWxBdHRyaWJ1dGUoYXR0cnNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZU1vZGVsR3JvdXBzKFNjaGVtYU1vZGVsR3JvdXBbXSBncm91cHMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZU1vZGVsR3JvdXAoZ3JvdXBzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVBdHRyaWJ1dGVHcm91cHMoU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBncm91cHMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZUF0dHJpYnV0ZUdyb3VwKGdyb3Vwc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlSWRlbnRpdHlDb25zdHJhaW50cyhTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBpZGNzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZGNzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlSWRlbnRpdHlDb25zdHJhaW50KGlkY3NbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUdsb2JhbEVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQpCi0gICAgewotICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JFbGVtZW50KGVsdCk7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVQYXJ0aWNsZURhdGEoKFNjaGVtYVBhcnRpY2xlKWVsdCk7Ci0gICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKGVsdC5nZXRTb3VyY2VOYW1lKCkpOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UKTsKLSAgICAgICAgc2F2ZXIud3JpdGVQYXJ0aWNsZURhdGEoKFNjaGVtYVBhcnRpY2xlKWVsdCk7Ci0gICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKGVsdC5nZXRTb3VyY2VOYW1lKCkpOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVHbG9iYWxBdHRyaWJ1dGUoU2NoZW1hR2xvYmFsQXR0cmlidXRlIGF0dHIpCi0gICAgewotICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JBdHRyaWJ1dGUoYXR0cik7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVBdHRyaWJ1dGVEYXRhKGF0dHIpOwotICAgICAgICBzYXZlci53cml0ZVN0cmluZyhhdHRyLmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSk7Ci0gICAgICAgIHNhdmVyLndyaXRlQXR0cmlidXRlRGF0YShhdHRyKTsKLSAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcoYXR0ci5nZXRTb3VyY2VOYW1lKCkpOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVNb2RlbEdyb3VwKFNjaGVtYU1vZGVsR3JvdXAgZ3JwKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yTW9kZWxHcm91cChncnApOwotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlTW9kZWxHcm91cERhdGEoZ3JwKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCk7Ci0gICAgICAgIHNhdmVyLndyaXRlTW9kZWxHcm91cERhdGEoZ3JwKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlQXR0cmlidXRlR3JvdXAoU2NoZW1hQXR0cmlidXRlR3JvdXAgZ3JwKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yQXR0cmlidXRlR3JvdXAoZ3JwKTsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOwotICAgICAgICBzYXZlci53cml0ZUF0dHJpYnV0ZUdyb3VwRGF0YShncnApOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUCk7Ci0gICAgICAgIHNhdmVyLndyaXRlQXR0cmlidXRlR3JvdXBEYXRhKGdycCk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUlkZW50aXR5Q29uc3RyYWludChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgaWRjKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9ySWRlbnRpdHlDb25zdHJhaW50KGlkYyk7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVJZENvbnN0cmFpbnREYXRhKGlkYyk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVCk7Ci0gICAgICAgIHNhdmVyLndyaXRlSWRDb25zdHJhaW50RGF0YShpZGMpOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIHZvaWQgc2F2ZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yVHlwZSh0eXBlKTsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOwotICAgICAgICBzYXZlci53cml0ZVR5cGVEYXRhKHR5cGUpOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFUWVBFKTsKLSAgICAgICAgc2F2ZXIud3JpdGVUeXBlRGF0YSh0eXBlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmFja1BvaW50ZXIoSW5wdXRTdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICAgICAgRGF0YUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0ID0gbmV3IERhdGFJbnB1dFN0cmVhbShzdHJlYW0pOwotCi0gICAgICAgICAgICBpbnQgbWFnaWMgPSBpbnB1dC5yZWFkSW50KCk7Ci0gICAgICAgICAgICBpZiAobWFnaWMgIT0gREFUQV9CQUJFKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBpbnQgbWFqb3J2ZXIgPSBpbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGludCBtaW5vcnZlciA9IGlucHV0LnJlYWRTaG9ydCgpOwotCi0gICAgICAgICAgICBpZiAobWFqb3J2ZXIgIT0gTUFKT1JfVkVSU0lPTikKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG1pbm9ydmVyID4gTUlOT1JfVkVSU0lPTikKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG1ham9ydmVyID4gMiB8fCBtYWpvcnZlciA9PSAyICYmIG1pbm9ydmVyID49IDE4KQotICAgICAgICAgICAgICAgIGlucHV0LnJlYWRTaG9ydCgpOyAvLyByZWxlYXNlIG51bWJlciBwcmVzZW50IGluIGF0TGVhc3QoMiwgMTgsIDApCi0KLSAgICAgICAgICAgIGludCBhY3R1YWxmaWxldHlwZSA9IGlucHV0LnJlYWRTaG9ydCgpOwotICAgICAgICAgICAgaWYgKGFjdHVhbGZpbGV0eXBlICE9IEZJTEVUWVBFX1NDSEVNQVBPSU5URVIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIFN0cmluZ1Bvb2wgc3RyaW5nUG9vbCA9IG5ldyBTdHJpbmdQb29sKCJwb2ludGVyIiwgInVuayIpOwotICAgICAgICAgICAgc3RyaW5nUG9vbC5yZWFkRnJvbShpbnB1dCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHJpbmdQb29sLnN0cmluZ0ZvckNvZGUoaW5wdXQucmVhZFNob3J0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyeSB7IGlucHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFhzYlJlYWRlcgotICAgIHsKLSAgICAgICAgRGF0YUlucHV0U3RyZWFtIF9pbnB1dDsKLSAgICAgICAgRGF0YU91dHB1dFN0cmVhbSBfb3V0cHV0OwotICAgICAgICBTdHJpbmdQb29sIF9zdHJpbmdQb29sOwotICAgICAgICBTdHJpbmcgX2hhbmRsZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX21ham9ydmVyOwotICAgICAgICBwcml2YXRlIGludCBfbWlub3J2ZXI7Ci0gICAgICAgIHByaXZhdGUgaW50IF9yZWxlYXNlbm87Ci0gICAgICAgIGludCBfYWN0dWFsZmlsZXR5cGU7Ci0KLSAgICAgICAgcHVibGljIFhzYlJlYWRlcihTdHJpbmcgaGFuZGxlLCBpbnQgZmlsZXR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZW5hbWUgPSBfYmFzZVBhY2thZ2UgKyBoYW5kbGUgKyAiLnhzYiI7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSByYXdpbnB1dCA9IGdldExvYWRlclN0cmVhbShyZXNvdXJjZW5hbWUpOwotICAgICAgICAgICAgaWYgKHJhd2lucHV0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IENvdWxkIG5vdCBsb2NhdGUgY29tcGlsZWQgc2NoZW1hIHJlc291cmNlICIgKyByZXNvdXJjZW5hbWUsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTk9fUkVTT1VSQ0UpOwotCi0gICAgICAgICAgICBfaW5wdXQgPSBuZXcgRGF0YUlucHV0U3RyZWFtKHJhd2lucHV0KTsKLSAgICAgICAgICAgIF9oYW5kbGUgPSBoYW5kbGU7Ci0KLSAgICAgICAgICAgIGludCBtYWdpYyA9IHJlYWRJbnQoKTsKLSAgICAgICAgICAgIGlmIChtYWdpYyAhPSBEQVRBX0JBQkUpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IFdyb25nIG1hZ2ljIGNvb2tpZSIsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfTUFHSUNfQ09PS0lFKTsKLQotICAgICAgICAgICAgX21ham9ydmVyID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBfbWlub3J2ZXIgPSByZWFkU2hvcnQoKTsKLQotICAgICAgICAgICAgaWYgKF9tYWpvcnZlciAhPSBNQUpPUl9WRVJTSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBXcm9uZyBtYWpvciB2ZXJzaW9uIC0gZXhwZWN0aW5nICIgKyBNQUpPUl9WRVJTSU9OICsgIiwgZ290ICIgKyBfbWFqb3J2ZXIsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfTUFKT1JfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPiBNSU5PUl9WRVJTSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBJbmNvbXBhdGlibGUgbWlub3IgdmVyc2lvbiAtIGV4cGVjdGluZyB1cCB0byAiICsgTUlOT1JfVkVSU0lPTiArICIsIGdvdCAiICsgX21pbm9ydmVyLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX01JTk9SX1ZFUlNJT04pOwotCi0gICAgICAgICAgICAvLyBDbGlwIHRvIDE0IGJlY2F1c2Ugd2UncmUgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBlYXJsaWVyCi0gICAgICAgICAgICAvLyBtaW5vciB2ZXJzaW9ucy4gIFJlbW92ZSB0aGlzIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3IG1ham9yCi0gICAgICAgICAgICAvLyB2ZXJzaW9uCi0KLSAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPCAxNCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogSW5jb21wYXRpYmxlIG1pbm9yIHZlcnNpb24gLSBleHBlY3RpbmcgYXQgbGVhc3QgMTQsIGdvdCAiICsgX21pbm9ydmVyLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX01JTk9SX1ZFUlNJT04pOwotCi0gICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxOCwgMCkpCi0gICAgICAgICAgICAgICAgX3JlbGVhc2VubyA9IHJlYWRTaG9ydCgpOwotCi0gICAgICAgICAgICBpbnQgYWN0dWFsZmlsZXR5cGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxmaWxldHlwZSAhPSBmaWxldHlwZSAmJiBmaWxldHlwZSAhPSAtMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogRmlsZSBoYXMgdGhlIHdyb25nIHR5cGUgLSBleHBlY3RpbmcgdHlwZSAiICsgZmlsZXR5cGUgKyAiLCBnb3QgdHlwZSAiICsgYWN0dWFsZmlsZXR5cGUsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfRklMRV9UWVBFKTsKLQotICAgICAgICAgICAgX3N0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nUG9vbChfaGFuZGxlLCBfbmFtZSk7Ci0gICAgICAgICAgICBfc3RyaW5nUG9vbC5yZWFkRnJvbShfaW5wdXQpOwotCi0gICAgICAgICAgICBfYWN0dWFsZmlsZXR5cGUgPSBhY3R1YWxmaWxldHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGF0TGVhc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgPCBtYWpvcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoX21pbm9ydmVyIDwgbWlub3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIChfcmVsZWFzZW5vID49IHJlbGVhc2Vubyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdE1vc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoX21ham9ydmVyIDwgbWFqb3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKF9taW5vcnZlciA8IG1pbm9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIChfcmVsZWFzZW5vIDw9IHJlbGVhc2Vubyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0QWN0dWFsRmlsZXR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2FjdHVhbGZpbGV0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgWHNiUmVhZGVyKFN0cmluZyBoYW5kbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgICAgICBfc3RyaW5nUG9vbCA9IG5ldyBTdHJpbmdQb29sKF9oYW5kbGUsIF9uYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVSZWFsSGVhZGVyKFN0cmluZyBoYW5kbGUsIGludCBmaWxldHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaGFja2Vyb286IGlmIGhhbmRsZSBjb250YWlucyBhICIvIiBpdCdzIG5vdCByZWxhdGl2ZS4KLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZW5hbWU7Ci0KLSAgICAgICAgICAgIGlmIChoYW5kbGUuaW5kZXhPZignLycpID49IDApCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VuYW1lID0gaGFuZGxlICsgIi54c2IiOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc291cmNlbmFtZSA9IF9iYXNlUGFja2FnZSArIGhhbmRsZSArICIueHNiIjsKLQotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHJhd291dHB1dCA9IGdldFNhdmVyU3RyZWFtKHJlc291cmNlbmFtZSk7Ci0gICAgICAgICAgICBpZiAocmF3b3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNvdWxkIG5vdCB3cml0ZSBjb21waWxlZCBzY2hlbWEgcmVzb3VyY2UgIiArIHJlc291cmNlbmFtZSwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5OT1RfV1JJVEVBQkxFKTsKLQotICAgICAgICAgICAgX291dHB1dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHJhd291dHB1dCk7Ci0gICAgICAgICAgICBfaGFuZGxlID0gaGFuZGxlOwotCi0gICAgICAgICAgICB3cml0ZUludChEQVRBX0JBQkUpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChNQUpPUl9WRVJTSU9OKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoTUlOT1JfVkVSU0lPTik7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KFJFTEVBU0VfTlVNQkVSKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoZmlsZXR5cGUpOwotCi0gICAgICAgICAgICBfc3RyaW5nUG9vbC53cml0ZVRvKF9vdXRwdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWFkRW5kKCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9pbnB1dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfaW5wdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG9oLCB3ZWxsLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2lucHV0ID0gbnVsbDsKLSAgICAgICAgICAgIF9zdHJpbmdQb29sID0gbnVsbDsKLSAgICAgICAgICAgIF9oYW5kbGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUVuZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9vdXRwdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9vdXRwdXQgPSBudWxsOwotICAgICAgICAgICAgX3N0cmluZ1Bvb2wgPSBudWxsOwotICAgICAgICAgICAgX2hhbmRsZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlsZVR5cGVGcm9tQ29tcG9uZW50VHlwZShpbnQgY29tcG9uZW50VHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFUWVBFOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFFTEVNRU5UOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURTsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5NT0RFTF9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVA7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNvbXBvbmVudCB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlSW5kZXhEYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaGFzIGEgaGFuZGxlIHBvb2wgKGNvdW50LCBoYW5kbGUvdHlwZSwgaGFuZGxlL3R5cGUuLi4pCi0gICAgICAgICAgICB3cml0ZUhhbmRsZVBvb2woX2xvY2FsSGFuZGxlcyk7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gYSBxbmFtZSBtYXAgb2YgZ2xvYmFsIGVsZW1lbnRzIChjb3VudCwgcW5hbWUvaGFuZGxlLCBxbmFtZS9oYW5kbGUuLi4pCi0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKGdsb2JhbEVsZW1lbnRzKCkpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoZ2xvYmFsQXR0cmlidXRlcygpKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIG1vZGVsIGdyb3VwcwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChtb2RlbEdyb3VwcygpKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGF0dHJpYnV0ZSBncm91cHMKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoYXR0cmlidXRlR3JvdXBzKCkpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgaWRlbnRpdHkgY29uc3RyYWludHMKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoaWRlbnRpdHlDb25zdHJhaW50cygpKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCB0eXBlcwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChnbG9iYWxUeXBlcygpKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGRvY3VtZW50IHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBlbGVtZW50Ci0gICAgICAgICAgICB3cml0ZURvY3VtZW50VHlwZU1hcChkb2N1bWVudFR5cGVzKCkpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgYXR0cmlidXRlIHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlVHlwZU1hcChhdHRyaWJ1dGVUeXBlcygpKTsKLQotICAgICAgICAgICAgLy8gYWxsIHRoZSB0eXBlcyBieSBjbGFzc25hbWUKLSAgICAgICAgICAgIHdyaXRlQ2xhc3NuYW1lTWFwKF90eXBlUmVmc0J5Q2xhc3NuYW1lKTsKLQotICAgICAgICAgICAgLy8gYWxsIHRoZSBuYW1lc3BhY2VzCi0gICAgICAgICAgICB3cml0ZU5hbWVzcGFjZXMoX25hbWVzcGFjZXMpOwotCi0gICAgICAgICAgICAvLyBWRVJTSU9OIDIuMTUgYW5kIG5ld2VyIGJlbG93Ci0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKHJlZGVmaW5lZEdsb2JhbFR5cGVzKCkpOwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChyZWRlZmluZWRNb2RlbEdyb3VwcygpKTsKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAocmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUhhbmRsZVBvb2woSGFuZGxlUG9vbCBwb29sKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHBvb2wuX2NvbXBvbmVudHNUb0hhbmRsZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvb2wuX2NvbXBvbmVudHNUb0hhbmRsZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFDb21wb25lbnQgY29tcCA9IChTY2hlbWFDb21wb25lbnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpcG9vbC5fY29tcG9uZW50c1RvSGFuZGxlcy5nZXQoY29tcCk7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGUgPSBmaWxlVHlwZUZyb21Db21wb25lbnRUeXBlKGNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhoYW5kbGUpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlYWRIYW5kbGVQb29sKEhhbmRsZVBvb2wgcG9vbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBvb2wuX2hhbmRsZXNUb1JlZnMuc2l6ZSgpICE9IDAgfHwgcG9vbC5fc3RhcnRlZCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb25lbXB0eSBoYW5kbGUgc2V0IGJlZm9yZSByZWFkIik7Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIHNob3J0IGNvZGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BVFlQRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlLlJlZihnZXRUeXBlU3lzdGVtKCksIGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hTW9kZWxHcm91cC5SZWYoZ2V0VHlwZVN5c3RlbSgpLCBoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlNjaGVtYSBpbmRleCBoYXMgYW4gdW5yZWNvZ25pemVkIGVudHJ5IG9mIHR5cGUgIiArIGNvZGUsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uVU5SRUNPR05JWkVEX0lOREVYX0VOVFJZKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcG9vbC5faGFuZGxlc1RvUmVmcy5wdXQoaGFuZGxlLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2hvcnQgcmVhZFNob3J0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVNob3J0KGludCBzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocyA+IFNob3J0Lk1BWF9WQUxVRSB8fCBzIDwgU2hvcnQuTUlOX1ZBTFVFKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJWYWx1ZSAiICsgcyArICIgb3V0IG9mIHJhbmdlOiBtdXN0IGZpdCBpbiBhIDE2LWJpdCBzaG9ydC4iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JTlRfVE9PX0xBUkdFKTsKLSAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LndyaXRlU2hvcnQocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlYWRJbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWRJbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUludChpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9vdXRwdXQud3JpdGVJbnQoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlYWRTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3N0cmluZ1Bvb2wuc3RyaW5nRm9yQ29kZShyZWFkU2hvcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb2RlID0gX3N0cmluZ1Bvb2wuY29kZUZvclN0cmluZyhzdHIpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChjb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIHJlYWRRTmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgaWYgKGxvY2FsbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUU5hbWUoUU5hbWUgcW5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChxbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKG51bGwpOwotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNPQVBBcnJheVR5cGUgcmVhZFNPQVBBcnJheVR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHJlYWRRTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGRpbWVuc2lvbnMgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU09BUEFycmF5VHlwZShxTmFtZSwgZGltZW5zaW9ucyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlU09BUEFycmF5VHlwZShTT0FQQXJyYXlUeXBlIGFycmF5VHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFycmF5VHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUobnVsbCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZShhcnJheVR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoYXJyYXlUeXBlLnNvYXAxMURpbWVuc2lvblN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgcmVhZEhhbmRsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChoYW5kbGUuY2hhckF0KDApICE9ICdfJykKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xvY2FsSGFuZGxlcy5yZWZGb3JIYW5kbGUoaGFuZGxlKTsKLQotICAgICAgICAgICAgc3dpdGNoIChoYW5kbGUuY2hhckF0KDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBfQklfIC0gYnVpbHQtaW4gc2NoZW1hIHR5cGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFNjaGVtYVR5cGUpQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uZ2V0KCkucmVzb2x2ZUhhbmRsZShoYW5kbGUpKS5nZXRSZWYoKTsKLSAgICAgICAgICAgICAgICBjYXNlICdUJzogLy8gX1hUXyAtIGV4dGVybmFsIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZFR5cGVSZWYoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpOwotICAgICAgICAgICAgICAgIGNhc2UgJ0UnOiAvLyBfWEVfIC0gZXh0ZXJuYWwgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kRWxlbWVudFJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnQSc6IC8vIF9YQV8gLSBleHRlcm5hbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEF0dHJpYnV0ZVJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnTSc6IC8vIF9YTV8gLSBleHRlcm5hbCBtb2RlbCBncm91cAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kTW9kZWxHcm91cFJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIF9YTl8gLSBleHRlcm5hbCBhdHRyaWJ1dGUgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKTsKLSAgICAgICAgICAgICAgICBjYXNlICdEJzogLy8gX1hEXyAtIGV4dGVybmFsIGlkZW50aXR5IGNvbnN0cmFpbnQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZElkZW50aXR5Q29uc3RyYWludFJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnUic6IC8vIF9YUl8gLSBleHRlcm5hbCByZWYgdG8gYXR0cmlidXRlJ3MgdHlwZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kQXR0cmlidXRlKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKS5nZXRUeXBlKCkuZ2V0UmVmKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnUyc6IC8vIF9YU18gLSBleHRlcm5hbCByZWYgdG8gZWxlbWVudCdzIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEVsZW1lbnQoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpLmdldFR5cGUoKS5nZXRSZWYoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IHJlc29sdmUgaGFuZGxlICIgKyBoYW5kbGUsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9IQU5ETEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUhhbmRsZShTY2hlbWFDb21wb25lbnQgY29tcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXAgPT0gbnVsbCB8fCBjb21wLmdldFR5cGVTeXN0ZW0oKSA9PSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JDb21wb25lbnQoY29tcCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChjb21wLmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWEFfIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWE1fIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hOXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY29tcC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWEVfIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDoKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YRF8iICsgUU5hbWVIZWxwZXIucHJldHR5KGNvbXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgotICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSAoU2NoZW1hVHlwZSljb21wOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0J1aWx0aW5UeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfQklfIiArIHR5cGUuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpeCBmb3IgQ1IxMjA3NTkgLSBhZGRlZCBvdXRwdXQgb2YgdHlwZXMgX1hSXyAmIF9YU18KLSAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhbiBhdHRyaWJ1dGUgKF9YUl8pIG9yIGVsZW1lbnQgKF9YU18pIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgcmVmIHRvIHJlZmVyIHRvIGFuIGF0dHJpYnV0ZSBvciBlbGVtZW50IGluIGFub3RoZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hIGFuZCB0aGUgdHlwZSBvZiB0aGF0IGF0dHJpYnV0ZSBvciBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlzIGFuIGFub255bW91cyAobG9jYWwpIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWFRfIiArIFFOYW1lSGVscGVyLnByZXR0eSh0eXBlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgc2YgPSB0eXBlLmdldENvbnRhaW5lckZpZWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKHNmICE9IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNmLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YUl8iICsgUU5hbWVIZWxwZXIucHJldHR5KHNmLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWFNfIiArIFFOYW1lSGVscGVyLnByZXR0eShzZi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgaGFuZGxlIGZvciBjb21wb25lbnQgIiArIGNvbXAsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9IQU5ETEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVhZFR5cGVSZWYoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUuUmVmKXJlYWRIYW5kbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVIYW5kbGUodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgcmVhZFFOYW1lUmVmTWFwKCkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRRTmFtZSgpOwotICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgb2JqID0gcmVhZEhhbmRsZSgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQobmFtZSwgb2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUU5hbWVNYXAoU2NoZW1hQ29tcG9uZW50W10gY29tcG9uZW50cykKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChjb21wb25lbnRzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZShjb21wb25lbnRzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoY29tcG9uZW50c1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlRG9jdW1lbnRUeXBlTWFwKFNjaGVtYVR5cGVbXSBkb2N0eXBlcykKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChkb2N0eXBlcy5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGRvY3R5cGVzW2ldLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoZG9jdHlwZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUF0dHJpYnV0ZVR5cGVNYXAoU2NoZW1hVHlwZVtdIGF0dHJ0eXBlcykKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRydHlwZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoYXR0cnR5cGVzW2ldLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGF0dHJ0eXBlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlLlJlZltdIHJlYWRUeXBlUmVmQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgU2NoZW1hVHlwZS5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZS5SZWZbc2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZWFkVHlwZVJlZigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUeXBlQXJyYXkoU2NoZW1hVHlwZVtdIGFycmF5KQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGFycmF5Lmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGFycmF5W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE1hcCByZWFkQ2xhc3NuYW1lUmVmTWFwKCkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50LlJlZiBvYmogPSByZWFkSGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChuYW1lLCBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVDbGFzc25hbWVNYXAoTWFwIHR5cGVzQnlDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlc0J5Q2xhc3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzQnlDbGFzcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoKChTY2hlbWFUeXBlLlJlZil0eXBlc0J5Q2xhc3MuZ2V0KGNsYXNzTmFtZSkpLmdldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNldCByZWFkTmFtZXNwYWNlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlTmFtZXNwYWNlcyhTZXQgbmFtZXNwYWNlcykKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChuYW1lc3BhY2VzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPdXRwdXRTdHJlYW0gZ2V0U2F2ZXJTdHJlYW0oU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKF9iYXNlU2F2ZURpciwgbmFtZSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElucHV0U3RyZWFtIGdldExvYWRlclN0cmVhbShTdHJpbmcgcmVzb3VyY2VuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3Jlc291cmNlTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaW5pc2hlcyBsb2FkaW5nIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50IGZpbmlzaExvYWRpbmdFbGVtZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBpbXBsID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKGdldFR5cGVTeXN0ZW0oKSk7Ci0gICAgICAgICAgICAgICAgc2hvcnQgcGFydGljbGVUeXBlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlVHlwZSAhPSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiV3JvbmcgcGFydGljbGUgdHlwZSAiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5CQURfUEFSVElDTEVfVFlQRSk7Ci0gICAgICAgICAgICAgICAgbG9hZFBhcnRpY2xlKGltcGwsIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQsIHRydWUpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0RmlsZW5hbWUocmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZmluaXNoTG9hZGluZ0F0dHJpYnV0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgaW1wbCA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKGdldFR5cGVTeXN0ZW0oKSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2FkQXR0cmlidXRlKGltcGwpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0RmlsZW5hbWUocmVhZFN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXAgZmluaXNoTG9hZGluZ01vZGVsR3JvdXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBpbXBsID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBJbXBsKGdldFR5cGVTeXN0ZW0oKSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvYWRNb2RlbEdyb3VwKGltcGwpOwotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBmaW5pc2hMb2FkaW5nSWRlbnRpdHlDb25zdHJhaW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGltcGwgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbChnZXRUeXBlU3lzdGVtKCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0TmFtZShyZWFkUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRDb25zdHJhaW50Q2F0ZWdvcnkocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0U2VsZWN0b3IocmVhZFN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IG5ldyBTdHJpbmdbcmVhZFNob3J0KCldOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGZpZWxkcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldEZpZWxkcyhmaWVsZHMpOwotCi0gICAgICAgICAgICAgICAgaWYgKGltcGwuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWVJFRikKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRSZWZlcmVuY2VkS2V5KChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKXJlYWRIYW5kbGUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbWFwQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBNYXAgbnNNYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWFwQ291bnQgOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBuc01hcHBpbmdzLnB1dChwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGltcGwuc2V0TlNNYXAobnNNYXBwaW5ncyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5ORVNURURfRVhDRVBUSU9OLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cCBmaW5pc2hMb2FkaW5nQXR0cmlidXRlR3JvdXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgaW1wbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwoZ2V0VHlwZVN5c3RlbSgpKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9hZEF0dHJpYnV0ZUdyb3VwKGltcGwpOwotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmlzaExvYWRpbmdUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgaW1wbCA9IG5ldyBTY2hlbWFUeXBlSW1wbChnZXRUeXBlU3lzdGVtKCksIHRydWUpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0TmFtZShyZWFkUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYocmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRCYXNlRGVwdGgocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0QmFzZVR5cGVSZWYocmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXREZXJpdmF0aW9uVHlwZShyZWFkU2hvcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlYWRTaG9ydCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9HTE9CQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbnRhaW5lckZpZWxkUmVmKHJlYWRIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9MT0NBTEFUVFI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbnRhaW5lckZpZWxkSW5kZXgoKHNob3J0KTEsIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMRUxUOgotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRDb250YWluZXJGaWVsZEluZGV4KChzaG9ydCkyLCByZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRGdWxsSmF2YU5hbWUocmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldEZ1bGxKYXZhSW1wbE5hbWUocmVhZFN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMocmVhZFR5cGVSZWZBcnJheSgpKTsKLQotICAgICAgICAgICAgICAgIGltcGwuc2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKHJlYWRTaG9ydCgpKTsKLQotICAgICAgICAgICAgICAgIGludCBmbGFnczsKLSAgICAgICAgICAgICAgICBmbGFncyA9IHJlYWRJbnQoKTsKLQotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NvbXBsZXhUeXBlID0gKChmbGFncyAmIEZMQUdfU0lNUExFX1RZUEUpID09IDApOwotICAgICAgICAgICAgICAgIGltcGwuc2V0Q29tcGlsZWQoKGZsYWdzICYgRkxBR19DT01QSUxFRCkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXREb2N1bWVudFR5cGUoKGZsYWdzICYgRkxBR19ET0NVTUVOVF9UWVBFKSAhPSAwKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldEF0dHJpYnV0ZVR5cGUoKGZsYWdzICYgRkxBR19BVFRSSUJVVEVfVFlQRSkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRTaW1wbGVUeXBlKCFpc0NvbXBsZXhUeXBlKTsKLQotICAgICAgICAgICAgICAgIHNob3J0IGNvbXBsZXhWYXJpZXR5ID0gU2NoZW1hVHlwZS5OT1RfQ09NUExFWF9UWVBFOwotICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXhUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRBYnN0cmFjdEZpbmFsKChmbGFncyAmIEZMQUdfQUJTVFJBQ1QpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX0VYVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfUkVTVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfTElTVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfVU5JT04pICE9IDApOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEJsb2NrKChmbGFncyAmIEZMQUdfQkxPQ0tfRVhUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19CTE9DS19SRVNUKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldE9yZGVyU2Vuc2l0aXZlKChmbGFncyAmIEZMQUdfT1JERVJfU0VOU0lUSVZFKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgY29tcGxleFZhcmlldHkgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoY29tcGxleFZhcmlldHkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBNb2RlbCBUYWJsZQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHNob3J0IGF0dHJDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck1vZGVsLmFkZEF0dHJpYnV0ZShyZWFkQXR0cmlidXRlRGF0YSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBhdHRyTW9kZWwuc2V0V2lsZGNhcmRTZXQocmVhZFFOYW1lU2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBhdHRyTW9kZWwuc2V0V2lsZGNhcmRQcm9jZXNzKHJlYWRTaG9ydCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgUHJvcGVydHkgVGFibGUKLSAgICAgICAgICAgICAgICAgICAgTWFwIGF0dHJQcm9wZXJ0aWVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgYXR0clByb3BDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJQcm9wQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHJlYWRQcm9wZXJ0eURhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJBdHRyaWJ1dGUgcHJvcGVydHkgIiArIGkgKyAiIGlzIG5vdCBhbiBhdHRyaWJ1dGUiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19QUk9QRVJUWV9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJQcm9wZXJ0aWVzLnB1dChwcm9wLmdldE5hbWUoKSwgcHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBNYXAgZWxlbVByb3BlcnRpZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzaG9ydCBpc0FsbCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UIHx8IGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGVudCBNb2RlbCBUcmVlCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FsbCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0cyA9IHJlYWRQYXJ0aWNsZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudE1vZGVsID0gcGFydHNbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TW9kZWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDb250ZW50IG1vZGVsIG5vdCB3ZWxsLWZvcm1lZCIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk1BTEZPUk1FRF9DT05URU5UX01PREVMKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBQcm9wZXJ0eSBUYWJsZQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtUHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBlbGVtUHJvcENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1Qcm9wQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcmVhZFByb3BlcnR5RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJFbGVtZW50IHByb3BlcnR5ICIgKyBpICsgIiBpcyBub3QgYW4gZWxlbWVudCIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX1BST1BFUlRZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1Qcm9wZXJ0aWVzLnB1dChwcm9wLmdldE5hbWUoKSwgcHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgZWxlbVByb3BlcnRpZXMsIGF0dHJQcm9wZXJ0aWVzLCBpc0FsbCA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuV2lsZGNhcmRSZXN1bHQgd2NFbHQgPSBTdHNjQ29tcGxleFR5cGVSZXNvbHZlci5zdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsKTsKLSAgICAgICAgICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFdpbGRjYXJkU3VtbWFyeSh3Y0VsdC50eXBlZFdpbGRjYXJkcywgd2NFbHQuaGFzV2lsZGNhcmRzLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghaXNDb21wbGV4VHlwZSB8fCBjb21wbGV4VmFyaWV0eSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgc2ltcGxlVmFyaWV0eSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KHNpbXBsZVZhcmlldHkpOwotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTdHJpbmdFbnVtID0gKChmbGFncyAmIEZMQUdfU1RSSU5HRU5VTSkgIT0gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRPcmRlcmVkKChmbGFncyAmIEZMQUdfT1JERVJFRCkgIT0gMCA/IFNjaGVtYVR5cGUuVU5PUkRFUkVEIDogKChmbGFncyAmIEZMQUdfVE9UQUxfT1JERVIpICE9IDAgPyBTY2hlbWFUeXBlLlRPVEFMX09SREVSIDogU2NoZW1hVHlwZS5QQVJUSUFMX09SREVSKSk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0Qm91bmRlZCgoZmxhZ3MgJiBGTEFHX0JPVU5ERUQpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEZpbml0ZSgoZmxhZ3MgJiBGTEFHX0ZJTklURSkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0TnVtZXJpYygoZmxhZ3MgJiBGTEFHX05VTUVSSUMpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFVuaW9uT2ZMaXN0cygoZmxhZ3MgJiBGTEFHX1VOSU9OX09GX0xJU1RTKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRTaW1wbGVGaW5hbCgoZmxhZ3MgJiBGTEFHX0ZJTkFMX1JFU1QpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX0xJU1QpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX1VOSU9OKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgICAgICBYbWxWYWx1ZVJlZltdIGZhY2V0cyA9IG5ldyBYbWxWYWx1ZVJlZltTY2hlbWFUeXBlLkxBU1RfRkFDRVQgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbltdIGZpeGVkRmFjZXRzID0gbmV3IGJvb2xlYW5bU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0IGZhY2V0Q291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYWNldENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGZhY2V0Q29kZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzW2ZhY2V0Q29kZV0gPSByZWFkWG1sVmFsdWVPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkRmFjZXRzW2ZhY2V0Q29kZV0gPSAocmVhZFNob3J0KCkgPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRCYXNpY0ZhY2V0cyhmYWNldHMsIGZpeGVkRmFjZXRzKTsKLQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFdoaXRlU3BhY2VSdWxlKHJlYWRTaG9ydCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFBhdHRlcm5GYWNldCgoZmxhZ3MgJiBGTEFHX0hBU19QQVRURVJOKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgICAgICBzaG9ydCBwYXR0ZXJuQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10gcGF0dGVybnMgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW3BhdHRlcm5Db3VudF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybkNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zW2ldID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbihyZWFkU3RyaW5nKCksICJYIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQYXR0ZXJucyhwYXR0ZXJucyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgZW51bUNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFZhbHVlUmVmW10gZW51bVZhbHVlcyA9IG5ldyBYbWxWYWx1ZVJlZltlbnVtQ291bnRdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnVtVmFsdWVzW2ldID0gcmVhZFhtbFZhbHVlT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRFbnVtZXJhdGlvblZhbHVlcyhlbnVtQ291bnQgPT0gMCA/IG51bGwgOiBlbnVtVmFsdWVzKTsKLQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEJhc2VFbnVtVHlwZVJlZihyZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nRW51bSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc2VDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZW50cmllcyA9IG5ldyBTY2hlbWFTdHJpbmdFbnVtRW50cnlbc2VDb3VudF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzW2ldID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwocmVhZFN0cmluZygpLCByZWFkU2hvcnQoKSwgcmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0U3RyaW5nRW51bUVudHJpZXMoZW50cmllcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpbXBsZVZhcmlldHkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0RGVjaW1hbFNpemUocmVhZEludCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0VW5pb25NZW1iZXJUeXBlUmVmcyhyZWFkVHlwZVJlZkFycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJTaW1wbGUgdHlwZSBkb2VzIG5vdCBoYXZlIGEgcmVjb2duaXplZCB2YXJpZXR5IiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfU0lNUExFX1ZBUklFVFkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW1wbC5zZXRGaWxlbmFtZShyZWFkU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHR5cGUgZnJvbSB0eXBlc3lzdGVtIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTkVTVEVEX0VYQ0VQVElPTiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVR5cGVEYXRhKFNjaGVtYVR5cGUgdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVRTmFtZSh0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGUodHlwZS5nZXRPdXRlclR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KCgoU2NoZW1hVHlwZUltcGwpdHlwZSkuZ2V0QmFzZURlcHRoKCkpOwotICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuZ2V0RGVyaXZhdGlvblR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRDb250YWluZXJGaWVsZCgpID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChGSUVMRF9OT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZ2V0T3V0ZXJUeXBlKCkuaXNBdHRyaWJ1dGVUeXBlKCkgfHwgdHlwZS5nZXRPdXRlclR5cGUoKS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoRklFTERfR0xPQkFMKTsKLSAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZSgoU2NoZW1hQ29tcG9uZW50KXR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlLmdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KEZJRUxEX0xPQ0FMQVRUUik7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCgoKFNjaGVtYVR5cGVJbXBsKXR5cGUuZ2V0T3V0ZXJUeXBlKCkpLmdldEluZGV4Rm9yTG9jYWxBdHRyaWJ1dGUoKFNjaGVtYUxvY2FsQXR0cmlidXRlKXR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoRklFTERfTE9DQUxFTFQpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoKChTY2hlbWFUeXBlSW1wbCl0eXBlLmdldE91dGVyVHlwZSgpKS5nZXRJbmRleEZvckxvY2FsRWxlbWVudCgoU2NoZW1hTG9jYWxFbGVtZW50KXR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVTdHJpbmcodHlwZS5nZXRGdWxsSmF2YU5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyh0eXBlLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGVBcnJheSh0eXBlLmdldEFub255bW91c1R5cGVzKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCgpKTsKLQotICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfU0lNUExFX1RZUEU7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRE9DVU1FTlRfVFlQRTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQVRUUklCVVRFX1RZUEU7Ci0gICAgICAgICAgICBpZiAodHlwZS5vcmRlcmVkKCkgIT0gU2NoZW1hVHlwZS5VTk9SREVSRUQpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19PUkRFUkVEOwotICAgICAgICAgICAgaWYgKHR5cGUub3JkZXJlZCgpID09IFNjaGVtYVR5cGUuVE9UQUxfT1JERVIpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19UT1RBTF9PUkRFUjsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzQm91bmRlZCgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQk9VTkRFRDsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzRmluaXRlKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19GSU5JVEU7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc051bWVyaWMoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX05VTUVSSUM7Ci0gICAgICAgICAgICBpZiAodHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19TVFJJTkdFTlVNOwotICAgICAgICAgICAgaWYgKCgoU2NoZW1hVHlwZUltcGwpdHlwZSkuaXNVbmlvbk9mTGlzdHMoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1VOSU9OX09GX0xJU1RTOwotICAgICAgICAgICAgaWYgKHR5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19IQVNfUEFUVEVSTjsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzT3JkZXJTZW5zaXRpdmUoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX09SREVSX1NFTlNJVElWRTsKLQotICAgICAgICAgICAgaWYgKHR5cGUuYmxvY2tFeHRlbnNpb24oKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0JMT0NLX0VYVDsKLSAgICAgICAgICAgIGlmICh0eXBlLmJsb2NrUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0JMT0NLX1JFU1Q7Ci0gICAgICAgICAgICBpZiAodHlwZS5maW5hbEV4dGVuc2lvbigpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOQUxfRVhUOwotICAgICAgICAgICAgaWYgKHR5cGUuZmluYWxSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOQUxfRVhUOwotICAgICAgICAgICAgaWYgKHR5cGUuZmluYWxMaXN0KCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19GSU5BTF9MSVNUOwotICAgICAgICAgICAgaWYgKHR5cGUuZmluYWxVbmlvbigpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOQUxfVU5JT047Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0Fic3RyYWN0KCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19BQlNUUkFDVDsKLQotICAgICAgICAgICAgd3JpdGVJbnQoZmxhZ3MpOwotCi0gICAgICAgICAgICBpZiAoIXR5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldENvbnRlbnRUeXBlKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIE1vZGVsIFRhYmxlCi0gICAgICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgYXR0ck1vZGVsID0gdHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOwotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnMgPSBhdHRyTW9kZWwuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRycy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlRGF0YShhdHRyc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lU2V0KGF0dHJNb2RlbC5nZXRXaWxkY2FyZFNldCgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGF0dHJNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgUHJvcGVydHkgVGFibGUKLSAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGF0dHJQcm9wZXJ0aWVzID0gdHlwZS5nZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRyUHJvcGVydGllcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0clByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHlEYXRhKGF0dHJQcm9wZXJ0aWVzW2ldKTsKLQotICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRlbnQgTW9kZWwgVHJlZQotICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuaGFzQWxsQ29udGVudCgpID8gMSA6IDApOwotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRzOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRDb250ZW50TW9kZWwoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBuZXcgU2NoZW1hUGFydGljbGVbXSB7IHR5cGUuZ2V0Q29udGVudE1vZGVsKCkgfTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBuZXcgU2NoZW1hUGFydGljbGVbMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQYXJ0aWNsZUFycmF5KHBhcnRzKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IFByb3BlcnR5IFRhYmxlCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gZWx0UHJvcGVydGllcyA9IHR5cGUuZ2V0RWxlbWVudFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChlbHRQcm9wZXJ0aWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWx0UHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHlEYXRhKGVsdFByb3BlcnRpZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgZmFjZXRDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldEZhY2V0KGkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldENvdW50Kys7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChmYWNldENvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBTY2hlbWFUeXBlLkxBU1RfRkFDRVQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgZmFjZXQgPSB0eXBlLmdldEZhY2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QoZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmlzRmFjZXRGaXhlZChpKSA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5nZXRXaGl0ZVNwYWNlUnVsZSgpKTsKLQotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHBhdHRlcm5zID0gKChTY2hlbWFUeXBlSW1wbCl0eXBlKS5nZXRQYXR0ZXJuRXhwcmVzc2lvbnMoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHBhdHRlcm5zLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcocGF0dGVybnNbaV0uZ2V0UGF0dGVybigpKTsKLQotICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSBlbnVtVmFsdWVzID0gdHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICAgICAgICAgIGlmIChlbnVtVmFsdWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoMCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChlbnVtVmFsdWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QoZW51bVZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbmV3IGZvciB2ZXJzaW9uIDIuMwotICAgICAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlLmdldEJhc2VFbnVtVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBlbnRyaWVzID0gdHlwZS5nZXRTdHJpbmdFbnVtRW50cmllcygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGVudHJpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhlbnRyaWVzW2ldLmdldFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoZW50cmllc1tpXS5nZXRJbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGVudHJpZXNbaV0uZ2V0RW51bU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUludCh0eXBlLmdldERlY2ltYWxTaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUodHlwZS5nZXRMaXN0SXRlbVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGVBcnJheSh0eXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKHR5cGUuZ2V0U291cmNlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVhZEV4dGVuc2lvbnNMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBhc3NlcnQgY291bnQgPT0gMDsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVhZFN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgcmVhZEF0dHJpYnV0ZURhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgcmVzdWx0ID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpOwotICAgICAgICAgICAgbG9hZEF0dHJpYnV0ZShyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbG9hZE1vZGVsR3JvdXAoU2NoZW1hTW9kZWxHcm91cEltcGwgcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuaW5pdChyZWFkUU5hbWUoKSwgcmVhZFN0cmluZygpLCByZWFkU2hvcnQoKSA9PSAxLCBhdExlYXN0KDIsIDE1LCAwKSA/IHJlYWRTaG9ydCgpID09IDEgOiBmYWxzZSwgR3JvdXBEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCByZWFkU3RyaW5nKCkgKS5nZXRHcm91cCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBsb2FkQXR0cmlidXRlR3JvdXAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIHJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmluaXQoIHJlYWRRTmFtZSgpLCByZWFkU3RyaW5nKCksIHJlYWRTaG9ydCgpID09IDEsIGF0TGVhc3QoMiwgMTUsIDApID8gcmVhZFNob3J0KCkgPT0gMSA6IGZhbHNlLCBBdHRyaWJ1dGVHcm91cERvY3VtZW50LkZhY3RvcnkucGFyc2UoIHJlYWRTdHJpbmcoKSApLmdldEF0dHJpYnV0ZUdyb3VwKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGxvYWRBdHRyaWJ1dGUoU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbmFtZSwgdHlwZSwgdXNlLCBkZWZ0ZXh0LCBkZWZ2YWwsIGZpeGVkLCBzb2FwYXJyYXl0eXBlCi0gICAgICAgICAgICByZXN1bHQuaW5pdChyZWFkUU5hbWUoKSwgcmVhZFR5cGVSZWYoKSwgcmVhZFNob3J0KCksIHJlYWRTdHJpbmcoKSwgbnVsbCwgYXRMZWFzdCgyLCAxNiwgMCkgPyByZWFkWG1sVmFsdWVPYmplY3QoKSA6IG51bGwsIHJlYWRTaG9ydCgpID09IDEsIHJlYWRTT0FQQXJyYXlUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUF0dHJpYnV0ZURhdGEoU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYXR0cikKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVRTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGUoYXR0ci5nZXRUeXBlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRyLmdldFVzZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKGF0dHIuZ2V0RGVmYXVsdFRleHQoKSk7Ci0gICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KGF0dHIuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRyLmlzRml4ZWQoKSA/IDEgOiAwKTsKLSAgICAgICAgICAgIHdyaXRlU09BUEFycmF5VHlwZSgoKFNjaGVtYVdTRExBcnJheVR5cGUpYXR0cikuZ2V0V1NETEFycmF5VHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVJZENvbnN0cmFpbnREYXRhKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBpZGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlUU5hbWUoaWRjLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGlkYy5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSk7Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhpZGMuZ2V0U2VsZWN0b3IoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IGlkYy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoZmllbGRzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBmaWVsZHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGZpZWxkc1tpXSk7Ci0KLQotICAgICAgICAgICAgaWYgKGlkYy5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZUkVGKQotICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGlkYy5nZXRSZWZlcmVuY2VkS2V5KCkpOwotCi0gICAgICAgICAgICBTZXQgbWFwcGluZ3MgPSBpZGMuZ2V0TlNNYXAoKS5lbnRyeVNldCgpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChtYXBwaW5ncy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcHBpbmdzLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKWUuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpZS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcocHJlZml4KTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyh1cmkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHJlYWRQYXJ0aWNsZUFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hUGFydGljbGVbcmVhZFNob3J0KCldOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcmVhZFBhcnRpY2xlRGF0YSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQYXJ0aWNsZUFycmF5KFNjaGVtYVBhcnRpY2xlW10gc3BhKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHNwYS5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGEubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgd3JpdGVQYXJ0aWNsZURhdGEoc3BhW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIHJlYWRQYXJ0aWNsZURhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG9ydCBwYXJ0aWNsZVR5cGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCByZXN1bHQ7Ci0gICAgICAgICAgICBpZiAocGFydGljbGVUeXBlICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYVBhcnRpY2xlSW1wbCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7Ci0gICAgICAgICAgICBsb2FkUGFydGljbGUocmVzdWx0LCBwYXJ0aWNsZVR5cGUsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGxvYWRQYXJ0aWNsZShTY2hlbWFQYXJ0aWNsZUltcGwgcmVzdWx0LCBpbnQgcGFydGljbGVUeXBlLCBib29sZWFuIGdsb2JhbCkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvcnQgcGFydGljbGVGbGFncyA9IHJlYWRTaG9ydCgpOwotCi0gICAgICAgICAgICByZXN1bHQuc2V0UGFydGljbGVUeXBlKHBhcnRpY2xlVHlwZSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0TWluT2NjdXJzKHJlYWRCaWdJbnRlZ2VyKCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldE1heE9jY3VycyhyZWFkQmlnSW50ZWdlcigpKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFRyYW5zaXRpb25SdWxlcyhyZWFkUU5hbWVTZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfU0tJUFBBQkxFKSAhPSAwKTsKLQotICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZVR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkU2V0KHJlYWRRTmFtZVNldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkUHJvY2VzcyhyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGxyZXN1bHQgPSAoU2NoZW1hTG9jYWxFbGVtZW50SW1wbClyZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0TmFtZUFuZFR5cGVSZWYocmVhZFFOYW1lKCksIHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldERlZmF1bHQocmVhZFN0cmluZygpLCAocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9GSVhFRCkgIT0gMCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0RGVmYXVsdFZhbHVlKHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXROaWxsYWJsZSgocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9OSUxMQUJMRSkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0QmxvY2soKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tFWFQpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tSRVNUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0JMT0NLU1VCU1QpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldFdzZGxBcnJheVR5cGUocmVhZFNPQVBBcnJheVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0QWJzdHJhY3QoKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfQUJTVFJBQ1QpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBncmVzdWx0ID0gKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKWxyZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVzdWx0LnNldEZpbmFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0ZJTkFMRVhUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0ZJTkFMUkVTVCkgIT0gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE3LCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVzdWx0LnNldFN1YnN0aXR1dGlvbkdyb3VwKChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZilyZWFkSGFuZGxlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzdWJzdEdyb3VwQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RHcm91cENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jlc3VsdC5hZGRTdWJzdGl0dXRpb25Hcm91cE1lbWJlcihyZWFkUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gaWRjcyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW3JlYWRTaG9ydCgpXTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpZGNzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkY3NbaV0gPSAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZilyZWFkSGFuZGxlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXRJZGVudGl0eUNvbnN0cmFpbnRzKGlkY3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFBhcnRpY2xlQ2hpbGRyZW4ocmVhZFBhcnRpY2xlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlVucmVjb2duaXplZCBwYXJ0aWNsZSB0eXBlICIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9QQVJUSUNMRV9UWVBFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQYXJ0aWNsZURhdGEoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKTsKLSAgICAgICAgICAgIHNob3J0IGZsYWdzID0gMDsKLSAgICAgICAgICAgIGlmIChwYXJ0LmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX1NLSVBQQUJMRTsKLSAgICAgICAgICAgIGlmIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IGxwYXJ0ID0gKFNjaGVtYUxvY2FsRWxlbWVudClwYXJ0OwotICAgICAgICAgICAgICAgIGlmIChscGFydC5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9GSVhFRDsKLSAgICAgICAgICAgICAgICBpZiAobHBhcnQuaXNOaWxsYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfTklMTEFCTEU7Ci0gICAgICAgICAgICAgICAgaWYgKGxwYXJ0LmJsb2NrRXh0ZW5zaW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9CTE9DS0VYVDsKLSAgICAgICAgICAgICAgICBpZiAobHBhcnQuYmxvY2tSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfQkxPQ0tSRVNUOwotICAgICAgICAgICAgICAgIGlmIChscGFydC5ibG9ja1N1YnN0aXR1dGlvbigpKQotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfQkxPQ0tTVUJTVDsKLSAgICAgICAgICAgICAgICBpZiAobHBhcnQuaXNBYnN0cmFjdCgpKQotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfQUJTVFJBQ1Q7Ci0KLSAgICAgICAgICAgICAgICBpZiAobHBhcnQgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxFbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBncGFydCA9IChTY2hlbWFHbG9iYWxFbGVtZW50KWxwYXJ0OwotICAgICAgICAgICAgICAgICAgICBpZiAoZ3BhcnQuZmluYWxFeHRlbnNpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9GSU5BTEVYVDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdwYXJ0LmZpbmFsUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9GSU5BTFJFU1Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVTaG9ydChmbGFncyk7Ci0gICAgICAgICAgICB3cml0ZUJpZ0ludGVnZXIocGFydC5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICB3cml0ZUJpZ0ludGVnZXIocGFydC5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lU2V0KHBhcnQuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZVNldChwYXJ0LmdldFdpbGRjYXJkU2V0KCkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHBhcnQuZ2V0V2lsZGNhcmRQcm9jZXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IGxwYXJ0ID0gKFNjaGVtYUxvY2FsRWxlbWVudClwYXJ0OwotICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGxwYXJ0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZShscGFydC5nZXRUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhscGFydC5nZXREZWZhdWx0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdChscGFydC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU09BUEFycmF5VHlwZSgoKFNjaGVtYVdTRExBcnJheVR5cGUpbHBhcnQpLmdldFdTRExBcnJheVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChscGFydCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZ3BhcnQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudClscGFydDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoZ3BhcnQuc3Vic3RpdHV0aW9uR3JvdXAoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lW10gc3Vic3RHcm91cE1lbWJlcnMgPSBncGFydC5zdWJzdGl0dXRpb25Hcm91cE1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoc3Vic3RHcm91cE1lbWJlcnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RHcm91cE1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShzdWJzdEdyb3VwTWVtYmVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBpZGNzID0gbHBhcnQuZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpOwotCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoaWRjcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpZGNzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGlkY3NbaV0pOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQYXJ0aWNsZUFycmF5KHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHBhcnRpY2xlIHR5cGUgIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uQkFEX1BBUlRJQ0xFX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcmVhZFByb3BlcnR5RGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBwcm9wID0gbmV3IFNjaGVtYVByb3BlcnR5SW1wbCgpOwotICAgICAgICAgICAgcHJvcC5zZXROYW1lKHJlYWRRTmFtZSgpKTsKLSAgICAgICAgICAgIHByb3Auc2V0VHlwZVJlZihyZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgIHNob3J0IHByb3BmbGFncyA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgcHJvcC5zZXRBdHRyaWJ1dGUoKHByb3BmbGFncyAmIEZMQUdfUFJPUF9JU0FUVFIpICE9IDApOwotICAgICAgICAgICAgcHJvcC5zZXRDb250YWluZXJUeXBlUmVmKHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgcHJvcC5zZXRNaW5PY2N1cnMocmVhZEJpZ0ludGVnZXIoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldE1heE9jY3VycyhyZWFkQmlnSW50ZWdlcigpKTsKLSAgICAgICAgICAgIHByb3Auc2V0TmlsbGFibGUocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgcHJvcC5zZXREZWZhdWx0KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgIHByb3Auc2V0Rml4ZWQocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgcHJvcC5zZXREZWZhdWx0VGV4dChyZWFkU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBwcm9wLnNldEphdmFQcm9wZXJ0eU5hbWUocmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIHByb3Auc2V0SmF2YVR5cGVDb2RlKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgIHByb3Auc2V0RXh0ZW5kc0phdmEocmVhZFR5cGVSZWYoKSwKLSAgICAgICAgICAgICAgICAgICAgKHByb3BmbGFncyAmIEZMQUdfUFJPUF9KQVZBU0lOR0xFVE9OKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAocHJvcGZsYWdzICYgRkxBR19QUk9QX0pBVkFPUFRJT05BTCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgKHByb3BmbGFncyAmIEZMQUdfUFJPUF9KQVZBQVJSQVkpICE9IDApOwotICAgICAgICAgICAgcHJvcC5zZXRKYXZhU2V0dGVyRGVsaW1pdGVyKHJlYWRRTmFtZVNldCgpKTsKLSAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKLSAgICAgICAgICAgICAgICBwcm9wLnNldERlZmF1bHRWYWx1ZShyZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0KLSAgICAgICAgICAgIGlmICghcHJvcC5pc0F0dHJpYnV0ZSgpICYmIGF0TGVhc3QoMiwgMTcsIDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNob3J0IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBMaW5rZWRIYXNoU2V0IHFuYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0KHNpemUpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNpemUgOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lcy5hZGQocmVhZFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIHByb3Auc2V0QWNjZXB0ZWROYW1lcyhxbmFtZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvcC5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBwcm9wOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVByb3BlcnR5RGF0YShTY2hlbWFQcm9wZXJ0eSBwcm9wKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lKHByb3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZShwcm9wLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KChwcm9wLmlzQXR0cmlidXRlKCkgPyBGTEFHX1BST1BfSVNBVFRSIDogMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAocHJvcC5leHRlbmRzSmF2YVNpbmdsZXRvbigpID8gRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gOiAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChwcm9wLmV4dGVuZHNKYXZhT3B0aW9uKCkgPyBGTEFHX1BST1BfSkFWQU9QVElPTkFMIDogMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAocHJvcC5leHRlbmRzSmF2YUFycmF5KCkgPyBGTEFHX1BST1BfSkFWQUFSUkFZIDogMCkpOwotICAgICAgICAgICAgd3JpdGVUeXBlKHByb3AuZ2V0Q29udGFpbmVyVHlwZSgpKTsKLSAgICAgICAgICAgIHdyaXRlQmlnSW50ZWdlcihwcm9wLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgIHdyaXRlQmlnSW50ZWdlcihwcm9wLmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocHJvcC5oYXNOaWxsYWJsZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocHJvcC5oYXNEZWZhdWx0KCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChwcm9wLmhhc0ZpeGVkKCkpOwotICAgICAgICAgICAgd3JpdGVTdHJpbmcocHJvcC5nZXREZWZhdWx0VGV4dCgpKTsKLQotICAgICAgICAgICAgd3JpdGVTdHJpbmcocHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChwcm9wLmdldEphdmFUeXBlQ29kZSgpKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZShwcm9wLmphdmFCYXNlZE9uVHlwZSgpKTsKLSAgICAgICAgICAgIHdyaXRlUU5hbWVTZXQocHJvcC5nZXRKYXZhU2V0dGVyRGVsaW1pdGVyKCkpOwotICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdChwcm9wLmdldERlZmF1bHRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgaWYgKCEgcHJvcC5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lW10gbmFtZXMgPSBwcm9wLmFjY2VwdGVkTmFtZXMoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KG5hbWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbmFtZXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKG5hbWVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVNb2RlbEdyb3VwRGF0YShTY2hlbWFNb2RlbEdyb3VwIGdycCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTW9kZWxHcm91cEltcGwgaW1wbCA9IChTY2hlbWFNb2RlbEdyb3VwSW1wbClncnA7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lKGltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKGltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChpbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwgPyAxIDogMCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGltcGwuaXNSZWRlZmluaXRpb24oKSA/IDEgOiAwKTsgLy8gbmV3IGZvciB2ZXJzaW9uIDIuMTUKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKGltcGwuZ2V0UGFyc2VPYmplY3QoKS54bWxUZXh0KG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZU91dGVyKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVBdHRyaWJ1dGVHcm91cERhdGEoU2NoZW1hQXR0cmlidXRlR3JvdXAgZ3JwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgaW1wbCA9IChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwpZ3JwOwotICAgICAgICAgICAgd3JpdGVRTmFtZShpbXBsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhpbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoaW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsID8gMSA6IDApOwotICAgICAgICAgICAgd3JpdGVTaG9ydChpbXBsLmlzUmVkZWZpbml0aW9uKCkgPyAxIDogMCk7IC8vIG5ldyBmb3IgdmVyc2lvbiAyLjE1Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhpbXBsLmdldFBhcnNlT2JqZWN0KCkueG1sVGV4dChuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVPdXRlcigpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxWYWx1ZVJlZiByZWFkWG1sVmFsdWVPYmplY3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlLlJlZiB0eXBlcmVmID0gcmVhZFR5cGVSZWYoKTsKLSAgICAgICAgICAgIGlmICh0eXBlcmVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpbnQgYnRjID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCBudWxsKTsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHZhbHVlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChyZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCByZWFkQnl0ZUFycmF5KCkpOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIHJlYWRRTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgbmV3IERvdWJsZShyZWFkRG91YmxlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVYbWxWYWx1ZU9iamVjdChYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlKTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBTY2hlbWFUeXBlIGlUeXBlID0gKChTaW1wbGVWYWx1ZSl2YWx1ZSkuaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoaVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KC0xKTsKLSAgICAgICAgICAgICAgICBMaXN0IHZhbHVlcyA9ICgoWG1sT2JqZWN0QmFzZSl2YWx1ZSkueGdldExpc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodmFsdWVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KChYbWxBbnlTaW1wbGVUeXBlKWkubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGJ0YyA9IGlUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGJ0Yyk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChidGMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcodmFsdWUuZ2V0U3RyaW5nVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ5dGVBcnJheSgoKFNpbXBsZVZhbHVlKXZhbHVlKS5nZXRCeXRlQXJyYXlWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKCgoU2ltcGxlVmFsdWUpdmFsdWUpLmdldFFOYW1lVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVEb3VibGUoKChTaW1wbGVWYWx1ZSl2YWx1ZSkuZ2V0RmxvYXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVEb3VibGUoKChTaW1wbGVWYWx1ZSl2YWx1ZSkuZ2V0RG91YmxlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkb3VibGUgcmVhZERvdWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZERvdWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX291dHB1dC53cml0ZURvdWJsZShkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBRTmFtZVNldCByZWFkUU5hbWVTZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG9ydCBmbGFnID0gcmVhZFNob3J0KCk7Ci0KLSAgICAgICAgICAgIFNldCB1cmlTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgc2hvcnQgdXJpQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB1cmlTZXQuYWRkKHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIFNldCBxbmFtZVNldDEgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgc2hvcnQgcW5jb3VudDEgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5jb3VudDE7IGkrKykKLSAgICAgICAgICAgICAgICBxbmFtZVNldDEuYWRkKHJlYWRRTmFtZSgpKTsKLQotICAgICAgICAgICAgU2V0IHFuYW1lU2V0MiA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBzaG9ydCBxbmNvdW50MiA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmNvdW50MjsgaSsrKQotICAgICAgICAgICAgICAgIHFuYW1lU2V0Mi5hZGQocmVhZFFOYW1lKCkpOwotCi0gICAgICAgICAgICBpZiAoZmxhZyA9PSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKHVyaVNldCwgbnVsbCwgcW5hbWVTZXQxLCBxbmFtZVNldDIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKG51bGwsIHVyaVNldCwgcW5hbWVTZXQyLCBxbmFtZVNldDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVFOYW1lU2V0KFFOYW1lU2V0IHNldCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpbnZlcnQgPSAoc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChpbnZlcnQgPyAxIDogMCk7Ci0KLSAgICAgICAgICAgIFNldCB1cmlTZXQgPSBpbnZlcnQgPyBzZXQuZXhjbHVkZWRVUklzKCkgOiBzZXQuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHVyaVNldC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdXJpU2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoKFN0cmluZylpLm5leHQoKSk7Ci0KLSAgICAgICAgICAgIFNldCBxbmFtZVNldDEgPSBpbnZlcnQgPyBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpIDogc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocW5hbWVTZXQxLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZVNldDEuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKChRTmFtZSlpLm5leHQoKSk7Ci0KLSAgICAgICAgICAgIFNldCBxbmFtZVNldDIgPSBpbnZlcnQgPyBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpIDogc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocW5hbWVTZXQyLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZVNldDIuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKChRTmFtZSlpLm5leHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gcmVhZEJ5dGVBcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNob3J0IGxlbiA9IF9pbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuXTsKLSAgICAgICAgICAgICAgICBfaW5wdXQucmVhZEZ1bGx5KHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUJ5dGVBcnJheShieXRlW10gYmEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYmEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LndyaXRlKGJhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQmlnSW50ZWdlciByZWFkQmlnSW50ZWdlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSByZWFkQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5PTkU7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVCaWdJbnRlZ2VyKEJpZ0ludGVnZXIgYmkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiaSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChiaS5zaWdudW0oKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlQnl0ZUFycmF5KFNJTkdMRV9aRVJPX0JZVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlQnl0ZUFycmF5KGJpLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgYnl0ZVtdIFNJTkdMRV9aRVJPX0JZVEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpMCB9OwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckhhbmRsZShTdHJpbmcgaGFuZGxlKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChfcmVzb2x2ZWRIYW5kbGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpX3Jlc29sdmVkSGFuZGxlcy5nZXQoaGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlZiA9IChTY2hlbWFUeXBlLlJlZilfdHlwZVJlZnNCeUNsYXNzbmFtZS5nZXQoY2xhc3NuYW1lKTsKLSAgICAgICAgcmV0dXJuIChyZWYgIT0gbnVsbCkgPyByZWYuZ2V0KCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQgcmVzb2x2ZUhhbmRsZShTdHJpbmcgaGFuZGxlKQotICAgIHsKLSAgICAgICAgU2NoZW1hQ29tcG9uZW50IHJlc3VsdDsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKF9yZXNvbHZlZEhhbmRsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFDb21wb25lbnQpX3Jlc29sdmVkSGFuZGxlcy5nZXQoaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhzYlJlYWRlciByZWFkZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSwgLTEpOwotICAgICAgICAgICAgaW50IGZpbGV0eXBlID0gcmVhZGVyLmdldEFjdHVhbEZpbGV0eXBlKCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZpbGV0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BVFlQRToKLSAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIHR5cGUgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIGVsZW1lbnQgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgYXR0cmlidXRlIGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIG1vZGVsIGdyb3VwIGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nTW9kZWxHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOgotICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgYXR0cmlidXRlIGdyb3VwIGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nQXR0cmlidXRlR3JvdXAoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFJREVOVElUWUNPTlNUUkFJTlQ6Ci0gICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyBpZCBjb25zdHJhaW50IGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nSWRlbnRpdHlDb25zdHJhaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklsbGVnYWwgaGFuZGxlIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3luY2hyb25pemVkIChfcmVzb2x2ZWRIYW5kbGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghX3Jlc29sdmVkSGFuZGxlcy5jb250YWluc0tleShoYW5kbGUpKQotICAgICAgICAgICAgICAgICAgICBfcmVzb2x2ZWRIYW5kbGVzLnB1dChoYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hQ29tcG9uZW50KV9yZXNvbHZlZEhhbmRsZXMuZ2V0KGhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcCBfcmVzb2x2ZWRIYW5kbGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2FsbE5vbkdyb3VwSGFuZGxlc1Jlc29sdmVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKLSAgICB7Ci0gICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmUgY2FsbGVkIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgMCk7Ci0gICAgICAgIGlmIChfYWxsTm9uR3JvdXBIYW5kbGVzUmVzb2x2ZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIGFsbCBoYW5kbGVzIGZvciB0eXBlIHN5c3RlbSAiICsgX25hbWUsIDEpOwotCi0gICAgICAgIExpc3QgcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcmVmcy5hZGRBbGwoX2dsb2JhbEVsZW1lbnRzLnZhbHVlcygpKTsKLSAgICAgICAgcmVmcy5hZGRBbGwoX2dsb2JhbEF0dHJpYnV0ZXMudmFsdWVzKCkpOwotICAgICAgICByZWZzLmFkZEFsbChfZ2xvYmFsVHlwZXMudmFsdWVzKCkpOwotICAgICAgICByZWZzLmFkZEFsbChfZG9jdW1lbnRUeXBlcy52YWx1ZXMoKSk7Ci0gICAgICAgIHJlZnMuYWRkQWxsKF9hdHRyaWJ1dGVUeXBlcy52YWx1ZXMoKSk7Ci0gICAgICAgIHJlZnMuYWRkQWxsKF9pZGVudGl0eUNvbnN0cmFpbnRzLnZhbHVlcygpKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZWZzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgcmVmID0gKFNjaGVtYUNvbXBvbmVudC5SZWYpaS5uZXh0KCk7Ci0gICAgICAgICAgICByZWYuZ2V0Q29tcG9uZW50KCk7IC8vIEZvcmNlcyByZWYgdG8gYmUgcmVzb2x2ZWQKLSAgICAgICAgfQotCi0gICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIkZpbmlzaGVkIHJlc29sdmluZyB0eXBlIHN5c3RlbSAiICsgX25hbWUsIC0xKTsKLSAgICAgICAgX2FsbE5vbkdyb3VwSGFuZGxlc1Jlc29sdmVkID0gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRGVmaW5lZChTdHJpbmcgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lc3BhY2VzLmNvbnRhaW5zKG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUuUmVmKV9nbG9iYWxUeXBlcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmREb2N1bWVudFR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hVHlwZS5SZWYpX2RvY3VtZW50VHlwZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kQXR0cmlidXRlVHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlLlJlZilfYXR0cmlidXRlVHlwZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBmaW5kRWxlbWVudFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZilfZ2xvYmFsRWxlbWVudHMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIGZpbmRBdHRyaWJ1dGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZilfZ2xvYmFsQXR0cmlidXRlcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYU1vZGVsR3JvdXAuUmVmKV9tb2RlbEdyb3Vwcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBmaW5kQXR0cmlidXRlR3JvdXBSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKV9hdHRyaWJ1dGVHcm91cHMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZilfaWRlbnRpdHlDb25zdHJhaW50cy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBnbG9iYWxUeXBlcygpCi0gICAgewotICAgICAgICBpZiAoX2dsb2JhbFR5cGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVF9BUlJBWTsKLQotICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX2dsb2JhbFR5cGVzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2dsb2JhbFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYVR5cGUuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIHJlZGVmaW5lZEdsb2JhbFR5cGVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVkZWZpbmVkR2xvYmFsVHlwZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfcmVkZWZpbmVkR2xvYmFsVHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcmVkZWZpbmVkR2xvYmFsVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZS5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTb3VyY2VBc1N0cmVhbShTdHJpbmcgc291cmNlTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICghc291cmNlTmFtZS5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgICAgICBzb3VyY2VOYW1lID0gIi8iICsgc291cmNlTmFtZTsKLQotICAgICAgICByZXR1cm4gX3Jlc291cmNlTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oInNjaGVtYS9zcmMiICsgc291cmNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBkb2N1bWVudFR5cGVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZG9jdW1lbnRUeXBlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW19kb2N1bWVudFR5cGVzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2RvY3VtZW50VHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZS5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gYXR0cmlidXRlVHlwZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9hdHRyaWJ1dGVUeXBlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW19hdHRyaWJ1dGVUeXBlcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9hdHRyaWJ1dGVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBnbG9iYWxFbGVtZW50cygpCi0gICAgewotICAgICAgICBpZiAoX2dsb2JhbEVsZW1lbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9HRV9BUlJBWTsKLQotICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50W10gcmVzdWx0ID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRbX2dsb2JhbEVsZW1lbnRzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2dsb2JhbEVsZW1lbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gZ2xvYmFsQXR0cmlidXRlcygpCi0gICAgewotICAgICAgICBpZiAoX2dsb2JhbEF0dHJpYnV0ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0dBX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbX2dsb2JhbEF0dHJpYnV0ZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZ2xvYmFsQXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfbW9kZWxHcm91cHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01HX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBbXSByZXN1bHQgPSBuZXcgU2NoZW1hTW9kZWxHcm91cFtfbW9kZWxHcm91cHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfbW9kZWxHcm91cHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hTW9kZWxHcm91cC5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwW10gcmVkZWZpbmVkTW9kZWxHcm91cHMoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZWRlZmluZWRNb2RlbEdyb3Vwcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfTUdfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hTW9kZWxHcm91cFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwW19yZWRlZmluZWRNb2RlbEdyb3Vwcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9yZWRlZmluZWRNb2RlbEdyb3Vwcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFNb2RlbEdyb3VwLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gYXR0cmlidXRlR3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfYXR0cmlidXRlR3JvdXBzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9BR19BUlJBWTsKLQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtfYXR0cmlidXRlR3JvdXBzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2F0dHJpYnV0ZUdyb3Vwcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIHJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcygpCi0gICAgewotICAgICAgICBpZiAoX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfQUdfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSByZXN1bHQgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBbX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gaWRlbnRpdHlDb25zdHJhaW50cygpCi0gICAgewotICAgICAgICBpZiAoX2lkZW50aXR5Q29uc3RyYWludHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lDX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbX2lkZW50aXR5Q29uc3RyYWludHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaWRlbnRpdHlDb25zdHJhaW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jbGFzc2xvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIElOVEVSTkFMTFkgT05MWSBieSB0aGUgY29kZSBnZW5lcmF0b3IgQUZURVIgdGhlIHR5cGUgc3lzdGVtIGhhcwotICAgICAqIGJlZW4gc2F2ZWQgYW5kIGEgaGFuZGxlIGhhcyBiZWVuIGVzdGFibGlzaGVkIGZvciBlYWNoIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBoYW5kbGVGb3JUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvclR5cGUodHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtRm9yTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfbmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKF9uYW1lKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVWaXNpdG9ySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVZpc2l0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYmRiNDAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVZpc2l0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVmlzaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGhpcyBzdGF0ZSBtYWNoaW5lIHZhbGlkYXRlcyBlbGVtZW50IG9yZGVyIGJhc2VkIG9uIGEgZGV0ZXJtaW5pc3RpYwotICogY29udGVudCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVWaXNpdG9ySW1wbCBpbXBsZW1lbnRzIFR5cGVTdG9yZVZpc2l0b3IKLXsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgaXQgYnkgcGFzc2luZyB0aGUgcm9vdCBvZiB0aGUgY29udGVudCBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgewotICAgICAgICBpbml0KHBhcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlVmlzaXRvckltcGwoKQotICAgIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhY2sgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0YWNrID0gZXhwYW5kKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChfcm9sbGJhY2sgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3JvbGxiYWNrID0gZXhwYW5kKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgX3N0YWNrU2l6ZSA9IDA7Ci0gICAgICAgIF9yb2xsYmFja1NpemUgPSAwOwotCi0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2gocGFydCk7Ci0gICAgICAgICAgICBfcm9sbGJhY2tJbmRleCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlzaXRvclN0YXRlW10gZXhwYW5kKFZpc2l0b3JTdGF0ZVtdIG9yaWcpCi0gICAgewotICAgICAgICBpbnQgbmV3c2l6ZSA9IChvcmlnID09IG51bGwgPyA0IDogb3JpZy5sZW5ndGggKiAyKTsKLSAgICAgICAgVmlzaXRvclN0YXRlW10gcmVzdWx0ID0gbmV3IFZpc2l0b3JTdGF0ZVtuZXdzaXplXTsKLSAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgcmVzdWx0LCAwLCBvcmlnLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAob3JpZyA9PSBudWxsID8gMCA6IG9yaWcubGVuZ3RoKTsgaSA8IG5ld3NpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IFZpc2l0b3JTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0KLSAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbiBQUk9CRV9WQUxJRElUWSA9IHRydWU7Ci0gICAgZmluYWwgc3RhdGljIGJvb2xlYW4gQ0hFQ0tfVkFMSURJVFkgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgVmlzaXRvclN0YXRlW10gX3N0YWNrOwotICAgIHByaXZhdGUgVmlzaXRvclN0YXRlW10gX3JvbGxiYWNrOwotICAgIGludCBfc3RhY2tTaXplOwotICAgIGludCBfcm9sbGJhY2tTaXplOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNWYWxpZDsKLSAgICBwcml2YXRlIFNjaGVtYVBhcnRpY2xlIF9tYXRjaGVkUGFydGljbGU7Ci0gICAgcHJpdmF0ZSBWaXNpdG9yU3RhdGUgX3RvcDsKLSAgICBwcml2YXRlIGludCBfcm9sbGJhY2tJbmRleDsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZpc2l0b3JTdGF0ZQotICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgY29weShWaXNpdG9yU3RhdGUgb3JpZykKLSAgICAgICAgewotICAgICAgICAgICAgX2N1clBhcnQgPSBvcmlnLl9jdXJQYXJ0OwotICAgICAgICAgICAgX2N1ckNvdW50ID0gb3JpZy5fY3VyQ291bnQ7Ci0gICAgICAgICAgICBfY3VyTWluID0gb3JpZy5fY3VyTWluOwotICAgICAgICAgICAgX2N1ck1heCA9IG9yaWcuX2N1ck1heDsKLSAgICAgICAgICAgIF9wcm9jZXNzZWRDaGlsZENvdW50ID0gb3JpZy5fcHJvY2Vzc2VkQ2hpbGRDb3VudDsKLSAgICAgICAgICAgIF9jaGlsZENvdW50ID0gb3JpZy5fY2hpbGRDb3VudDsKLSAgICAgICAgICAgIF9zZWVuID0gb3JpZy5fc2VlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGluaXQoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgX2N1clBhcnQgPSBwYXJ0OwotICAgICAgICAgICAgX2N1ck1pbiA9IHBhcnQuZ2V0SW50TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICBfY3VyTWF4ID0gcGFydC5nZXRJbnRNYXhPY2N1cnMoKTsKLSAgICAgICAgICAgIF9jdXJDb3VudCA9IDA7Ci0gICAgICAgICAgICBfcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICBfY2hpbGRDb3VudCA9IHBhcnQuY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsKLSAgICAgICAgICAgIF9zZWVuID0gcGFydC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwgPwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xlYW5bX2NoaWxkQ291bnRdIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIF9jdXJQYXJ0OwotICAgICAgICBpbnQgX2N1ckNvdW50OwotICAgICAgICBpbnQgX2N1ck1heDsKLSAgICAgICAgaW50IF9jdXJNaW47Ci0gICAgICAgIGludCBfcHJvY2Vzc2VkQ2hpbGRDb3VudDsKLSAgICAgICAgaW50IF9jaGlsZENvdW50OwotICAgICAgICBib29sZWFuW10gX3NlZW47Ci0gICAgfQotCi0gICAgVmlzaXRvclN0YXRlIHRvcFJlZigpCi0gICAgewotICAgICAgICByZXR1cm4gX3N0YWNrW19zdGFja1NpemUgLSAxXTsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVDb3B5KFZpc2l0b3JTdGF0ZSByZWYpCi0gICAgewotICAgICAgICBpZiAoX3JvbGxiYWNrLmxlbmd0aCA9PSBfcm9sbGJhY2tTaXplKQotICAgICAgICAgICAgX3JvbGxiYWNrID0gZXhwYW5kKF9yb2xsYmFjayk7Ci0KLSAgICAgICAgX3JvbGxiYWNrW19yb2xsYmFja1NpemVdLmNvcHkocmVmKTsKLSAgICAgICAgX3JvbGxiYWNrU2l6ZSArPSAxOwotICAgIH0KLQotICAgIHZvaWQgYWRkUGFydGljbGUoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhY2subGVuZ3RoID09IF9zdGFja1NpemUpCi0gICAgICAgICAgICBfc3RhY2sgPSBleHBhbmQoX3N0YWNrKTsKLSAgICAgICAgX3N0YWNrW19zdGFja1NpemVdLmluaXQocGFydCk7Ci0gICAgICAgIF9zdGFja1NpemUgKz0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCkKLSAgICAgKiB0b3A6ICAgICAgbnVsbCBvciBkaXNjYXJkYWJsZSBkdWUgdG8gcG9wIGluIHByb2dyZXNzCi0gICAgICogcm9sbGJhY2s6IChSOCBSNyBSNiBSNSkgKGVtcHR5IGF0IHRoZSBzdGFydCBvZiAidmlzaXQiKQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzKQotICAgICAqIHRvcDogICAgICBENCA9IG11dGFibGUgY29weSBvZiBSNAotICAgICAqIHJvbGxiYWNrICAoUjggUjcgUjYgUjUgUjQpCi0gICAgICovCi0gICAgYm9vbGVhbiBwcmVwYXJlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcm9sbGJhY2tJbmRleCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9wID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIF90b3AgPSB0b3BSZWYoKTsKLSAgICAgICAgc2F2ZUNvcHkoX3RvcCk7Ci0gICAgICAgIF9yb2xsYmFja0luZGV4ID0gX3N0YWNrU2l6ZSAtIDE7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZWNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2KQotICAgICAqIHRvcDogICAgICBENwotICAgICAqIHJvbGxiYWNrOiAoUjggUjcgUjYgUjUpCi0gICAgICoKLSAgICAgKiBQb3N0Y29uZGl0aW9uOgotICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUgRDYgRDcpCi0gICAgICogdG9wOiAgICAgIEQ4ID0gbmV3IHN0YXRlIGJhc2VkIG9uIHBhcnQKLSAgICAgKiByb2xsYmFjayAgKFI4IFI3IFI2IFI1KQotICAgICAqLwotICAgIHZvaWQgcHVzaChTY2hlbWFQYXJ0aWNsZSBwYXJ0KQotICAgIHsKLSAgICAgICAgYWRkUGFydGljbGUocGFydCk7Ci0gICAgICAgIF90b3AgPSB0b3BSZWYoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENikKLSAgICAgKiB0b3A6ICAgICAgRDcgaXMgZGlzY2FyZGFibGUKLSAgICAgKiByb2xsYmFjazogKFI4IFI3IFI2IFI1KQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1KQotICAgICAqIHRvcDogICAgICBENiAoc2VlIHByZXBhcmUgaW4gY2FzZSBpdCdzIGFuIFIgc3RhdGUpCi0gICAgICogcm9sbGJhY2sgIChSOCBSNyBSNiBSNSkKLSAgICAgKi8KLSAgICBib29sZWFuIHBvcCgpCi0gICAgewotICAgICAgICBfc3RhY2tTaXplIC09IDE7Ci0gICAgICAgIGlmIChfc3RhY2tTaXplIDw9IF9yb2xsYmFja0luZGV4KQotICAgICAgICAgICAgcmV0dXJuIHByZXBhcmUoKTsKLSAgICAgICAgX3RvcCA9IHRvcFJlZigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENikKLSAgICAgKiB0b3A6ICAgICAgRDcKLSAgICAgKiByb2xsYmFjazogKFI4IFI3IFI2IFI1KQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2IEQ3KSAtPiBhbmQgcmVuYW1lIHRvIEQncyB0byBSJ3MKLSAgICAgKiB0b3A6ICAgICAgbnVsbAotICAgICAqIHJvbGxiYWNrICAoKQotICAgICAqLwotICAgIHZvaWQgY29tbWl0KCkKLSAgICB7Ci0gICAgICAgIF90b3AgPSBudWxsOwotICAgICAgICBfcm9sbGJhY2tJbmRleCA9IF9zdGFja1NpemU7Ci0gICAgICAgIF9yb2xsYmFja1NpemUgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZWNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2KQotICAgICAqIHRvcDogICAgICBENyBpcyBkaXNjYXJkYWJsZQotICAgICAqIHJvbGxiYWNrOiAoUjggUjcgUjYgUjUpCi0gICAgICoKLSAgICAgKiBQb3N0Y29uZGl0aW9uOgotICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgUjUgUjYgUjcgUjgpCi0gICAgICogdG9wOiAgICAgIG51bGwKLSAgICAgKiByb2xsYmFjayAgKCkKLSAgICAgKi8KLSAgICB2b2lkIHJvbGxiYWNrKCkKLSAgICB7Ci0gICAgICAgIHdoaWxlIChfcm9sbGJhY2tTaXplID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX3JvbGxiYWNrU2l6ZSAtPSAxOwotICAgICAgICAgICAgVmlzaXRvclN0YXRlIHRlbXAgPSBfc3RhY2tbX3JvbGxiYWNrSW5kZXhdOwotICAgICAgICAgICAgX3N0YWNrW19yb2xsYmFja0luZGV4XSA9IF9yb2xsYmFja1tfcm9sbGJhY2tTaXplXTsKLSAgICAgICAgICAgIF9yb2xsYmFja1tfcm9sbGJhY2tTaXplXSA9IHRlbXA7Ci0gICAgICAgICAgICBfcm9sbGJhY2tJbmRleCArPSAxOwotICAgICAgICB9Ci0gICAgICAgIF9zdGFja1NpemUgPSBfcm9sbGJhY2tJbmRleDsKLSAgICAgICAgX3RvcCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBubyB2YWxpZCBuZXh0IHN0YXRlIGNhbiBiZSBmb3VuZCwgdGhlbiAibm90VmFsaWQiCi0gICAgICogaXMgcmV0dXJuZWQuIEl0IHJvbGxzIGJhY2sgYW55IGNoYW5nZXMgdG8gdGhlIHN0YXRlCi0gICAgICogbWFjaGluZSBzdGFjaywgc2V0cyB0byBmYWxzZSB0aGUgdmFsaWQgYml0LCBhbmQgY2xlYXJzCi0gICAgICogdGhlIG1hdGNoZWQgZWxlbWVudCBzdGF0ZSBiZWZvcmUgcmV0dXJuaW5nIGZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gbm90VmFsaWQoKQotICAgIHsKLSAgICAgICAgX2lzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgX21hdGNoZWRQYXJ0aWNsZSA9IG51bGw7Ci0gICAgICAgIHJvbGxiYWNrKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGEgdmFsaWQgc3RhdGUgdHJhbnNpdGlvbiBoYXMgYmVlbiBkb25lLCB0aGVuICJvayIKLSAgICAgKiBpcyByZXR1cm5lZC4gSXQgY29tbWl0cyB0aGUgY2hhbmdlZCBzdGF0ZSBtYWNoaW5lIHN0YXRlLAotICAgICAqIHN0b3JlcyB0aGUgbWF0Y2hlZCBlbGVtZW50IHN0YXRlLCBhbmQgcmV0dXJucyB0cnVlLgotICAgICAqLwotICAgIGJvb2xlYW4gb2soU2NoZW1hUGFydGljbGUgcGFydCwgYm9vbGVhbiB0ZXN0VmFsaWRpdHkpCi0gICAgewotICAgICAgICBpZiAoICEgdGVzdFZhbGlkaXR5ICkKLSAgICAgICAgewotICAgICAgICAgICAgX21hdGNoZWRQYXJ0aWNsZSA9IHBhcnQ7Ci0gICAgICAgICAgICBjb21taXQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJvbGxiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyo9PSBWSVNJVE9SIElNUExFTUVOVEFUSU9OID09Ki8KLQotICAgIC8qKgotICAgICAqIFRyYXZlcnNlcyBhIGRldGVybWluaXN0aWMgY29udGVudCBtb2RlbCwgY2hlY2tpbmcgZm9yCi0gICAgICogdmFsaWRpdHkgYXQgYW55IGdpdmVuIHBvaW50LgotICAgICAqCi0gICAgICogQ2FsbCB2aXNpdChudWxsKSBvbmNlIGF0IHRoZSBlbmQgaWYgeW91J3JlIGNoZWNraW5nIGZvcgotICAgICAqIGNvbXBsZXRlIHZhbGlkaXR5IG9mIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciB0aGUgYWN0dWFsIHZpc2l0IGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KFFOYW1lIGVsdE5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHZpc2l0KGVsdE5hbWUsIENIRUNLX1ZBTElESVRZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIHRoYXQKLSAgICAgKiB0cmF2ZXJzZXMgYSBkZXRlcm1pbmlzdGljIGNvbnRlbnQgbW9kZWwsIGNoZWNraW5nIGZvcgotICAgICAqIHZhbGlkaXR5IGF0IGFueSBnaXZlbiBwb2ludC4KLSAgICAgKgotICAgICAqIFdoZW4gdGVzdFZhbGlkaXR5IGlzIGZhbHNlIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBjaGFuZ2Ugc3RhdGVzCi0gICAgICogaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdmFsaWQKLSAgICAgKgotICAgICAqIFdoZW4gdGVzdFZhbGlkaXR5IGlzIHRydWUgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBjaGFuZ2Ugc3RhdGVzCi0gICAgICogYW5kIHdpbGwgcmV0dXJuIGlmIGEgcGFydGljdWxhciBzdGF0ZSBpcyB2YWxpZCBvciBpbnZhbGlkCi0gICAgICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChRTmFtZSBlbHROYW1lICxib29sZWFuIHRlc3RWYWxpZGl0eSkKLSAgICB7Ci0gICAgICAgIGlmICghcHJlcGFyZSgpKQotICAgICAgICAgICAgcmV0dXJuIG5vdFZhbGlkKCk7Ci0KLSAgICAgICAgdHJhdmVyc2luZzogZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKF90b3AuX2N1ckNvdW50ID49IF90b3AuX2N1ck1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBvcCgpKQotICAgICAgICAgICAgICAgICAgICBicmVhayB0cmF2ZXJzaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtaW5tYXg6IHN3aXRjaCAoX3RvcC5fY3VyUGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfdG9wLl9jdXJQYXJ0LmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2soX3RvcC5fY3VyUGFydCwgdGVzdFZhbGlkaXR5KTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfdG9wLl9jdXJQYXJ0LmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2soX3RvcC5fY3VyUGFydCwgdGVzdFZhbGlkaXR5KTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50OyBpIDwgX3RvcC5fY2hpbGRDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjYW5kaWRhdGUgPSBfdG9wLl9jdXJQYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goY2FuZGlkYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cmF2ZXJzaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCAhPSAwIHx8IF90b3AuX2N1ckNvdW50IDwgX3RvcC5fY3VyTWluKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBtaW5tYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX3RvcC5fY3VyQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRyYXZlcnNpbmc7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdG9wLl9jaGlsZENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGNhbmRpZGF0ZSA9IF90b3AuX2N1clBhcnQuZ2V0UGFydGljbGVDaGlsZChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuY2FuU3RhcnRXaXRoRWxlbWVudChlbHROYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goY2FuZGlkYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cmF2ZXJzaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbiAmJiAhX3RvcC5fY3VyUGFydC5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdFZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotCi0gICAgICAgICAgICAgICAgICAgIGludCBza2lwcGVkID0gX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgYWxsc2NhbjogZm9yIChpbnQgaSA9IDA7IGkgPCBfdG9wLl9jaGlsZENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9zZWVuW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGFsbHNjYW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGNhbmRpZGF0ZSA9IF90b3AuX2N1clBhcnQuZ2V0UGFydGljbGVDaGlsZChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuY2FuU3RhcnRXaXRoRWxlbWVudChlbHROYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvcC5fc2VlbltpXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChjYW5kaWRhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRyYXZlcnNpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjYW5kaWRhdGUuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgPCBfdG9wLl9jaGlsZENvdW50KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fY3VyQ291bnQgPCBfdG9wLl9jdXJNaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdFZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBtaW5tYXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX3RvcC5fY3VyQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5maWxsKF90b3AuX3NlZW4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJhdmVyc2luZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc29tZWJvZHkgY2FsbGVkICJicmVhayBtaW5tYXgiLCBzbyBwb3Agb3V0IG9mIGxvb3AKLSAgICAgICAgICAgIGlmICghcG9wKCkpCi0gICAgICAgICAgICAgICAgYnJlYWsgdHJhdmVyc2luZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgb3V0ZXJtb3N0IGxvb3AKLSAgICAgICAgaWYgKGVsdE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBvayhudWxsLCB0ZXN0VmFsaWRpdHkpOwotCi0gICAgICAgIC8vIHRoaXMgbWVhbnMgd2UgaGF2ZSBleHRyYSBlbGVtZW50cyBhdCB0aGUgZW5kCi0gICAgICAgIHJldHVybiBub3RWYWxpZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRlc3RWYWxpZChRTmFtZSBlbHROYW1lKQotICAgIHsKLSAgICAgIHJldHVybiB2aXNpdChlbHROYW1lLFBST0JFX1ZBTElESVRZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGVsZW1lbnRmbGFncwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0X2VsZW1lbnRmbGFncygpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFBhcnRpY2xlKCkgPT0gbnVsbCB8fCBjdXJyZW50UGFydGljbGUoKS5nZXRQYXJ0aWNsZVR5cGUoKSAhPSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IGVsdCA9IChTY2hlbWFMb2NhbEVsZW1lbnQpY3VycmVudFBhcnRpY2xlKCk7Ci0KLSAgICAgICAgcmV0dXJuIChlbHQuaXNOaWxsYWJsZSgpID8gVHlwZVN0b3JlLk5JTExBQkxFIDogMCkgfAotICAgICAgICAgICAgICAgKGVsdC5pc0RlZmF1bHQoKSA/IFR5cGVTdG9yZS5IQVNERUZBVUxUIDogMCkgfAotICAgICAgICAgICAgICAgKGVsdC5pc0ZpeGVkKCkgPyBUeXBlU3RvcmUuRklYRUQgOiAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGRlZmF1bHQgdGV4dAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0X2RlZmF1bHRfdGV4dCgpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFBhcnRpY2xlKCkgPT0gbnVsbCB8fCBjdXJyZW50UGFydGljbGUoKS5nZXRQYXJ0aWNsZVR5cGUoKSAhPSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuICgoU2NoZW1hTG9jYWxFbGVtZW50KWN1cnJlbnRQYXJ0aWNsZSgpKS5nZXREZWZhdWx0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNjaGVtYSBmaWVsZCBmb3IgdGhpcyBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hRmllbGQgZ2V0X3NjaGVtYV9maWVsZCgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRQYXJ0aWNsZSgpIGluc3RhbmNlb2YgU2NoZW1hRmllbGQpCi0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYUZpZWxkKWN1cnJlbnRQYXJ0aWNsZSgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzY2hlbWEgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFQYXJ0aWNsZSBjdXJyZW50UGFydGljbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9tYXRjaGVkUGFydGljbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRpcmUgY29udGVudCB1cCB0byBub3cgaXMgdmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxWYWxpZCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2lzVmFsaWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NoZWNrZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGRhZWMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NzMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhCZWFuRGVidWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1wdWJsaWMgY2xhc3MgU3RzY0NoZWNrZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBbGwoKQotICAgIHsKLSAgICAgICAgLy8gd2FsayB0aGUgdHJlZSBvZiB0eXBlcwotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLnJlZGVmaW5lZEdsb2JhbFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBnVHlwZSA9IChTY2hlbWFUeXBlKWFsbFNlZW5UeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoIXN0YXRlLm5vUHZyKCkgJiYgIC8vIG9wdGlvbiB0byB0dXJuIG9mZiBwYXJ0aWNsZSByZXN0cmljdGlvbiBjaGVja2luZwotICAgICAgICAgICAgICAgICFnVHlwZS5pc0RvY3VtZW50VHlwZSgpKSAvLyBEb24ndCBjaGVjayBkb2MgdHlwZXMgZm9yIHJlc3RyaWN0aW9uLiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGVja1Jlc3RyaWN0aW9uKChTY2hlbWFUeXBlSW1wbClnVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0ZpZWxkcygoU2NoZW1hVHlwZUltcGwpZ1R5cGUpOwotICAgICAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdUeXBlLmdldEFub255bW91c1R5cGVzKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoZWNrU3Vic3RpdHV0aW9uR3JvdXBzKHN0YXRlLmdsb2JhbEVsZW1lbnRzKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgY2hlY2tzIHJ1bGUgIzUgb2YgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2Nvc3MtY3QKLSAgICAgKiBhcyB3ZWxsIGFzIGF0dHJpYnV0ZSArIGVsZW1lbnQgZGVmYXVsdC9maXhlZCB2YWxpZGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tGaWVsZHMoU2NoZW1hVHlwZUltcGwgc1R5cGUpCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3QgbG9jYXRpb24gPSBzVHlwZS5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICAKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgc0F0dHJNb2RlbCA9IHNUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0gICAgICAgIGlmIChzQXR0ck1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gc0F0dHJzICA9IHNBdHRyTW9kZWwuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgUU5hbWUgaWRBdHRyID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0F0dHJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChYbWxJRC50eXBlLmlzQXNzaWduYWJsZUZyb20oc0F0dHJzW2ldLmdldFR5cGUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaWRBdHRyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZEF0dHIgPSBzQXR0cnNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkJvdGggIiArIFFOYW1lSGVscGVyLnByZXR0eShpZEF0dHIpICsgIiBhbmQgIiArIHNBdHRyc1tpXS5nZXROYW1lKCkgKyAiIGFyZSB4czpJRCBhdHRyaWJ1dGVzOyBvbmx5IG9uZSBJRCBhdHRyaWJ1dGUgaXMgYWxsb3dlZCBvbiBhIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyc1tpXS5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkFuIGF0dHJpYnV0ZSBvZiB0eXBlIHhzOklEIGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgYSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlQ29uc3RyYWludCA9IHNBdHRyc1tpXS5nZXREZWZhdWx0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVDb25zdHJhaW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgdmFsID0gc0F0dHJzW2ldLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsLnZhbGlkYXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc1Byb3AgPSAoU2NoZW1hUHJvcGVydHlJbXBsKXNUeXBlLmdldEF0dHJpYnV0ZVByb3BlcnR5KHNBdHRyc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvcCAhPSBudWxsICYmIHNQcm9wLmdldERlZmF1bHRUZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9wLnNldERlZmF1bHRWYWx1ZShuZXcgWG1sVmFsdWVSZWYodmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0cnNbaV0uaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KHNBdHRyc1tpXS5nZXROYW1lKCkpICsgIiBlbGVtZW50IGZpeGVkIHZhbHVlICciICsgdmFsdWVDb25zdHJhaW50ICsgIicgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzQXR0cnNbaV0uZ2V0VHlwZSgpKSwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc0F0dHJzW2ldLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgZGVmYXVsdCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc0F0dHJzW2ldLmdldFR5cGUoKSksIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNoZWNrRWxlbWVudERlZmF1bHRzKHNUeXBlLmdldENvbnRlbnRNb2RlbCgpLCBsb2NhdGlvbiwgc1R5cGUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWxlbWVudERlZmF1bHRzKFNjaGVtYVBhcnRpY2xlIG1vZGVsLCBYbWxPYmplY3QgbG9jYXRpb24sIFNjaGVtYVR5cGUgcGFyZW50VHlwZSkKLSAgICB7Ci0gICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzd2l0Y2ggKG1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gbW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja0VsZW1lbnREZWZhdWx0cyhjaGlsZHJlbltpXSwgbG9jYXRpb24sIHBhcmVudFR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbnN0cmFpbnQgPSBtb2RlbC5nZXREZWZhdWx0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZUNvbnN0cmFpbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRUeXBlKCkuaXNTaW1wbGVUeXBlKCkgfHwgbW9kZWwuZ2V0VHlwZSgpLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSB2YWwgPSBtb2RlbC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC52YWxpZGF0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNQcm9wID0gKFNjaGVtYVByb3BlcnR5SW1wbClwYXJlbnRUeXBlLmdldEVsZW1lbnRQcm9wZXJ0eShtb2RlbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvcCAhPSBudWxsICYmIHNQcm9wLmdldERlZmF1bHRUZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9wLnNldERlZmF1bHRWYWx1ZShuZXcgWG1sVmFsdWVSZWYodmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobW9kZWwuZ2V0TmFtZSgpKSArICIgZWxlbWVudCBmaXhlZCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUobW9kZWwuZ2V0VHlwZSgpKSwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobW9kZWwuZ2V0TmFtZSgpKSArICIgZWxlbWVudCBkZWZhdWx0IHZhbHVlICciICsgdmFsdWVDb25zdHJhaW50ICsgIicgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShtb2RlbC5nZXRUeXBlKCkpLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVsLmdldFR5cGUoKS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1vZGVsLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlICciICsgdmFsdWVDb25zdHJhaW50ICsgIicgYmVjYXVzZSBpdHMgdHlwZSBoYXMgZWxlbWVudCBjb250ZW50IG9ubHkuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5nZXRUeXBlKCkuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobW9kZWwuZ2V0TmFtZSgpKSArICIgZWxlbWVudCBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBiZWNhdXNlIGl0cyB0eXBlIGhhcyBlbXB0eSBjb250ZW50IG9ubHkuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBmb2xsb3dpbmcgY29kZSBvbmx5IGNoZWNrcyBydWxlICM1IG9mIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uCi0gICAgICogIChFdmVyeXRoaW5nIGVsc2UgY2FuIGFuZCBzaG91bGQgYmUgZG9uZSBpbiBTdHNjUmVzb2x2ZXIsIGJlY2F1c2Ugd2UgY2FuIGdpdmUgbW9yZSBkZXRhaWxlZCBsaW5lICMgaW5mbyB0aGVyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1Jlc3RyaWN0aW9uKFNjaGVtYVR5cGVJbXBsIHNUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKHNUeXBlLmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiAmJiAhc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcmVtZW1iZXIgdmVyeSBwcmVjaXNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBub3RoaW4uCi0gICAgICAgICAgICBYbWxPYmplY3QgbG9jYXRpb24gPSBzVHlwZS5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICAKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBzVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgYmFzZSB0eXBlIG9mIGEgY29tcGxleCB0eXBlIHJlc3RyaWN0aW9uIG11c3QgYmUgYSBjb21wbGV4IHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIDUgVGhlIGFwcHJvcHJpYXRlIGNhc2UgYW1vbmcgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldENvbnRlbnRUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOgotICAgICAgICAgICAgICAgICAgICAvLyA1LjEgSWYgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBpcyBhIHNpbXBsZSB0eXBlIGRlZmluaXRpb24sIHRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjEuMSBUaGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBiZSBhIHNpbXBsZSB0eXBlIGRlZmluaXRpb24gb2Ygd2hpY2ggdGhlIHtjb250ZW50IHR5cGV9IGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBhcyBkZWZpbmVkIGluIERlcml2YXRpb24gVmFsaWQgKFJlc3RyaWN0aW9uLCBTaW1wbGUpICinMy4xNC42KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiB3ZSBkb24ndCBhbGxvdyB0aGUgY29udGVudCB0eXBlIHRvIGJlIGFuICJvbiB0aGUgc2lkZSIgc2ltcGxlIHR5cGUsIHNvIG5vdGhpbmcgZmFuY3kgdG8gY2hlY2sgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4xLjIgVGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBiZSBtaXhlZCBhbmQgaGF2ZSBhIHBhcnRpY2xlIHdoaWNoIGlzILdlbXB0aWFibGW3IGFzIGRlZmluZWQgaW4gUGFydGljbGUgRW1wdGlhYmxlICinMy45LjYpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGEgc2ltcGxlIGNvbnRlbnQgbW9kZWwgY2FuIG9ubHkgcmVzdHJpY3QgYSBtaXhlZCBjb250ZW50IG1vZGVsIHRoYXQgaGFzIHNraXBwYWJsZSBlbGVtZW50cy4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggYSBzaW1wbGUgY29udGVudCBtb2RlbCBjYW4gb25seSByZXN0cmljdCBhIHNpbXBsZSBvciBtaXhlZCBjb250ZW50IG1vZGVsLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4yIElmIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUgY29tcGxleCB0eXBlIGl0c2VsZiBpcyBlbXB0eSAsIHRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuMi4xIFRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBtdXN0IGFsc28gYmUgZW1wdHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4yLjIgVGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgYmUgZWxlbWVudE9ubHkgb3IgbWl4ZWQgYW5kIGhhdmUgYSBwYXJ0aWNsZSB3aGljaCBpcyC3ZW1wdGlhYmxltyBhcyBkZWZpbmVkIGluIFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCkgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhbiBlbXB0eSBjb250ZW50IG1vZGVsIGNhbiBvbmx5IHJlc3RyaWN0IGEgY29udGVudCBtb2RlbCB0aGF0IGhhcyBza2lwcGFibGUgZWxlbWVudHMuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhbiBlbXB0eSBjb250ZW50IG1vZGVsIGNhbm5vdCByZXN0cmljdCBhIHR5cGUgd2l0aCBhIHNpbXBsZSBjb250ZW50IG1vZGVsLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIElmIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBpcyBtaXhlZC4uLgotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhIG1peGVkIGNvbnRlbnQgbW9kZWwgY2FuIG9ubHkgcmVzdHJpY3QgYW5vdGhlciB0eXBlIHdpdGggYSBtaXhlZCBjb250ZW50IG1vZGVsLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIEZBTExUSFJPVUdICi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIC4uLiBvciB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIGl0c2VsZiBpcyBlbGVtZW50LW9ubHksLi4uCi0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGVsZW1lbnQgb3IgbWl4ZWQgY29udGVudCBjYW5ub3QgcmVzdHJpY3QgYW4gZW1wdHkgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBlbGVtZW50IG9yIG1peGVkIGNvbnRlbnQgY2Fubm90IHJlc3RyaWN0IGEgc2ltcGxlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIC4uLiB0aGVuIHRoZSBwYXJ0aWNsZSBvZiB0aGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24gaXRzZWxmIG11c3QgYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBvZiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsID0gYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCA9IHNUeXBlLmdldENvbnRlbnRNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoYmFzZU1vZGVsICE9IG51bGwgJiYgZGVyaXZlZE1vZGVsICE9IG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsID09IG51bGwgfHwgZGVyaXZlZE1vZGVsID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiTnVsbCBtb2RlbHMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBFTVBUWV9DT05URU5UOiAiICsgYmFzZVR5cGUgKyAiICgiICsgYmFzZU1vZGVsICsgIiksICIgKyBzVHlwZSArICIgKCIgKyBkZXJpdmVkTW9kZWwgKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgcmVzdHJpY3Rpb24uIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIC4uLiAgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgotICAgICAgICAgICAgICAgICAgICBMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWRkIHRoZSBsYXN0IGVycm9yLCBiZWNhdXNlIGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uIG1heSBhZGQgZXJyb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgY29sbGVjdGlvbiB0aGF0IGl0IGxhdGVyIGNoYW5nZXMgaXRzIG1pbmQgYWJvdXQsIG9yIGl0IG1heSAoaW5hZHZlcnRlbnRseSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmdldCB0byBkZXNjcmliZSBhbiBlcnJvciBpbnRvIHRoZSBjb2xsZWN0aW9uLi4uLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCByZXN0cmljdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmdldEVycm9yTGlzdGVuZXIoKS5hZGQoZXJyb3JzLmdldChlcnJvcnMuc2l6ZSgpIC0gMSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gdHdvIHNjaGVtYSBwYXJ0aWNsZSB0eXBlcywgYSBiYXNlTW9kZWwsIGFuZCBhIGRlcml2ZWQgbW9kZWwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUKLSAgICAgKiBkZXJpdmVkTW9kZWwgY2FuIGJlIGVnaXRpbWF0ZWx5IGJlIHVzZWQgZm9yIHJlc3RyaWN0aW9uLiAgRXJyb3JzIGFyZSBwdXQgaW50byB0aGUgZXJyb3JzIGNvbGxlY3Rpb25zLgotICAgICAqIEBwYXJhbSBiYXNlTW9kZWwgLSBUaGUgYmFzZSBzY2hlbWEgcGFydGljbGUKLSAgICAgKiBAcGFyYW0gZGVyaXZlZE1vZGVsIC0gVGhlIGRlcml2ZWQgKHJlc3RyaWN0ZWQpIHNjaGVtYSBwYXJ0aWNsZQotICAgICAqIEBwYXJhbSBlcnJvcnMgLSBJbnZhbGlkIHJlc3RyaWN0aW9uIGVycm9ycyBhcmUgcHV0IGludG8gdGhpcyBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4sIHRydWUgaWYgdmFsaWQgcmVzdHJ1Y3Rpb24sIGZhbHNlIGlmIGludmFsaWQgcmVzdHJpY3Rpb24KLSAgICAgKiBACi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpICB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAvLyAxIFRoZXkgYXJlIHRoZSBzYW1lIHBhcnRpY2xlLgotICAgICAgICBpZiAoYmFzZU1vZGVsLmVxdWFscyhkZXJpdmVkTW9kZWwpKSB7Ci0gICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEltcGxlbWVudCB0YWJsZSBkZWZpbmVkIGluIHNjaGVtYSBzcGVjIG9uIHJlc3RyaWN0aW9ucyBhdDoKLSAgICAgICAgICAgIC8vICAgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2Nvcy1wYXJ0aWNsZS1yZXN0cmljdAotICAgICAgICAgICAgc3dpdGNoIChiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5hbWVBbmRUeXBlT0soKFNjaGVtYUxvY2FsRWxlbWVudCkgYmFzZU1vZGVsLCAoU2NoZW1hTG9jYWxFbGVtZW50KSBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5zQ29tcGF0KGJhc2VNb2RlbCwgKFNjaGVtYUxvY2FsRWxlbWVudCkgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNTdWJzZXQoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZUFzSWZHcm91cChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2UoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlVW5vcmRlcmVkKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlQXNJZkdyb3VwKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZUxheChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG1hcEFuZFN1bShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlQXNJZkdyb3VwKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgQmFzZSBUeXBlIik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN0cmljdGlvblZhbGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWFwQW5kU3VtKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpICB7Ci0gICAgICAgIC8vIG1hcEFuZFN1bSBpcyBjYWxsIGlmIGJhc2U6IENIT0lDRSwgZGVyaXZlZDogU0VRVUVOQ0UKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U7Ci0gICAgICAgIGFzc2VydCBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U7Ci0gICAgICAgIGJvb2xlYW4gbWFwQW5kU3VtVmFsaWQgPSB0cnVlOwotICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIERlcml2YXRpb24gT0sgKFNlcXVlbmNlOkNob2ljZSAtLSBNYXBBbmRTdW0pCi0gICAgICAgIC8vIEZvciBhIHNlcXVlbmNlIGdyb3VwIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhIGNob2ljZSBncm91cCBwYXJ0aWNsZSBhbGwgb2YgdGhlIGZvbGxvd2luZwotICAgICAgICAvLyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgVGhlcmUgaXMgYSBjb21wbGV0ZSBmdW5jdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIHRvIHRoZSBwYXJ0aWNsZXMgaW4gdGhlCi0gICAgICAgIC8vIHtwYXJ0aWNsZXN9IG9mIEIgc3VjaCB0aGF0IGVhY2ggcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBpbgotICAgICAgICAvLyB0aGUge3BhcnRpY2xlc30gb2YgQiBpdCBtYXBzIHRvIGFzIGRlZmluZWQgYnkgUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KS4KLSAgICAgICAgLy8gaW50ZXJwcmV0YXRpb246ICBlYWNoIHBhcnRpY2xlIGNoaWxkIGluIGRlcml2ZWQgc2hvdWxkIGhhdmUgYSBtYXRjaCBpbiBiYXNlLgotICAgICAgICAvLyAyIFRoZSBwYWlyIGNvbnNpc3Rpbmcgb2YgdGhlIHByb2R1Y3Qgb2YgdGhlIHttaW4gb2NjdXJzfSBvZiBSIGFuZCB0aGUgbGVuZ3RoIG9mIGl0cyB7cGFydGljbGVzfSBhbmQgdW5ib3VuZGVkCi0gICAgICAgIC8vIGlmIHttYXggb2NjdXJzfSBpcyB1bmJvdW5kZWQgb3RoZXJ3aXNlIHRoZSBwcm9kdWN0IG9mIHRoZSB7bWF4IG9jY3Vyc30gb2YgUiBhbmQgdGhlIGxlbmd0aCBvZiBpdHMge3BhcnRpY2xlc30KLSAgICAgICAgLy8gaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgIC8vIE5PVEU6IFRoaXMgY2xhdXNlIGlzIGluIHByaW5jaXBsZSBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gYWJzb2x1dGVseSBuZWNlc3NhcnksIGJ1dCBpbiBwcmFjdGljZSB3aWxsIGNvdmVyCi0gICAgICAgIC8vIGFsbCB0aGUgbGlrZWx5IGNhc2VzLCBhbmQgaXMgbXVjaCBlYXNpZXIgdG8gc3BlY2lmeSB0aGFuIHRoZSBmdWxseSBnZW5lcmFsIHZlcnNpb24uCi0gICAgICAgIC8vIE5PVEU6IFRoaXMgY2FzZSBhbGxvd3MgdGhlICJ1bmZvbGRpbmciIG9mIGl0ZXJhdGVkIGRpc2p1bmN0aW9ucyBpbnRvIHNlcXVlbmNlcy4gSXQgbWF5IGJlIHBhcnRpY3VsYXJseSB1c2VmdWwKLSAgICAgICAgLy8gd2hlbiB0aGUgZGlzanVuY3Rpb24gaXMgYW4gaW1wbGljaXQgb25lIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHN1YnN0aXR1dGlvbiBncm91cHMuCi0KLSAgICAgICAgLy8gTWFwIHN0ZXAgLSBmb3IgZWFjaCBtZW1iZXIgb2YgdGhlIGRlcml2ZWQgbW9kZWwncyBwYXJ0aWNsZSBjaGlsZHJlbiBzZWFyY2ggYmFzZSBtb2RlbCdzIHBhcnRpY2xlIGNoaWxkcmVuCi0gICAgICAgIC8vICBmb3IgbWF0Y2gKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBkZXJpdmVkUGFydGljbGVBcnJheSA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gYmFzZVBhcnRpY2xlQXJyYXkgPSBiYXNlTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcml2ZWRQYXJ0aWNsZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUgPSBkZXJpdmVkUGFydGljbGVBcnJheVtpXTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiYXNlUGFydGljbGVBcnJheS5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSA9IGJhc2VQYXJ0aWNsZUFycmF5W2pdOwotICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2UgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYSBtYXRjaAotICAgICAgICAgICAgICAgIGlmIChpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIG1hdGNoIHRoZW4gbm8gbmVlZCB0byBjaGVjayBiYXNlIHBhcnRpY2xlcyBhbnltb3JlCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgICAgICBtYXBBbmRTdW1WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE1hcHBpbmdFcnJvcigpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdW0gc3RlcAotICAgICAgICBCaWdJbnRlZ2VyIGRlcml2ZWRSYW5nZU1pbiA9IGRlcml2ZWRNb2RlbC5nZXRNaW5PY2N1cnMoKS5tdWx0aXBseShCaWdJbnRlZ2VyLnZhbHVlT2YoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKS5sZW5ndGgpKTsKLSAgICAgICAgQmlnSW50ZWdlciBkZXJpdmVkUmFuZ2VNYXggPSBudWxsOwotICAgICAgICBCaWdJbnRlZ2VyIFVOQk9VTkRFRCA9IG51bGw7Ci0gICAgICAgIGlmIChkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICBkZXJpdmVkUmFuZ2VNYXggPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVyaXZlZFJhbmdlTWF4ID0gZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpLm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpLmxlbmd0aCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IGNoZWNrIGRlcml2ZWRSYW5nZSAoZGVyaXZlZFJhbmdlTWluIGFuZCBkZXJpdmVkUmFuZ2VNYXgpIGFnYWluc3QgYmFzZSBtb2RlbCBvY2N1cnJlbmNlIHJhbmdlCi0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogT2NjdXJyZW5jZSBSYW5nZSBPSwotICAgICAgICAvLyBGb3IgYSBwYXJ0aWNsZSdzIG9jY3VycmVuY2UgcmFuZ2UgdG8gYmUgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBhbm90aGVyJ3Mgb2NjdXJyZW5jZSByYW5nZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgSXRzIHttaW4gb2NjdXJzfSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3Mge21pbiBvY2N1cnN9LgotICAgICAgICAvLyAyIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gICAyLjEgVGhlIG90aGVyJ3Mge21heCBvY2N1cnN9IGlzIHVuYm91bmRlZC4KLSAgICAgICAgLy8gICAyLjIgQm90aCB7bWF4IG9jY3Vyc30gYXJlIG51bWJlcnMsIGFuZCB0aGUgcGFydGljbGUncyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3MuCi0KLSAgICAgICAgaWYgKGRlcml2ZWRSYW5nZU1pbi5jb21wYXJlVG8oYmFzZU1vZGVsLmdldE1pbk9jY3VycygpKSA8IDApIHsKLSAgICAgICAgICAgIG1hcEFuZFN1bVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yQ2hvaWNlU2VxdWVuY2UoZGVyaXZlZFJhbmdlTWluLCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZU1vZGVsLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCB8fCBkZXJpdmVkUmFuZ2VNYXggIT0gVU5CT1VOREVEICYmIGRlcml2ZWRSYW5nZU1heC5jb21wYXJlVG8oYmFzZU1vZGVsLmdldE1heE9jY3VycygpKSA+IDApIHsKLSAgICAgICAgICAgIG1hcEFuZFN1bVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yQ2hvaWNlU2VxdWVuY2UoZGVyaXZlZFJhbmdlTWF4LCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWFwQW5kU3VtVmFsaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3JDaG9pY2VTZXF1ZW5jZShCaWdJbnRlZ2VyIGRlcml2ZWRSYW5nZU1pbiwgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSB0b3RhbCBtaW5PY2N1cnMgZm9yIHRoZSBkZXJpdmVkIDxzZXF1ZW5jZT4ncyBlbGVtZW50czogIgotICAgICAgICAgICAgICAgICsgZGVyaXZlZFJhbmdlTWluLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICJtdXN0IG5vdCBiZSBsZXNzIHRoYW4gdGhlIGJhc2UgPGNob2ljZT4ncyBtaW5PY2N1cnMgKCIKLSAgICAgICAgICAgICAgICArIGJhc2VNb2RlbC5nZXRNaW5PY2N1cnMoKS50b1N0cmluZygpICsgIikiOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yQ2hvaWNlU2VxdWVuY2UoQmlnSW50ZWdlciBkZXJpdmVkUmFuZ2VNYXgsIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgdG90YWwgbWF4T2NjdXJzIGZvciB0aGUgZGVyaXZlZCA8c2VxdWVuY2U+J3MgZWxlbWVudHMgKCIKLSAgICAgICAgICAgICAgICArIGRlcml2ZWRSYW5nZU1heC50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiKSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIGJhc2UgPGNob2ljZT4ncyBtYXhPY2N1cnMgKCIKLSAgICAgICAgICAgICAgICArIHByaW50TWF4T2NjdXJzKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSkgKyAiKSI7Ci0gICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE1hcHBpbmdFcnJvcigpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgQXQgbGVhc3Qgb25lIHJlc3RyaWN0ZWQgdHlwZSBkb2VzIG5vdCBtYXRjaC4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVjdXJzZUFzSWZHcm91cChTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIHJlY3Vyc2VBc0lmR3JvdXAgaXMgY2FsbGVkIGlmOgotICAgICAgICAvLyBiYXNlOiBBTEwsIGRlcml2ZWQ6IEVMRU1FTlQKLSAgICAgICAgLy8gYmFzZTogQ0hPSUNFLCBkZXJpdmVkOiBFTEVNRU5UCi0gICAgICAgIC8vIGJhc2U6IFNFUVVFTkNFLCBkZXJpdmVkOiBFTEVNRU5UCi0gICAgICAgIGFzc2VydCAoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICB8fCAoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICB8fCAoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChFbHQ6QWxsL0Nob2ljZS9TZXF1ZW5jZSAtLSBSZWN1cnNlQXNJZkdyb3VwKQotCi0gICAgICAgIC8vIEZvciBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhIGdyb3VwIHBhcnRpY2xlCi0gICAgICAgIC8vIChhbGwsIGNob2ljZSBvciBzZXF1ZW5jZSkgYSBncm91cCBwYXJ0aWNsZSBvZiB0aGUgdmFyaWV0eSBjb3JyZXNwb25kaW5nIHRvIEIncywgd2l0aCB7bWluIG9jY3Vyc30gYW5kCi0gICAgICAgIC8vIHttYXggb2NjdXJzfSBvZiAxIGFuZCB3aXRoIHtwYXJ0aWNsZXN9IGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgcGFydGljbGUgdGhlIHNhbWUgYXMgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24KLSAgICAgICAgLy8gbXVzdCBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIGdyb3VwIGFzIGRlZmluZWQgYnkgUGFydGljbGUgRGVyaXZhdGlvbiBPSwotICAgICAgICAvLyAoQWxsOkFsbCxTZXF1ZW5jZTpTZXF1ZW5jZSAtLSBSZWN1cnNlKSAopzMuOS42KSwgUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoQ2hvaWNlOkNob2ljZSAtLSBSZWN1cnNlTGF4KQotICAgICAgICAvLyAopzMuOS42KSBvciBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChBbGw6QWxsLFNlcXVlbmNlOlNlcXVlbmNlIC0tIFJlY3Vyc2UpICinMy45LjYpLCBkZXBlbmRpbmcgb24gd2hldGhlcgotICAgICAgICAvLyB0aGUgZ3JvdXAgaXMgYWxsLCBjaG9pY2Ugb3Igc2VxdWVuY2UKLQotICAgICAgICAvLyBpbnRlcnByZXRhdGlvbjogIG1ha2UgYSBmYWtlIGdyb3VwIG9mIHRoZSByaWdodCB0eXBlLCB3aXRoIG1pbiBvY2N1cnMgYW5kIG1heCBvY2N1cnMgb2YgMQotICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgYXNJZlBhcnQgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFBhcnRpY2xlVHlwZShiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpOwotICAgICAgICBhc0lmUGFydC5zZXRNaW5PY2N1cnMoQmlnSW50ZWdlci5PTkUpOwotICAgICAgICBhc0lmUGFydC5zZXRNYXhPY2N1cnMoQmlnSW50ZWdlci5PTkUpOwotICAgICAgICBhc0lmUGFydC5zZXRQYXJ0aWNsZUNoaWxkcmVuKG5ldyBTY2hlbWFQYXJ0aWNsZVtdIHsgZGVyaXZlZE1vZGVsIH0pOwotICAgICAgICAKLSAgICAgICAgLy8gdGhlIHJlY3Vyc2UKLSAgICAgICAgcmV0dXJuIGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKGJhc2VNb2RlbCwgYXNJZlBhcnQsIGVycm9ycywgY29udGV4dCk7IAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVjdXJzZUxheChTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSAgewotICAgICAgICAvLyByZWN1cnNlTGF4IGlzIGNhbGxlZCBpZiBiYXNlOiBDSE9JQ0UsIGRlcml2ZWQ6IENIT0lDRQotICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFOwotICAgICAgICBib29sZWFuIHJlY3Vyc2VMYXhWYWxpZCA9IHRydWU7Ci0gICAgICAgIC8vU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChDaG9pY2U6Q2hvaWNlIC0tIFJlY3Vyc2VMYXgpCi0gICAgICAgIC8vIEZvciBhIGNob2ljZSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW5vdGhlciBjaG9pY2UgZ3JvdXAgcGFydGljbGUgYWxsIG9mIHRoZQotICAgICAgICAvLyBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFIncyBvY2N1cnJlbmNlIHJhbmdlIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlCi0gICAgICAgIC8vIFJhbmdlIE9LICinMy45LjYpOwotICAgICAgICAvLyAyIFRoZXJlIGlzIGEgY29tcGxldGUgt29yZGVyLXByZXNlcnZpbme3IGZ1bmN0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIKLSAgICAgICAgLy8gdG8gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiBzdWNoIHRoYXQgZWFjaCBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiBpcyBhCi0gICAgICAgIC8vILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIGl0IG1hcHMgdG8gYXMgZGVmaW5lZCBieQotICAgICAgICAvLyBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgotICAgICAgICAvLyBOT1RFOiBBbHRob3VnaCB0aGUgt3ZhbGlkYXRpb263IHNlbWFudGljcyBvZiBhIGNob2ljZSBncm91cCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIGl0cyBwYXJ0aWNsZXMsCi0gICAgICAgIC8vIGRlcml2ZWQgY2hvaWNlIGdyb3VwcyBhcmUgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZWlyIGJhc2UgaW4gb3JkZXIgdG8gc2ltcGxpZnkKLSAgICAgICAgLy8gY2hlY2tpbmcgdGhhdCB0aGUgZGVyaXZhdGlvbiBpcyBPSy4KLSAgICAgICAgLy8gaW50ZXJwcmV0YXRpb246ICBjaGVjayBkZXJpdmVkIGNob2ljZXMgZm9yIG1hdGNoIGluIG9yZGVyLCBtdXN0IGdldCBhbiBpbiBvcmRlciBtYXRjaCBvbiBhIGJhc2UgcGFydGljbGUsCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBiYXNlIHBhcnRpY2xlcyBhcmUgc2tpcHBhYmxlLiAgYSBsb3QgbGlrZSByZWN1cnNlCi0KLSAgICAgICAgaWYgKCFvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGN5Y2xlIHRocnUgYm90aCBkZXJpdmVkIHBhcnRpY2xlIGNoaWxkcmVuIGFuZCBiYXNlIHBhcnRpY2xlIGNoaWxkcmVuIGxvb2tpbmcgZm9yIG1hdGNoZXMKLSAgICAgICAgLy8gIGlmIHRoZSBkZXJpdmVkIHBhcnRpY2xlIGRvZXMgbm90IG1hdGNoIHRoZSBiYXNlIHBhcnRpY2xlIHRoZW4gYmFzZSBwYXJ0aWNsZSBjYW4gYmUgc2tpcHBlZAotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gZGVyaXZlZFBhcnRpY2xlQXJyYXkgPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGJhc2VQYXJ0aWNsZUFycmF5ID0gYmFzZU1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgaW50IGkgPSAwLCBqID0gMDsKLSAgICAgICAgZm9yICg7IGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGggJiYgaiA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aDspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSA9IGRlcml2ZWRQYXJ0aWNsZUFycmF5W2ldOwotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlID0gYmFzZVBhcnRpY2xlQXJyYXlbal07Ci0gICAgICAgICAgICAvLyB0cnkgdG8gbWF0Y2ggdGhlIHR3byBwYXJ0aWNsZXMgYnkgcmVjdXJzaW5nCi0gICAgICAgICAgICBpZiAoaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjb29sIGZvdW5kIGEgbWF0Y2gsIGluY3JlbWVudCBib3RoIGluZGV4ZXMKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkaWQgbm90IG1hdGNoLCBpbmNyZW1lbnQgdGhlIGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgIC8vIE9rLCBsZXQncyBza2lwIHRoaXMgYmFzZSBwYXJ0aWNsZSwgaW5jcmVtZW50IGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG9rLCBnb3QgdG8gdGhlIGVuZCBvZiBvbmUgb2YgdGhlIGFycmF5cwotICAgICAgICAvLyBpZiBhdCBlbmQgb2YgYmFzZSBwYXJ0aWNsZSBhcnJheSBhbmQgbm90IGF0IHRoZSBlbmQgb2YgZGVyaXZlZCBwYXJ0aWNsZSBhcnJheSB0aGVuIHJlbWFpbmluZyBkZXJpdmVkCi0gICAgICAgIC8vICBwYXJ0aWNsZXMgbXVzdCBub3QgbWF0Y2gKLSAgICAgICAgaWYgKGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJlY3Vyc2VMYXhWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRm91bmQgZGVyaXZlZCBwYXJ0aWNsZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgaW4gdGhlIGJhc2UgY29udGVudCBtb2RlbC4iOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0RGVyaXZlZE1hcHBpbmdFcnJvcihtZXNzYWdlLCBiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIHJlY3Vyc2VMYXhWYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlY3Vyc2VVbm9yZGVyZWQoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICAvLyByZWN1cnNlVW5vcmRlciBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTEwgYW5kIGRlcml2ZWQ6IFNFUQotICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U7Ci0gICAgICAgIGJvb2xlYW4gcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gdHJ1ZTsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChTZXF1ZW5jZTpBbGwgLS0gUmVjdXJzZVVub3JkZXJlZCkKLSAgICAgICAgLy8gRm9yIGEgc2VxdWVuY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGFuIGFsbCBncm91cCBwYXJ0aWNsZSBhbGwgb2YgdGhlCi0gICAgICAgIC8vIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5Ci0gICAgICAgIC8vIE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgIC8vIDIgVGhlcmUgaXMgYSBjb21wbGV0ZSBmdW5jdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIHRvIHRoZSBwYXJ0aWNsZXMKLSAgICAgICAgLy8gaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgc3VjaCB0aGF0IGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gMi4xIE5vIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIGlzIG1hcHBlZCB0byBieSBtb3JlIHRoYW4gb25lIG9mIHRoZSBwYXJ0aWNsZXMgaW4KLSAgICAgICAgLy8gdGhlIHtwYXJ0aWNsZXN9IG9mIFI7Ci0gICAgICAgIC8vIDIuMiBFYWNoIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIKLSAgICAgICAgLy8gaXQgbWFwcyB0byBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNik7Ci0gICAgICAgIC8vIDIuMyBBbGwgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHdoaWNoIGFyZSBub3QgbWFwcGVkIHRvIGJ5IGFueSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30KLSAgICAgICAgLy8gb2YgUiBhcmUgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBFbXB0aWFibGUgKKczLjkuNikuCi0gICAgICAgIC8vIE5PVEU6IEFsdGhvdWdoIHRoaXMgY2xhdXNlIGFsbG93cyByZW9yZGVyaW5nLCBiZWNhdXNlIG9mIHRoZSBsaW1pdHMgb24gdGhlIGNvbnRlbnRzIG9mIGFsbCBncm91cHMgdGhlCi0gICAgICAgIC8vIGNoZWNraW5nIHByb2Nlc3MgY2FuIHN0aWxsIGJlIGRldGVybWluaXN0aWMuCi0gICAgICAgIC8vIDEsIDIuMiwgYW5kIDIuMyBhcmUgdGhlIHNhbWUgYXMgcmVjdXJzZSwgc28gZG8gMi4xIGFuZCB0aGVuIGNhbGwgcmVjdXJzZQotCi0gICAgICAgIGlmICghb2NjdXJyZW5jZVJhbmdlT0soYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlYWQgYmFzZVBhcnRpY2xlIGFycmF5IFFOYW1lcyBpbnRvIGhhc2htYXAKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBiYXNlUGFydGljbGVzID0gYmFzZU1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgSGFzaE1hcCBiYXNlUGFydGljbGVNYXAgPSBuZXcgSGFzaE1hcCgxMCk7Ci0gICAgICAgIE9iamVjdCBNQVBQRUQgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGhhc2htYXAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGFydGljbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgYmFzZVBhcnRpY2xlTWFwLnB1dChiYXNlUGFydGljbGVzW2ldLmdldE5hbWUoKSwgYmFzZVBhcnRpY2xlc1tpXSk7Ci0gICAgICAgIAotICAgICAgICAvLyBnbyB0aHJ1IHRoZSBzZXF1ZW5jZSAoZGVyaXZlZCBtb2RlbCdzIGNoaWxkcmVuKSBhbmQgY2hlY2sgb2ZmIGZyb20gYmFzZSBwYXJ0aWNsZSBtYXAKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBkZXJpdmVkUGFydGljbGVzID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXJpdmVkUGFydGljbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBtYXRjaGVkQmFzZVBhcnRpY2xlID0gKFNjaGVtYVBhcnRpY2xlKSBiYXNlUGFydGljbGVNYXAuZ2V0KGRlcml2ZWRQYXJ0aWNsZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVkQmFzZVBhcnRpY2xlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQWxsU2VxTWFwcGluZ0Vycm9yKCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZ290IGEgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEJhc2VQYXJ0aWNsZSA9PSBNQVBQRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hvYSwgdGhpcyBiYXNlIHBhcnRpY2xlIGhhcyBhbHJlYWR5IGJlZW4gbWF0Y2hlZCAoc2VlIDIuMSBhYm92ZSkKLSAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE1hcHBlZE1vcmVUaGFuT25jZUVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVyaXZlZFBhcnRpY2xlc1tpXS5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZFBhcnRpY2xlc1tpXS5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGVyaXZlZCBwYXJ0aWNsZXMgY2FuIGhhdmUgYSBtYXggb2NjdXJzIGdyZWF0ZXIgdGhhbiAxCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEFsbFNlcU1heE9jY3Vyc0dyZWF0ZXJUaGFuMUVycm9yKGRlcml2ZWRQYXJ0aWNsZXNbaV0pLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKG1hdGNoZWRCYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZXNbaV0sIGVycm9ycywgY29udGV4dCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSBhbiBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIGNvb2wsIGdvdCBhIG1hdGNoLCB1cGRhdGUgdG8gTUFQUEVECi0gICAgICAgICAgICAgICAgICAgIGJhc2VQYXJ0aWNsZU1hcC5wdXQoZGVyaXZlZFBhcnRpY2xlc1tpXS5nZXROYW1lKCksIE1BUFBFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBpcyBjb29sIHNvIGZhciB0aGVuIGNoZWNrIHRvIHNlZSBpZiBhbnkgYmFzZSBwYXJ0aWNsZXMgYXJlIG5vdCBtYXRjaGVkCi0gICAgICAgIGlmIChyZWN1cnNlVW5vcmRlcmVkVmFsaWQpIHsKLSAgICAgICAgICAgIC8vIGdldCBhbGwgdGhlIGhhc2htYXAga2V5cyBhbmQgbG9vcCB0aHJ1IGxvb2tpbmcgZm9yIE5PVF9NQVBQRUQKLSAgICAgICAgICAgIFNldCBiYXNlUGFydGljbGVDb2xsZWN0aW9uID0gYmFzZVBhcnRpY2xlTWFwLmtleVNldCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhc2VQYXJ0aWNsZUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFFOYW1lIGJhc2VQYXJ0aWNsZVFOYW1lID0gKFFOYW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0aWNsZU1hcC5nZXQoYmFzZVBhcnRpY2xlUU5hbWUpICE9IE1BUFBFRCAmJiAhKChTY2hlbWFQYXJ0aWNsZSliYXNlUGFydGljbGVNYXAuZ2V0KGJhc2VQYXJ0aWNsZVFOYW1lKSkuaXNTa2lwcGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGJhc2UgcGFydGljbGUgd2FzIG5vdCBtYXBwZWQgYW5kIGlzIG5vdCAicGFydGljbGUgZW1wdGlhYmxlIiAoc2tpcHBhYmxlKQotICAgICAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0R3JvdXBNYXBwaW5nRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0QWxsU2VxTWF4T2NjdXJzR3JlYXRlclRoYW4xRXJyb3IoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkKLSAgICAgICAgICAgICAgICArICIgaGFzIGEgbWF4T2NjdXJzIGdyZWF0IHRoYW4gMSAoIgotICAgICAgICAgICAgICAgICsgcHJpbnRNYXhPY2N1cnMoZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpKQotICAgICAgICAgICAgICAgICsgIikuICBXaGVuIHJlc3RyaWN0aW5nIGFuIDxhbGw+IHdpdGggYSA8c2VxdWVuY2U+LCBubyA8ZWxlbWVudD4gY2FuIGhhdmUgYSBtYXhPY2N1cnMgPiAxIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0SW52YWxpZEFsbFNlcU1hcHBpbmdFcnJvcigpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgRWFjaCBlbGVtZW50IGluIHRoZSBkZXJpdmVkIGNvbnRlbnQgbW9kZWwgbXVzdCBtYXRjaCBhbiBlbGVtZW50IGluIHRoZSBiYXNlICIKLSAgICAgICAgICAgICAgICArICJjb250ZW50IG1vZGVsLiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEdyb3VwTWFwcGluZ0Vycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtZW1iZXJzIG9mIHRoZSBkZXJpdmVkIGNvbnRlbnQgbW9kZWwgbXVzdCBtYXRjaCB0aGUgbWVtYmVycyBvZiB0aGUgYmFzZSAiCi0gICAgICAgICAgICAgICAgKyAiIGNvbnRlbnQgbW9kZWwgdW5sZXNzIHRoZSBtZW1iZXIgb2YgdGhlIGJhc2UgY29udGVudCBtb2RlbCBpcyBvcHRpb25hbCAocGFydGljbGUgZW1wdGlhYmxlKS4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRNYXBwZWRNb3JlVGhhbk9uY2VFcnJvcihTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBXaGVuIHVzaW5nIGEgPHNlcXVlbmNlPiB0byByZXN0cmljdCBhbiA8YWxsPiB0aGUgZWxlbWVudHMgaW4gdGhlIDxhbGw+IGNhbiBiZSBtYXBwZWQgb25seSBvbmNlLiAiCi0gICAgICAgICAgICAgICAgKyAiIEZvdW5kIGVsZW1lbnQgaW4gdGhlIDxzZXF1ZW5jZT4gdGhhdCBtYXBzIGFuIGVsZW1lbnQgaW4gdGhlIDxhbGw+IG1vcmUgdGhhbiBvbmNlLiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWN1cnNlKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gcmVjdXJzZSBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTEwgZGVyaXZlZDogQUxMIG9yIGJhc2U6IFNFUVVFTkNFIGRlcml2ZWQ6IFNFUVVFTkNFCi0gICAgICAgIGJvb2xlYW4gcmVjdXJzZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgLy8gRm9yIGFuIGFsbCBvciBzZXF1ZW5jZSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW5vdGhlciBncm91cCBwYXJ0aWNsZSB3aXRoIHRoZSBzYW1lCi0gICAgICAgIC8vIHtjb21wb3NpdG9yfSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5Ci0gICAgICAgIC8vIE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgIC8vIDIgVGhlcmUgaXMgYSBjb21wbGV0ZSC3b3JkZXItcHJlc2VydmluZ7cgZnVuY3Rpb25hbCBtYXBwaW5nIGZyb20gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiB0bwotICAgICAgICAvLyB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHN1Y2ggdGhhdCBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vICAgMi4xIEVhY2ggcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30KLSAgICAgICAgLy8gICBvZiBCIGl0IG1hcHMgdG8gYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgotICAgICAgICAvLyAgIDIuMiBBbGwgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHdoaWNoIGFyZSBub3QgbWFwcGVkIHRvIGJ5IGFueSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30KLSAgICAgICAgLy8gICBvZiBSIGFyZSC3ZW1wdGlhYmxltyBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4KLSAgICAgICAgLy8gTk9URTogQWx0aG91Z2ggdGhlILd2YWxpZGF0aW9utyBzZW1hbnRpY3Mgb2YgYW4gYWxsIGdyb3VwIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgaXRzIHBhcnRpY2xlcywKLSAgICAgICAgLy8gZGVyaXZlZCBhbGwgZ3JvdXBzIGFyZSByZXF1aXJlZCB0byBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlaXIgYmFzZSBpbiBvcmRlciB0byBzaW1wbGlmeSBjaGVja2luZyB0aGF0Ci0gICAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIGlzIE9LLgotICAgICAgICAvLyBbRGVmaW5pdGlvbjpdICBBIGNvbXBsZXRlIGZ1bmN0aW9uYWwgbWFwcGluZyBpcyBvcmRlci1wcmVzZXJ2aW5nIGlmIGVhY2ggcGFydGljbGUgciBpbiB0aGUgZG9tYWluIFIgbWFwcwotICAgICAgICAvLyB0byBhIHBhcnRpY2xlIGIgaW4gdGhlIHJhbmdlIEIgd2hpY2ggZm9sbG93cyAobm90IG5lY2Vzc2FyaWx5IGltbWVkaWF0ZWx5KSB0aGUgcGFydGljbGUgaW4gdGhlIHJhbmdlIEIKLSAgICAgICAgLy8gbWFwcGVkIHRvIGJ5IHRoZSBwcmVkZWNlc3NvciBvZiByLCBpZiBhbnksIHdoZXJlICJwcmVkZWNlc3NvciIgYW5kICJmb2xsb3dzIiBhcmUgZGVmaW5lZCB3aXRoIHJlc3BlY3QgdG8KLSAgICAgICAgLy8gdGhlIG9yZGVyIG9mIHRoZSBsaXN0cyB3aGljaCBjb25zdGl0dXRlIFIgYW5kIEIuCi0KLSAgICAgICAgaWYgKCFvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBpcyBmb3JtYXR0ZWQgaW4gb2NjdXJyZW5jUmFuZ2VPSyAuLi4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjeWNsZSB0aHJ1IGJvdGggZGVyaXZlZCBwYXJ0aWNsZSBjaGlsZHJlbiBhbmQgYmFzZSBwYXJ0aWNsZSBjaGlsZHJlbiBsb29raW5nIGZvciBtYXRjaGVzCi0gICAgICAgIC8vICBpZiB0aGUgZGVyaXZlZCBwYXJ0aWNsZSBkb2VzIG5vdCBtYXRjaCB0aGUgYmFzZSBwYXJ0aWNsZSB0aGVuIGJhc2UgcGFydGljbGUgY2FuIGJlIHNraXBwZWQgaWYgaXQgaXMKLSAgICAgICAgLy8gIHNraXBwYWJsZSAoc2FtZSBhcyAicGFydGljbGUgZW1wdGlhYmxlIikgb3RoZXJ3aXNlIGlzIGFuIGludmFsaWQgcmVzdHJpY3Rpb24uCi0gICAgICAgIC8vIGFmdGVyIHRoZSBkZXJpdmVkIHBhcnRpY2xlcyBoYXZlIGJlZW4gY3ljbGVkIGlmIHRoZXJlIGFyZSBhbnkgYmFzZSBwYXJ0aWNsZXMgbGVmdCBvdmVyIHRoZW4gdGhleQotICAgICAgICAvLyAgbXVzdCBiZSBza2lwcGFibGUgb3IgaW52YWxpZCByZXN0cmljdGlvbgotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gZGVyaXZlZFBhcnRpY2xlQXJyYXkgPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGJhc2VQYXJ0aWNsZUFycmF5ID0gYmFzZU1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgaW50IGkgPSAwLCBqID0gMDsKLSAgICAgICAgZm9yICg7IGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGggJiYgaiA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aDspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSA9IGRlcml2ZWRQYXJ0aWNsZUFycmF5W2ldOwotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlID0gYmFzZVBhcnRpY2xlQXJyYXlbal07Ci0gICAgICAgICAgICAvLyB0cnkgdG8gbWF0Y2ggdGhlIHR3byBwYXJ0aWNsZXMgYnkgcmVjdXJzaW5nCi0gICAgICAgICAgICBpZiAoaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjb29sIGZvdW5kIGEgbWF0Y2gsIGluY3JlbWVudCBib3RoIGluZGV4ZXMKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkaWQgbm90IG1hdGNoLCBpbmNyZW1lbnQgdGhlIGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgIC8vICB0aGF0J3Mgb2sgaWYgdGhlIGJhc2UgcGFydGljbGUgaXMgc2tpcHBhYmxlCi0gICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0aWNsZS5pc1NraXBwYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9rLCBsZXQncyBza2lwIHRoaXMgYmFzZSBwYXJ0aWNsZSwgaW5jcmVtZW50IGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hvYSwgcGFydGljbGVzIGFyZSBub3QgdmFsaWQgcmVzdHJpY3Rpb25zIGFuZCBiYXNlIGlzIG5vdCBza2lwcGFibGUgLSBFUlJPUgotICAgICAgICAgICAgICAgICAgICByZWN1cnNlVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRm91bmQgbm9uLW9wdGlvbmFsIHBhcnRpY2xlIHRoYXQgaXMgbm90IG1hcHBlZCBpbiBiYXNlIGNvbnRlbnQgbW9kZWwuIjsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0RGVyaXZlZE1hcHBpbmdFcnJvcihtZXNzYWdlLCBiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb2ssIGdvdCB0byB0aGUgZW5kIG9mIG9uZSBvZiB0aGUgYXJyYXlzCi0gICAgICAgIC8vIGlmIGF0IGVuZCBvZiBiYXNlIHBhcnRpY2xlIGFycmF5IGFuZCBub3QgYXQgdGhlIGVuZCBvZiBkZXJpdmVkIHBhcnRpY2xlIGFycmF5IHRoZW4gcmVtYWluaW5nIGRlcml2ZWQKLSAgICAgICAgLy8gIHBhcnRpY2xlcyBtdXN0IG5vdCBtYXRjaAotICAgICAgICBpZiAoaSA8IGRlcml2ZWRQYXJ0aWNsZUFycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgcmVjdXJzZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJGb3VuZCBkZXJpdmVkIHBhcnRpY2xlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBpbiB0aGUgYmFzZSBjb250ZW50IG1vZGVsLiI7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKG1lc3NhZ2UsIGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgYXQgZW5kIG9mIGRlcml2ZWQgcGFydGljbGUgYXJyYXkgYW5kIG5vdCBhdCBlbmQgb2YgYmFzZSBwYXJ0aWNsZSBhcnJheSB0aGVuIGNoY2sgcmVtYWluaW5nCi0gICAgICAgICAgICAvLyAgYmFzZSBwYXJ0aWNsZXMgdG8gYXNzdXJlIHRoZXkgYXJlIHNraXBwYWJsZQotICAgICAgICAgICAgaWYgKGogPCBiYXNlUGFydGljbGVBcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gajsgayA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZVBhcnRpY2xlQXJyYXlba10uaXNTa2lwcGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJGb3VuZCB0cmFpbGluZyBiYXNlIHBhcnRpY2xlcyB0aGF0IGFyZSBub3Qgb3B0aW9uYWwgYW5kIGFyZSBub3QgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXByZXNlbnRlZCBpbiB0aGUgZGVyaXZlZCBjb250ZW50IG1vZGVsLiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKG1lc3NhZ2UsIGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVjdXJzZVZhbGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgZGVyaXZlZCAocmVzdHJpY3RlZCkgY29udGVudCBtb2RlbCBtdXN0IG1hdGNoIHRoZSBiYXNlIGNvbnRlbnQgbW9kZWwgdW5sZXNzICIKLSAgICAgICAgICAgICAgICArICJ0aGUgcGFydCBvZiB0aGUgYmFzZSBjb250ZW50IG1vZGVsIHRoYXQgZG9lcyBub3QgbWF0Y2ggaXMgb3B0aW9uYWwuICBBIG1pc21hdGNoIGZvdW5kIGJldHdlZW4gYSBiYXNlICIgKwotICAgICAgICAgICAgICAgIHByaW50UGFydGljbGUoYmFzZU1vZGVsKSArICIgYW5kIGEgZGVyaXZlZCAiICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkTW9kZWwpICsgIi4gICIgKyBtZXNzYWdlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgaXMgY2FsbGVkIHdoZW46Ci0gICAgICAgIC8vIGJhc2U6IEFOWSwgZGVyaXZlZDogQUxMCi0gICAgICAgIC8vIGJhc2U6IEFOWSwgZGVyaXZlZDogQ0hPSUNFCi0gICAgICAgIC8vIGJhc2U6IEFOWSwgZGVyaXZlZDogU0VRVUVOQ0UKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKLSAgICAgICAgYXNzZXJ0IChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMKQotICAgICAgICAgICAgICAgIHx8IChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFKQotICAgICAgICAgICAgICAgIHx8IChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0UpOwotICAgICAgICBib29sZWFuIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSB0cnVlOwotICAgICAgICAvLyBGb3IgYSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYSB3aWxkY2FyZCBwYXJ0aWNsZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgRXZlcnkgbWVtYmVyIG9mIHRoZSB7cGFydGljbGVzfSBvZiB0aGUgZ3JvdXAgaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSB3aWxkY2FyZCBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNikuCi0gICAgICAgIC8vICBOb3RlOiAgbm90IHBvc2l0aXZlIHdoYXQgdGhpcyBtZWFucy4gIEludGVycHJldGluZyB0byBtZWFuIHRoYXQgZXZlcnkgcGFydGljbGUgb2YgdGhlIGdyb3VwIG11c3QgYWRoZXJlIHRvIHdpbGRjYXJkIGRlcml2YXRpb24gcnVsZXMKLSAgICAgICAgLy8gICAgICAgICBpbiBhIHJlY3Vyc2l2ZSBtYW5uZXIKLSAgICAgICAgLy8gIExvb3AgdGhydSB0aGUgY2hpbGRyZW4gcGFydGljbGVzIG9mIHRoZSBncm91cCBhbmQgaW52b2tlIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiB0byBjaGVjayBmb3Igd2lsZGNhcmQgcmVzdHJpY3Rpb24gdmFsaWRpdHkKLSAgICAgICAgCi0gICAgICAgIC8vIEJBVSAtIGFuIGVycmF0YSBzaG91bGQgYmUgc3VibWl0dGVkIG9uIHRoaXMgY2xhdXNlIG9mIHRoZSBzcGVjLCBiZWNhdXNlIHRoZQotICAgICAgICAvLyBzcGVjIG1ha2VzIG5vIHNlbnNlLCBhcyB0aGUgeHN0YyBwYXJ0aWNsZXNSMDEzLnhzZCB0ZXN0IGV4ZW1wbGlmaWVzLgotICAgICAgICAvLyB3aGF0IHdlIF9zaG91bGRfIHNvIGlzIGFuICJhcyBpZiIgb24gdGhlIHdpbGRjYXJkLCBhbGxvd2luZyBpdCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotICAgICAgICAvLyBiZWZvcmUgcmVjdXJzaW5nCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBhc0lmUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLSAgICAgICAgYXNJZlBhcnQuc2V0UGFydGljbGVUeXBlKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFdpbGRjYXJkUHJvY2VzcyhiYXNlTW9kZWwuZ2V0V2lsZGNhcmRQcm9jZXNzKCkpOwotICAgICAgICBhc0lmUGFydC5zZXRXaWxkY2FyZFNldChiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLlpFUk8pOwotICAgICAgICBhc0lmUGFydC5zZXRNYXhPY2N1cnMobnVsbCk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFRyYW5zaXRpb25SdWxlcyhiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSwgdHJ1ZSk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFRyYW5zaXRpb25Ob3RlcyhiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHBhcnRpY2xlQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdmFsaWQgV2lsZGNhcmQvRWxlbWVudCBkZXJpdmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSBuc0NvbXBhdChhc0lmUGFydCwgKFNjaGVtYUxvY2FsRWxlbWVudCkgcGFydGljbGUsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBXaWxkY2FyZC9XaWxkY2FyZCBkZXJpdmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSBuc1N1YnNldChhc0lmUGFydCwgcGFydGljbGUsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBXaWxkY2FyZC9Hcm91cCBkZXJpdmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KGFzSWZQYXJ0LCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgYW55IHBhcnRpY2xlIGlzIGludmFsaWQgdGhlbiBicmVhayB0aGUgbG9vcAotICAgICAgICAgICAgaWYgKCFuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAyIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgdGhlIGdyb3VwLCBhcyBkZWZpbmVkIGJ5IEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoYWxsIGFuZCBzZXF1ZW5jZSkgKKczLjguNikKLSAgICAgICAgLy8gKGlmIHRoZSBncm91cCBpcyBhbGwgb3Igc2VxdWVuY2UpIG9yIEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoY2hvaWNlKSAopzMuOC42KSAoaWYgaXQgaXMgY2hvaWNlKSBpcyBhIHZhbGlkCi0gICAgICAgIC8vIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLQotICAgICAgICBpZiAobnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSkgewotICAgICAgICAgICAgbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSA9IGNoZWNrR3JvdXBPY2N1cnJlbmNlT0soYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrR3JvdXBPY2N1cnJlbmNlT0soU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICBib29sZWFuIGdyb3VwT2NjdXJyZW5jZU9LID0gdHJ1ZTsKLSAgICAgICAgQmlnSW50ZWdlciBtaW5SYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhSYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBtaW5SYW5nZSA9IGdldEVmZmVjdGl2ZU1pblJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBnZXRFZmZlY3RpdmVNYXhSYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgbWluUmFuZ2UgPSBnZXRFZmZlY3RpdmVNaW5SYW5nZUNob2ljZShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZ2V0RWZmZWN0aXZlTWF4UmFuZ2VDaG9pY2UoZGVyaXZlZE1vZGVsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIG1pbiBvY2N1cnMgZm9yIHZhbGlkaXR5Ci0gICAgICAgIC8vIGRlcml2ZWQgbWluIG9jY3VycyBpcyB2YWxpZCBpZiBpdHMge21pbiBvY2N1cnN9IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncyB7bWluIG9jY3Vyc30uCi0gICAgICAgIGlmIChtaW5SYW5nZS5jb21wYXJlVG8oYmFzZU1vZGVsLmdldE1pbk9jY3VycygpKSA8IDApIHsKLSAgICAgICAgICAgIGdyb3VwT2NjdXJyZW5jZU9LID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRHcm91cE1pbk9jY3Vyc0Vycm9yKGRlcml2ZWRNb2RlbCwgYmFzZU1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIG1heCBvY2N1cnMgZm9yIHZhbGlkaXR5Ci0gICAgICAgIC8vIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gVGhlIGJhc2UgbW9kZWwncyB7bWF4IG9jY3Vyc30gaXMgdW5ib3VuZGVkLgotICAgICAgICAvLyBvciBib3RoIHttYXggb2NjdXJzfSBhcmUgbnVtYmVycywgYW5kIHRoZSBwYXJ0aWNsZSdzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncwotICAgICAgICBCaWdJbnRlZ2VyIFVOQk9VTkRFRCA9IG51bGw7Ci0gICAgICAgIGlmIChiYXNlTW9kZWwuZ2V0TWF4T2NjdXJzKCkgIT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICBpZiAobWF4UmFuZ2UgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBPY2N1cnJlbmNlT0sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRHcm91cE1heE9jY3Vyc0Vycm9yKGRlcml2ZWRNb2RlbCwgYmFzZU1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UuY29tcGFyZVRvKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwT2NjdXJyZW5jZU9LID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEdyb3VwTWF4T2NjdXJzRXJyb3IoZGVyaXZlZE1vZGVsLCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncm91cE9jY3VycmVuY2VPSzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0R3JvdXBNYXhPY2N1cnNFcnJvcihTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWF4T2NjdXJzIGZvciB0aGUgZGVyaXZlZCBncm91cCAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkKLSAgICAgICAgICAgICAgICArICIgaXMgZ3JlYXQgdGhhbiB0aGUgYmFzZSBtYXhPY2N1cnMgb2YgIgotICAgICAgICAgICAgICAgICsgcHJpbnRNYXhPY2N1cnMoYmFzZU1vZGVsLmdldE1heE9jY3VycygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0R3JvdXBNaW5PY2N1cnNFcnJvcihTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWluT2NjdXJzIGZvciB0aGUgZGVyaXZlZCBncm91cCAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkKLSAgICAgICAgICAgICAgICArICIgaXMgbGVzcyB0aGFuIHRoZSBiYXNlIG1pbk9jY3VycyBvZiAiCi0gICAgICAgICAgICAgICAgKyBiYXNlTW9kZWwuZ2V0TWluT2NjdXJzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBnZXRFZmZlY3RpdmVNYXhSYW5nZUNob2ljZShTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhSYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgQmlnSW50ZWdlciBVTkJPVU5ERUQgPSBudWxsOwotICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoY2hvaWNlKQotICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGEgcGFydGljbGUgd2hvc2Uge3Rlcm19IGlzIGEgZ3JvdXAgd2hvc2Uge2NvbXBvc2l0b3J9IGlzIGNob2ljZQotICAgICAgICAvLyBpcyBhIHBhaXIgb2YgbWluaW11bSBhbmQgbWF4aW11bSwgYXMgZm9sbG93czoKLSAgICAgICAgLy8gTUFYSU1VTQotICAgICAgICAvLyAxKSB1bmJvdW5kZWQgaWYgdGhlIHttYXggb2NjdXJzfSBvZiBhbnkgd2lsZGNhcmQgb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBvcgotICAgICAgICAvLyB0aGUgbWF4aW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYW55IG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gaXMKLSAgICAgICAgLy8gdW5ib3VuZGVkIChub3RlOiBzZWVtcyB0byBiZSB0aGUgc2FtZSBhcyBNYXggUmFuZ2UgQWxsIG9yIFNlcXVlbmNlKSwKLSAgICAgICAgLy8gb3IgMikgaWYgYW55IG9mIHRob3NlIGlzIG5vbi16ZXJvIGFuZCB0aGUge21heCBvY2N1cnN9IG9mIHRoZSBwYXJ0aWNsZSBpdHNlbGYgaXMgdW5ib3VuZGVkLAotICAgICAgICAvLyBvdGhlcndpc2UgMykgdGhlIHByb2R1Y3Qgb2YgdGhlIHBhcnRpY2xlJ3Mge21heCBvY2N1cnN9IGFuZCB0aGUgbWF4aW11bSBvZiB0aGUge21heCBvY2N1cnN9IG9mIGV2ZXJ5Ci0gICAgICAgIC8vIHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSAqbWF4aW11bSogKG5vdGU6IHRoaXMgaXMgdGhlIGRpZmZlcmVuY2UKLSAgICAgICAgLy8gYmV0d2VlbiBNYXhSYW5nZSBDaG9pY2UgYW5zIE1heFJhbmdlIEFsbCBvciBTZXF1ZW5jZSkgcGFydCBvZiB0aGUKLSAgICAgICAgLy8gZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfQotICAgICAgICAvLyAob3IgMCBpZiB0aGVyZSBhcmUgbm8ge3BhcnRpY2xlc30pLgotCi0gICAgICAgIGJvb2xlYW4gbm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCA9IGZhbHNlOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3Vyc0luV2lsZENhcmRPckVsZW1lbnQgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzSW5Hcm91cCA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHBhcnRpY2xlQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHVuYm91bmRlZCB0aGVuIG1heG9jY3VycyB3aWxsIGJlIG51bGwKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBVTkJPVU5ERUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUuZ2V0SW50TWF4T2NjdXJzKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aHQgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHBhcnRpY2xlIGlzIGZvdW5kIGZvciBsYXRlciB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldE1heE9jY3VycygpLmNvbXBhcmVUbyhtYXhPY2N1cnNJbldpbGRDYXJkT3JFbGVtZW50KSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5XaWxkQ2FyZE9yRWxlbWVudCA9IHBhcnRpY2xlLmdldE1heE9jY3VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgYW4gdW5ib3VuZGVkIGhhcyBiZWVuIGZvdW5kIHRoZW4gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGlmIChtYXhSYW5nZSA9PSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIDEpIHVuYm91bmRlZCBpZiB0aGUge21heCBvY2N1cnN9IG9mIGFueSB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IG9yCi0gICAgICAgIC8vIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhbnkgb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBpcwotICAgICAgICAvLyB1bmJvdW5kZWQKLSAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgLy8gMikgaWYgYW55IG9mIHRob3NlIGlzIG5vbi16ZXJvIGFuZCB0aGUge21heCBvY2N1cnN9IG9mIHRoZSBwYXJ0aWNsZSBpdHNlbGYgaXMgdW5ib3VuZGVkCi0gICAgICAgICAgICBpZiAobm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCAmJiBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBVTkJPVU5ERUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIDMpIHRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttYXggb2NjdXJzfSBhbmQgdGhlIG1heGltdW0gb2YgdGhlIHttYXggb2NjdXJzfSBvZiBldmVyeQotICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSAqbWF4aW11bSoKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgZWFjaCBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkubXVsdGlwbHkobWF4T2NjdXJzSW5XaWxkQ2FyZE9yRWxlbWVudC5hZGQobWF4T2NjdXJzSW5Hcm91cCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1heFJhbmdlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0RWZmZWN0aXZlTWF4UmFuZ2VBbGxTZXEoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4UmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIEJpZ0ludGVnZXIgVU5CT1VOREVEID0gbnVsbDsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFZmZlY3RpdmUgVG90YWwgUmFuZ2UgKGFsbCBhbmQgc2VxdWVuY2UpCi0gICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYSBwYXJ0aWNsZSB3aG9zZSB7dGVybX0gaXMgYSBncm91cCB3aG9zZSB7Y29tcG9zaXRvcn0gaXMgYWxsIG9yIHNlcXVlbmNlIGlzIGEKLSAgICAgICAgLy8gcGFpciBvZiBtaW5pbXVtIGFuZCBtYXhpbXVtLCBhcyBmb2xsb3dzOgotICAgICAgICAvLyBNQVhJTVVNCi0gICAgICAgIC8vIDEpIHVuYm91bmRlZCBpZiB0aGUge21heCBvY2N1cnN9IG9mIGFueSB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IG9yCi0gICAgICAgIC8vIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhbnkgb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBpcwotICAgICAgICAvLyB1bmJvdW5kZWQsIG9yIDIpIGlmIGFueSBvZiB0aG9zZSBpcyBub24temVybyBhbmQgdGhlIHttYXggb2NjdXJzfSBvZiB0aGUgcGFydGljbGUgaXRzZWxmIGlzIHVuYm91bmRlZCwgb3RoZXJ3aXNlCi0gICAgICAgIC8vIDMpIHRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttYXggb2NjdXJzfSBhbmQgdGhlICpzdW0qIG9mIHRoZSB7bWF4IG9jY3Vyc30gb2YgZXZlcnkgd2lsZGNhcmQgb3IgZWxlbWVudAotICAgICAgICAvLyBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBhbmQgdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YKLSAgICAgICAgLy8gdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSAob3IgMCBpZiB0aGVyZSBhcmUgbm8ge3BhcnRpY2xlc30pLgotCi0gICAgICAgIGJvb2xlYW4gbm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCA9IGZhbHNlOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3Vyc1RvdGFsID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3Vyc0luR3JvdXAgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydGljbGVDaGlsZHJlbiA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBwYXJ0aWNsZUNoaWxkcmVuW2ldOwotICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiB1bmJvdW5kZWQgdGhlbiBtYXhvY2N1cnMgd2lsbCBiZSBudWxsCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSA9PSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhbmdlID0gVU5CT1VOREVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldEludE1heE9jY3VycygpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgdGh0IGF0IGxlYXN0IG9uZSBub24temVybyBwYXJ0aWNsZSBpcyBmb3VuZCBmb3IgbGF0ZXIgdGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vblplcm9QYXJ0aWNsZUNoaWxkRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vyc1RvdGFsID0gbWF4T2NjdXJzVG90YWwuYWRkKHBhcnRpY2xlLmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgYW4gdW5ib3VuZGVkIGhhcyBiZWVuIGZvdW5kIHRoZW4gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGlmIChtYXhSYW5nZSA9PSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIDEpIHVuYm91bmRlZCBpZiB0aGUge21heCBvY2N1cnN9IG9mIGFueSB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IG9yCi0gICAgICAgIC8vIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhbnkgb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBpcwotICAgICAgICAvLyB1bmJvdW5kZWQKLSAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgLy8gMikgaWYgYW55IG9mIHRob3NlIGlzIG5vbi16ZXJvIGFuZCB0aGUge21heCBvY2N1cnN9IG9mIHRoZSBwYXJ0aWNsZSBpdHNlbGYgaXMgdW5ib3VuZGVkCi0gICAgICAgICAgICBpZiAobm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCAmJiBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBVTkJPVU5ERUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIDMpIHRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttYXggb2NjdXJzfSBhbmQgdGhlIHN1bSBvZiB0aGUge21heCBvY2N1cnN9IG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAvLyBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBhbmQgdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkubXVsdGlwbHkobWF4T2NjdXJzVG90YWwuYWRkKG1heE9jY3Vyc0luR3JvdXApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXhSYW5nZTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0RWZmZWN0aXZlTWluUmFuZ2VDaG9pY2UoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChjaG9pY2UpCi0gICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYSBwYXJ0aWNsZSB3aG9zZSB7dGVybX0gaXMgYSBncm91cCB3aG9zZSB7Y29tcG9zaXRvcn0gaXMgY2hvaWNlIGlzIGEgcGFpciBvZgotICAgICAgICAvLyBtaW5pbXVtIGFuZCBtYXhpbXVtLCBhcyBmb2xsb3dzOgotICAgICAgICAvLyBNSU5JTVVNCi0gICAgICAgIC8vIFRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttaW4gb2NjdXJzfQotICAgICAgICAvLyBhbmQgdGhlICptaW5pbXVtKiBvZiB0aGUge21pbiBvY2N1cnN9IG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgLy8gZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSBtaW5pbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoIG9mCi0gICAgICAgIC8vIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gKG9yIDAgaWYgdGhlcmUgYXJlIG5vIHtwYXJ0aWNsZXN9KS4KLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBCaWdJbnRlZ2VyIG1pblJhbmdlID0gbnVsbDsKLSAgICAgICAgLy8gZ2V0IHRoZSBtaW5pbXVtIG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgLy8gdG90YWwgdXAgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBmb3IgZWFjaCBncm91cAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gcGFydGljbGVDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pblJhbmdlID09IG51bGwgfHwgbWluUmFuZ2UuY29tcGFyZVRvKHBhcnRpY2xlLmdldE1pbk9jY3VycygpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblJhbmdlID0gcGFydGljbGUuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBtcnMgPSBnZXRFZmZlY3RpdmVNaW5SYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWluUmFuZ2UgPT0gbnVsbCB8fCBtaW5SYW5nZS5jb21wYXJlVG8obXJzKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblJhbmdlID0gbXJzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1yYyA9IGdldEVmZmVjdGl2ZU1pblJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaW5SYW5nZSA9PSBudWxsIHx8IG1pblJhbmdlLmNvbXBhcmVUbyhtcmMpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWluUmFuZ2UgPSBtcmM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1pblJhbmdlID09IG51bGwpCi0gICAgICAgICAgICBtaW5SYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLQotICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRvdGFsCi0gICAgICAgIG1pblJhbmdlID0gZGVyaXZlZE1vZGVsLmdldE1pbk9jY3VycygpLm11bHRpcGx5KG1pblJhbmdlKTsKLSAgICAgICAgcmV0dXJuIG1pblJhbmdlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0RWZmZWN0aXZlTWluUmFuZ2VBbGxTZXEoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWluUmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChhbGwgYW5kIHNlcXVlbmNlKQotICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGEgcGFydGljbGUgd2hvc2Uge3Rlcm19IGlzIGEgZ3JvdXAgd2hvc2Uge2NvbXBvc2l0b3J9IGlzIGFsbCBvciBzZXF1ZW5jZSBpcyBhCi0gICAgICAgIC8vIHBhaXIgb2YgbWluaW11bSBhbmQgbWF4aW11bSwgYXMgZm9sbG93czoKLSAgICAgICAgLy8gTUlOSU1VTQotICAgICAgICAvLyBUaGUgcHJvZHVjdCBvZiB0aGUgcGFydGljbGUncyB7bWluIG9jY3Vyc30KLSAgICAgICAgLy8gYW5kIHRoZSAqc3VtKiBvZiB0aGUge21pbiBvY2N1cnN9IG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgLy8gZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30KLSAgICAgICAgLy8gYW5kIHRoZSBtaW5pbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoCi0gICAgICAgIC8vIG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gKG9yIDAgaWYgdGhlcmUgYXJlIG5vIHtwYXJ0aWNsZXN9KS4KLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgQmlnSW50ZWdlciBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gcGFydGljbGVDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb3RhbE1pbk9jY3VycyA9IHBhcnRpY2xlVG90YWxNaW5PY2N1cnMuYWRkKHBhcnRpY2xlLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb3RhbE1pbk9jY3VycyA9IHBhcnRpY2xlVG90YWxNaW5PY2N1cnMuYWRkKGdldEVmZmVjdGl2ZU1pblJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb3RhbE1pbk9jY3VycyA9IHBhcnRpY2xlVG90YWxNaW5PY2N1cnMuYWRkKGdldEVmZmVjdGl2ZU1pblJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1pblJhbmdlID0gZGVyaXZlZE1vZGVsLmdldE1pbk9jY3VycygpLm11bHRpcGx5KHBhcnRpY2xlVG90YWxNaW5PY2N1cnMpOwotCi0gICAgICAgIHJldHVybiBtaW5SYW5nZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5zU3Vic2V0KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gbnNTdWJzZXQgaXMgY2FsbGVkIHdoZW4gYmFzZTogQU5ZLCBkZXJpdmVkOiBBTlkKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKLSAgICAgICAgYXNzZXJ0IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKLSAgICAgICAgYm9vbGVhbiBuc1N1YnNldCA9IGZhbHNlOwotICAgICAgICAvLyBGb3IgYSB3aWxkY2FyZCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW5vdGhlciB3aWxkY2FyZCBwYXJ0aWNsZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgUidzIG9jY3VycmVuY2UgcmFuZ2UgbXVzdCBiZSBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLSAgICAgICAgaWYgKG9jY3VycmVuY2VSYW5nZU9LKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAvLyAyIFIncyB7bmFtZXNwYWNlIGNvbnN0cmFpbnR9IG11c3QgYmUgYW4gaW50ZW5zaW9uYWwgc3Vic2V0IG9mIEIncyB7bmFtZXNwYWNlIGNvbnN0cmFpbnR9IGFzIGRlZmluZWQKLSAgICAgICAgICAgIC8vIGJ5IFdpbGRjYXJkIFN1YnNldCAopzMuMTAuNikuCi0gICAgICAgICAgICBpZiAoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCkuaW52ZXJzZSgpLmlzRGlzam9pbnQoZGVyaXZlZE1vZGVsLmdldFdpbGRjYXJkU2V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgbnNTdWJzZXQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuc1N1YnNldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE5TSXNOb3RTdWJzZXRFcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5zU3Vic2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXROU0lzTm90U3Vic2V0RXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBuc1N1YnNldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5zQ29tcGF0KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50LCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gbnNDb21wYXQgaXMgY2FsbGVkIHdoZW4gYmFzZTogQU5ZLCBkZXJpdmVkOiBFTEVNRU5UCi0gICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQ7Ci0gICAgICAgIGJvb2xlYW4gbnNDb21wYXQgPSBmYWxzZTsKLSAgICAgICAgLy8gRm9yIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgd2lsZGNhcmQgcGFydGljbGUgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFRoZSBlbGVtZW50IGRlY2xhcmF0aW9uJ3Mge3RhcmdldCBuYW1lc3BhY2V9IGlzILd2YWxpZLcgd2l0aCByZXNwZWN0IHRvIHRoZSB3aWxkY2FyZCdzIHtuYW1lc3BhY2UgY29uc3RyYWludH0KLSAgICAgICAgLy8gYXMgZGVmaW5lZCBieSBXaWxkY2FyZCBhbGxvd3MgTmFtZXNwYWNlIE5hbWUgKKczLjEwLjQpLgotICAgICAgICBpZiAoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCkuY29udGFpbnMoZGVyaXZlZEVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgLy8gMiBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLSAgICAgICAgICAgIGlmIChvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIChTY2hlbWFQYXJ0aWNsZSkgZGVyaXZlZEVsZW1lbnQsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICBuc0NvbXBhdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3IoYmFzZU1vZGVsLCAoU2NoZW1hUGFydGljbGUpIGRlcml2ZWRFbGVtZW50KSwgY29udGV4dCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnNDb21wYXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE5TSXNOb3RTdWJzZXRFcnJvcihiYXNlTW9kZWwsIChTY2hlbWFQYXJ0aWNsZSkgZGVyaXZlZEVsZW1lbnQpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBuc0NvbXBhdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0TlNJc05vdFN1YnNldEVycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSwgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gVGhlIG5hbWVzcGFjZShzKSBvZiB0aGUgZGVyaXZlZCBmaWVsZDogIiArIHByaW50UGFydGljbGUoZGVyaXZlZFBhcnRpY2xlKQotICAgICAgICAgICAgICAgICsgIiBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBuYW1lc3BhY2Uocykgb2YgdGhlIGJhc2UgZmllbGQ6ICIgKyBwcmludFBhcnRpY2xlKGJhc2VQYXJ0aWNsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBkZXJpdmVkIGNvbnRlbnQgbW9kZWwgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkTW9kZWwpCi0gICAgICAgICAgICAgICAgKyAiIGNhbm5vdCByZXN0cmljdCBiYXNlIGNvbnRlbnQgbW9kZWwgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlTW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmFtZUFuZFR5cGVPSyhTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZUVsZW1lbnQsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkRWxlbWVudCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIG5hbWVBbmRUeXBlT0sgY2FsbGVkIHdoZW4gYmFzZTogRUxFTUVOVCBhbmQgZGVyaXZlZDogRUxFTUVOVAotICAgICAgICBib29sZWFuIG5hbWVBbmRUeXBlT0sgPSBmYWxzZTsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBSZXN0cmljdGlvbiBPSyAoRWx0OkVsdCAtLSBOYW1lQW5kVHlwZU9LKQotICAgICAgICAvLyAxIFRoZSBkZWNsYXJhdGlvbnMnIHtuYW1lfXMgYW5kIHt0YXJnZXQgbmFtZXNwYWNlfXMgYXJlIHRoZSBzYW1lLgotICAgICAgICBpZiAoKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCkuY2FuU3RhcnRXaXRoRWxlbWVudChkZXJpdmVkRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAvLyAyIEVpdGhlciBCJ3Mge25pbGxhYmxlfSBpcyB0cnVlIG9yIFIncyB7bmlsbGFibGV9IGlzIGZhbHNlLgotICAgICAgICAgICAgaWYgKGJhc2VFbGVtZW50LmlzTmlsbGFibGUoKSB8fCAhZGVyaXZlZEVsZW1lbnQuaXNOaWxsYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gMyBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLSAgICAgICAgICAgICAgICBpZiAob2NjdXJyZW5jZVJhbmdlT0soKFNjaGVtYVBhcnRpY2xlKSBiYXNlRWxlbWVudCwgKFNjaGVtYVBhcnRpY2xlKSBkZXJpdmVkRWxlbWVudCwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAvLyA0IGVpdGhlciBCJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgYWJzZW50LCBvciBpcyBub3QgZml4ZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIFIncyBkZWNsYXJhdGlvbidzIHt2YWx1ZSBjb25zdHJhaW50fSBpcyBmaXhlZCB3aXRoIHRoZSBzYW1lIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICBuYW1lQW5kVHlwZU9LID0gY2hlY2tGaXhlZChiYXNlRWxlbWVudCwgZGVyaXZlZEVsZW1lbnQsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lQW5kVHlwZU9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyA1IFIncyBkZWNsYXJhdGlvbidzIHtpZGVudGl0eS1jb25zdHJhaW50IGRlZmluaXRpb25zfSBpcyBhIHN1YnNldCBvZiBCJ3MgZGVjbGFyYXRpb24ncyB7aWRlbnRpdHktY29uc3RyYWludCBkZWZpbml0aW9uc30sIGlmIGFueS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVBbmRUeXBlT0sgPSBjaGVja0lkZW50aXR5Q29uc3RyYWludHMoYmFzZUVsZW1lbnQsIGRlcml2ZWRFbGVtZW50LCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVBbmRUeXBlT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3IFIncyB7dHlwZSBkZWZpbml0aW9ufSBpcyB2YWxpZGx5IGRlcml2ZWQgZ2l2ZW4ge2V4dGVuc2lvbiwgbGlzdCwgdW5pb259IGZyb20gQidzIHt0eXBlIGRlZmluaXRpb259IGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lZCBieSBUeXBlIERlcml2YXRpb24gT0sgKENvbXBsZXgpICinMy40LjYpIG9yIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAopzMuMTQuNiksIGFzIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVBbmRUeXBlT0sgPSB0eXBlRGVyaXZhdGlvbk9LKGJhc2VFbGVtZW50LmdldFR5cGUoKSwgZGVyaXZlZEVsZW1lbnQuZ2V0VHlwZSgpLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lQW5kVHlwZU9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDYgUidzIGRlY2xhcmF0aW9uJ3Mge2Rpc2FsbG93ZWQgc3Vic3RpdHV0aW9uc30gaXMgYSBzdXBlcnNldCBvZiBCJ3MgZGVjbGFyYXRpb24ncyB7ZGlzYWxsb3dlZCBzdWJzdGl0dXRpb25zfS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUFuZFR5cGVPSyA9IGJsb2NrU2V0T0soYmFzZUVsZW1lbnQsIGRlcml2ZWRFbGVtZW50LCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZUFuZFR5cGVPSzsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBibG9ja1NldE9LKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlRWxlbWVudCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50LCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAoYmFzZUVsZW1lbnQuYmxvY2tSZXN0cmljdGlvbigpICYmICFkZXJpdmVkRWxlbWVudC5ibG9ja1Jlc3RyaWN0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJSZXN0cmljdGlvbiBJbnZhbGlkLiAgRGVyaXZlZCAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpZGVyaXZlZEVsZW1lbnQpICsgIiBkb2VzIG5vdCBibG9jayByZXN0cmljdGlvbiBhcyBkb2VzIHRoZSBiYXNlICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmFzZUVsZW1lbnQuYmxvY2tFeHRlbnNpb24oKSAmJiAhZGVyaXZlZEVsZW1lbnQuYmxvY2tFeHRlbnNpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIlJlc3RyaWN0aW9uIEludmFsaWQuICBEZXJpdmVkICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkRWxlbWVudCkgKyAiIGRvZXMgbm90IGJsb2NrIGV4dGVuc2lvbiBhcyBkb2VzIHRoZSBiYXNlICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmFzZUVsZW1lbnQuYmxvY2tTdWJzdGl0dXRpb24oKSAmJiAhZGVyaXZlZEVsZW1lbnQuYmxvY2tTdWJzdGl0dXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIlJlc3RyaWN0aW9uIEludmFsaWQuICBEZXJpdmVkICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkRWxlbWVudCkgKyAiIGRvZXMgbm90IGJsb2NrIHN1YnN0aXR1dGlvbiBhcyBkb2VzIHRoZSBiYXNlICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlRGVyaXZhdGlvbk9LKFNjaGVtYVR5cGUgYmFzZVR5cGUsIFNjaGVtYVR5cGUgZGVyaXZlZFR5cGUsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICBib29sZWFuIHR5cGVEZXJpdmF0aW9uT0sgPSBmYWxzZTsKLSAgICAgICAgLy8gMSBJZiBCIGFuZCBEIGFyZSBub3QgdGhlIHNhbWUgdHlwZSBkZWZpbml0aW9uLCB0aGVuIHRoZSB7ZGVyaXZhdGlvbiBtZXRob2R9IG9mIEQgbXVzdCBub3QgYmUgaW4gdGhlIHN1YnNldC4KLSAgICAgICAgLy8gMiBPbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDIuMSBCIGFuZCBEIG11c3QgYmUgdGhlIHNhbWUgdHlwZSBkZWZpbml0aW9uLgotICAgICAgICAvLyAyLjIgQiBtdXN0IGJlIEQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259LgotICAgICAgICAvLyAyLjMgQWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAyLjMuMSBEJ3Mge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBtdXN0IG5vdCBiZSB0aGUgt3VyLXR5cGUgZGVmaW5pdGlvbrcuCi0gICAgICAgIC8vIDIuMy4yIFRoZSBhcHByb3ByaWF0ZSBjYXNlIGFtb25nIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAyLjMuMi4xIElmIEQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIGNvbXBsZXgsIHRoZW4gaXQgbXVzdCBiZSB2YWxpZGx5IGRlcml2ZWQgZnJvbSBCIGdpdmVuIHRoZSBzdWJzZXQgYXMgZGVmaW5lZCBieSB0aGlzIGNvbnN0cmFpbnQuCi0gICAgICAgIC8vIDIuMy4yLjIgSWYgRCdzIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gaXMgc2ltcGxlLCB0aGVuIGl0IG11c3QgYmUgdmFsaWRseSBkZXJpdmVkIGZyb20gQiBnaXZlbiB0aGUgc3Vic2V0IGFzIGRlZmluZWQgaW4gVHlwZSBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICinMy4xNC42KS4KLSAgICAgICAgLy8gICBUaGlzIGxpbmUgd2lsbCBjaGVjayBpZiBkZXJpdmVkVHlwZSBpcyBhIHN1YlR5cGUgb2YgYmFzZVR5cGUgKHNob3VsZCBoYW5kbGUgYWxsIG9mIHRoZSAyLnh4IGNoZWNrcyBhYm92ZSkKLSAgICAgICAgaWYgKGJhc2VUeXBlLmlzQXNzaWduYWJsZUZyb20oZGVyaXZlZFR5cGUpKSB7Ci0gICAgICAgICAgICAvLyBPayBkZXJpdmVkIHR5cGUgaXMgc3VidHlwZSBidXQgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgb2YgdGhlIGRlcml2YXRpb25zIGJldHdlZW4gdGhlIHR3byB0eXBlcyBhcmUgYnkKLSAgICAgICAgICAgIC8vIFJlc3RyaWN0aW9uLgotICAgICAgICAgICAgdHlwZURlcml2YXRpb25PSyA9IGNoZWNrQWxsRGVyaXZhdGlvbnNGb3JSZXN0cmljdGlvbihiYXNlVHlwZSwgZGVyaXZlZFR5cGUsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBkZXJpdmVkIHR5cGUgaXMgbm90IGEgc3ViLXR5cGUgb2YgYmFzZSB0eXBlCi0gICAgICAgICAgICB0eXBlRGVyaXZhdGlvbk9LID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkVHlwZU5vdFN1YlR5cGVFcnJvcihiYXNlVHlwZSwgZGVyaXZlZFR5cGUpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZURlcml2YXRpb25PSzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0RGVyaXZlZFR5cGVOb3RTdWJUeXBlRXJyb3IoU2NoZW1hVHlwZSBiYXNlVHlwZSwgU2NoZW1hVHlwZSBkZXJpdmVkVHlwZSkgewotICAgICAgICByZXR1cm4gIlJlc3RyaWN0aW9uIEludmFsaWQuICBEZXJpdmVkIFR5cGU6ICIgKyBwcmludFR5cGUoZGVyaXZlZFR5cGUpICsgIiBpcyBub3QgYSBzdWItdHlwZSBvZiBCYXNlIFR5cGU6ICIgKyBwcmludFR5cGUoYmFzZVR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tBbGxEZXJpdmF0aW9uc0ZvclJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgYmFzZVR5cGUsIFNjaGVtYVR5cGUgZGVyaXZlZFR5cGUsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotCi0gICAgICAgIGJvb2xlYW4gYWxsRGVyaXZhdGlvbnNBcmVSZXN0cmljdGlvbnMgPSB0cnVlOwotICAgICAgICBTY2hlbWFUeXBlIGN1cnJlbnRUeXBlID0gZGVyaXZlZFR5cGU7Ci0gICAgICAgIC8vIHJ1biB1cCB0aGUgdHlwZXMgaGllcmFyY2h5IGZyb20gZGVyaXZlZCBUeXBlIHRvIGJhc2UgVHlwZSBhbmQgbWFrZSBzdXJlIHRoYXQgYWxsIGFyZSBkZXJpdmVkIGJ5Ci0gICAgICAgIC8vICAgcmVzdHJpY3Rpb24uICBJZiBhbnkgYXJlIG5vdCB0aGVuIHRoaXMgaXMgbm90IGEgdmFsaWQgcmVzdHJpY3Rpb24uCi0gICAgICAgIHdoaWxlICghYmFzZVR5cGUuZXF1YWxzKGN1cnJlbnRUeXBlKSkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRUeXBlLmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTikgewotICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWxsRGVyaXZhdGlvbnNBcmVSZXN0cmljdGlvbnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRBbGxEZXJpdmF0aW9uc0FyZU5vdFJlc3RyaWN0aW9uc0Vycm9yKGJhc2VUeXBlLCBkZXJpdmVkVHlwZSwgY3VycmVudFR5cGUpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFsbERlcml2YXRpb25zQXJlUmVzdHJpY3Rpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRBbGxEZXJpdmF0aW9uc0FyZU5vdFJlc3RyaWN0aW9uc0Vycm9yKFNjaGVtYVR5cGUgYmFzZVR5cGUsIFNjaGVtYVR5cGUgZGVyaXZlZFR5cGUsIFNjaGVtYVR5cGUgY3VycmVudFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIHR5cGUgIiArIHByaW50VHlwZShkZXJpdmVkVHlwZSkgKyAiIGRlcml2ZWQgZnJvbSBiYXNlIHR5cGUgIgotICAgICAgICAgICAgICAgICsgcHJpbnRUeXBlKGJhc2VUeXBlKSArICIgaGFzIGFuIGludGVybWVkaWFyeSB0eXBlICIgKyBwcmludFR5cGUoY3VycmVudFR5cGUpCi0gICAgICAgICAgICAgICAgKyAidGhhdCBpcyBub3QgZGVyaXZlZCBieSByZXN0cmljdGlvbi4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tJZGVudGl0eUNvbnN0cmFpbnRzKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlRWxlbWVudCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50LCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNSBSJ3MgZGVjbGFyYXRpb24ncyB7aWRlbnRpdHktY29uc3RyYWludCBkZWZpbml0aW9uc30gaXMgYSBzdWJzZXQgb2YgQidzIGRlY2xhcmF0aW9uJ3Mge2lkZW50aXR5LWNvbnN0cmFpbnQgZGVmaW5pdGlvbnN9LCBpZiBhbnkuCi0gICAgICAgIGJvb2xlYW4gaWRlbnRpdHlDb25zdHJhaW50c09LID0gdHJ1ZTsKLQotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBiYXNlQ29uc3RyYWludHMgPSBiYXNlRWxlbWVudC5nZXRJZGVudGl0eUNvbnN0cmFpbnRzKCk7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGRlcml2ZWRDb25zdHJhaW50cyA9IGRlcml2ZWRFbGVtZW50LmdldElkZW50aXR5Q29uc3RyYWludHMoKTsKLSAgICAgICAgLy8gY3ljbGUgdGhydSBkZXJpdmVkJ3MgaWRlbnRpdHkgY29uc3RyYWludHMgYW5kIGNoZWNrIGVhY2ggdG8gYXNzdXJlIHRoZXkgaW4gdGhlIGFycmF5IG9mIGJhc2UgY29uc3RyYWludHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXJpdmVkQ29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBkZXJpdmVkQ29uc3RyYWludCA9IGRlcml2ZWRDb25zdHJhaW50c1tpXTsKLSAgICAgICAgICAgIGlmIChjaGVja0ZvcklkZW50aXR5Q29uc3RyYWludEV4aXN0ZW5jZShiYXNlQ29uc3RyYWludHMsIGRlcml2ZWRDb25zdHJhaW50KSkgewotICAgICAgICAgICAgICAgIGlkZW50aXR5Q29uc3RyYWludHNPSyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdElkZW50aXR5Q29uc3RyYWludHNOb3RTdWJzZXRFcnJvcihiYXNlRWxlbWVudCwgZGVyaXZlZEVsZW1lbnQpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkZW50aXR5Q29uc3RyYWludHNPSzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0SWRlbnRpdHlDb25zdHJhaW50c05vdFN1YnNldEVycm9yKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlRWxlbWVudCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAiUmVzdHJpY3Rpb24gSW52YWxpZC4gIFRoZSBpZGVudGl0eSBjb25zdHJhaW50cyBmb3IgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWRlcml2ZWRFbGVtZW50KQotICAgICAgICAgICAgICAgICsgIiBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBpZGVudGl0eSBjb25zdHJhaW50cyBmb3IgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWJhc2VFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrRm9ySWRlbnRpdHlDb25zdHJhaW50RXhpc3RlbmNlKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGJhc2VDb25zdHJhaW50cywgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGRlcml2ZWRDb25zdHJhaW50KSB7Ci0gICAgICAgIC8vIHNwaW4gdGhydSB0aGUgYmFzZSBpZGVudGl0eSBjb25zdHJhaW50cyBjaGVjayB0byBzZWUgaWYgZGVyaXZlZCBjb25zdHJhaW50IGV4aXN0cwotICAgICAgICBib29sZWFuIGlkZW50aXR5Q29uc3RyYWludEV4aXN0cyA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VDb25zdHJhaW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGJhc2VDb25zdHJhaW50ID0gYmFzZUNvbnN0cmFpbnRzW2ldOwotICAgICAgICAgICAgaWYgKGJhc2VDb25zdHJhaW50LmdldE5hbWUoKS5lcXVhbHMoZGVyaXZlZENvbnN0cmFpbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGlkZW50aXR5Q29uc3RyYWludEV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkZW50aXR5Q29uc3RyYWludEV4aXN0czsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tGaXhlZChTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZU1vZGVsLCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNCBlaXRoZXIgQidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGFic2VudCwgb3IgaXMgbm90IGZpeGVkLAotICAgICAgICAvLyBvciBSJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgZml4ZWQgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgICAgYm9vbGVhbiBjaGVja0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChiYXNlTW9kZWwuaXNGaXhlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoYmFzZU1vZGVsLmdldERlZmF1bHRUZXh0KCkuZXF1YWxzKGRlcml2ZWRNb2RlbC5nZXREZWZhdWx0VGV4dCgpKSkgewotICAgICAgICAgICAgICAgIC8vICBSJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgZml4ZWQgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICBjaGVja0ZpeGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRlcml2ZWQgZWxlbWVudCBoYXMgYSBmaXhlZCB2YWx1ZSB0aGF0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBiYXNlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkRml4ZWRFcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICBjaGVja0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyAgQidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGFic2VudCwgb3IgaXMgbm90IGZpeGVkLAotICAgICAgICAgICAgY2hlY2tGaXhlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoZWNrRml4ZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEludmFsaWRGaXhlZEVycm9yKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlTW9kZWwsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkTW9kZWwpIHsKLSAgICAgICAgcmV0dXJuICJUaGUgRGVyaXZlZCBDb250ZW50IE1vZGVsIG9uIEVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkTW9kZWwpCi0gICAgICAgICAgICAgICAgKyAiJyBoYXMgYSBmaXhlZCB2YWx1ZSBvZjogJyIKLSAgICAgICAgICAgICAgICArIGRlcml2ZWRNb2RlbC5nZXREZWZhdWx0VGV4dCgpCi0gICAgICAgICAgICAgICAgKyAiJyB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgQmFzZSBDb250ZW50IE1vZGVsOiAnIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpYmFzZU1vZGVsKQotICAgICAgICAgICAgICAgICsgIicgd2hhdCBoYXMgYSBmaXhlZCB2YWx1ZSBvZjogJyIKLSAgICAgICAgICAgICAgICArIGJhc2VNb2RlbC5nZXREZWZhdWx0VGV4dCgpICsgIiciOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gb2NjdXJyZW5jZVJhbmdlT0soU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICBib29sZWFuIG9jY3VycmVuY2VSYW5nZU9LID0gZmFsc2U7Ci0gICAgICAgIC8vIE5vdGU6IGluIHRoZSBmb2xsb3dpbmcgY29tbWVudHMgKGZyb20gdGhlIHNjaGVtYSBzcGVjKSBvdGhlciBpcyB0aGUgYmFzZU1vZGVsCi0gICAgICAgIC8vIDEgSXRzIHttaW4gb2NjdXJzfSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3Mge21pbiBvY2N1cnN9LgotICAgICAgICBpZiAoZGVyaXZlZFBhcnRpY2xlLmdldE1pbk9jY3VycygpLmNvbXBhcmVUbyhiYXNlUGFydGljbGUuZ2V0TWluT2NjdXJzKCkpID49IDApIHsKLSAgICAgICAgICAgIC8vIDIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAgICAgLy8gMi4xIFRoZSBvdGhlcidzIHttYXggb2NjdXJzfSBpcyB1bmJvdW5kZWQuCi0gICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvY2N1cnJlbmNlUmFuZ2VPSyA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIDIuMiBCb3RoIHttYXggb2NjdXJzfSBhcmUgbnVtYmVycywgYW5kIHRoZSBwYXJ0aWNsZSdzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncy4KLSAgICAgICAgICAgICAgICBpZiAoZGVyaXZlZFBhcnRpY2xlLmdldE1heE9jY3VycygpICE9IG51bGwgJiYgYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWRQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VSYW5nZU9LID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlUmFuZ2VPSyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlLmdldE5hbWUoKSA9PSBudWxsIHx8IGRlcml2ZWRQYXJ0aWNsZS5nZXROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvckdyb3VwKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvcihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9jY3VycmVuY2VSYW5nZU9LID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlLmdldE5hbWUoKSA9PSBudWxsIHx8IGRlcml2ZWRQYXJ0aWNsZS5nZXROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3JHcm91cChiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvcihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2NjdXJyZW5jZVJhbmdlT0s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3JHcm91cChTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWF4T2NjdXJzIGZvciB0aGUgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkUGFydGljbGUpCi0gICAgICAgICAgICAgICAgKyAiICgiICsgcHJpbnRNYXhPY2N1cnMoZGVyaXZlZFBhcnRpY2xlLmdldE1heE9jY3VycygpKQotICAgICAgICAgICAgICAgICsgIikgaXMgZ3JlYXRlciB0aGFuIHRoYW4gdGhlIG1heE9jY3VycyBmb3IgdGhlIGJhc2UgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlUGFydGljbGUpCi0gICAgICAgICAgICAgICAgKyAiICgiICsgcHJpbnRNYXhPY2N1cnMoYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpKSArICIpIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvckdyb3VwKFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSwgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtaW5PY2N1cnMgZm9yIHRoZSAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRQYXJ0aWNsZSkKLSAgICAgICAgICAgICAgICArICIgKCIgKyBkZXJpdmVkUGFydGljbGUuZ2V0TWluT2NjdXJzKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIikgaXMgbGVzcyB0aGFuIHRoYW4gdGhlIG1pbk9jY3VycyBmb3IgdGhlIGJhc2UgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlUGFydGljbGUpCi0gICAgICAgICAgICAgICAgKyAiICgiICsgYmFzZVBhcnRpY2xlLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZUZpZWxkLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkRmllbGQpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1pbk9jY3VycyBmb3IgdGhlIGVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRGaWVsZCkKLSAgICAgICAgICAgICAgICArICInICgiICsgZGVyaXZlZEZpZWxkLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIpIGlzIGxlc3MgdGhhbiB0aGFuIHRoZSBtaW5PY2N1cnMgZm9yIHRoZSBiYXNlIGVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGJhc2VGaWVsZCkKLSAgICAgICAgICAgICAgICArICInICgiICsgYmFzZUZpZWxkLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZUZpZWxkLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkRmllbGQpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1heE9jY3VycyBmb3IgdGhlIGVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRGaWVsZCkKLSAgICAgICAgICAgICAgICArICInICgiICsgcHJpbnRNYXhPY2N1cnMoZGVyaXZlZEZpZWxkLmdldE1heE9jY3VycygpKQotICAgICAgICAgICAgICAgICsgIikgaXMgZ3JlYXRlciB0aGFuIHRoYW4gdGhlIG1heE9jY3VycyBmb3IgdGhlIGJhc2UgZWxlbWVudDogJyIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoYmFzZUZpZWxkKSArICInICgiICsgcHJpbnRNYXhPY2N1cnMoYmFzZUZpZWxkLmdldE1heE9jY3VycygpKSArICIpIjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW50UGFydGljbGUoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8YWxsPiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxjaG9pY2U+IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxlbGVtZW50IG5hbWU9XCIiICsgUU5hbWVIZWxwZXIucHJldHR5KHBhcnQuZ2V0TmFtZSgpKSArICJcIj4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxzZXF1ZW5jZT4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxhbnk+IjsKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHJldHVybiAiPz8iOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmludE1heE9jY3VycyhCaWdJbnRlZ2VyIGJpKQotICAgIHsKLSAgICAgICAgaWYgKGJpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gInVuYm91bmRlZCI7Ci0gICAgICAgIHJldHVybiBiaS50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbnRUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLnByZXR0eSh0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiB0eXBlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1N1YnN0aXR1dGlvbkdyb3VwcyhTY2hlbWFHbG9iYWxFbGVtZW50W10gZWx0cykKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBlbHRzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQgPSBlbHRzW2ldOwotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBoZWFkID0gZWx0LnN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0KLSAgICAgICAgICAgIGlmIChoZWFkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBoZWFkVHlwZSA9IGhlYWQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgdGFpbFR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIFhtbE9iamVjdCBwYXJzZVRyZWUgPSAoKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKWVsdCkuX3BhcnNlT2JqZWN0OwotCi0gICAgICAgICAgICAgICAgaWYgKCEgaGVhZFR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0YWlsVHlwZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGVsdC5nZXROYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgbXVzdCBoYXZlIGEgdHlwZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgdHlwZSBvZiBpdHMgc3Vic3RpdHV0aW9uIGdyb3VwLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSU5DT05TSVNURU5UX1RZUEUsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChoZWFkLmZpbmFsRXh0ZW5zaW9uKCkgJiYgaGVhZC5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGVsdC5nZXROYW1lKCkpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgZWxlbWVudCB3aXRoIGZpbmFsPScjYWxsJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoISBoZWFkVHlwZS5lcXVhbHModGFpbFR5cGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWQuZmluYWxFeHRlbnNpb24oKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbFR5cGUuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShlbHQuZ2V0TmFtZSgpKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIHN1YnN0aXR1dGVkIGZvciBlbGVtZW50IHdpdGggZmluYWw9J2V4dGVuc2lvbiciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlYWQuZmluYWxSZXN0cmljdGlvbigpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxUeXBlLmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShlbHQuZ2V0TmFtZSgpKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIHN1YnN0aXR1dGVkIGZvciBlbGVtZW50IHdpdGggZmluYWw9J3Jlc3RyaWN0aW9uJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ29tcGxleFR5cGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjAwMzg0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuKjsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkFueURvY3VtZW50LkFueTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb25OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0U3BlY2lmaWNhdGlvbjsKLQotcHVibGljIGNsYXNzIFN0c2NDb21wbGV4VHlwZVJlc29sdmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBHcm91cCBnZXRDb250ZW50TW9kZWwoQ29tcGxleFR5cGUgcGFyc2VDdCkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJzZUN0LmdldEFsbCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRBbGwoKTsKLQotICAgICAgICBpZiAocGFyc2VDdC5nZXRTZXF1ZW5jZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRTZXF1ZW5jZSgpOwotCi0gICAgICAgIGlmIChwYXJzZUN0LmdldENob2ljZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRDaG9pY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VDdC5nZXRHcm91cCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRHcm91cCgpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAgZ2V0Q29udGVudE1vZGVsKENvbXBsZXhSZXN0cmljdGlvblR5cGUgcGFyc2VSZXN0KQotICAgIHsKLSAgICAgICAgaWYgKHBhcnNlUmVzdC5nZXRBbGwoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVzdC5nZXRBbGwoKTsKLQotICAgICAgICBpZiAocGFyc2VSZXN0LmdldFNlcXVlbmNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZVJlc3QuZ2V0U2VxdWVuY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VSZXN0LmdldENob2ljZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VSZXN0LmdldENob2ljZSgpOwotCi0gICAgICAgIGlmIChwYXJzZVJlc3QuZ2V0R3JvdXAoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVzdC5nZXRHcm91cCgpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHcm91cCBnZXRDb250ZW50TW9kZWwoRXh0ZW5zaW9uVHlwZSBwYXJzZUV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJzZUV4dC5nZXRBbGwoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0LmdldEFsbCgpOwotCi0gICAgICAgIGlmIChwYXJzZUV4dC5nZXRTZXF1ZW5jZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VFeHQuZ2V0U2VxdWVuY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VFeHQuZ2V0Q2hvaWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUV4dC5nZXRDaG9pY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VFeHQuZ2V0R3JvdXAoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0LmdldEdyb3VwKCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWEgZ2V0U2NoZW1hKFhtbE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBvLm5ld0N1cnNvcigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICggYy50b1BhcmVudCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoby5zY2hlbWFUeXBlKCkuZXF1YWxzKFNjaGVtYS50eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTY2hlbWEpIG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVDb21wbGV4VHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIENvbXBsZXhUeXBlIHBhcnNlQ3QgPSAoQ29tcGxleFR5cGUpc0ltcGwuZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKHBhcnNlQ3QpOwotCi0gICAgICAgIC8vIFNldCBhYnN0cmFjdCAmIGZpbmFsIGZsYWdzCi0gICAgICAgIGJvb2xlYW4gYWJzID0gcGFyc2VDdC5pc1NldEFic3RyYWN0KCkgPyBwYXJzZUN0LmdldEFic3RyYWN0KCkgOiBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmaW5hbEV4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsUmVzdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsTGlzdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsVW5pb24gPSBmYWxzZTsKLQotICAgICAgICBPYmplY3QgZHMgPSBudWxsOwotICAgICAgICBpZiAocGFyc2VDdC5pc1NldEZpbmFsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzID0gcGFyc2VDdC5nZXRGaW5hbCgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEluc3BlY3QgdGhlIGZpbmFsIGRlZmF1bHQgYXR0cmlidXRlIG9uIHRoZSBzY2hlbWEKLSAgICAgICAgZWxzZSBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmlzU2V0RmluYWxEZWZhdWx0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzID0gc2NoZW1hLmdldEZpbmFsRGVmYXVsdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkcyBpbnN0YW5jZW9mIFN0cmluZyAmJiBkcy5lcXVhbHMoIiNhbGwiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAjQUxMIHZhbHVlCi0gICAgICAgICAgICAgICAgZmluYWxFeHQgPSBmaW5hbFJlc3QgPSBmaW5hbExpc3QgPSBmaW5hbFVuaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGRzIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygiZXh0ZW5zaW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsRXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgZmluYWxSZXN0ID0gdHJ1ZTsKLQotLy8gU2luY2UgY29tcGxleCB0eXBlcyBkb24ndCBwYXJ0aWNpcGF0ZSBpbiBsaXN0IGFuZCB1bmlvbnMsIHRoZXNlIGNhbiByZW1haW4KLS8vIGZhbHNlLiAgUGVyaGFwcyB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IuCi0KLS8vICAgICAgICAgICAgICAgIGlmICgoKExpc3QpZHMpLmNvbnRhaW5zKCJsaXN0IikpCi0vLyAgICAgICAgICAgICAgICAgICAgZmluYWxMaXN0ID0gdHJ1ZTsKLS8vICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoInVuaW9uIikpCi0vLyAgICAgICAgICAgICAgICAgICAgZmluYWxVbmlvbiA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5zZXRBYnN0cmFjdEZpbmFsKGFicywgZmluYWxFeHQsIGZpbmFsUmVzdCwgZmluYWxMaXN0LCBmaW5hbFVuaW9uKTsKLQotICAgICAgICAvLyBTZXQgYmxvY2sgZmxhZ3MKLSAgICAgICAgYm9vbGVhbiBibG9ja0V4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJsb2NrUmVzdCA9IGZhbHNlOwotICAgICAgICBPYmplY3QgYmxvY2sgPSBudWxsOwotCi0gICAgICAgIGlmIChwYXJzZUN0LmlzU2V0QmxvY2soKSkKLSAgICAgICAgICAgIGJsb2NrID0gcGFyc2VDdC5nZXRCbG9jaygpOwotICAgICAgICBlbHNlIGlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuaXNTZXRCbG9ja0RlZmF1bHQoKSkKLSAgICAgICAgICAgIGJsb2NrID0gc2NoZW1hLmdldEJsb2NrRGVmYXVsdCgpOwotCi0gICAgICAgIGlmIChibG9jayAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBTdHJpbmcgJiYgYmxvY2suZXF1YWxzKCIjYWxsIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gI0FMTCB2YWx1ZQotICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gYmxvY2tSZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygiZXh0ZW5zaW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tSZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnNldEJsb2NrKGJsb2NrRXh0LCBibG9ja1Jlc3QpOwotCi0gICAgICAgIC8vIFZlcmlmeTogaGF2ZSBzaW1wbGVDb250ZW50LCBjb21wbGV4Q29udGVudCwgb3IgZGlyZWN0IHN0dWZmCi0gICAgICAgIENvbXBsZXhDb250ZW50RG9jdW1lbnQuQ29tcGxleENvbnRlbnQgcGFyc2VDYyA9IHBhcnNlQ3QuZ2V0Q29tcGxleENvbnRlbnQoKTsKLSAgICAgICAgU2ltcGxlQ29udGVudERvY3VtZW50LlNpbXBsZUNvbnRlbnQgcGFyc2VTYyA9IHBhcnNlQ3QuZ2V0U2ltcGxlQ29udGVudCgpOwotICAgICAgICBHcm91cCBwYXJzZUdyb3VwID0gZ2V0Q29udGVudE1vZGVsKHBhcnNlQ3QpOwotICAgICAgICBpbnQgY291bnQgPQotICAgICAgICAgICAgICAgIChwYXJzZUNjICE9IG51bGwgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgIChwYXJzZVNjICE9IG51bGwgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgIChwYXJzZUdyb3VwICE9IG51bGwgPyAxIDogMCk7Ci0gICAgICAgIGlmIChjb3VudCA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIGNvbXBsZXggdHlwZSBtdXN0IGRlZmluZSBlaXRoZXIgYSBjb250ZW50IG1vZGVsLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAib3IgYSBzaW1wbGVDb250ZW50IG9yIGNvbXBsZXhDb250ZW50IGRlcml2YXRpb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25lIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfQ09OVEVOVF9NT0RFTCwgcGFyc2VDdCk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgdGhlIGZpcnN0IG9mIGNvbXBsZXhDb250ZW50LCBzaW1wbGVDb250ZW50LCBtb2RlbAotICAgICAgICAgICAgcGFyc2VHcm91cCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocGFyc2VDYyAhPSBudWxsICYmIHBhcnNlU2MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYXJzZVNjID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBhcnNlQ2MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcnNlQ2MuZ2V0RXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBwYXJzZUNjLmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVzdHJpY3Rpb24gY29uZmxpY3RzIHdpdGggZXh0ZW5zaW9uIiwgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9DT05URU5UX01PREVMLCBwYXJzZUNjLmdldFJlc3RyaWN0aW9uKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBNaXhlZCBjYW4gYmUgc3BlY2lmaWVkIGluIHR3byBwbGFjZXM6IHRoZSBydWxlcyBhcmUgdGhhdCBDYyB3aW5zIG92ZXIgQ3QgaWYgcHJlc2VudAotICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2MtbXZlCi0gICAgICAgICAgICBib29sZWFuIG1peGVkID0gcGFyc2VDYy5pc1NldE1peGVkKCkgPyBwYXJzZUNjLmdldE1peGVkKCkgOiBwYXJzZUN0LmdldE1peGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwYXJzZUNjLmdldEV4dGVuc2lvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVzb2x2ZUNjRXh0ZW5zaW9uKHNJbXBsLCBwYXJzZUNjLmdldEV4dGVuc2lvbigpLCBtaXhlZCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJzZUNjLmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvbHZlQ2NSZXN0cmljdGlvbihzSW1wbCwgcGFyc2VDYy5nZXRSZXN0cmljdGlvbigpLCBtaXhlZCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1pc3NpbmcgcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfUkVTVFJJQ1RJT05fT1JfRVhURU5TSU9OLCBwYXJzZUNjKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlRXJyb3JUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJzZVNjICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXJzZVNjLmdldEV4dGVuc2lvbigpICE9IG51bGwgJiYgcGFyc2VTYy5nZXRSZXN0cmljdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlc3RyaWN0aW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfQ09OVEVOVF9NT0RFTCwgcGFyc2VTYy5nZXRSZXN0cmljdGlvbigpKTsKLQotICAgICAgICAgICAgaWYgKHBhcnNlU2MuZ2V0RXh0ZW5zaW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvbHZlU2NFeHRlbnNpb24oc0ltcGwsIHBhcnNlU2MuZ2V0RXh0ZW5zaW9uKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VTYy5nZXRSZXN0cmljdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVNjUmVzdHJpY3Rpb24oc0ltcGwsIHBhcnNlU2MuZ2V0UmVzdHJpY3Rpb24oKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1pc3NpbmcgcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfUkVTVFJJQ1RJT05fT1JfRVhURU5TSU9OLCBwYXJzZVNjKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlRXJyb3JUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXNvbHZlQmFzaWNDb21wbGV4VHlwZShzSW1wbCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUVycm9yVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHR5cGUgb2YgZXJyb3IgcmVjb3Zlcnkgbm90IHlldCBpbXBsZW1lbnRlZC4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlLlJlZltdIG1ha2VSZWZBcnJheShDb2xsZWN0aW9uIHR5cGVMaXN0KQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZS5SZWZbdHlwZUxpc3Quc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlKWkubmV4dCgpKS5nZXRSZWYoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVCYXNpY0NvbXBsZXhUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQ29tcGxleFR5cGUgcGFyc2VUcmVlID0gKENvbXBsZXhUeXBlKXNJbXBsLmdldFBhcnNlT2JqZWN0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSAoc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCk7Ci0gICAgICAgIEdyb3VwIHBhcnNlR3JvdXAgPSBnZXRDb250ZW50TW9kZWwocGFyc2VUcmVlKTsKLQotICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgZXh0ZW5kIG9yIHJlc3RyaWN0IHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IG9oIHdlbGwuCi0gICAgICAgIH0KLQotICAgICAgICBpbnQgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlR3JvdXApOwotCi0gICAgICAgIC8vIHVzZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChkb2Vzbid0IGJlY29tZSBwYXJ0IG9mIHRoZSByZXN1bHQpCi0gICAgICAgIE1hcCBlbGVtZW50TW9kZWwgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIGJ1aWxkIGNvbnRlbnQgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSB0cmFuc2xhdGVDb250ZW50TW9kZWwoc0ltcGwsIHBhcnNlR3JvdXAsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBwYXJ0aWNsZUNvZGUsIGFub255bW91c1R5cGVzLCBlbGVtZW50TW9kZWwsIGZhbHNlLCBudWxsKTsKLQotICAgICAgICAvLyBkZXRlY3QgdGhlIG5vbmVtcHR5ICJhbGwiIGNhc2UgKGVtcHR5IDxhbGw+IGRvZXNuJ3QgY291bnQgLSBpdCBuZWVkcyB0byBiZSBlbGltaW5hdGVkIHRvIG1hdGNoIFhTRCB0ZXN0IGNhc2VzKQotICAgICAgICBib29sZWFuIGlzQWxsID0gY29udGVudE1vZGVsICE9IG51bGwgJiYgY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTDsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gc3VtbWFyaXplIHdpbGRjYXJkIGluZm9ybWF0aW9uCi0gICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjRWx0ID0gc3VtbWFyaXplRWx0V2lsZGNhcmRzKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKLQotICAgICAgICAvLyBidWlsZCBzdGF0ZSBtYWNoaW5lIGFuZCB2ZXJpZnkgdGhhdCBjb250ZW50IG1vZGVsIGlzIGRldGVybWluaXN0aWMKLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWlsZFN0YXRlTWFjaGluZShjb250ZW50TW9kZWwpOwotICAgICAgICAgICAgaWYgKCFTdHNjU3RhdGUuZ2V0KCkubm9VcGEoKSAmJiAhKChTY2hlbWFQYXJ0aWNsZUltcGwpY29udGVudE1vZGVsKS5pc0RldGVybWluaXN0aWMoKSkKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkNvbnRlbnQgbW9kZWwgdmlvbGF0ZXMgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIiwgWG1sRXJyb3JDb250ZXh0Lk5PTkRFVEVSTUlOSVNUSUNfTU9ERUwsIHBhcnNlR3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgcHJvcGVydHkgbW9kZWwKLSAgICAgICAgLy8gZW1pdERCRygiQnVpbGRpbmcgY29udGVudCBNb2RlbCBmb3IgIiArIHNJbXBsKTsKLSAgICAgICAgTWFwIGVsZW1lbnRQcm9wZXJ0eU1vZGVsID0gYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoY29udGVudE1vZGVsLCBzSW1wbCk7Ci0KLSAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZSBwcm9wZXJ0eSBtb2RlbAotICAgICAgICBNYXAgYXR0cmlidXRlUHJvcGVydHlNb2RlbCA9IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoYXR0ck1vZGVsLCBzSW1wbCk7Ci0KLSAgICAgICAgLy8gZmlndXJlIG91dCBjb250ZW50IHR5cGUKLSAgICAgICAgaW50IGNvbXBsZXhWYXJpZXR5ID0KLSAgICAgICAgICAgIHBhcnNlVHJlZS5nZXRNaXhlZCgpCi0gICAgICAgICAgICAgICAgPyBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQKLSAgICAgICAgICAgICAgICA6IGNvbnRlbnRNb2RlbCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UCi0gICAgICAgICAgICAgICAgICAgIDogU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQ7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTik7Ci0gICAgICAgIHNJbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eShjb21wbGV4VmFyaWV0eSk7Ci0gICAgICAgIHNJbXBsLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgZWxlbWVudFByb3BlcnR5TW9kZWwsIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwsIGlzQWxsKTsKLSAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMobWFrZVJlZkFycmF5KGFub255bW91c1R5cGVzKSk7Ci0gICAgICAgIHNJbXBsLnNldFdpbGRjYXJkU3VtbWFyeSh3Y0VsdC50eXBlZFdpbGRjYXJkcywgd2NFbHQuaGFzV2lsZGNhcmRzLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVDY1Jlc3RyaWN0aW9uKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBDb21wbGV4UmVzdHJpY3Rpb25UeXBlIHBhcnNlVHJlZSwgYm9vbGVhbiBtaXhlZCkKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBib29sZWFuIGNoYW1lbGVvbiA9IChzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsKTsKLQotICAgICAgICAvLyBCVUdCVUc6IE5PVCBZRVQgUkVBTExZIElNUExFTUVOVEVECi0gICAgICAgIC8vIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkLiIpOwotCi0gICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGU7Ci0gICAgICAgIGlmIChwYXJzZVRyZWUuZ2V0QmFzZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIGNvbXBsZXhDb250ZW50IG11c3QgZGVmaW5lIGEgYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfQkFTRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIGJhc2VUeXBlID0gbnVsbDsgLy8gcmVjb3Zlcnk6IG5vIGluaGVyaXRhbmNlLgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kUmVkZWZpbmVkR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IGV4dGVuZCB0aGUgb3JpZ2luYWwgdHlwZSBkZWZpbml0aW9uIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocGFyc2VUcmVlLmdldEJhc2UoKSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEU7Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZmluYWxSZXN0cmljdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IHJlc3RyaWN0IGEgZmluYWwgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeToganVzdCBrZWVwIGdvaW5nCi0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkpCi0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyBjaXJjdWxhciBkZXBlbmRlbmN5OiBubyBpbmhlcml0YW5jZQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgR3JvdXAgcGFyc2VFZyA9IGdldENvbnRlbnRNb2RlbChwYXJzZVRyZWUpOwotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgImFsbCIgY2FzZQotICAgICAgICBpbnQgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlRWcpOwotCi0gICAgICAgIC8vIHVzZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChkb2Vzbid0IGJlY29tZSBwYXJ0IG9mIHRoZSByZXN1bHQpCi0gICAgICAgIE1hcCBlbGVtZW50TW9kZWwgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIGJ1aWxkIGNvbnRlbnQgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSB0cmFuc2xhdGVDb250ZW50TW9kZWwoCi0gICAgICAgICAgICBzSW1wbCwgcGFyc2VFZywgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHBhcnRpY2xlQ29kZSwgYW5vbnltb3VzVHlwZXMsIGVsZW1lbnRNb2RlbCwgZmFsc2UsIG51bGwpOwotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgbm9uZW1wdHkgImFsbCIgY2FzZSAoZW1wdHkgPGFsbD4gZG9lc24ndCBjb3VudCAtIGl0IG5lZWRzIHRvIGJlIGVsaW1pbmF0ZWQgdG8gbWF0Y2ggWFNEIHRlc3QgY2FzZXMpCi0gICAgICAgIGJvb2xlYW4gaXNBbGwgPSBjb250ZW50TW9kZWwgIT0gbnVsbCAmJiBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgYXR0ciBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWw7Ci0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCkpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgYmFzZVR5cGUsIGZhbHNlLCBudWxsKTsKLQotICAgICAgICAvLyBzdW1tYXJpemUgd2lsZGNhcmQgaW5mb3JtYXRpb24KLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NFbHQgPSBzdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsKTsKLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOwotCi0gICAgICAgIC8vIGJ1aWxkIHN0YXRlIG1hY2hpbmUgYW5kIHZlcmlmeSB0aGF0IGNvbnRlbnQgbW9kZWwgaXMgZGV0ZXJtaW5pc3RpYwotICAgICAgICBpZiAoY29udGVudE1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkU3RhdGVNYWNoaW5lKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgICAgICBpZiAoIVN0c2NTdGF0ZS5nZXQoKS5ub1VwYSgpICYmICEoKFNjaGVtYVBhcnRpY2xlSW1wbCljb250ZW50TW9kZWwpLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ29udGVudCBtb2RlbCB2aW9sYXRlcyB0aGUgdW5pcXVlIHBhcnRpY2xlIGF0dHJpYnV0aW9uIHJ1bGUiLCBYbWxFcnJvckNvbnRleHQuTk9OREVURVJNSU5JU1RJQ19NT0RFTCwgcGFyc2VFZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0eSBtb2RlbAotICAgICAgICAvLyBlbWl0REJHKCJCdWlsZGluZyBjb250ZW50IE1vZGVsIGZvciAiICsgc0ltcGwpOwotICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPSBidWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZShjb250ZW50TW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBjb21wdXRlIGVtcHR5L2VsZW1lbnQvbWl4ZWQKLSAgICAgICAgaW50IGNvbXBsZXhWYXJpZXR5ID0gKGNvbnRlbnRNb2RlbCA9PSBudWxsID8gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UIDoKLSAgICAgICAgICAgIChtaXhlZCA/IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCA6IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UKSk7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihiYXNlVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aCgoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKTsKLSAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KGNvbXBsZXhWYXJpZXR5KTsKLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBlbGVtZW50UHJvcGVydHlNb2RlbCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgaXNBbGwpOwotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vbnltb3VzVHlwZXMpKTsKLSAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KHdjRWx0LnR5cGVkV2lsZGNhcmRzLCB3Y0VsdC5oYXNXaWxkY2FyZHMsIHdjQXR0ci50eXBlZFdpbGRjYXJkcywgd2NBdHRyLmhhc1dpbGRjYXJkcyk7Ci0gICAgfQotCi0gICAgc3RhdGljIE1hcCBleHRyYWN0RWxlbWVudE1vZGVsKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBNYXAgZWxlbWVudE1vZGVsID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHNUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gc1Byb3BzID0gc1R5cGUuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzUHJvcHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNQcm9wc1tpXS5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBlbGVtZW50TW9kZWwucHV0KHNQcm9wc1tpXS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUHJvcHNbaV0uZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudE1vZGVsOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVDY0V4dGVuc2lvbihTY2hlbWFUeXBlSW1wbCBzSW1wbCwgRXh0ZW5zaW9uVHlwZSBwYXJzZVRyZWUsIGJvb2xlYW4gbWl4ZWQpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlOwotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSAoc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgaWYgKHBhcnNlVHJlZS5nZXRCYXNlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgY29tcGxleENvbnRlbnQgbXVzdCBkZWZpbmUgYSBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuTUlTU0lOR19CQVNFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyByZWNvdmVyeTogbm8gaW5oZXJpdGFuY2UuCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLCBzSW1wbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXROYW1lKCkuZXF1YWxzKHNJbXBsLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgZXh0ZW5kIHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocGFyc2VUcmVlLmdldEJhc2UoKSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkpCi0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyBjaXJjdWxhciBkZXBlbmRlbmN5OiBubyBpbmhlcml0YW5jZQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgKGJhc2VUeXBlLmlzU2ltcGxlVHlwZSgpIHx8IGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgc3BlY2lmaWVkIGJhc2UgdHlwZSBpcyBub3QgYSBjb21wbGV4IHR5cGUgd2l0aCBjb21wbGV4IGNvbnRlbnQuIiwgWG1sRXJyb3JDb250ZXh0LkNPTVBMRVhfQkFTRV9OT1RfQ09NUExFWCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyByZWNvdmVyeTogbm8gaW5oZXJpdGFuY2UuCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5maW5hbEV4dGVuc2lvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGV4dGVuZCBhIGZpbmFsIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGp1c3Qga2VlcCBnb2luZwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgYmFzZSBjb250ZW50IG1vZGVsCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGJhc2VDb250ZW50TW9kZWwgPSAoYmFzZVR5cGUgPT0gbnVsbCA/IG51bGwgOiBiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKSk7Ci0gICAgICAgIC8vIFRPRE86IGF0dHJpYnV0ZSBtb2RlbCBhbHNvCi0KLSAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIGJhc2VFbGVtZW50TW9kZWwgPSBleHRyYWN0RWxlbWVudE1vZGVsKGJhc2VUeXBlKTsKLSAgICAgICAgR3JvdXAgcGFyc2VFZyA9IGdldENvbnRlbnRNb2RlbChwYXJzZVRyZWUpOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgZXh0ZW5zaW9uIG1vZGVsCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGV4dGVuc2lvbk1vZGVsID0gdHJhbnNsYXRlQ29udGVudE1vZGVsKAotICAgICAgICAgICAgICAgIHNJbXBsLCBwYXJzZUVnLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlRWcpLAotICAgICAgICAgICAgICAgIGFub255bW91c1R5cGVzLCBiYXNlRWxlbWVudE1vZGVsLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBhcHBseSBydWxlICMyIG5lYXIgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2MtbXZlOiBlbXB0eSBleHQgbW9kZWwgLT4gbWl4ZWQgdGFrZW4gZnJvbSBiYXNlCi0gICAgICAgIGlmIChleHRlbnNpb25Nb2RlbCA9PSBudWxsICYmICFtaXhlZCkKLSAgICAgICAgICAgIG1peGVkID0gKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFwcGx5IERlcml2YXRpb24gVmFsaWQgKEV4dGVuc2lvbikgcnVsZSAxLjQuMi4yCi0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCkgJiYKLSAgICAgICAgICAgICAgICAoKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKSAhPSBtaXhlZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZXh0ZW5kIGFuIGVsZW1lbnQtb25seSB0eXBlIHdpdGggYSBtaXhlZCB0eXBlIG9yIHZpY2UtdmVyc2EiLCBYbWxFcnJvckNvbnRleHQuSU5DT05TSVNURU5UX1RZUEUsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgImFsbCIgYmFzZSBjYXNlCi0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIGJhc2VUeXBlLmhhc0FsbENvbnRlbnQoKSAmJiBleHRlbnNpb25Nb2RlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGV4dGVuZCBhIHR5cGUgd2l0aCAnYWxsJyBjb250ZW50IG1vZGVsIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9FWFRFTkRfQUxMLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICBleHRlbnNpb25Nb2RlbCA9IG51bGw7IC8vIHJlY292ZXJ5OiBkcm9wIGV4dGVuc2lvbgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29udGVudCBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCA9IGV4dGVuZENvbnRlbnRNb2RlbChiYXNlQ29udGVudE1vZGVsLCBleHRlbnNpb25Nb2RlbCwgcGFyc2VUcmVlKTsKLQotICAgICAgICAvLyBkZXRlY3QgdGhlIG5vbmVtcHR5ICJhbGwiIGNhc2UgKGVtcHR5IDxhbGw+IGRvZXNuJ3QgY291bnQgLSBpdCBuZWVkcyB0byBiZSBlbGltaW5hdGVkIHRvIG1hdGNoIFhTRCB0ZXN0IGNhc2VzKQotICAgICAgICBib29sZWFuIGlzQWxsID0gY29udGVudE1vZGVsICE9IG51bGwgJiYgY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTDsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsOwotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbChiYXNlVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpKTsKLSAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwocGFyc2VUcmVlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIHNJbXBsLCBudWxsLCBhdHRyTW9kZWwsIGJhc2VUeXBlLCB0cnVlLCBudWxsKTsKLQotICAgICAgICAvLyBzdW1tYXJpemUgd2lsZGNhcmQgaW5mb3JtYXRpb24KLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NFbHQgPSBzdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsKTsKLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOwotCi0gICAgICAgIC8vIGJ1aWxkIHN0YXRlIG1hY2hpbmUgYW5kIHZlcmlmeSB0aGF0IGNvbnRlbnQgbW9kZWwgaXMgZGV0ZXJtaW5pc3RpYwotICAgICAgICBpZiAoY29udGVudE1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkU3RhdGVNYWNoaW5lKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgICAgICBpZiAoIVN0c2NTdGF0ZS5nZXQoKS5ub1VwYSgpICYmICEoKFNjaGVtYVBhcnRpY2xlSW1wbCljb250ZW50TW9kZWwpLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ29udGVudCBtb2RlbCB2aW9sYXRlcyB0aGUgdW5pcXVlIHBhcnRpY2xlIGF0dHJpYnV0aW9uIHJ1bGUiLCBYbWxFcnJvckNvbnRleHQuTk9OREVURVJNSU5JU1RJQ19NT0RFTCwgcGFyc2VFZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0eSBtb2RlbAotICAgICAgICAvLyBlbWl0REJHKCJCdWlsZGluZyBjb250ZW50IE1vZGVsIGZvciAiICsgc0ltcGwpOwotICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPSBidWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZShjb250ZW50TW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBjb21wdXRlIGVtcHR5L2VsZW1lbnQvbWl4ZWQKLSAgICAgICAgaW50IGNvbXBsZXhWYXJpZXR5ID0gICggbWl4ZWQgPyBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgOgotICAgICAgICAgICAgKGNvbnRlbnRNb2RlbCA9PSBudWxsID8gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UIDogU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQpKTsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIGltcGxlbWVudGF0aW9uCi0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgYmFzZVR5cGUgPSBYbWxPYmplY3QudHlwZTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UmVmKCkpOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9FWFRFTlNJT04pOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoY29tcGxleFZhcmlldHkpOwotICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwoY29udGVudE1vZGVsLCBhdHRyTW9kZWwsIGVsZW1lbnRQcm9wZXJ0eU1vZGVsLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBpc0FsbCk7Ci0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9ueW1vdXNUeXBlcykpOwotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkod2NFbHQudHlwZWRXaWxkY2FyZHMsIHdjRWx0Lmhhc1dpbGRjYXJkcywgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlU2NSZXN0cmljdGlvbihTY2hlbWFUeXBlSW1wbCBzSW1wbCwgU2ltcGxlUmVzdHJpY3Rpb25UeXBlIHBhcnNlVHJlZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGU7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBib29sZWFuIGNoYW1lbGVvbiA9IChzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsKTsKLSAgICAgICAgaWYgKHBhcnNlVHJlZS5nZXRTaW1wbGVUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUud2FybmluZygiTmVzdGVkIHNpbXBsZSB0eXBlcyBpbnNpZGUgc2ltcGxlIGNvbnRlbnQgcmVzdHJpY3Rpb25zIGFyZSB1bnN1cHBvcnRlZCAtIGlnbm9yaW5nIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBuZXN0ZWQgc2ltcGxlIHR5cGUgZWxlbWVudC4KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyc2VUcmVlLmdldEJhc2UoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSBzaW1wbGVDb250ZW50IHJlc3RyaWN0aW9uIG11c3QgZGVmaW5lIGEgYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfQkFTRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kUmVkZWZpbmVkR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocGFyc2VUcmVlLmdldEJhc2UoKSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCi0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjdXJzaW9uCi0gICAgICAgIFN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZSgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpOwotCi0gICAgICAgIGlmIChiYXNlVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNpbXBsZSB0eXBlICciICsgYmFzZVR5cGUuZ2V0TmFtZSgpICsgIicgY2Fubm90IGJlIHVzZWQgYXMgdGhlIGJhc2UgdHlwZSBvZiBhIHNpbXBsZSBjb250ZW50IHJlc3RyaWN0aW9uLiAoVXNlIGV4dGVuc2lvbiBpbnN0ZWFkLikiLCBYbWxFcnJvckNvbnRleHQuU0lNUExFX0JBU0VfTk9UX1NJTVBMRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0gICAgICAgIC8vIEJVR0JVRzogY2FuIHJlc3RyaWN0IG1peGVkIGNvbnRlbnQgYXMgbG9uZyBhcyBhbGwgY2hpbGQgZWxlbWVudHMgYXJlIG9wdGlvbmFsCi0gICAgICAgIGVsc2UgaWYgKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBzcGVjaWZpZWQgYmFzZSB0eXBlICIgKyBiYXNlVHlwZS50b1N0cmluZygpICsgIiBkb2VzIG5vdCBoYXZlIHNpbXBsZSBjb250ZW50LiIsIFhtbEVycm9yQ29udGV4dC5TSU1QTEVfQkFTRV9OT1RfU0lNUExFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCi0gICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgcmVzdHJpY3QgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBMaXN0IGFub255bW91c1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsOwotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbChiYXNlVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpKTsKLSAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwocGFyc2VUcmVlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIHNJbXBsLCBudWxsLCBhdHRyTW9kZWwsIGJhc2VUeXBlLCBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gc3VtbWFyaXplIHdpbGRjYXJkIGluZm9ybWF0aW9uCi0gICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKGJhc2VUeXBlLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOwotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vbnltb3VzVHlwZXMpKTsKLSAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSwgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKLSAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpOwotICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwobnVsbCwgYXR0ck1vZGVsLCBudWxsLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBmYWxzZSk7Ci0gICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KGJhc2VUeXBlLmdldFNpbXBsZVZhcmlldHkoKSk7Ci0gICAgICAgIHNJbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG51bGwgPyBudWxsIDogYmFzZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihiYXNlVHlwZS5nZXRMaXN0SXRlbVR5cGUoKS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRVbmlvbk1lbWJlclR5cGVSZWZzKG1ha2VSZWZBcnJheShBcnJheXMuYXNMaXN0KGJhc2VUeXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKSkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCBmYWNldHMKLSAgICAgICAgU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5yZXNvbHZlRmFjZXRzKHNJbXBsLCBwYXJzZVRyZWUsIChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSk7Ci0KLSAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCi0gICAgICAgIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIucmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKHNJbXBsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlU2NFeHRlbnNpb24oU2NoZW1hVHlwZUltcGwgc0ltcGwsIFNpbXBsZUV4dGVuc2lvblR5cGUgcGFyc2VUcmVlKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gKHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwpOwotICAgICAgICBpZiAocGFyc2VUcmVlLmdldEJhc2UoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSBzaW1wbGVDb250ZW50IGV4dGVuc2lvbiBtdXN0IGRlZmluZSBhIGJhc2UgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5NSVNTSU5HX0JBU0UsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKLSAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCksIHNJbXBsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgIWJhc2VUeXBlLmdldE5hbWUoKS5lcXVhbHMoc0ltcGwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCBleHRlbmQgdGhlIG9yaWdpbmFsIHR5cGUgZGVmaW5pdGlvbiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihwYXJzZVRyZWUuZ2V0QmFzZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24KLSAgICAgICAgU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSk7Ci0KLSAgICAgICAgaWYgKCFiYXNlVHlwZS5pc1NpbXBsZVR5cGUoKSAmJiBiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgc3BlY2lmaWVkIGJhc2UgdHlwZSAiICsgYmFzZVR5cGUudG9TdHJpbmcoKSArICIgZG9lcyBub3QgaGF2ZSBzaW1wbGUgY29udGVudC4iLCBYbWxFcnJvckNvbnRleHQuU0lNUExFX0JBU0VfTk9UX1NJTVBMRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZmluYWxFeHRlbnNpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBleHRlbmQgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBMaXN0IGFub255bW91c1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsOwotICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCkpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgYmFzZVR5cGUsIHRydWUsIG51bGwpOwotCi0gICAgICAgIC8vIHN1bW1hcml6ZSB3aWxkY2FyZCBpbmZvcm1hdGlvbgotICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0F0dHIgPSBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKGF0dHJNb2RlbCk7Ci0KLSAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZSBwcm9wZXJ0eSBtb2RlbAotICAgICAgICBNYXAgYXR0cmlidXRlUHJvcGVydHlNb2RlbCA9IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoYXR0ck1vZGVsLCBzSW1wbCk7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihiYXNlVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aCgoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTik7Ci0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9ueW1vdXNUeXBlcykpOwotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQuRU1QVFksIGZhbHNlLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCk7Ci0gICAgICAgIHNJbXBsLnNldENvbnRlbnRNb2RlbChudWxsLCBhdHRyTW9kZWwsIG51bGwsIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwsIGZhbHNlKTsKLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoYmFzZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKTsKLSAgICAgICAgc0ltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihiYXNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gbnVsbCA/IG51bGwgOiBiYXNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICBzd2l0Y2ggKHNJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKGJhc2VUeXBlLmdldExpc3RJdGVtVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMobWFrZVJlZkFycmF5KEFycmF5cy5hc0xpc3QoYmFzZVR5cGUuZ2V0VW5pb25NZW1iZXJUeXBlcygpKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGZhY2V0cwotICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVGYWNldHMoc0ltcGwsIG51bGwsIChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSk7Ci0KLSAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCi0gICAgICAgIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIucmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKHNJbXBsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgV2lsZGNhcmRSZXN1bHQKLSAgICB7Ci0gICAgICAgIFdpbGRjYXJkUmVzdWx0KFFOYW1lU2V0IHR5cGVkV2lsZGNhcmRzLCBib29sZWFuIGhhc1dpbGRjYXJkcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy50eXBlZFdpbGRjYXJkcyA9IHR5cGVkV2lsZGNhcmRzOwotICAgICAgICAgICAgdGhpcy5oYXNXaWxkY2FyZHMgPSBoYXNXaWxkY2FyZHM7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWVTZXQgdHlwZWRXaWxkY2FyZHM7Ci0gICAgICAgIGJvb2xlYW4gaGFzV2lsZGNhcmRzOwotICAgIH0KLQotICAgIHN0YXRpYyBXaWxkY2FyZFJlc3VsdCBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGF0dHJNb2RlbCkKLSAgICB7Ci0gICAgICAgIGlmIChhdHRyTW9kZWwuZ2V0V2lsZGNhcmRQcm9jZXNzKCkgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTk9ORSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoUU5hbWVTZXQuRU1QVFksIGZhbHNlKTsKLSAgICAgICAgaWYgKGF0dHJNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5TS0lQKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdChRTmFtZVNldC5FTVBUWSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoYXR0ck1vZGVsLmdldFdpbGRjYXJkU2V0KCksIHRydWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBXaWxkY2FyZFJlc3VsdCBzdW1tYXJpemVFbHRXaWxkY2FyZHMoU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHNldCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc1dpbGRjYXJkcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkUmVzdWx0IGlubmVyID0gc3VtbWFyaXplRWx0V2lsZGNhcmRzKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZEFsbChpbm5lci50eXBlZFdpbGRjYXJkcyk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1dpbGRjYXJkcyB8PSBpbm5lci5oYXNXaWxkY2FyZHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoc2V0LnRvUU5hbWVTZXQoKSwgaGFzV2lsZGNhcmRzKTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnRNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TS0lQKSA/Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0LkVNUFRZIDogY29udGVudE1vZGVsLmdldFdpbGRjYXJkU2V0KCksIHRydWUpOwotICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBmYWxsdGhyb3VnaAotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoUU5hbWVTZXQuRU1QVFksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKAotICAgICAgICAgICAgWG1sT2JqZWN0IHBhcnNlVHJlZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sCi0gICAgICAgICAgICBMaXN0IGFub255bW91c1R5cGVzLCBTY2hlbWFUeXBlIG91dGVyVHlwZSwKLSAgICAgICAgICAgIFNldCBzZWVuQXR0cmlidXRlcywgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIHJlc3VsdCwgU2NoZW1hVHlwZSBiYXNlVHlwZSwgYm9vbGVhbiBleHRlbnNpb24sIFFOYW1lIHJlZGVmaW5pdGlvbkZvcikKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgaWYgKHNlZW5BdHRyaWJ1dGVzID09IG51bGwpCi0gICAgICAgICAgICBzZWVuQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGJvb2xlYW4gc2VlbldpbGRjYXJkID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gc2VlblJlZGVmaW5pdGlvbiA9IGZhbHNlOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBiYXNlTW9kZWwgPSBudWxsOwotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGJhc2VNb2RlbCA9IGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHBhcnNlVHJlZS5uZXdDdXJzb3IoKTsKLQotICAgICAgICBmb3IgKGJvb2xlYW4gbW9yZSA9IGN1ci50b0ZpcnN0Q2hpbGQoKTsgbW9yZTsgbW9yZSA9IGN1ci50b05leHRTaWJsaW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodHJhbnNsYXRlQXR0cmlidXRlQ29kZShjdXIuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFUVFJJQlVURV9DT0RFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIHhzZGF0dHIgPSAoQXR0cmlidXRlKWN1ci5nZXRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBzQXR0ciA9IFN0c2NUcmFuc2xhdG9yLnRyYW5zbGF0ZUF0dHJpYnV0ZSh4c2RhdHRyLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIG91dGVyVHlwZSwgYmFzZU1vZGVsLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbkF0dHJpYnV0ZXMuY29udGFpbnMoc0F0dHIuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBkZWZpbmVkICIsIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfQVRUUklCVVRFX05BTUUsIHhzZGF0dHIueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHRoZSBkdXBsaWNhdGUgYXR0cgotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VlbkF0dHJpYnV0ZXMuYWRkKHNBdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIGJhc2VBdHRyID0gYmFzZU1vZGVsLmdldEF0dHJpYnV0ZShzQXR0ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VBdHRyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleHRlbnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpLmNvbnRhaW5zKHNBdHRyLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSByZXN0cmljdGlvbiBjYW5ub3QgaW50cm9kdWNlIGEgbmV3IGF0dHJpYnV0ZSB0aGF0IHdvdWxkIG5vdCBiZSBhbGxvd2VkIGluIHRoZSBiYXNlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSwgeHNkYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBbiBleHRlbnNpb24gY2Fubm90IHByb2hpYml0IGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBiYXNlIHR5cGU7IHVzZSByZXN0cmljdGlvbiBpbnN0ZWFkLiIsIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfQVRUUklCVVRFX05BTUUsIHhzZGF0dHIueGdldFVzZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyLmdldFVzZSgpICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLlJFUVVJUkVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZUF0dHIuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUkVRVUlSRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgcmVzdHJpY3Rpb24gY2Fubm90IG1vZGlmeSBhbiBhdHRyaWJ1dGUgdGhhdCBpcyByZXF1aXJlZCBpbiB0aGUgYmFzZSB0eXBlIHRvIGJlIHByb2hpYml0ZWQgb3Igb3B0aW9uYWwuIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSwgeHNkYXR0ci54Z2V0VXNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVtb3ZlUHJvaGliaXRlZEF0dHJpYnV0ZShzQXR0ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyLmdldFVzZSgpICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkQXR0cmlidXRlKHNBdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0RGVmYXVsdFRleHQoKSAhPSBudWxsICYmICFzQXR0ci5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ci5nZXRVc2UoKSAhPSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIG11c3QgYmUgb3B0aW9uYWwgaW4gb3JkZXIgdG8gc3BlY2lmeSBhIGRlZmF1bHQiLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgeHNkYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEFOWV9BVFRSSUJVVEVfQ09ERToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkIHhzZHdjID0gKFdpbGRjYXJkKWN1ci5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5XaWxkY2FyZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk9ubHkgb25lIGF0dHJpYnV0ZSB3aWxkY2FyZCBhbGxvd2VkIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHRoZSBleHRyYSB3aWxkY2FyZAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlZW5XaWxkY2FyZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUxpc3QgbnNMaXN0ID0geHNkd2MueGdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnNUZXh0OwotICAgICAgICAgICAgICAgICAgICBpZiAobnNMaXN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBuc1RleHQgPSAiIyNhbnkiOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBuc1RleHQgPSBuc0xpc3QuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQgd2NzZXQgPSBRTmFtZVNldC5mb3JXaWxkY2FyZE5hbWVzcGFjZVN0cmluZyhuc1RleHQsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsICE9IG51bGwgJiYgIWV4dGVuc2lvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgcmVzdHJpY3Rpb24gY2Fubm90IGFkZCBhbnlBdHRyaWJ1dGUgd2hlbiB0aGUgYmFzZSB0eXBlIGRvZXMgbm90IGhhdmUgYW55QXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSB0aGUgZXh0cmEgd2lsZGNhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKS5jb250YWluc0FsbCh3Y3NldCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSciICsgbnNUZXh0ICsgIicgaXMgbm90IGEgc3Vic2V0IG9mIHRoZSBiYXNlIHR5cGUgYW55QXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSB0aGUgcmVzdHJpY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHdjcHJvY2VzcyA9IHRyYW5zbGF0ZVdpbGRjYXJkUHJvY2Vzcyh4c2R3Yy54Z2V0UHJvY2Vzc0NvbnRlbnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldFdpbGRjYXJkUHJvY2VzcygpID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLk5PTkUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldCh3Y3NldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRQcm9jZXNzKHdjcHJvY2Vzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldCh3Y3NldC51bmlvbihyZXN1bHQuZ2V0V2lsZGNhcmRTZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFByb2Nlc3Mod2Nwcm9jZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRTZXQod2NzZXQuaW50ZXJzZWN0KHJlc3VsdC5nZXRXaWxkY2FyZFNldCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvbGQgcHJvY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEFUVFJJQlVURV9HUk9VUF9DT0RFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlR3JvdXBSZWYgeHNkYWcgPSAoQXR0cmlidXRlR3JvdXBSZWYpY3VyLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZWYgPSB4c2RhZy5nZXRSZWYoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBtdXN0IGhhdmUgYSByZWYgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9HUk9VUF9NSVNTSU5HX1JFRiwgeHNkYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIGdyb3VwOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVkZWZpbml0aW9uRm9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3RhdGUuZmluZFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCwgcmVkZWZpbml0aW9uRm9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIHJlZGVmaW5pdGlvbkZvci5lcXVhbHMoZ3JvdXAuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlblJlZGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkFuIGF0dHJpYnV0ZSBncm91cCByZWRlZmluaXRpb24gbXVzdCBpbmNsdWRlIGF0IG1vc3Qgb25lIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgeHNkYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5SZWRlZmluaXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5maW5kQXR0cmlidXRlR3JvdXAocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfR1JPVVBfTk9UX0ZPVU5ELCB4c2RhZy54Z2V0UmVmKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmlzUHJvY2Vzc2luZyhncm91cCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiByZWZlcmVuY2VzIGl0c2VsZiIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ViVGFyZ2V0TmFtZXNwYWNlID0gZ3JvdXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFtZWxlb24gPSBncm91cC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3RhcnRQcm9jZXNzaW5nKGdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmVzdGVkUmVkZWZpbml0aW9uRm9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWRlZmluaXRpb25Gb3IgPSBncm91cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKGdyb3VwLmdldFBhcnNlT2JqZWN0KCksIHN1YlRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgb3V0ZXJUeXBlLCBzZWVuQXR0cmlidXRlcywgcmVzdWx0LCBiYXNlVHlwZSwgZXh0ZW5zaW9uLCBuZXN0ZWRSZWRlZmluaXRpb25Gb3IpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5maW5pc2hQcm9jZXNzaW5nKGdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB0aGluZ3MgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSBtb2RlbC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hUGFydGljbGUgZXh0ZW5kQ29udGVudE1vZGVsKFNjaGVtYVBhcnRpY2xlIGJhc2VDb250ZW50TW9kZWwsIFNjaGVtYVBhcnRpY2xlIGV4dGVuZGVkQ29udGVudE1vZGVsLCBYbWxPYmplY3QgcGFyc2VUcmVlKQotICAgIHsKLSAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleENvbnRlbnQ6OmV4dGVuc2lvbgotICAgICAgICAKLSAgICAgICAgLy8gMi4xIElmIHRoZSC3ZXhwbGljaXQgY29udGVudLcgaXMgZW1wdHksIHRoZW4gdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB0eXBlIGRlZmluaXRpb24gt3Jlc29sdmVktyB0byBieSB0aGUgt2FjdHVhbCB2YWx1Zbcgb2YgdGhlIGJhc2UgW2F0dHJpYnV0ZV0gCi0gICAgICAgIGlmIChleHRlbmRlZENvbnRlbnRNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGJhc2VDb250ZW50TW9kZWw7Ci0gICAgICAgIAotICAgICAgICAvLyAyLjIgSWYgdGhlIHR5cGUgZGVmaW5pdGlvbiC3cmVzb2x2ZWS3IHRvIGJ5IHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgYmFzZSBbYXR0cmlidXRlXSBoYXMgYSB7Y29udGVudCB0eXBlfSBvZiBlbXB0eSwgdGhlbiBhIHBhaXIgb2YgbWl4ZWQgb3IgZWxlbWVudE9ubHkgKGRldGVybWluZWQgYXMgcGVyIGNsYXVzZSAxLjIuMSBhYm92ZSkgYW5kIHRoZSC3ZXhwbGljaXQgY29udGVudLcgaXRzZWxmOwotICAgICAgICBpZiAoYmFzZUNvbnRlbnRNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGV4dGVuZGVkQ29udGVudE1vZGVsOwotICAgICAgICAKLSAgICAgICAgLy8gMi4zIG90aGVyd2lzZSBhIHBhaXIgb2YgbWl4ZWQgb3IgZWxlbWVudE9ubHkgKGRldGVybWluZWQgYXMgcGVyIGNsYXVzZSAxLjIuMSBhYm92ZSkgYW5kIGEgcGFydGljbGUgd2hvc2UgcHJvcGVydGllcyBhcmUgYXMgZm9sbG93czogIAotICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgc1BhcnQgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7Ci0gICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7Ci0KLSAgICAgICAgTGlzdCBhY2N1bXVsYXRlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhZGRNaW51c1BvaW50bGVzc1BhcnRpY2xlcyhhY2N1bXVsYXRlLCBiYXNlQ29udGVudE1vZGVsLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7Ci0gICAgICAgIGFkZE1pbnVzUG9pbnRsZXNzUGFydGljbGVzKGFjY3VtdWxhdGUsIGV4dGVuZGVkQ29udGVudE1vZGVsLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7Ci0gICAgICAgIHNQYXJ0LnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7Ci0gICAgICAgIHNQYXJ0LnNldE1heE9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7Ci0gICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlQ2hpbGRyZW4oKFNjaGVtYVBhcnRpY2xlW10pCi0gICAgICAgICAgICAgICAgYWNjdW11bGF0ZS50b0FycmF5KG5ldyBTY2hlbWFQYXJ0aWNsZVthY2N1bXVsYXRlLnNpemUoKV0pKTsKLQotICAgICAgICByZXR1cm4gZmlsdGVyUG9pbnRsZXNzUGFydGljbGVzQW5kVmVyaWZ5QWxsUGFydGljbGVzKHNQYXJ0LCBwYXJzZVRyZWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBCaWdJbnRlZ2VyIGV4dHJhY3RNaW5PY2N1cnMoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIG5uaSkKLSAgICB7Ci0gICAgICAgIGlmIChubmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKLSAgICAgICAgQmlnSW50ZWdlciByZXN1bHQgPSBubmkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQmlnSW50ZWdlciBleHRyYWN0TWF4T2NjdXJzKEFsbE5OSSBhbGxOTkkpCi0gICAgewotICAgICAgICBpZiAoYWxsTk5JID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5PTkU7Ci0KLSAgICAgICAgaWYgKGFsbE5OSS5pbnN0YW5jZVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfREVDSU1BTCkKLSAgICAgICAgICAgIHJldHVybiAoKFhtbEludGVnZXIpYWxsTk5JKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZGVmaW5pdGlvbkZvckdyb3VwCi0gICAgewotICAgICAgICBwcml2YXRlIFFOYW1lIGdyb3VwTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNlZW5SZWRlZmluaXRpb24gPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgUmVkZWZpbml0aW9uRm9yR3JvdXAoUU5hbWUgZ3JvdXBOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IGdyb3VwTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRHcm91cE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXBOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWVuUmVkZWZpbml0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNlZW5SZWRlZmluaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWVuUmVkZWZpbml0aW9uKGJvb2xlYW4gc2VlblJlZGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zZWVuUmVkZWZpbml0aW9uID0gc2VlblJlZGVmaW5pdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFQYXJ0aWNsZSB0cmFuc2xhdGVDb250ZW50TW9kZWwoCi0gICAgICAgICAgICBTY2hlbWFUeXBlIG91dGVyVHlwZSwKLSAgICAgICAgICAgIFhtbE9iamVjdCBwYXJzZVRyZWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLAotICAgICAgICAgICAgaW50IHBhcnRpY2xlQ29kZSwKLSAgICAgICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMsIE1hcCBlbGVtZW50TW9kZWwsCi0gICAgICAgICAgICBib29sZWFuIGFsbG93RWx0LCBSZWRlZmluaXRpb25Gb3JHcm91cCByZWRlZmluaXRpb25Gb3IpCi0gICAgewotICAgICAgICBpZiAocGFyc2VUcmVlID09IG51bGwgfHwgcGFydGljbGVDb2RlID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgLy8gZW1pdERCRygiVHJhbnNsYXRpbmcgY29udGVudCBtb2RlbCBmb3IgIiArIG91dGVyVHlwZSk7Ci0gICAgICAgIC8vIGluZGVudERCRygpOwotICAgICAgICBhc3NlcnQocGFydGljbGVDb2RlICE9IDApOwotCi0gICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnM7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzOwotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBncm91cCA9IG51bGw7Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIHNQYXJ0OwotCi0gICAgICAgIGlmIChwYXJ0aWNsZUNvZGUgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFhbGxvd0VsdCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIHNlcXVlbmNlLCBjaG9pY2Ugb3IgYWxsIGhlcmUiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBwYXJzZVRyZWUpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBkZXRlY3Qgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQgYW5kIGNvbnN0cnVjdCBhIGNob2ljZQotCi0gICAgICAgICAgICBMb2NhbEVsZW1lbnQgcGFyc2VFbHQgPSAoTG9jYWxFbGVtZW50KXBhcnNlVHJlZTsKLSAgICAgICAgICAgIHNQYXJ0ID0gU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlRWxlbWVudChwYXJzZUVsdCwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBvdXRlclR5cGUpOwotICAgICAgICAgICAgaWYgKHNQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBtaW5PY2N1cnMgPSBleHRyYWN0TWluT2NjdXJzKHBhcnNlRWx0LnhnZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBtYXhPY2N1cnMgPSBleHRyYWN0TWF4T2NjdXJzKHBhcnNlRWx0LnhnZXRNYXhPY2N1cnMoKSk7Ci0KLSAgICAgICAgICAgIFNjaGVtYVR5cGUgb2xkVHlwZSA9IChTY2hlbWFUeXBlKWVsZW1lbnRNb2RlbC5nZXQoc1BhcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChvbGRUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudE1vZGVsLnB1dChzUGFydC5nZXROYW1lKCksIHNQYXJ0LmdldFR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc1BhcnQuZ2V0VHlwZSgpLmVxdWFscyhvbGRUeXBlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVHlwZSBvZiAiICsgUU5hbWVIZWxwZXIucHJldHR5KHNQYXJ0LmdldE5hbWUoKSkgKyAiIGlzIGluY29uc2lzdGVudCB3aXRoIGFub3RoZXIgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhpcyBjb250ZW50IG1vZGVsIiwgWG1sRXJyb3JDb250ZXh0LklOQ09OU0lTVEVOVF9UWVBFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29kZSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFhbGxvd0VsdCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIHNlcXVlbmNlLCBjaG9pY2Ugb3IgYWxsIGhlcmUiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgQW55IHBhcnNlQW55ID0gKEFueSlwYXJzZVRyZWU7Ci0gICAgICAgICAgICBzUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLSAgICAgICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCk7Ci0gICAgICAgICAgICBRTmFtZVNldCB3Y3NldDsKLSAgICAgICAgICAgIE5hbWVzcGFjZUxpc3QgbnNsaXN0ID0gcGFyc2VBbnkueGdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYgKG5zbGlzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHdjc2V0ID0gUU5hbWVTZXQuQUxMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdjc2V0ID0gUU5hbWVTZXQuZm9yV2lsZGNhcmROYW1lc3BhY2VTdHJpbmcobnNsaXN0LmdldFN0cmluZ1ZhbHVlKCksIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBzUGFydC5zZXRXaWxkY2FyZFNldCh3Y3NldCk7Ci0gICAgICAgICAgICBzUGFydC5zZXRXaWxkY2FyZFByb2Nlc3ModHJhbnNsYXRlV2lsZGNhcmRQcm9jZXNzKHBhcnNlQW55LnhnZXRQcm9jZXNzQ29udGVudHMoKSkpOwotICAgICAgICAgICAgbWluT2NjdXJzID0gZXh0cmFjdE1pbk9jY3VycyhwYXJzZUFueS54Z2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgbWF4T2NjdXJzID0gZXh0cmFjdE1heE9jY3VycyhwYXJzZUFueS54Z2V0TWF4T2NjdXJzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgR3JvdXAgcGFyc2VHcm91cCA9IChHcm91cClwYXJzZVRyZWU7Ci0gICAgICAgICAgICBzUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLQotICAgICAgICAgICAgLy8gZ3JhYiBtaW4vbWF4T2NjdXJzIGJlZm9yZSBkZXJlZmVyZW5jaWduIGdyb3VwIHJlZgotICAgICAgICAgICAgbWluT2NjdXJzID0gZXh0cmFjdE1pbk9jY3VycyhwYXJzZUdyb3VwLnhnZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBtYXhPY2N1cnMgPSBleHRyYWN0TWF4T2NjdXJzKHBhcnNlR3JvdXAueGdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSA9PSBNT0RFTF9HUk9VUF9DT0RFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIHJlZiA9IHBhcnNlR3JvdXAuZ2V0UmVmKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkdyb3VwIHJlZmVyZW5jZSBtdXN0IGhhdmUgYSByZWYgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkdST1VQX01JU1NJTkdfUkVGLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5pdGlvbkZvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5maW5kUmVkZWZpbmVkTW9kZWxHcm91cChyZWYsIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwsIHJlZGVmaW5pdGlvbkZvci5nZXRHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIGdyb3VwLmdldE5hbWUoKS5lcXVhbHMocmVkZWZpbml0aW9uRm9yLmdldEdyb3VwTmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5pdGlvbkZvci5pc1NlZW5SZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiR3JvdXAgcmVkZWZpbml0aW9uIG11c3QgcmVmZXIgdG8gdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gYXQgbW9zdCBvbmNlIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUJpZ0ludGVnZXIuT05FLmVxdWFscyhtYXhPY2N1cnMpIHx8ICFCaWdJbnRlZ2VyLk9ORS5lcXVhbHMobWluT2NjdXJzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiV2hlbiByZWZlcmVuY2luZyB0aGUgb3JpZ2luYWwgZ3JvdXAgZGVmaW5pdGlvbiBpbiBhIHJlZGVmaW5pdGlvbiwgbWF4T2NjdXJzIGFuZCBtaW5PY2N1cnMgbXVzdCBiZSAxIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWRlZmluaXRpb25Gb3Iuc2V0U2VlblJlZGVmaW5pdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBncm91cCA9IHN0YXRlLmZpbmRNb2RlbEdyb3VwKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5NT0RFTF9HUk9VUF9OT1RfRk9VTkQsICgoR3JvdXApcGFyc2VUcmVlKS54Z2V0UmVmKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmlzUHJvY2Vzc2luZyhncm91cCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiByZWZlcmVuY2VzIGl0c2VsZiIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBubyBnbyB0byB0aGUgY2hpbGQuCi0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IGdyb3VwLmdldFBhcnNlT2JqZWN0KCkubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKGN1ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGVDb2RlICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlVHJlZSA9IHBhcnNlR3JvdXAgPSAoR3JvdXApY3VyLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZ3JvdXAuZ2V0TmFtZSgpKSArICIgaXMgZW1wdHkiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBncm91cC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZUNvZGUgIT0gU2NoZW1hUGFydGljbGUuQUxMICYmIHBhcnRpY2xlQ29kZSAhPSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSAmJiBwYXJ0aWNsZUNvZGUgIT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZ3JvdXAuZ2V0TmFtZSgpKSArICIgaXMgbm90IGEgc2VxdWVuY2UsIGFsbCwgb3IgY2hvaWNlIiwgWG1sRXJyb3JDb250ZXh0LkVYUExJQ0lUX0dST1VQX05FRURFRCwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UgPSBncm91cC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3VGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZUNvZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgc1BhcnQuc2V0UGFydGljbGVUeXBlKHBhcnRpY2xlQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwgJiYgbWluT2NjdXJzLmNvbXBhcmVUbyhtYXhPY2N1cnMpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIm1heE9jY3VycyBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gbWluT2NjdXJzIiwgWG1sRXJyb3JDb250ZXh0Lk1JTl9NQVhfT0NDVVJTLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgbWF4T2NjdXJzID0gbWluT2NjdXJzOyAvLyByZW1lZHk6IHBpbiBtYXggdXAgdG8gbWluCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwgJiYgbWF4T2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gbWF4T2NjdXJzID09IG1pbk9jY3VycyA9PSAwLCBzYW1lIGFzIG5vIHBhcnRpY2xlIGF0IGFsbC4KLSAgICAgICAgfQotCi0gICAgICAgIHNQYXJ0LnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOwotICAgICAgICBzUGFydC5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChncm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5zdGFydFByb2Nlc3NpbmcoZ3JvdXApOwotICAgICAgICAgICAgcmVkZWZpbml0aW9uRm9yID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChncm91cC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgICAgIHJlZGVmaW5pdGlvbkZvciA9IG5ldyBSZWRlZmluaXRpb25Gb3JHcm91cChncm91cC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0NoaWxkcmVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gcGFyc2VUcmVlLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgTGlzdCBhY2N1bXVsYXRlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKGN1ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGFkZE1pbnVzUG9pbnRsZXNzUGFydGljbGVzKGFjY3VtdWxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVDb250ZW50TW9kZWwob3V0ZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIuZ2V0T2JqZWN0KCksIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXNUeXBlcywgZWxlbWVudE1vZGVsLCB0cnVlLCByZWRlZmluaXRpb25Gb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuZ2V0UGFydGljbGVUeXBlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc1BhcnQuc2V0UGFydGljbGVDaGlsZHJlbigoU2NoZW1hUGFydGljbGVbXSkKLSAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZS50b0FycmF5KG5ldyBTY2hlbWFQYXJ0aWNsZVthY2N1bXVsYXRlLnNpemUoKV0pKTsKLSAgICAgICAgICAgIGN1ci5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgU2NoZW1hUGFydGljbGUgcmVzdWx0ID0gZmlsdGVyUG9pbnRsZXNzUGFydGljbGVzQW5kVmVyaWZ5QWxsUGFydGljbGVzKHNQYXJ0LCBwYXJzZVRyZWUpOwotCi0gICAgICAgIGlmIChncm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5maW5pc2hQcm9jZXNzaW5nKGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBvdXRkZW50REJHKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBpbnQgdHJhbnNsYXRlV2lsZGNhcmRQcm9jZXNzKEFueS5Qcm9jZXNzQ29udGVudHMgcHJvY2VzcykKLSAgICB7Ci0gICAgICAgIGlmIChwcm9jZXNzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUGFydGljbGUuU1RSSUNUOwotCi0gICAgICAgIFN0cmluZyBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKCJsYXgiLmVxdWFscyhwcm9jZXNzVmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVBhcnRpY2xlLkxBWDsKLQotICAgICAgICBpZiAoInNraXAiLmVxdWFscyhwcm9jZXNzVmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVBhcnRpY2xlLlNLSVA7Ci0KLSAgICAgICAgcmV0dXJuIFNjaGVtYVBhcnRpY2xlLlNUUklDVDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hUGFydGljbGUgZmlsdGVyUG9pbnRsZXNzUGFydGljbGVzQW5kVmVyaWZ5QWxsUGFydGljbGVzKFNjaGVtYVBhcnRpY2xlIHBhcnQsIFhtbE9iamVjdCBwYXJzZVRyZWUpCi0gICAgewotICAgICAgICBpZiAocGFydC5nZXRNYXhPY2N1cnMoKSAhPSBudWxsICYmIHBhcnQuZ2V0TWF4T2NjdXJzKCkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGlmIChwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNTaW5nbGV0b24oKSAmJiBwYXJ0LmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCkgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQuZ2V0UGFydGljbGVDaGlsZCgwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgIHBhcnQuZ2V0TWluT2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNTaW5nbGV0b24oKSAmJiBwYXJ0LmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCkgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQuZ2V0UGFydGljbGVDaGlsZCgwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0FsbCA9IHBhcnQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMOwotICAgICAgICAKLSAgICAgICAgaWYgKGlzQWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jY29zLWFsbC1saW1pdGVkCi0gICAgICAgICAgICBpZiAocGFydC5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8IHBhcnQuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBbiBhbGwgZ3JvdXAgbXVzdCBoYXZlIG1heE9jY3VycyA8PSAxIiwgWG1sRXJyb3JDb250ZXh0LkFMTF9DT05URU5UUywgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0LmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY2hpbGQgPSBwYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQW4gYWxsIGdyb3VwIGlzIG9ubHkgYWxsb3dlZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBjb250ZW50IG1vZGVsIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9FWFRFTkRfQUxMLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaXNBbGwgJiYgKGNoaWxkLmdldFBhcnRpY2xlVHlwZSgpICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQgfHwgY2hpbGQuZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBbiBhbGwgZ3JvdXAgY2FuIGNvbnRhaW4gb25seSBlbGVtZW50IHBhcnRpY2xlcyB3aXRoIG1heE9jY3VycyA8PSAxIiwgWG1sRXJyb3JDb250ZXh0LkFMTF9DT05URU5UUywgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgYWRkTWludXNQb2ludGxlc3NQYXJ0aWNsZXMoCi0gICAgICAgICAgICBMaXN0IGxpc3QsIFNjaGVtYVBhcnRpY2xlIHBhcnQsIGludCBwYXJlbnRQYXJ0aWNsZVR5cGUpCi0gICAgewotICAgICAgICBpZiAocGFydCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50UGFydGljbGVUeXBlID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFICYmIHBhcnQuaXNTaW5nbGV0b24oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVtaXREQkcoImRyb3BwaW5nIHJlZHVuZGFudCBzZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXJ0aWNsZVR5cGUgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFICYmIHBhcnQuaXNTaW5nbGV0b24oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVtaXREQkcoImRyb3BwaW5nIHJlZHVuZGFudCBjaG9pY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBsaXN0LmFkZChwYXJ0KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgTWFwIGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoU2NoZW1hQXR0cmlidXRlTW9kZWwgYXR0ck1vZGVsLCBTY2hlbWFUeXBlIG93bmVyKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnVzZXMgPSBhdHRyTW9kZWwuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnVzZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQucHV0KGF0dHJ1c2VzW2ldLmdldE5hbWUoKSwgYnVpbGRVc2VQcm9wZXJ0eShhdHRydXNlc1tpXSwgb3duZXIpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBNYXAgYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoU2NoZW1hUGFydGljbGUgcGFydCwgU2NoZW1hVHlwZSBvd25lcikKLSAgICB7Ci0gICAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCi0gICAgICAgIGJvb2xlYW4gYXNTZXF1ZW5jZSA9IGZhbHNlOwotICAgICAgICBNYXAgbW9kZWwgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGFzU2VxdWVuY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgYXNTZXF1ZW5jZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIG1vZGVsID0gYnVpbGRFbGVtZW50UHJvcGVydHlNb2RlbCgoU2NoZW1hTG9jYWxFbGVtZW50KXBhcnQsIG93bmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgbW9kZWwgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGJ1aWxkIG1vZGVsIGZvciBjaGlsZHJlbgotICAgICAgICAgICAgbW9kZWwgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGluZGVudERCRygpOwotICAgICAgICAgICAgICAgIE1hcCBjaGlsZE1vZGVsID0gYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoY2hpbGRyZW5baV0sIG93bmVyKTsKLSAgICAgICAgICAgICAgICAvLyBvdXRkZW50REJHKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gY2hpbGRNb2RlbC52YWx1ZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgaVByb3AgPSAoU2NoZW1hUHJvcGVydHkpai5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBvUHJvcCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpbW9kZWwuZ2V0KGlQcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvUHJvcCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFzU2VxdWVuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTY2hlbWFQcm9wZXJ0eUltcGwpaVByb3ApLnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLlpFUk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwucHV0KGlQcm9wLmdldE5hbWUoKSwgaVByb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgdmVyaWZpZWQgaW4gYW4gZWFybGllciBzdGVwCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydChvUHJvcC5nZXRUeXBlKCkuZXF1YWxzKGlQcm9wLmdldFR5cGUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lcmdlUHJvcGVydGllcyhvUHJvcCwgaVByb3AsIGFzU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmluYWxseSBkZWFsIHdpdGggbWluT2NjdXJzLCBtYXhPY2N1cnMgb3ZlciB3aG9sZSBncm91cAotICAgICAgICAgICAgQmlnSW50ZWdlciBtaW4gPSBwYXJ0LmdldE1pbk9jY3VycygpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXggPSBwYXJ0LmdldE1heE9jY3VycygpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBtb2RlbC52YWx1ZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IG9Qcm9wID0gKFNjaGVtYVByb3BlcnR5KWoubmV4dCgpOwotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbWluT2NjdXJzID0gb1Byb3AuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnMgPSBvUHJvcC5nZXRNYXhPY2N1cnMoKTsKLQotICAgICAgICAgICAgICAgIG1pbk9jY3VycyA9IG1pbk9jY3Vycy5tdWx0aXBseShtaW4pOwotICAgICAgICAgICAgICAgIGlmIChtYXggIT0gbnVsbCAmJiBtYXguZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykpCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3VycyA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXhPY2N1cnMgIT0gbnVsbCAmJiAhbWF4T2NjdXJzLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnMgPSBtYXggPT0gbnVsbCA/IG51bGwgOiBtYXhPY2N1cnMubXVsdGlwbHkobWF4KTsKLQotICAgICAgICAgICAgICAgICgoU2NoZW1hUHJvcGVydHlJbXBsKW9Qcm9wKS5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKLSAgICAgICAgICAgICAgICAoKFNjaGVtYVByb3BlcnR5SW1wbClvUHJvcCkuc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgc3RhdGljIE1hcCBidWlsZEVsZW1lbnRQcm9wZXJ0eU1vZGVsKFNjaGVtYUxvY2FsRWxlbWVudCBlcGFydCwgU2NoZW1hVHlwZSBvd25lcikKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgxKTsKLQotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBzUHJvcCA9IGJ1aWxkVXNlUHJvcGVydHkoZXBhcnQsIG93bmVyKTsKLSAgICAgICAgcmVzdWx0LnB1dChzUHJvcC5nZXROYW1lKCksIHNQcm9wKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hUHJvcGVydHkgYnVpbGRVc2VQcm9wZXJ0eShTY2hlbWFGaWVsZCB1c2UsIFNjaGVtYVR5cGUgb3duZXIpCi0gICAgewotICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc1Byb3BJbXBsID0gbmV3IFNjaGVtYVByb3BlcnR5SW1wbCgpOwotICAgICAgICBzUHJvcEltcGwuc2V0TmFtZSh1c2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldENvbnRhaW5lclR5cGVSZWYob3duZXIuZ2V0UmVmKCkpOwotICAgICAgICBzUHJvcEltcGwuc2V0VHlwZVJlZih1c2UuZ2V0VHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldEF0dHJpYnV0ZSh1c2UuaXNBdHRyaWJ1dGUoKSk7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXREZWZhdWx0KHVzZS5pc0RlZmF1bHQoKSA/IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSA6IFNjaGVtYVByb3BlcnR5Lk5FVkVSKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldEZpeGVkKHVzZS5pc0ZpeGVkKCkgPyBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkgOiBTY2hlbWFQcm9wZXJ0eS5ORVZFUik7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXROaWxsYWJsZSh1c2UuaXNOaWxsYWJsZSgpID8gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZIDogU2NoZW1hUHJvcGVydHkuTkVWRVIpOwotICAgICAgICBzUHJvcEltcGwuc2V0RGVmYXVsdFRleHQodXNlLmdldERlZmF1bHRUZXh0KCkpOwotICAgICAgICBzUHJvcEltcGwuc2V0TWluT2NjdXJzKHVzZS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXRNYXhPY2N1cnModXNlLmdldE1heE9jY3VycygpKTsKLQotICAgICAgICBpZiAodXNlIGluc3RhbmNlb2YgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCBlbHQgPSAoU2NoZW1hTG9jYWxFbGVtZW50SW1wbCl1c2U7Ci0gICAgICAgICAgICBzUHJvcEltcGwuc2V0QWNjZXB0ZWROYW1lcyhlbHQuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNQcm9wSW1wbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBtZXJnZVByb3BlcnRpZXMoU2NoZW1hUHJvcGVydHlJbXBsIGludG8sIFNjaGVtYVByb3BlcnR5IGZyb20sIGJvb2xlYW4gYXNTZXF1ZW5jZSkKLSAgICB7Ci0gICAgICAgIC8vIG1pbm9jY3VyLCBtYXhvY2N1cgotICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VycyA9IGludG8uZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzID0gaW50by5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgaWYgKGFzU2VxdWVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbk9jY3VycyA9IG1pbk9jY3Vycy5hZGQoZnJvbS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzID0gKGZyb20uZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycy5hZGQoZnJvbS5nZXRNYXhPY2N1cnMoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXJzID0gbWluT2NjdXJzLm1pbihmcm9tLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgIGlmIChtYXhPY2N1cnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnMgPSAoZnJvbS5nZXRNYXhPY2N1cnMoKSA9PSBudWxsID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycy5tYXgoZnJvbS5nZXRNYXhPY2N1cnMoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGludG8uc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgICAgIGludG8uc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7Ci0KLSAgICAgICAgLy8gbmlsbGFibGUsIGRlZmF1bHQsIGZpeGVkCi0gICAgICAgIGlmIChmcm9tLmhhc05pbGxhYmxlKCkgIT0gaW50by5oYXNOaWxsYWJsZSgpKQotICAgICAgICAgICAgaW50by5zZXROaWxsYWJsZShTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSk7Ci0gICAgICAgIGlmIChmcm9tLmhhc0RlZmF1bHQoKSAhPSBpbnRvLmhhc0RlZmF1bHQoKSkKLSAgICAgICAgICAgIGludG8uc2V0RGVmYXVsdChTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSk7Ci0gICAgICAgIGlmIChmcm9tLmhhc0ZpeGVkKCkgIT0gaW50by5oYXNGaXhlZCgpKQotICAgICAgICAgICAgaW50by5zZXRGaXhlZChTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSk7Ci0KLSAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZQotICAgICAgICBpZiAoaW50by5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmcm9tLmdldERlZmF1bHRUZXh0KCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICFpbnRvLmdldERlZmF1bHRUZXh0KCkuZXF1YWxzKGZyb20uZ2V0RGVmYXVsdFRleHQoKSkpCi0gICAgICAgICAgICAgICAgaW50by5zZXREZWZhdWx0VGV4dChudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFQYXJ0aWNsZVtdIGVuc3VyZVN0YXRlTWFjaGluZShTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbGRTdGF0ZU1hY2hpbmUoY2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBidWlsZFN0YXRlTWFjaGluZShTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwpCi0gICAgewotICAgICAgICBpZiAoY29udGVudE1vZGVsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIHBhcnRJbXBsID0gKFNjaGVtYVBhcnRpY2xlSW1wbCljb250ZW50TW9kZWw7Ci0gICAgICAgIGlmIChwYXJ0SW1wbC5oYXNUcmFuc2l0aW9uTm90ZXMoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBRTmFtZVNldEJ1aWxkZXIgc3RhcnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgIFFOYW1lU2V0QnVpbGRlciBleGNsdWRlbmV4dCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgYm9vbGVhbiBkZXRlcm1pbmlzdGljID0gdHJ1ZTsKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gY2Fuc2tpcCA9IChwYXJ0SW1wbC5nZXRNaW5PY2N1cnMoKS5zaWdudW0oKSA9PSAwKTsKLQotICAgICAgICBzd2l0Y2ggKHBhcnRJbXBsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBzdGFydCBhbmQgZXhjbHVkZU5leHQ7IGNhbnNraXAgaXMgYWxyZWFkeSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRJbXBsLmhhc1RyYW5zaXRpb25SdWxlcygpKQotICAgICAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwocGFydEltcGwuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQuYWRkKHBhcnRJbXBsLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHN0YXJ0IGFuZCBleGNsdWRlTmV4dDsgY2Fuc2tpcCBpcyBhbHJlYWR5IGNvcnJlY3QKLSAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwocGFydEltcGwuZ2V0V2lsZGNhcmRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBlbnN1cmVTdGF0ZU1hY2hpbmUocGFydEltcGwuZ2V0UGFydGljbGVDaGlsZHJlbigpKTsKLQotICAgICAgICAgICAgICAgIC8vIGFkanVzdCBjYW5za2lwIGlmIGFsbCBjaGlsZHJlbiBhcmUgc2tpcHBhYmxlCi0gICAgICAgICAgICAgICAgY2Fuc2tpcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNhbnNraXAgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5za2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGJ1YmJsZSB1cCBub25kZXRlcm1pbmlzdGljIGJpdAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBkZXRlcm1pbmlzdGljICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgZGV0ZXJtaW5pc3RpYyBhbmQgY29tcHV0ZSBleGNsdWRlTmV4dCBzZXQKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKCgoU2NoZW1hUGFydGljbGVJbXBsKWNoaWxkcmVuW2kgLSAxXSkuZ2V0RXhjbHVkZU5leHRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXRlcm1pbmlzdGljICYmICFleGNsdWRlbmV4dC5pc0Rpc2pvaW50KChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkcmVuW2ldKS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5leHQsIGNvbXB1dGUgc3RhcnQgc2V0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0LmFkZEFsbCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZW5zdXJlU3RhdGVNYWNoaW5lKHBhcnRJbXBsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGp1c3QgY2Fuc2tpcCBpZiBhbnkgY2hpbGRyZW4gYXJlIHNraXBwYWJsZQotICAgICAgICAgICAgICAgIGNhbnNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIWNhbnNraXAgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZHJlbltpXSkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnNraXAgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGJ1YmJsZSB1cCBub25kZXRlcm1pbmlzdGljIGJpdAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBkZXRlcm1pbmlzdGljICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHN0YXJ0IGFuZCBleGNsdWRlTmV4dCBzZXRzLCB2ZXJpZnkgZGV0ZXJtaW5pc3RpYwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZXJtaW5pc3RpYyAmJiAhc3RhcnQuaXNEaXNqb2ludCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQuYWRkQWxsKChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmdldEV4Y2x1ZGVOZXh0U2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGVuc3VyZVN0YXRlTWFjaGluZShwYXJ0SW1wbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gYWRqdXN0IGNhbnNraXAgaWYgYWxsIGNoaWxkcmVuIGFyZSBza2lwcGFibGUKLSAgICAgICAgICAgICAgICBjYW5za2lwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIWNhbnNraXAgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5za2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYnViYmxlIHVwIG5vbmRldGVybWluaXN0aWMgYml0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGRldGVybWluaXN0aWMgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpXSkuaXNEZXRlcm1pbmlzdGljKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgc3RhcnQgYW5kIGV4Y2x1ZGVOZXh0IHNldHMsIHZlcmlmeSBkZXRlcm1pbmlzdGljCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXRlcm1pbmlzdGljICYmICFzdGFydC5pc0Rpc2pvaW50KChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmFkZEFsbCgoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpXSkuZ2V0RXhjbHVkZU5leHRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjYW5za2lwKQotICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoc3RhcnQpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQsIGFsbCBjYXNlcyBueWkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgc2NoZW1hIHBhcnRpY2xlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhcHBseSBsb29waW5nIGxvZ2ljCi0KLSAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnMgPSBwYXJ0SW1wbC5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnMgPSBwYXJ0SW1wbC5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgYm9vbGVhbiBjYW5sb29wID0gKG1heE9jY3VycyA9PSBudWxsIHx8IG1heE9jY3Vycy5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCk7Ci0gICAgICAgIGJvb2xlYW4gdmFybG9vcCA9IChtYXhPY2N1cnMgPT0gbnVsbCB8fCBtaW5PY2N1cnMuY29tcGFyZVRvKG1heE9jY3VycykgPCAwKTsKLQotICAgICAgICBpZiAoY2FubG9vcCAmJiBkZXRlcm1pbmlzdGljICYmICFleGNsdWRlbmV4dC5pc0Rpc2pvaW50KHN0YXJ0KSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHBvc3NpYmxlIGxvb3Bpbmcgbm9uZGV0ZXJtaW5pc20uCi0gICAgICAgICAgICAvLyBsZXQncyB0YWtlIHNvbWUgdGltZSBub3cgdG8gc2VlIGlmIGl0J3MgYWN0dWFsbHkgY2F1c2VkCi0gICAgICAgICAgICAvLyBieSBub24tdW5pcXVlLXBhcnRpY2xlLWF0dHJpYnV0ZSBvciBub3QuCi0gICAgICAgICAgICBRTmFtZVNldCBzdXNwZWN0U2V0ID0gZXhjbHVkZW5leHQuaW50ZXJzZWN0KHN0YXJ0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgc2V0IG9mIGFsbCBwYXJ0aWNsZXMgdGhhdCBjb3VsZCBzdGFydCB0aGlzIGdyb3VwCi0gICAgICAgICAgICBNYXAgc3RhcnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdTdGFydChwYXJ0SW1wbCwgc3VzcGVjdFNldCwgc3RhcnRNYXAsIG5ldyBRTmFtZVNldEJ1aWxkZXIoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIHNldCBvZiBhbGwgcGFydGljbGVzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHJlcGVhdGVkIHJhdGhlciB0aGFuIGVuZGluZyB0aGlzIGdyb3VwCi0gICAgICAgICAgICBNYXAgYWZ0ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdBZnRlcihwYXJ0SW1wbCwgc3VzcGVjdFNldCwgYWZ0ZXJNYXAsIG5ldyBRTmFtZVNldEJ1aWxkZXIoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1lbWJlciBvZiBhZnRlciB0aGF0IGlzIG5vdCBhIG1lbWJlciBvZiBzdGFydAotICAgICAgICAgICAgLy8gaWYgd2UgY2FuLCB0aGVuIHBhcnRpY2xlIGF0dHJpYnV0aW9uIGlzIG5vdCB1bmlxdWUKLSAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBhZnRlck1hcFN1YnN1bWVkQnlTdGFydE1hcChzdGFydE1hcCwgYWZ0ZXJNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhcmxvb3ApCi0gICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoc3RhcnQpOwotCi0gICAgICAgIGNhbnNraXAgPSBjYW5za2lwIHx8IG1pbk9jY3Vycy5zaWdudW0oKSA9PSAwOwotCi0gICAgICAgIHBhcnRJbXBsLnNldFRyYW5zaXRpb25SdWxlcyhzdGFydC50b1FOYW1lU2V0KCksIGNhbnNraXApOwotICAgICAgICBwYXJ0SW1wbC5zZXRUcmFuc2l0aW9uTm90ZXMoZXhjbHVkZW5leHQudG9RTmFtZVNldCgpLCBkZXRlcm1pbmlzdGljKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhZnRlck1hcFN1YnN1bWVkQnlTdGFydE1hcChNYXAgc3RhcnRNYXAsIE1hcCBhZnRlck1hcCkKLSAgICB7Ci0gICAgICAgIGlmIChhZnRlck1hcC5zaXplKCkgPiBzdGFydE1hcC5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiAoYWZ0ZXJNYXAuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdGFydE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0ID0gKFNjaGVtYVBhcnRpY2xlKWkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFmdGVyTWFwLmNvbnRhaW5zS2V5KHBhcnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQgc3RhcnRTZXQgPSAoUU5hbWVTZXQpc3RhcnRNYXAuZ2V0KHBhcnQpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCBhZnRlclNldCA9IChRTmFtZVNldClhZnRlck1hcC5nZXQocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRTZXQuY29udGFpbnNBbGwoYWZ0ZXJTZXQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFmdGVyTWFwLnJlbW92ZShwYXJ0KTsKLSAgICAgICAgICAgIGlmIChhZnRlck1hcC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChhZnRlck1hcC5pc0VtcHR5KCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnRpY2xlc01hdGNoaW5nU3RhcnQoU2NoZW1hUGFydGljbGUgcGFydCwgUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHN1c3BlY3RTZXQsIE1hcCByZXN1bHQsIFFOYW1lU2V0QnVpbGRlciBlbGltaW5hdGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBpZiAoIXN1c3BlY3RTZXQuY29udGFpbnMocGFydC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChwYXJ0LCBudWxsKTsKLSAgICAgICAgICAgICAgICBlbGltaW5hdGUuYWRkKHBhcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGlmIChzdXNwZWN0U2V0LmlzRGlzam9pbnQocGFydC5nZXRXaWxkY2FyZFNldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQocGFydCwgcGFydC5nZXRXaWxkY2FyZFNldCgpLmludGVyc2VjdChzdXNwZWN0U2V0KSk7Ci0gICAgICAgICAgICAgICAgZWxpbWluYXRlLmFkZEFsbChwYXJ0LmdldFdpbGRjYXJkU2V0KCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KGNoaWxkcmVuW2ldLCBzdXNwZWN0U2V0LCByZXN1bHQsIGVsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5bMF0uaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdTdGFydChjaGlsZHJlblswXSwgc3VzcGVjdFNldCwgcmVzdWx0LCBlbGltaW5hdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciByZW1haW5pbmdTdXNwZWN0cyA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoc3VzcGVjdFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciBzdXNwZWN0c1RvRWxpbWluYXRlID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KGNoaWxkcmVuW2ldLCByZW1haW5pbmdTdXNwZWN0cywgcmVzdWx0LCBzdXNwZWN0c1RvRWxpbWluYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaW1pbmF0ZS5hZGRBbGwoc3VzcGVjdHNUb0VsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuW2ldLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nU3VzcGVjdHMucmVtb3ZlQWxsKHN1c3BlY3RzVG9FbGltaW5hdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1N1c3BlY3RzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXNwZWN0c1RvRWxpbWluYXRlLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIoU2NoZW1hUGFydGljbGUgcGFydCwgUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHN1c3BlY3RTZXQsIE1hcCByZXN1bHQsIFFOYW1lU2V0QnVpbGRlciBlbGltaW5hdGUsIGJvb2xlYW4gdG9wKQotICAgIHsKLSAgICAgICAgcmVjdXJzZTogc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdBZnRlcihjaGlsZHJlbltpXSwgc3VzcGVjdFNldCwgcmVzdWx0LCBlbGltaW5hdGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIoY2hpbGRyZW5bMF0sIHN1c3BlY3RTZXQsIHJlc3VsdCwgZWxpbWluYXRlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciByZW1haW5pbmdTdXNwZWN0cyA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoc3VzcGVjdFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciBzdXNwZWN0c1RvRWxpbWluYXRlID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIoY2hpbGRyZW5baV0sIHJlbWFpbmluZ1N1c3BlY3RzLCByZXN1bHQsIHN1c3BlY3RzVG9FbGltaW5hdGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaW1pbmF0ZS5hZGRBbGwoc3VzcGVjdHNUb0VsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuW2ldLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ1N1c3BlY3RzLnJlbW92ZUFsbChzdXNwZWN0c1RvRWxpbWluYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdTdXNwZWN0cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlY3RzVG9FbGltaW5hdGUuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdG9wKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VycyA9IHBhcnQuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3VycyA9IHBhcnQuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgICBib29sZWFuIHZhcmxvb3AgPSAobWF4T2NjdXJzID09IG51bGwgfHwgbWluT2NjdXJzLmNvbXBhcmVUbyhtYXhPY2N1cnMpIDwgMCk7Ci0gICAgICAgICAgICBpZiAodmFybG9vcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KHBhcnQsIHN1c3BlY3RTZXQsIHJlc3VsdCwgZWxpbWluYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvZGVGb3JOYW1lRW50cnkKLSAgICB7Ci0gICAgICAgIENvZGVGb3JOYW1lRW50cnkoUU5hbWUgbmFtZSwgaW50IGNvZGUpCi0gICAgICAgICAgICB7IHRoaXMubmFtZSA9IG5hbWU7IHRoaXMuY29kZSA9IGNvZGU7IH0KLSAgICAgICAgcHVibGljIFFOYW1lIG5hbWU7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfR1JPVVBfQ09ERSA9IDEwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIENvZGVGb3JOYW1lRW50cnlbXSBwYXJ0aWNsZUNvZGVzID0gbmV3IENvZGVGb3JOYW1lRW50cnlbXQotICAgIHsKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJhbGwiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hUGFydGljbGUuQUxMKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJzZXF1ZW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiY2hvaWNlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVBhcnRpY2xlLkNIT0lDRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiZWxlbWVudCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJhbnkiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hUGFydGljbGUuV0lMRENBUkQpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImdyb3VwIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIE1PREVMX0dST1VQX0NPREUpLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgcGFydGljbGVDb2RlTWFwID0gYnVpbGRQYXJ0aWNsZUNvZGVNYXAoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZFBhcnRpY2xlQ29kZU1hcCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNvZGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0LnB1dChwYXJ0aWNsZUNvZGVzW2ldLm5hbWUsICBuZXcgSW50ZWdlcihwYXJ0aWNsZUNvZGVzW2ldLmNvZGUpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgdHJhbnNsYXRlUGFydGljbGVDb2RlKEdyb3VwIHBhcnNlRWcpCi0gICAgewotICAgICAgICBpZiAocGFyc2VFZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUocGFyc2VFZy5uZXdDdXJzb3IoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIEludGVnZXIgcmVzdWx0ID0gKEludGVnZXIpcGFydGljbGVDb2RlTWFwLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0NPREUgPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9HUk9VUF9DT0RFID0gMTAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTllfQVRUUklCVVRFX0NPREUgPSAxMDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb2RlRm9yTmFtZUVudHJ5W10gYXR0cmlidXRlQ29kZXMgPSBuZXcgQ29kZUZvck5hbWVFbnRyeVtdCi0gICAgewotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImF0dHJpYnV0ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBBVFRSSUJVVEVfQ09ERSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiYXR0cmlidXRlR3JvdXAiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgQVRUUklCVVRFX0dST1VQX0NPREUpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImFueUF0dHJpYnV0ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBBTllfQVRUUklCVVRFX0NPREUpLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYXR0cmlidXRlQ29kZU1hcCA9IGJ1aWxkQXR0cmlidXRlQ29kZU1hcCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkQXR0cmlidXRlQ29kZU1hcCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVDb2Rlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoYXR0cmlidXRlQ29kZXNbaV0ubmFtZSwgIG5ldyBJbnRlZ2VyKGF0dHJpYnV0ZUNvZGVzW2ldLmNvZGUpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IHRyYW5zbGF0ZUF0dHJpYnV0ZUNvZGUoUU5hbWUgY3VycmVudE5hbWUpCi0gICAgewotICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKWF0dHJpYnV0ZUNvZGVNYXAuZ2V0KGN1cnJlbnROYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0ltcG9ydGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSW1wb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjMzhhMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSW1wb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5SZWRlZmluZURvY3VtZW50LlJlZGVmaW5lOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuU2NoZW1hOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbXBvcnREb2N1bWVudC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbmNsdWRlRG9jdW1lbnQuSW5jbHVkZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotCi1wdWJsaWMgY2xhc3MgU3RzY0ltcG9ydGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUb1Byb2Nlc3NbXSByZXNvbHZlSW1wb3J0c0FuZEluY2x1ZGVzKFNjaGVtYVtdIHN0YXJ0V2l0aCkKLSAgICB7Ci0gICAgICAgIERvd25sb2FkVGFibGUgZW5naW5lID0gbmV3IERvd25sb2FkVGFibGUoc3RhcnRXaXRoKTsKLSAgICAgICAgcmV0dXJuIGVuZ2luZS5yZXNvbHZlSW1wb3J0c0FuZEluY2x1ZGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTY2hlbWFUb1Byb2Nlc3MKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU2NoZW1hIHNjaGVtYTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlOwotICAgICAgICBwcml2YXRlIFJlZGVmaW5lIHJlZGVmaW5lOwotCi0gICAgICAgIHB1YmxpYyBTY2hlbWFUb1Byb2Nlc3MoU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUmVkZWZpbmUgcmVkZWZpbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgICAgICAgICAgdGhpcy5jaGFtZWxlb25OYW1lc3BhY2UgPSBjaGFtZWxlb25OYW1lc3BhY2U7Ci0gICAgICAgICAgICB0aGlzLnJlZGVmaW5lID0gcmVkZWZpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHNjaGVtYSB0byBwYXJzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNjaGVtYTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYmFzZSBVUkkgZm9yIHRoaXMgc3RwCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2NoZW1hLmRvY3VtZW50UHJvcGVydGllcygpLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSByZWRlZmluZSBlbGVtZW50LCBpZiBwcm9jZXNzZWQgdmlhIHJlZGVmaW5lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUmVkZWZpbmUgZ2V0UmVkZWZpbmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVkZWZpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNoYW1lbGVvbiBuYW1lc3BhY2UuIE51bGwgaWYgdGhpcyBzY2hlbWEgaXMgbm90IGJlaW5nIHRyZWF0ZWQKLSAgICAgICAgICogYXMgYSBjaGFtZWxlb24uIChUaGUgb3JkaW5hcnkgdGFyZ2V0TmFtZXNwYWNlIHdpbGwganVzdCBiZSBleHRyYWN0ZWQKLSAgICAgICAgICogZnJvbSB0aGUgc3ludGF4IG9mIHRoZSBzY2hlbWEuKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2hhbWVsZW9uTmFtZXNwYWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTY2hlbWFUb1Byb2Nlc3MpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZpbmFsIFNjaGVtYVRvUHJvY2VzcyBzY2hlbWFUb1Byb2Nlc3MgPSAoU2NoZW1hVG9Qcm9jZXNzKSBvOwotCi0gICAgICAgICAgICBpZiAoY2hhbWVsZW9uTmFtZXNwYWNlICE9IG51bGwgPyAhY2hhbWVsZW9uTmFtZXNwYWNlLmVxdWFscyhzY2hlbWFUb1Byb2Nlc3MuY2hhbWVsZW9uTmFtZXNwYWNlKSA6IHNjaGVtYVRvUHJvY2Vzcy5jaGFtZWxlb25OYW1lc3BhY2UgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKHJlZGVmaW5lICE9IG51bGwgPyAhcmVkZWZpbmUuZXF1YWxzKHNjaGVtYVRvUHJvY2Vzcy5yZWRlZmluZSkgOiBzY2hlbWFUb1Byb2Nlc3MucmVkZWZpbmUgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKCFzY2hlbWEuZXF1YWxzKHNjaGVtYVRvUHJvY2Vzcy5zY2hlbWEpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgICAgICByZXN1bHQgPSBzY2hlbWEuaGFzaENvZGUoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKGNoYW1lbGVvbk5hbWVzcGFjZSAhPSBudWxsID8gY2hhbWVsZW9uTmFtZXNwYWNlLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKHJlZGVmaW5lICE9IG51bGwgPyByZWRlZmluZS5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfVVJMX1BSRUZJWCA9ICJwcm9qZWN0Oi8vbG9jYWwiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VVUkxGb3JEb2MoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gb2JqLmRvY3VtZW50UHJvcGVydGllcygpLmdldFNvdXJjZU5hbWUoKTsKLQotICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICAgICAgcmV0dXJuIFBST0pFQ1RfVVJMX1BSRUZJWCArIHBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCi0gICAgICAgIC8vIGxvb2tzIGxpa2UgYSBVUkw/Ci0gICAgICAgIGludCBjb2xvbiA9IHBhdGguaW5kZXhPZignOicpOwotICAgICAgICBpZiAoY29sb24gPiAxICYmIHBhdGguc3Vic3RyaW5nKDAsIGNvbG9uKS5tYXRjaGVzKCJeXFx3KyQiKSkKLSAgICAgICAgICAgIHJldHVybiBwYXRoOwotCi0gICAgICAgIHJldHVybiBQUk9KRUNUX1VSTF9QUkVGSVggKyAiLyIgKyBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBVUkkgcGFyc2VVUkkoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gc3ludGF4KQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy93b3JrYXJvdW5kIGZvciBTdW4gYnVnICMgNDcyMzcyNgotICAgIHByaXZhdGUgc3RhdGljIFVSSSByZXNvbHZlKFVSSSBiYXNlLCBTdHJpbmcgY2hpbGQpCi0gICAgewotICAgICAgICBVUkkgcnVyaSA9IGJhc2UucmVzb2x2ZShjaGlsZCk7Ci0gICAgICAgIAotICAgICAgICAvL2ZpeCB1cCBub3JtYWxpemF0aW9uIGJ1ZwotICAgICAgICBpZiAoImZpbGUiLmVxdWFscyhydXJpLmdldFNjaGVtZSgpKSAmJiAhIGNoaWxkLmVxdWFscyhydXJpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJhc2UuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikgJiYgIXJ1cmkuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiLy8vIi5jb25jYXQocnVyaS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcnVyaSA9IG5ldyBVUkkoImZpbGUiLCBudWxsLCBwYXRoLCBydXJpLmdldFF1ZXJ5KCksIHJ1cmkuZ2V0RnJhZ21lbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlzKQotICAgICAgICAgICAgICAgIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ1cmk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3dubG9hZFRhYmxlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogTmFtZXNwYWNlL3NjaGVtYUxvY2F0aW9uIHBhaXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIERvd25sb2FkZWQgc2NoZW1hcyBhcmUgaW5kZXhlZCBieSBuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uLCBhbmQgYm90aC4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBwZXJmZWN0IG1hdGNoIGlzIHByZWZlcnJlZCwgYnV0IGEgbWF0Y2gtYnktbmFtZXNwYWNlIGlzIGFjY2VwdGVkLgotICAgICAgICAgKiBBIG1hdGNoLWJ5LXNjaGVtYUxvY2F0aW9uIGlzIG9ubHkgYWNjZXB0ZWQgZm9yIGluY2x1ZGVzIChub3QgaW1wb3J0cykuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOc0xvY1BhaXIKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb25VUkw7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBOc0xvY1BhaXIoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2F0aW9uVVJMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25VUkwgPSBsb2NhdGlvblVSTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBFbXB0eSBzdHJpbmcgZm9yIG5vLW5hbWVzcGFjZSwgbnVsbCBmb3IgbmFtZXNwYWNlLW5vdC1wYXJ0LW9mLWtleQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uVVJMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE5zTG9jUGFpcikpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIE5zTG9jUGFpciBuc0xvY1BhaXIgPSAoTnNMb2NQYWlyKSBvOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uVVJMICE9IG51bGwgPyAhbG9jYXRpb25VUkwuZXF1YWxzKG5zTG9jUGFpci5sb2NhdGlvblVSTCkgOiBuc0xvY1BhaXIubG9jYXRpb25VUkwgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCA/ICFuYW1lc3BhY2VVUkkuZXF1YWxzKG5zTG9jUGFpci5uYW1lc3BhY2VVUkkpIDogbnNMb2NQYWlyLm5hbWVzcGFjZVVSSSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAobmFtZXNwYWNlVVJJICE9IG51bGwgPyBuYW1lc3BhY2VVUkkuaGFzaENvZGUoKSA6IDApOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKGxvY2F0aW9uVVJMICE9IG51bGwgPyBsb2NhdGlvblVSTC5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERpZ2VzdEtleQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gX2RpZ2VzdDsKLSAgICAgICAgICAgIGludCBfaGFzaENvZGU7Ci0gICAgICAgICAgICBEaWdlc3RLZXkoYnl0ZVtdIGRpZ2VzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZGlnZXN0ID0gZGlnZXN0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNCAmJiBpIDwgZGlnZXN0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2hhc2hDb2RlID0gX2hhc2hDb2RlIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIF9oYXNoQ29kZSA9IF9oYXNoQ29kZSArIGRpZ2VzdFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGlnZXN0S2V5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKF9kaWdlc3QsICgoRGlnZXN0S2V5KW8pLl9kaWdlc3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2hhc2hDb2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBNYXAgc2NoZW1hQnlOc0xvY1BhaXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcml2YXRlIE1hcCBzY2hlbWFCeURpZ2VzdEtleSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgTGlua2VkTGlzdCBzY2FuTmVlZGVkID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBTZXQgZW1wdHlOYW1lc3BhY2VTY2hlbWFzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgcHJpdmF0ZSBTZXQgc2Nhbm5lZEFscmVhZHkgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBwcml2YXRlIFNldCBmYWlsZWREb3dubG9hZHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIHByaXZhdGUgU2NoZW1hIGRvd25sb2FkU2NoZW1hKFhtbE9iamVjdCByZWZlcmVuY2VkQnksIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvblVSTCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm8gbG9jYXRpb24gVVJMIHByb3ZpZGVkPyAgVGhlbiBub3RoaW5nIHRvIGRvLgotICAgICAgICAgICAgaWYgKGxvY2F0aW9uVVJMID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpcnN0IHJlc29sdmUgcmVsYXRpdmUgVVJMcyB3aXRoIHJlc3BlY3QgdG8gYmFzZSBVUkwgZm9yIGRvYwotICAgICAgICAgICAgVVJJIGJhc2VVUkkgPSBwYXJzZVVSSShiYXNlVVJMRm9yRG9jKHJlZmVyZW5jZWRCeSkpOwotICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlVVJMID0gYmFzZVVSSSA9PSBudWxsID8gbG9jYXRpb25VUkwgOiByZXNvbHZlKGJhc2VVUkksIGxvY2F0aW9uVVJMKS50b1N0cmluZygpOwotCi0gICAgICAgICAgICAvLyBwcm9iZSAxOiBucyt1cmwgLSBwZXJmZWN0IG1hdGNoCi0gICAgICAgICAgICBpZiAoYWJzb2x1dGVVUkwgIT0gbnVsbCAmJiB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWEgcmVzdWx0ID0gKFNjaGVtYSlzY2hlbWFCeU5zTG9jUGFpci5nZXQobmV3IE5zTG9jUGFpcih0YXJnZXROYW1lc3BhY2UsIGFic29sdXRlVVJMKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2JlIDI6IHdlIGhhdmUgcHJlZXhpc3Rpbmcga25vd2xlZGdlIG9mIHRoaXMgbmFtZXNwYWNlLAotICAgICAgICAgICAgLy8gZWl0aGVyIGZyb20gYW5vdGhlciBzY2hlbWEgZmlsZSBvciBmcm9tIHRoZSBsaW5rZXIuCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgZG93bmxvYWRpbmcgdGhlIGdpdmVuIFVSTCwgc2tpcCBpdCBzaWxlbnRseSBpZiB0aGUKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBpcyBhbHJlYWR5IHJlcHJlc2VudGVkIGJ5IGEgZmlsZSB3ZSBoYXZlLgotICAgICAgICAgICAgLy8gQWxzbywgc3VwcHJlc3MgZG93bmxvYWRzIG9mIFVSTHMgdG8gbmFtZXNwYWNlcyB0aGF0IGFyZSBhbHJlYWR5Ci0gICAgICAgICAgICAvLyBrbm93biBieSB0aGUgbGlua2VyLgotICAgICAgICAgICAgLy8gKFdlIG5ldmVyIGFzc3VtZSBwcmVleGlzdGluZyBrbm93bGVkZ2Ugb2YgdGhlIG5vLW5hbWVzcGFjZSwKLSAgICAgICAgICAgIC8vIGV2ZW4gaWYgd2UgaGF2ZSBzb21lIGRlZmluaXRpb25zLCBzaW5jZSBpdCdzIGxpa2VseSB0aGF0Ci0gICAgICAgICAgICAvLyBtb3JlIHRoYW4gb25lIHBlcnNvbiBpcyBwbGF5aW5nIGluIHRoZSBuby1uYW1lc3BhY2UgYXQgb25jZS4pCi0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgIXRhcmdldE5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRoZSBVUkwgaXMgbm90IG9uZSB0byBkb3dubG9hZDsgc2hvdWxkIHdlIGFzc3VtZSB3ZSBrbm93IGFib3V0IHRoZSBuYW1lc3BhY2U/Ci0gICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5zaG91bGREb3dubG9hZFVSSShhYnNvbHV0ZVVSTCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzY2hlbWEgcmVwcmVzZW50aW5nIHRoaXMgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHNraXAgdGhpcyBVUkwgc2lsZW50bHkgd2l0aG91dCBwcm9kdWNpbmcgYW4gZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYSByZXN1bHQgPSAoU2NoZW1hKXNjaGVtYUJ5TnNMb2NQYWlyLmdldChuZXcgTnNMb2NQYWlyKHRhcmdldE5hbWVzcGFjZSwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5rZXIgYWxyZWFkeSBrbm93cyBhYm91dCB0aGlzIG5hbWVzcGFjZSwgc2tpcAotICAgICAgICAgICAgICAgIC8vIHRoaXMgVVJMLgotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5saW5rZXJEZWZpbmVzTmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwcm9iZSAzOiB1cmwgb25seQotICAgICAgICAgICAgaWYgKGFic29sdXRlVVJMICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hIHJlc3VsdCA9IChTY2hlbWEpc2NoZW1hQnlOc0xvY1BhaXIuZ2V0KG5ldyBOc0xvY1BhaXIobnVsbCwgYWJzb2x1dGVVUkwpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vIG1hdGNoOiBlcnJvciBpZiB3ZSBjYW4ndCBvciB3b24ndCBkb3dubG9hZC4KLSAgICAgICAgICAgIGlmIChhYnNvbHV0ZVVSTCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZSAtIG5vIHZhbGlkIGxvY2F0aW9uIFVSTC4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmV2aW91c2x5RmFpbGVkVG9Eb3dubG9hZChhYnNvbHV0ZVVSTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYW4gZXJyb3IgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIHByb2R1Y2VkLgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXN0YXRlLnNob3VsZERvd25sb2FkVVJJKGFic29sdXRlVVJMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgXCIiICsgYWJzb2x1dGVVUkwgKyAiXCIgKG5ldHdvcmsgZG93bmxvYWRzIGRpc2FibGVkKS4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7Ci0gICAgICAgICAgICAgICAgYWRkRmFpbGVkRG93bmxvYWQoYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0cnkgdG8gZG93bmxvYWQKLSAgICAgICAgICAgIGRvd25sb2FkOiB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3QgeGRvYyA9IGRvd25sb2FkRG9jdW1lbnQoc3RhdGUuZ2V0UzRTTG9hZGVyKCksIHRhcmdldE5hbWVzcGFjZSwgYWJzb2x1dGVVUkwpOwotCi0gICAgICAgICAgICAgICAgU2NoZW1hIHJlc3VsdCA9IGZpbmRNYXRjaEJ5RGlnZXN0KHhkb2MpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydG5hbWUgPSBzdGF0ZS5yZWxhdGl2aXplKGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBhbiBleGFjdGx5LXRoZS1zYW1lIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLCB1c2UgdGhlIG9yaWdpbmFsIGFuZCBzcGV3Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkdXBuYW1lID0gc3RhdGUucmVsYXRpdml6ZShyZXN1bHQuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR1cG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmluZm8oc2hvcnRuYW1lICsgIiBpcyB0aGUgc2FtZSBhcyAiICsgZHVwbmFtZSArICIgKGlnbm9yaW5nIHRoZSBkdXBsaWNhdGUgZmlsZSkiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW5mbyhzaG9ydG5hbWUgKyAiIGlzIHRoZSBzYW1lIGFzIGFub3RoZXIgc2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBhIG5ldyBkb2N1bWVudDogdmFsaWRhdGUgaXQgYW5kIGdyYWIgdGhlIGNvbnRlbnRzCi0gICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgdm9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICB2b3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKHN0YXRlLmdldEVycm9yTGlzdGVuZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKHhkb2MgaW5zdGFuY2VvZiBTY2hlbWFEb2N1bWVudCkgfHwgIXhkb2MudmFsaWRhdGUodm9wdGlvbnMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVmZXJlbmNlZCBkb2N1bWVudCBpcyBub3QgYSB2YWxpZCBzY2hlbWEiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBkb3dubG9hZDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IHNEb2MgPSAoU2NoZW1hRG9jdW1lbnQpeGRvYzsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzRG9jLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbmZvKCJMb2FkaW5nIHJlZmVyZW5jZWQgZmlsZSAiICsgc2hvcnRuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTnNMb2NQYWlyIGtleSA9IG5ldyBOc0xvY1BhaXIoZW1wdHlTdHJpbmdJZk51bGwocmVzdWx0LmdldFRhcmdldE5hbWVzcGFjZSgpKSwgYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NmdWxEb3dubG9hZChrZXksIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWFsZm9ybWVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJVUkwgXCIiICsgYWJzb2x1dGVVUkwgKyAiXCIgaXMgbm90IHdlbGwtZm9ybWVkIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9GSU5EX1JFU09VUkNFLCByZWZlcmVuY2VkQnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGNvbm5lY3Rpb25Qcm9ibGVtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKGNvbm5lY3Rpb25Qcm9ibGVtLnRvU3RyaW5nKCksIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRklORF9SRVNPVVJDRSwgcmVmZXJlbmNlZEJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUHJvYmxlbSBwYXJzaW5nIHJlZmVyZW5jZWQgWE1MIHJlc291cmNlIC0gIiArIGUuZ2V0TWVzc2FnZSgpLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlY29yZCBmYWlsdXJlIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIGRvd25sb2FkIHRoaXMgVVJMIGFnYWluCi0gICAgICAgICAgICBhZGRGYWlsZWREb3dubG9hZChhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBYbWxPYmplY3QgZG93bmxvYWREb2N1bWVudChTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGFic29sdXRlVVJMKQotICAgICAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYbWxFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBFbnRpdHlSZXNvbHZlciByZXNvbHZlciA9IHN0YXRlLmdldEVudGl0eVJlc29sdmVyKCk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlRW50aXR5KG5hbWVzcGFjZSwgYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgcHJlZmVyZW5jZSBmb3IgSW5wdXRTb3VyY2UgY29udHJhY3Q6IGNoYXJhY3RlciBzdHJlYW0KLSAgICAgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gc291cmNlLmdldENoYXJhY3RlclN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0RG9jdW1lbnRTb3VyY2VOYW1lKGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZShyZWFkZXIsIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzZWNvbmQgcHJlZmVyZW5jZSBmb3IgSW5wdXRTb3VyY2UgY29udHJhY3Q6IAotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGJ5dGVzID0gc291cmNlLmdldEJ5dGVTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHNvdXJjZS5nZXRFbmNvZGluZygpOwotICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRNZXNzYWdlRGlnZXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0RG9jdW1lbnRTb3VyY2VOYW1lKGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldENoYXJhY3RlckVuY29kaW5nKGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZShieXRlcywgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRoaXJkIHByZWZlcmVuY2U6IHVzZSB0aGUgKHBvc3NpYmx5IHJlZGlyZWN0ZWQpIHVybAotICAgICAgICAgICAgICAgIFN0cmluZyB1cmxUb0xvYWQgPSBzb3VyY2UuZ2V0U3lzdGVtSWQoKTsKLSAgICAgICAgICAgICAgICBpZiAodXJsVG9Mb2FkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRW50aXR5UmVzb2x2ZXIgdW5hYmxlIHRvIHJlc29sdmUgIiArIGFic29sdXRlVVJMICsgIiAoZm9yIG5hbWVzcGFjZSAiICsgbmFtZXNwYWNlICsgIikiKTsKLSAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTWVzc2FnZURpZ2VzdCgpOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0RG9jdW1lbnRTb3VyY2VOYW1lKGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgICAgICBVUkwgdXJsRG93bmxvYWQgPSBuZXcgVVJMKHVybFRvTG9hZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZSh1cmxEb3dubG9hZCwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG5vIHJlc29sdmVyIC0ganVzdCB1c2UgdGhlIFVSTCBkaXJlY3RseSwgbm8gc3Vic3RpdHV0aW9uCi0gICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFVSTCB1cmxEb3dubG9hZCA9IG5ldyBVUkwoYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZSh1cmxEb3dubG9hZCwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkU3VjY2Vzc2Z1bERvd25sb2FkKE5zTG9jUGFpciBrZXksIFNjaGVtYSBzY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBkaWdlc3QgPSBzY2hlbWEuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0TWVzc2FnZURpZ2VzdCgpOwotICAgICAgICAgICAgaWYgKGRpZ2VzdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5hZGRTY2hlbWFEaWdlc3QobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGlnZXN0S2V5IGRrID0gbmV3IERpZ2VzdEtleShkaWdlc3QpOwotICAgICAgICAgICAgICAgIGlmICghc2NoZW1hQnlEaWdlc3RLZXkuY29udGFpbnNLZXkoZGspKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hQnlEaWdlc3RLZXkucHV0KG5ldyBEaWdlc3RLZXkoZGlnZXN0KSwgc2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmFkZFNjaGVtYURpZ2VzdChkaWdlc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2NoZW1hQnlOc0xvY1BhaXIucHV0KGtleSwgc2NoZW1hKTsKLSAgICAgICAgICAgIE5zTG9jUGFpciBrZXkxID0gbmV3IE5zTG9jUGFpcihrZXkuZ2V0TmFtZXNwYWNlVVJJKCksIG51bGwpOwotICAgICAgICAgICAgaWYgKCFzY2hlbWFCeU5zTG9jUGFpci5jb250YWluc0tleShrZXkxKSkKLSAgICAgICAgICAgICAgICBzY2hlbWFCeU5zTG9jUGFpci5wdXQoa2V5MSwgc2NoZW1hKTsKLSAgICAgICAgICAgIE5zTG9jUGFpciBrZXkyID0gbmV3IE5zTG9jUGFpcihudWxsLCBrZXkuZ2V0TG9jYXRpb25VUkwoKSk7Ci0gICAgICAgICAgICBpZiAoIXNjaGVtYUJ5TnNMb2NQYWlyLmNvbnRhaW5zS2V5KGtleTIpKQotICAgICAgICAgICAgICAgIHNjaGVtYUJ5TnNMb2NQYWlyLnB1dChrZXkyLCBzY2hlbWEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTY2hlbWEgZmluZE1hdGNoQnlEaWdlc3QoWG1sT2JqZWN0IG9yaWdpbmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gZGlnZXN0ID0gb3JpZ2luYWwuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0TWVzc2FnZURpZ2VzdCgpOwotICAgICAgICAgICAgaWYgKGRpZ2VzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWEpc2NoZW1hQnlEaWdlc3RLZXkuZ2V0KG5ldyBEaWdlc3RLZXkoZGlnZXN0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkRmFpbGVkRG93bmxvYWQoU3RyaW5nIGxvY2F0aW9uVVJMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsZWREb3dubG9hZHMuYWRkKGxvY2F0aW9uVVJMKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcmV2aW91c2x5RmFpbGVkVG9Eb3dubG9hZChTdHJpbmcgbG9jYXRpb25VUkwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWlsZWREb3dubG9hZHMuY29udGFpbnMobG9jYXRpb25VUkwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBudWxsYWJsZVN0cmluZ3NNYXRjaChTdHJpbmcgczEsIFN0cmluZyBzMikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMxID09IG51bGwgJiYgczIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzMSA9PSBudWxsIHx8IHMyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIChzMS5lcXVhbHMoczIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbXB0eVN0cmluZ0lmTnVsbChTdHJpbmcgcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRTY2FuTmVlZGVkKFNjaGVtYVRvUHJvY2VzcyBzdHApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc2Nhbm5lZEFscmVhZHkuY29udGFpbnMoc3RwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzY2FubmVkQWxyZWFkeS5hZGQoc3RwKTsKLSAgICAgICAgICAgICAgICBzY2FuTmVlZGVkLmFkZChzdHApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZEVtcHR5TmFtZXNwYWNlU2NoZW1hKFNjaGVtYSBzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbXB0eU5hbWVzcGFjZVNjaGVtYXMuYWRkKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVzZWRFbXB0eU5hbWVzcGFjZVNjaGVtYShTY2hlbWEgcykKLSAgICAgICAgewotICAgICAgICAgICAgZW1wdHlOYW1lc3BhY2VTY2hlbWFzLnJlbW92ZShzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBmZXRjaFJlbWFpbmluZ0VtcHR5TmFtZXNwYWNlU2NoZW1hcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbXB0eU5hbWVzcGFjZVNjaGVtYXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZW1wdHlOYW1lc3BhY2VTY2hlbWFzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3Moc2NoZW1hLCBudWxsLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtcHR5TmFtZXNwYWNlU2NoZW1hcy5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmV4dFRvU2NhbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhc2Nhbk5lZWRlZC5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFNjaGVtYVRvUHJvY2VzcyBuZXh0VG9TY2FuKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVG9Qcm9jZXNzIG5leHQgPSAoU2NoZW1hVG9Qcm9jZXNzKXNjYW5OZWVkZWQucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERvd25sb2FkVGFibGUoU2NoZW1hW10gc3RhcnRXaXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0V2l0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc3RhcnRXaXRoW2ldLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIE5zTG9jUGFpciBrZXkgPSBuZXcgTnNMb2NQYWlyKHRhcmdldE5hbWVzcGFjZSwgYmFzZVVSTEZvckRvYyhzdGFydFdpdGhbaV0pKTsKLSAgICAgICAgICAgICAgICBhZGRTdWNjZXNzZnVsRG93bmxvYWQoa2V5LCBzdGFydFdpdGhbaV0pOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKHN0YXJ0V2l0aFtpXSwgbnVsbCwgbnVsbCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYWRkRW1wdHlOYW1lc3BhY2VTY2hlbWEoc3RhcnRXaXRoW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTY2hlbWFUb1Byb2Nlc3NbXSByZXNvbHZlSW1wb3J0c0FuZEluY2x1ZGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIC8vIGFsZ29yaXRobSBpcyB0byBzY2FuIHRocm91Z2ggZWFjaCBzY2hlbWEgZG9jdW1lbnQgYW5kCi0gICAgICAgICAgICAvLyAxLiBkb3dubG9hZCBlYWNoIGltcG9ydCBhbmQgaW5jbHVkZSAoaWYgbm90IGFscmVhZHkgZG93bmxvYWRlZCkKLSAgICAgICAgICAgIC8vIDIuIHF1ZXVlIGVhY2ggaW1wb3J0ZWQgb3IgaW5jbHVkZWQgc2NoZW1hIHRvIGJlIHByb2Nlc3MgKGlmIG5vdCBhbHJlYWR5IHF1ZXVlZCkKLQotICAgICAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBpcyBydW4gdHdpY2UgdHdpY2U6IGZpcnN0IHdlIGJlZ2luIHdpdGggbm9uLWVtcHR5Ci0gICAgICAgICAgICAvLyBuYW1lc3BhY2Ugc2NoZW1hcyBvbmx5LiAgVGhlbiB3ZSByZXBlYXQgc3RhcnRpbmcgd2l0aCBhbnkKLSAgICAgICAgICAgIC8vIGVtcHR5IGVtcHR5LW5hbWVzcGFjZSBzY2hlbWFzIHRoYXQgaGF2ZSBOT1QgYmVlbiBjaGFtZWxlb24tCi0gICAgICAgICAgICAvLyBpbmNsdWRlZCBieSBvdGhlciBzY2hlbWFzIGFuZCBwcm9jZXNzIHRoZW0uCi0KLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGhhc05leHRUb1NjYW4oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVRvUHJvY2VzcyBzdHAgPSBuZXh0VG9TY2FuKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmFkZFNvdXJjZVVyaShzdHAuZ2V0U291cmNlTmFtZSgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzdHApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGltcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydFtdIGltcG9ydHMgPSBzdHAuZ2V0U2NoZW1hKCkuZ2V0SW1wb3J0QXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWEgaW1wb3J0ZWQgPSBkb3dubG9hZFNjaGVtYShpbXBvcnRzW2ldLCBlbXB0eVN0cmluZ0lmTnVsbChpbXBvcnRzW2ldLmdldE5hbWVzcGFjZSgpKSwgaW1wb3J0c1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb3dubG9hZCBmYWlscywgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFudWxsYWJsZVN0cmluZ3NNYXRjaChpbXBvcnRlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgaW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkltcG9ydGVkIHNjaGVtYSBoYXMgYSB0YXJnZXQgbmFtZXNwYWNlIFwiIiArIGltcG9ydGVkLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIlwiIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBcIiIgKyBpbXBvcnRzW2ldLmdldE5hbWVzcGFjZSgpICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0Lk1JU01BVENIRURfVEFSR0VUX05BTUVTUEFDRSwgaW1wb3J0c1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhpbXBvcnRlZCwgbnVsbCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGluY2x1ZGVzCi0gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlW10gaW5jbHVkZXMgPSBzdHAuZ2V0U2NoZW1hKCkuZ2V0SW5jbHVkZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlTmFtZXNwYWNlID0gc3RwLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzcGFjZSA9IGVtcHR5U3RyaW5nSWZOdWxsKHN0cC5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYSBpbmNsdWRlZCA9IGRvd25sb2FkU2NoZW1hKGluY2x1ZGVzW2ldLCBudWxsLCBpbmNsdWRlc1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb3dubG9hZCBmYWlscywgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5U3RyaW5nSWZOdWxsKGluY2x1ZGVkLmdldFRhcmdldE5hbWVzcGFjZSgpKS5lcXVhbHMoc291cmNlTmFtZXNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1jaGFtZWxlb24gY2FzZSAtIGp1c3QgbGlrZSBhbiBpbXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKGluY2x1ZGVkLCBudWxsLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluY2x1ZGVkLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsIGluY2x1ZGU6IGluY2x1ZGVkIHNjaGVtYSBpbiB3cm9uZyBuYW1lc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW5jbHVkZWQgc2NoZW1hIGhhcyBhIHRhcmdldCBuYW1lc3BhY2UgXCIiICsgaW5jbHVkZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgKyAiXCIgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgc291cmNlIG5hbWVzcGFjZSBcIiIgKyBzb3VyY2VOYW1lc3BhY2UgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuTUlTTUFUQ0hFRF9UQVJHRVRfTkFNRVNQQUNFLCBpbmNsdWRlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW1lbGVvbiBpbmNsdWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhpbmNsdWRlZCwgc291cmNlTmFtZXNwYWNlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRFbXB0eU5hbWVzcGFjZVNjaGVtYShpbmNsdWRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgcmVkZWZpbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWRlZmluZVtdIHJlZGVmaW5lcyA9IHN0cC5nZXRTY2hlbWEoKS5nZXRSZWRlZmluZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlTmFtZXNwYWNlID0gc3RwLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzcGFjZSA9IGVtcHR5U3RyaW5nSWZOdWxsKHN0cC5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZGVmaW5lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWEgcmVkZWZpbmVkID0gZG93bmxvYWRTY2hlbWEocmVkZWZpbmVzW2ldLCBudWxsLCByZWRlZmluZXNbaV0uZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZG93bmxvYWQgZmFpbHMsIGFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5lZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHlTdHJpbmdJZk51bGwocmVkZWZpbmVkLmdldFRhcmdldE5hbWVzcGFjZSgpKS5lcXVhbHMoc291cmNlTmFtZXNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1jaGFtZWxlb24gY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3MocmVkZWZpbmVkLCBudWxsLCByZWRlZmluZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVkZWZpbmVkLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsIGluY2x1ZGU6IGluY2x1ZGVkIHNjaGVtYSBpbiB3cm9uZyBuYW1lc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiUmVkZWZpbmVkIHNjaGVtYSBoYXMgYSB0YXJnZXQgbmFtZXNwYWNlIFwiIiArIHJlZGVmaW5lZC5nZXRUYXJnZXROYW1lc3BhY2UoKSArICJcIiB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBzb3VyY2UgbmFtZXNwYWNlIFwiIiArIHNvdXJjZU5hbWVzcGFjZSArICJcIiIsIFhtbEVycm9yQ29udGV4dC5NSVNNQVRDSEVEX1RBUkdFVF9OQU1FU1BBQ0UsIHJlZGVmaW5lc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW1lbGVvbiByZWRlZmluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3MocmVkZWZpbmVkLCBzb3VyY2VOYW1lc3BhY2UsIHJlZGVmaW5lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkRW1wdHlOYW1lc3BhY2VTY2hlbWEocmVkZWZpbmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWZldGNoUmVtYWluaW5nRW1wdHlOYW1lc3BhY2VTY2hlbWFzKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVRvUHJvY2Vzc1tdKXJlc3VsdC50b0FycmF5KG5ldyBTY2hlbWFUb1Byb2Nlc3NbcmVzdWx0LnNpemUoKV0pOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSmF2YWl6ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NKYXZhaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzg5YjI5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NKYXZhaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXRCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFN0c2NKYXZhaXplcgotewotICAgIC8qKgotICAgICAqIERvZXMgYSB0b3BvIHdhbGsgb2YgYWxsIHRoZSB0eXBlcyB0byByZXNvbHZlIHRoZW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGphdmFpemVBbGxUeXBlcyhib29sZWFuIGphdmFpemUpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICAvLyBGaXJzdCBkaXN0cmlidXRlIHRoZSBnbG9iYWwgbmFtZXMgYW1vbmcgdGhlIHRvcCBlbnRpdGllcy4KLSAgICAgICAgaWYgKGphdmFpemUpCi0gICAgICAgICAgICBhc3NpZ25HbG9iYWxKYXZhTmFtZXMoYWxsU2VlblR5cGVzKTsKLQotICAgICAgICAvLyBub3cgZnVsbHkgamF2YWl6ZSBldmVyeXRoaW5nIGRlZXBseS4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGphdmFpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgamF2YWl6ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ1R5cGUuZ2V0RnVsbEphdmFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hZGRDbGFzc25hbWUoY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpLCBnVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2tpcEphdmFpemluZ1R5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKLSAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhc3NpZ25HbG9iYWxKYXZhTmFtZXMoQ29sbGVjdGlvbiBzY2hlbWFUeXBlcykKLSAgICB7Ci0gICAgICAgIEhhc2hTZXQgdXNlZE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsID0gKFNjaGVtYVR5cGVJbXBsKWkubmV4dCgpOwotICAgICAgICAgICAgUU5hbWUgdG9wTmFtZSA9IGZpbmRUb3BOYW1lKHNJbXBsKTsKLSAgICAgICAgICAgIFN0cmluZyBwaWNrZWROYW1lID0gc3RhdGUuZ2V0SmF2YW5hbWUodG9wTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNVbmphdmFpemVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RnVsbEphdmFOYW1lKHBpY2tGdWxsSmF2YUNsYXNzTmFtZSh1c2VkTmFtZXMsIGZpbmRUb3BOYW1lKHNJbXBsKSwgcGlja2VkTmFtZSwgc0ltcGwuaXNEb2N1bWVudFR5cGUoKSwgc0ltcGwuaXNBdHRyaWJ1dGVUeXBlKCkpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRGdWxsSmF2YUltcGxOYW1lKHBpY2tGdWxsSmF2YUltcGxOYW1lKHVzZWROYW1lcywgc0ltcGwuZ2V0RnVsbEphdmFOYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdHJpbmdUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfU1RSSU5HKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tDb25zdGFudE5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIHdvcmRzKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGJhc2UgPSBOYW1lVXRpbC51cHBlckNhc2VVbmRlcmJhcih3b3Jkcyk7Ci0KLSAgICAgICAgaWYgKGJhc2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9ICJYIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlLnN0YXJ0c1dpdGgoIklOVF8iKSkgLy8gcmVzZXJ2ZWQgZm9yIGludCBjb2RlcwotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gIlhfIiArIGJhc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdW5pcU5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGZvciAodW5pcU5hbWUgPSBiYXNlOyB1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2UgKyAiXyIgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUpOwotCi0gICAgICAgIHJldHVybiB1bmlxTmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBza2lwSmF2YWl6aW5nVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChzSW1wbC5pc0phdmFpemVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBTY2hlbWFUeXBlSW1wbCBiYXNlVHlwZSA9IChTY2hlbWFUeXBlSW1wbClzSW1wbC5nZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHNraXBKYXZhaXppbmdUeXBlKGJhc2VUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIHNJbXBsLnN0YXJ0SmF2YWl6aW5nKCk7Ci0gICAgICAgIHNlY29uZFBhc3NQcm9jZXNzVHlwZShzSW1wbCk7Ci0gICAgICAgIHNJbXBsLmZpbmlzaEphdmFpemluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlY29uZFBhc3NQcm9jZXNzVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChpc1N0cmluZ1R5cGUoc0ltcGwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gZW51bVZhbHMgPSBzSW1wbC5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGVudW1lcmF0ZWQgc3RyaW5nIHR5cGUsIHZhbHVlcyBhcmUgdG8gYmUKLSAgICAgICAgICAgIC8vIGphdmFpemVkIGFzIGNvbnN0YW50cy4KLSAgICAgICAgICAgIGlmIChlbnVtVmFscyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGVudHJ5QXJyYXkgPSBuZXcgU2NoZW1hU3RyaW5nRW51bUVudHJ5W2VudW1WYWxzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBiYXNlZE9uID0gc0ltcGwuZ2V0QmFzZUVudW1UeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VkT24gPT0gc0ltcGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXQgdXNlZE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGVudW1WYWxzW2ldLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5QXJyYXlbaV0gPSBuZXcgU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbCh2YWwsIGkgKyAxLCBwaWNrQ29uc3RhbnROYW1lKHVzZWROYW1lcywgdmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGVudW1WYWxzW2ldLmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUFycmF5W2ldID0gYmFzZWRPbi5lbnVtRW50cnlGb3JTdHJpbmcodmFsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRTdHJpbmdFbnVtRW50cmllcyhlbnRyeUFycmF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGphdmFpemVUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgaWYgKHNJbXBsLmlzSmF2YWl6ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTY2hlbWFUeXBlSW1wbCBiYXNlVHlwZSA9IChTY2hlbWFUeXBlSW1wbClzSW1wbC5nZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGphdmFpemVUeXBlKGJhc2VUeXBlKTsKLQotICAgICAgICBzSW1wbC5zdGFydEphdmFpemluZygpOwotCi0gICAgICAgIHNJbXBsLnNldENvbXBpbGVkKHRydWUpOwotCi0gICAgICAgIHNlY29uZFBhc3NQcm9jZXNzVHlwZShzSW1wbCk7Ci0KLSAgICAgICAgaWYgKCFzSW1wbC5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wcyA9IHNJbXBsLmdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGF0dHJQcm9wcyA9IHNJbXBsLmdldEF0dHJpYnV0ZVByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgLy8gZWxlbWVudCBzZXR0ZXJzIHJlc3VsdCBmcm9tIGEgY29tcHV0YXRpb24KLSAgICAgICAgICAgIGlmIChlbHRQcm9wcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgIGFzc2lnbkphdmFFbGVtZW50U2V0dGVyTW9kZWwoZWx0UHJvcHMsIHNJbXBsLmdldENvbnRlbnRNb2RlbCgpKTsKLQotICAgICAgICAgICAgLy8gSGFuZGluZyBvdXQgamF2YSBuYW1lcyAtIHRoaXMgcGVybWl0cyB1cyB0byBhdm9pZCBjb2xsaXNpb25zLgotICAgICAgICAgICAgU2V0IHVzZWRQcm9wTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgICAgICAvLyBBc3NpZ24gbmFtZXMgaW4gdHdvIHBhc3NlczogZmlyc3QgaW5oZXJpdGVkIG5hbWVzLCB0aGVuIG90aGVycy4KLSAgICAgICAgICAgIGZvciAoYm9vbGVhbiBkb0luaGVyaXRlZCA9IHRydWU7IDsgZG9Jbmhlcml0ZWQgPSBmYWxzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZWx0UHJvcHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgYXNzaWduSmF2YVByb3BlcnR5TmFtZXModXNlZFByb3BOYW1lcywgZWx0UHJvcHMsIGJhc2VUeXBlLCBkb0luaGVyaXRlZCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NpZ25KYXZhUHJvcGVydHlOYW1lcyh1c2VkUHJvcE5hbWVzLCBhdHRyUHJvcHMsIGJhc2VUeXBlLCBkb0luaGVyaXRlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9Jbmhlcml0ZWQgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGFsbHByb3BzID0gc0ltcGwuZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBvcmRlciBpbnNlbnNpdGl2ZQotICAgICAgICAgICAgYm9vbGVhbiBpbnNlbnNpdGl2ZSA9IGlzUHJvcGVydHlNb2RlbE9yZGVySW5zZW5zaXRpdmUoYWxscHJvcHMpOwotCi0gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBqYXZhIHR5cGUgY29kZXMgbm93LgotICAgICAgICAgICAgLy8gVGhpcyBkZXBlbmRzIG9uIHJlY3Vyc2l2ZSB0eXBlIGluZm9ybWF0aW9uLCBzbyBpdCdzIGRvbmUgaW4gdHlwZWNoZWNraW5nCi0gICAgICAgICAgICBhc3NpZ25KYXZhVHlwZUNvZGVzKGFsbHByb3BzKTsKLQotICAgICAgICAgICAgc0ltcGwuc2V0T3JkZXJTZW5zaXRpdmUoIWluc2Vuc2l0aXZlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFzc2lnbiBqYXZhIHR5cGUgbmFtZXMgdG8gYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIGFzc2lnbkphdmFBbm9ueW1vdXNUeXBlTmFtZXMoc0ltcGwpOwotCi0gICAgICAgIHNJbXBsLmZpbmlzaEphdmFpemluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2lnbkphdmFBbm9ueW1vdXNUeXBlTmFtZXMoU2NoZW1hVHlwZUltcGwgb3V0ZXJUeXBlKQotICAgIHsKLSAgICAgICAgU2V0IHVzZWRUeXBlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTY2hlbWFUeXBlW10gYW5vbnltb3VzVHlwZXMgPSBvdXRlclR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIC8vIEJlY2F1c2Ugd2UgZ2VuZXJhdGUgbmVzdGVkIGphdmEgaW50ZXJmYWNlcywgYW5kIG5lc3RlZAotICAgICAgICAvLyBpbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgYmUgdGhlIHNhbWUgYXMgYW4gYW5jZXN0b3IsIHVzZSB1cAotICAgICAgICAvLyB0aGUgYW5jZXN0b3JzCi0KLSAgICAgICAgZm9yICggU2NoZW1hVHlwZSBzY2FuT3V0ZXJUeXBlID0gb3V0ZXJUeXBlIDsKLSAgICAgICAgICAgICAgc2Nhbk91dGVyVHlwZSAhPSBudWxsIDsKLSAgICAgICAgICAgICAgc2Nhbk91dGVyVHlwZSA9IHNjYW5PdXRlclR5cGUuZ2V0T3V0ZXJUeXBlKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2VkVHlwZU5hbWVzLmFkZCggc2Nhbk91dGVyVHlwZS5nZXRTaG9ydEphdmFOYW1lKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIFNjaGVtYVR5cGUgc2Nhbk91dGVyVHlwZSA9IG91dGVyVHlwZSA7Ci0gICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgIT0gbnVsbCA7Ci0gICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgPSBzY2FuT3V0ZXJUeXBlLmdldE91dGVyVHlwZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdXNlZFR5cGVOYW1lcy5hZGQoIHNjYW5PdXRlclR5cGUuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYW5kIGJlY2F1c2UgdGhpbmdzIGFyZSBwcm9ibGVtYXRpYyBpZiBhbiBpbm5lciB0eXBlIG5hbWUKLSAgICAgICAgLy8gaXMgdGhlIHNhbWUgYXMgYSB0b3AtbGV2ZWwgcGFja2FnZSBuYW1lLCBhbHNvIGdldCByaWQgb2YgdGhhdAotICAgICAgICAvLyBjb2xsaXNpb24KLSAgICAgICAgdXNlZFR5cGVOYW1lcy5hZGQoZ2V0T3V0ZXJtb3N0UGFja2FnZShvdXRlclR5cGUuZ2V0RnVsbEphdmFOYW1lKCkpKTsKLQotICAgICAgICAvLyBhc3NpZ24gbmFtZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9ueW1vdXNUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgc0ltcGwgPSAoU2NoZW1hVHlwZUltcGwpYW5vbnltb3VzVHlwZXNbaV07Ci0gICAgICAgICAgICBpZiAoc0ltcGwgPT0gbnVsbCkgLy8gYWxyZWFkeSBoYW5kbGVkIGluIGZpcnN0IHBhc3MKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChzSW1wbC5pc1NraXBwZWRBbm9ueW1vdXNUeXBlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIFNjaGVtYUZpZWxkIGNvbnRhaW5lckZpZWxkID0gc0ltcGwuZ2V0Q29udGFpbmVyRmllbGQoKTsKLSAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gc0ltcGwuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgbG9jYWxuYW1lID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgamF2YW5hbWUgPSBzdGF0ZS5nZXRKYXZhbmFtZShzSW1wbC5nZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbm90IGRlZmluZWQgaW5zaWRlIGFuIEVsdCBvciBBdHRyOiBtdXN0IGJlIGEgbmVzdGVkIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRPdXRlclR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJNZW1iZXIiOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJJdGVtIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogIldlaXJkIHR5cGUgIiArIHNJbXBsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJCYXNlIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc0ltcGwuc2V0U2hvcnRKYXZhTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcGlja0lubmVySmF2YUNsYXNzTmFtZSh1c2VkVHlwZU5hbWVzLCBsb2NhbG5hbWUsIGphdmFuYW1lKSk7Ci0gICAgICAgICAgICBzSW1wbC5zZXRTaG9ydEphdmFJbXBsTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcGlja0lubmVySmF2YUltcGxOYW1lKHVzZWRUeXBlTmFtZXMsIGxvY2FsbmFtZSwgamF2YW5hbWUgPT0gbnVsbCA/IG51bGwgOiBqYXZhbmFtZSArICJJbXBsIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBjb21wdXRlIHRoZSBzZXR0ZXIgbW9kZWwuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIFFOYW1lcyBvZiBlbGVtZW50cyB0aGF0IGNvdWxkIHBvc3NpYmx5IGJlCi0gICAgICogY29udGFpbmVkIGluIHRoZSBnaXZlbiBjb250ZW50TW9kZWwuIFRoZSBzdGF0ZSB2YXJpYWJsZSBpcyB1c2VkCi0gICAgICogdG8gcmVjb3JkIHRoZSByZXN1bHRzLCBzbyB0aGF0IGlmIHRoZXkgYXJlIG5lZWRlZCBhZ2FpbiBsYXRlciwKLSAgICAgKiB0aGV5IGRvIG5vdCBuZWVkIHRvIGJlIHJlY29tcHV0ZWQuCi0gICAgICovCi0gICAgc3RhdGljIFFOYW1lU2V0IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwsIE1hcCBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIC8vIFJlbWVtYmVyIHByZXZpb3VzbHkgY29tcHV0ZWQgcmVzdWx0cyB0byBhdm9pZCBjb21wbGV4aXR5IGV4cGxvc2lvbgotICAgICAgICBRTmFtZVNldCByZXN1bHQgPSAoUU5hbWVTZXQpc3RhdGUuZ2V0KGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gYnVpbGRlci50b1FOYW1lU2V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udGVudE1vZGVsLmdldFdpbGRjYXJkU2V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBRTmFtZVNldC5zaW5nbGV0b24oY29udGVudE1vZGVsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUucHV0KGNvbnRlbnRNb2RlbCwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGNvbXB1dGUgc2V0dGVyIG1vZGVsLgotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgUU5hbWVTZXQgb2YgYWxsIGVsZW1lbnRzIHRoYXQgY2FuIHBvc3NpYmx5IGNvbWUgYmVmb3JlIGFuCi0gICAgICogZWxlbWVudCB3aG9zZSBuYW1lIGlzIGdpdmVuIGJ5IHRoZSB0YXJnZXQgaW4gYSB2YWxpZCBpbnN0YW5jZSBvZiB0aGUKLSAgICAgKiBjb250ZW50TW9kZWwuICBXaGVuIGFwcGVuZGluZyBhbiBlbGVtZW50LCBpdCBjb21lcyBiZWZvcmUgdGhlIGZpcnN0Ci0gICAgICogb25lIHRoYXQgaXMgbm90IGluIHRoaXMgc2V0LgotICAgICAqLwotICAgIHN0YXRpYyBRTmFtZVNldCBjb21wdXRlTm9uZGVsaW1pdGluZ0VsZW1lbnRzKFFOYW1lIHRhcmdldCwgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsLCBNYXAgc3RhdGUpCi0gICAgewotICAgICAgICBRTmFtZVNldCBhbGxDb250ZW50cyA9IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwsIHN0YXRlKTsKLSAgICAgICAgaWYgKCFhbGxDb250ZW50cy5jb250YWlucyh0YXJnZXQpKQotICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LkVNUFRZOwotCi0gICAgICAgIC8vIElmIGl0ZXJhdGVkLCB0aGVuIGFsbCBjb250ZW50cyBhcmUgZGVsaW1pdGluZy4KLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbC5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudHM7Ci0KLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudHM7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LnNpbmdsZXRvbih0YXJnZXQpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0IGNoaWxkQ29udGVudHMgPSBjb21wdXRlQWxsQ29udGFpbmVkRWxlbWVudHMoY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSksIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkQ29udGVudHMuY29udGFpbnModGFyZ2V0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVOb25kZWxpbWl0aW5nRWxlbWVudHModGFyZ2V0LCBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9RTmFtZVNldCgpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWVuVGFyZ2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpID4gMDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCBjaGlsZENvbnRlbnRzID0gY29tcHV0ZUFsbENvbnRhaW5lZEVsZW1lbnRzKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkKGkpLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWVuVGFyZ2V0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbChjaGlsZENvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGlsZENvbnRlbnRzLmNvbnRhaW5zKHRhcmdldCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVOb25kZWxpbWl0aW5nRWxlbWVudHModGFyZ2V0LCBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5UYXJnZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvUU5hbWVTZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2lnbkphdmFFbGVtZW50U2V0dGVyTW9kZWwoU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wcywgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQotICAgIHsKLSAgICAgICAgLy8gVG8gY29tcHV0ZSB0aGUgZWxlbWVudCBzZXR0ZXIgbW9kZWwsIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUKLSAgICAgICAgLy8gZGVsaW1pdGluZyBlbGVtZW50cyBmb3IgZWFjaCBlbGVtZW50LgotCi0gICAgICAgIE1hcCBzdGF0ZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFFOYW1lU2V0IGFsbENvbnRlbnRzID0gY29tcHV0ZUFsbENvbnRhaW5lZEVsZW1lbnRzKGNvbnRlbnRNb2RlbCwgc3RhdGUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWx0UHJvcHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzSW1wbCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpZWx0UHJvcHNbaV07Ci0gICAgICAgICAgICBRTmFtZVNldCBuZGUgPSBjb21wdXRlTm9uZGVsaW1pdGluZ0VsZW1lbnRzKHNJbXBsLmdldE5hbWUoKSwgY29udGVudE1vZGVsLCBzdGF0ZSk7Ci0gICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoYWxsQ29udGVudHMpOwotICAgICAgICAgICAgYnVpbGRlci5yZW1vdmVBbGwobmRlKTsKLSAgICAgICAgICAgIHNJbXBsLnNldEphdmFTZXR0ZXJEZWxpbWl0ZXIoYnVpbGRlci50b1FOYW1lU2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgYXNzaWduSmF2YVByb3BlcnR5TmFtZXMoU2V0IHVzZWROYW1lcywgU2NoZW1hUHJvcGVydHlbXSBwcm9wcywgU2NoZW1hVHlwZSBiYXNlVHlwZSwgYm9vbGVhbiBkb0luaGVyaXRlZCkKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICAvLyB0d28gcGFzc2VzOiBmaXJzdCBkZWFsIHdpdGggaW5oZXJpdGVkIHByb3BlcnRpZXMsIHRoZW4gd2l0aCBuZXcgb25lcy4KLSAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgd2UgbWF0Y2ggdXAgd2l0aCBiYXNlIGNsYXNzIGRlZmluaXRpb25zIGNsZWFubHkKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc0ltcGwgPSAoU2NoZW1hUHJvcGVydHlJbXBsKXByb3BzW2ldOwotCi0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBiYXNlUHJvcCA9Ci0gICAgICAgICAgICAgICAoc0ltcGwuaXNBdHRyaWJ1dGUoKSA/Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VUeXBlLmdldEF0dHJpYnV0ZVByb3BlcnR5KHNJbXBsLmdldE5hbWUoKSkgOgotICAgICAgICAgICAgICAgICAgICBiYXNlVHlwZS5nZXRFbGVtZW50UHJvcGVydHkoc0ltcGwuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGlmICgoYmFzZVByb3AgIT0gbnVsbCkgIT0gZG9Jbmhlcml0ZWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFFOYW1lIHByb3BRTmFtZSA9IHNJbXBsLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWU7Ci0KLSAgICAgICAgICAgIGlmIChiYXNlUHJvcCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoZU5hbWUgPSBwaWNrSmF2YVByb3BlcnR5TmFtZSh1c2VkTmFtZXMsIHByb3BRTmFtZS5nZXRMb2NhbFBhcnQoKSwgc3RhdGUuZ2V0SmF2YW5hbWUocHJvcFFOYW1lKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlTmFtZSA9IGJhc2VQcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoIXVzZWROYW1lcy5jb250YWlucyh0aGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgdXNlZE5hbWVzLmFkZCh0aGVOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc0ltcGwuc2V0SmF2YVByb3BlcnR5TmFtZSh0aGVOYW1lKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0gKHNJbXBsLmdldE1heE9jY3VycygpID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICBzSW1wbC5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzU2luZ2xldG9uID0gIWlzQXJyYXkgJiYgKHNJbXBsLmdldE1heE9jY3VycygpLnNpZ251bSgpID4gMCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzT3B0aW9uID0gaXNTaW5nbGV0b24gJiYgKHNJbXBsLmdldE1pbk9jY3VycygpLnNpZ251bSgpID09IDApOwotICAgICAgICAgICAgU2NoZW1hVHlwZSBqYXZhQmFzZWRPblR5cGUgPSBzSW1wbC5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmIChiYXNlUHJvcCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiYXNlUHJvcC5leHRlbmRzSmF2YUFycmF5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpc1NpbmdsZXRvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpc09wdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpc0FycmF5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VQcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpc1NpbmdsZXRvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiYXNlUHJvcC5leHRlbmRzSmF2YU9wdGlvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNPcHRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhQmFzZWRPblR5cGUgPSBiYXNlUHJvcC5qYXZhQmFzZWRPblR5cGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc0ltcGwuc2V0RXh0ZW5kc0phdmEoamF2YUJhc2VkT25UeXBlLmdldFJlZigpLCBpc1NpbmdsZXRvbiwgaXNPcHRpb24sIGlzQXJyYXkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhc3NpZ25KYXZhVHlwZUNvZGVzKFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNJbXBsID0gKFNjaGVtYVByb3BlcnR5SW1wbClwcm9wZXJ0aWVzW2ldOwotICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNJbXBsLmphdmFCYXNlZE9uVHlwZSgpOwotICAgICAgICAgICAgc0ltcGwuc2V0SmF2YVR5cGVDb2RlKGphdmFUeXBlQ29kZUZvclR5cGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgamF2YVR5cGVDb2RlSW5Db21tb24oU2NoZW1hVHlwZVtdIHR5cGVzKQotICAgIHsKLSAgICAgICAgaWYgKHR5cGVzID09IG51bGwgfHwgdHlwZXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKLQotICAgICAgICBpbnQgY29kZSA9IGphdmFUeXBlQ29kZUZvclR5cGUodHlwZXNbMF0pOwotICAgICAgICBpZiAoY29kZSA9PSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVCkKLSAgICAgICAgICAgIHJldHVybiBjb2RlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBhbnkgdHdvIGFyZSBkaWZmZXJlbnQsIHRoZSBhbnN3ZXIgaXMgamF2YS5sYW5nLk9iamVjdAotICAgICAgICAgICAgaWYgKGNvZGUgIT0gamF2YVR5cGVDb2RlRm9yVHlwZSh0eXBlc1tpXSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb2RlOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgamF2YVR5cGVDb2RlRm9yVHlwZShTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKCFzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOwotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGFuIGludGVyZXN0aW5nIGNvbW1vbiBiYXNlIHR5cGUsIGUuZy4sIGZvciBzdHJpbmcgZW51bXMKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBzVHlwZS5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuaXNVUlR5cGUoKSkKLSAgICAgICAgICAgICAgICBzVHlwZSA9IGJhc2VUeXBlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhVHlwZUNvZGVJbkNvbW1vbihzVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmlzVVJUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKLQotICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOwotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU47Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0RGVjaW1hbFNpemUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JZVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nVHlwZShzVHlwZS5nZXRCYXNlRW51bVR5cGUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURTsgLy8gY29udmVydGVkIHRvIGNhbGVuZGFyCi0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURTsgLy8gY29udmVydGVkIHRvIGNhbGVuZGFyIChKQVgtQikKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogInVucmVjb2duaXplZCBjb2RlICIgKyBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5yZWNvZ25pemVkIGNvZGUgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSArICIgb2YgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNQcm9wZXJ0eU1vZGVsT3JkZXJJbnNlbnNpdGl2ZShTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBwcm9wZXJ0aWVzW2ldOwotICAgICAgICAgICAgaWYgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgIT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgJiYKLSAgICAgICAgICAgICAgICBwcm9wLmdldERlZmF1bHRUZXh0KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gcHJvdGVjdFJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lcyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBpID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgIGlmIChsYXN0U2VnbWVudC5lbmRzV2l0aCgiRG9jdW1lbnQiKSAmJiAhbGFzdFNlZ21lbnQuZXF1YWxzKCJEb2N1bWVudCIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBwcm90ZWN0UmVzZXJ2ZWRJbm5lckNsYXNzTmFtZXMoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKG5hbWUuZXF1YWxzKCJFbnVtIikgfHwgbmFtZS5lcXVhbHMoIkZhY3RvcnkiKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIFBST1RFQ1RFRF9QUk9QRVJUSUVTID0gewotICAgICAgICAiU3RyaW5nVmFsdWUiLAotICAgICAgICAiQm9vbGVhblZhbHVlIiwKLSAgICAgICAgIkJ5dGVWYWx1ZSIsCi0gICAgICAgICJTaG9ydFZhbHVlIiwKLSAgICAgICAgIkludFZhbHVlIiwKLSAgICAgICAgIkxvbmdWYWx1ZSIsCi0gICAgICAgICJCaWdJbnRlZ2VyVmFsdWUiLAotICAgICAgICAiQmlnRGVjaW1hbFZhbHVlIiwKLSAgICAgICAgIkZsb2F0VmFsdWUiLAotICAgICAgICAiRG91YmxlVmFsdWUiLAotICAgICAgICAiQnl0ZUFycmF5VmFsdWUiLAotICAgICAgICAiRW51bVZhbHVlIiwKLSAgICAgICAgIkNhbGVuZGFyVmFsdWUiLAotICAgICAgICAiRGF0ZVZhbHVlIiwKLSAgICAgICAgIkdEYXRlVmFsdWUiLAotICAgICAgICAiR0R1cmF0aW9uVmFsdWUiLAotICAgICAgICAiUU5hbWVWYWx1ZSIsCi0gICAgICAgICJMaXN0VmFsdWUiLAotICAgICAgICAiT2JqZWN0VmFsdWUiLAotICAgICAgICAiQ2xhc3MiLAotICAgIH07Ci0gICAgc3RhdGljIFNldCBQUk9URUNURURfUFJPUEVSVElFU19TRVQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KFBST1RFQ1RFRF9QUk9QRVJUSUVTKSk7Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBwcm90ZWN0UmVzZXJ2ZWRQcm9wZXJ0eU5hbWVzKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFBST1RFQ1RFRF9QUk9QRVJUSUVTX1NFVC5jb250YWlucyhuYW1lKSB8fAotICAgICAgICAgICAgKG5hbWUuZW5kc1dpdGgoIkFycmF5IikgJiYgIW5hbWUuZXF1YWxzKCJBcnJheSIpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tGdWxsSmF2YUNsYXNzTmFtZShTZXQgdXNlZE5hbWVzLCBRTmFtZSBxTmFtZSwgU3RyaW5nIGNvbmZpZ25hbWUsIGJvb2xlYW4gaXNEb2N1bWVudCwgYm9vbGVhbiBpc0F0dHJUeXBlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGJhc2U7Ci0gICAgICAgIGJvb2xlYW4gcHJvdGVjdDsKLQotICAgICAgICBpZiAoY29uZmlnbmFtZSAhPSBudWxsICYmIGNvbmZpZ25hbWUuaW5kZXhPZignLicpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGEgY29uZmlnbmFtZSB3aXRoIGRvdHMgZGVmaW5lcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZQotICAgICAgICAgICAgYmFzZSA9IGNvbmZpZ25hbWU7Ci0gICAgICAgICAgICBwcm90ZWN0ID0gcHJvdGVjdFJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lcyhiYXNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgYmFzZSA9IE5hbWVVdGlsLmdldENsYXNzTmFtZUZyb21RTmFtZShxTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgbWFwcGluZyBmcm9tIG5hbWVzcGFjZSBVUkkgdG8gSmF2YSBwYWNrYWdlCi0gICAgICAgICAgICAvLyBuYW1lLiBJZiBzbywgYXBwbHkgdGhlIG1hcHBlZCBwYWNrYWdlIHByZWZpeCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgICAgICAvLyB0aGUgYmFzZSBuYW1lCi0KLSAgICAgICAgICAgIFN0cmluZyBwa2dQcmVmaXggPSBzdGF0ZS5nZXRQYWNrYWdlT3ZlcnJpZGUodXJpKTsKLQotICAgICAgICAgICAgaWYgKHBrZ1ByZWZpeCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEZvcm0gdGhlIG5ldyBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmcm9tIHRoZSBuZXcgcGFja2FnZSBuYW1lCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBvbGQgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgIGJhc2UgPSBwa2dQcmVmaXggKyAiLiIgKyBiYXNlLnN1YnN0cmluZyhiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJlZml4Li4uCi0gICAgICAgICAgICBTdHJpbmcgamF2YVByZWZpeCA9IHN0YXRlLmdldEphdmFQcmVmaXgodXJpKTsKLSAgICAgICAgICAgIGlmIChqYXZhUHJlZml4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoJy4nKSArIDEpICsgamF2YVByZWZpeCArIGJhc2Uuc3Vic3RyaW5nKGJhc2UubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCi0gICAgICAgICAgICAvLyBhIGNvbmZpZ25hbWUgd2l0aG91dCBkb3RzIG1heSBvdmVycmlkZSB0aGUgc2hvcnRuYW1lIHBhcnQuCi0gICAgICAgICAgICBpZiAoY29uZmlnbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKSArIGNvbmZpZ25hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3RlY3QgPSBwcm90ZWN0UmVzZXJ2ZWRHbG9iYWxDbGFzc05hbWVzKGJhc2UpOwotICAgICAgICAgICAgaWYgKGNvbmZpZ25hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgc3BlY2lhbCBzdWZmaXgKLSAgICAgICAgICAgICAgICBpZiAoaXNEb2N1bWVudCkKLSAgICAgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgKyAiRG9jdW1lbnQiOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzQXR0clR5cGUpCi0gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlICsgIkF0dHJpYnV0ZSI7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgY29uZmlndXJlZCBzdWZmaXgKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVN1ZmZpeCA9IHN0YXRlLmdldEphdmFTdWZmaXgodXJpKTsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVN1ZmZpeCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArIGphdmFTdWZmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgb3V0ZXJtb3N0UGtnID0gZ2V0T3V0ZXJtb3N0UGFja2FnZShiYXNlKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWU7Ci0gICAgICAgIGlmIChwcm90ZWN0KQotICAgICAgICAgICAgdW5pcU5hbWUgPSBiYXNlICsgaW5kZXg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuaXFOYW1lID0gYmFzZTsKLSAgICAgICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh1bmlxTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCB1bmlxTmFtZS5lcXVhbHMob3V0ZXJtb3N0UGtnKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIHVuaXFOYW1lID0gYmFzZSArIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgdXNlZE5hbWVzLmFkZCh1bmlxTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQotICAgICAgICByZXR1cm4gdW5pcU5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZXRPdXRlcm1vc3RQYWNrYWdlKFN0cmluZyBmcWNuKQotICAgIHsKLSAgICAgICAgaWYgKGZxY24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgICAvLyByZW1vdmUgY2xhc3MgbmFtZQotICAgICAgICBpbnQgbGFzdGRvdCA9IGZxY24uaW5kZXhPZignLicpOwotICAgICAgICBpZiAobGFzdGRvdCA8IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIG91dGVyIHBhY2thZ2UgbmFtZXMKLSAgICAgICAgcmV0dXJuIGZxY24uc3Vic3RyaW5nKDAsIGxhc3Rkb3QpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcGlja0Z1bGxKYXZhSW1wbE5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGludGZOYW1lKQotICAgIHsKLSAgICAgICAgLy8gU3RyaXAgb2ZmIHRoZSBwYWNrYWdlIGZyb20gdGhlIGNsYXNzIG5hbWUgc28gd2UgY2FuIHJlcGxhY2UgaXQKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGludGZOYW1lOwotICAgICAgICBTdHJpbmcgcGtnTmFtZSA9IG51bGw7Ci0gICAgICAgIGludCBpbmRleCA9IGludGZOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBpbnRmTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgIHBrZ05hbWUgPSBpbnRmTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9ybSB0aGUgbmV3IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZyb20gdGhlIG5ldyBwYWNrYWdlIG5hbWUKLSAgICAgICAgLy8gYW5kIHRoZSBvbGQgY2xhc3MgbmFtZQotICAgICAgICBTdHJpbmcgYmFzZSA9IHBrZ05hbWUgKyAiLmltcGwuIiArIGNsYXNzTmFtZSArICJJbXBsIjsKLQotICAgICAgICBpbmRleCA9IDE7Ci0gICAgICAgIFN0cmluZyB1bmlxTmFtZSA9IGJhc2U7Ci0gICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUudG9Mb3dlckNhc2UoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2UgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHVuaXFOYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcGlja0phdmFQcm9wZXJ0eU5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIGphdmFOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKGphdmFOYW1lID09IG51bGwpCi0gICAgICAgICAgICBqYXZhTmFtZSA9IE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGxvY2FsTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gcHJvdGVjdCA9IHByb3RlY3RSZXNlcnZlZFByb3BlcnR5TmFtZXMoamF2YU5hbWUpOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGlmIChwcm90ZWN0KQotICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lOwotICAgICAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKHVuaXFOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWUgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUpOwotCi0gICAgICAgIHJldHVybiB1bmlxTmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tJbm5lckphdmFDbGFzc05hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIGphdmFOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKGphdmFOYW1lID09IG51bGwpCi0gICAgICAgICAgICBqYXZhTmFtZSA9IE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGxvY2FsTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gcHJvdGVjdCA9IHByb3RlY3RSZXNlcnZlZElubmVyQ2xhc3NOYW1lcyhqYXZhTmFtZSk7Ci0gICAgICAgIFN0cmluZyB1bmlxTmFtZTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaWYgKHByb3RlY3QpCi0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lICsgaW5kZXg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWU7Ci0gICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgdXNlZE5hbWVzLmFkZCh1bmlxTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHVuaXFOYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcGlja0lubmVySmF2YUltcGxOYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBqYXZhTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChqYXZhTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgamF2YU5hbWUgPSBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShsb2NhbE5hbWUpICsgIkltcGwiOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWUgPSBqYXZhTmFtZTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh1bmlxTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lICsgaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB1c2VkTmFtZXMuYWRkKHVuaXFOYW1lKTsKLQotICAgICAgICByZXR1cm4gdW5pcU5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIFFOYW1lIGZpbmRUb3BOYW1lKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gc1R5cGUuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBIGRvY3VtZW50IHR5cGUgbXVzdCBoYXZlIGEgY29udGVudCBtb2RlbCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIGVsdAotICAgICAgICAgICAgaWYgKHNUeXBlLmdldENvbnRlbnRNb2RlbCgpID09IG51bGwgfHwgc1R5cGUuZ2V0Q29udGVudE1vZGVsKCkuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gKHNUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpID09IG51bGwgfHwgc1R5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKS5nZXRBdHRyaWJ1dGVzKCkubGVuZ3RoICE9IDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFGaWVsZCBzRWx0ID0gc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKTsKLSAgICAgICAgYXNzZXJ0KHNFbHQgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydChzVHlwZS5nZXRPdXRlclR5cGUoKSA9PSBudWxsKTsKLSAgICAgICAgcmV0dXJuIHNFbHQuZ2V0TmFtZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2OGQ4Yi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsRWxlbWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsQXR0cmlidXRlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5LZXlyZWZEb2N1bWVudC5LZXlyZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFN0c2NSZXNvbHZlcgotewotICAgIC8qKgotICAgICAqIERvZXMgYSB0b3BvIHdhbGsgb2YgYWxsIHRoZSB0eXBlcyB0byByZXNvbHZlIHRoZW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVBbGwoKQotICAgIHsKLSAgICAgICAgLy8gcmVzb2x2ZSB0cmVlIG9mIHR5cGVzCi0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcyA9IHN0YXRlLmRvY3VtZW50VHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZG9jdW1lbnRUeXBlcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICByZXNvbHZlU3Vic3RpdHV0aW9uR3JvdXAoKFNjaGVtYVR5cGVJbXBsKWRvY3VtZW50VHlwZXNbaV0pOwotCi0gICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5hdHRyaWJ1dGVUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5yZWRlZmluZWRHbG9iYWxUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICAgICAgICAgICAgcmVzb2x2ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKLSAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXNvbHZlIGFsbCBrZXlyZWYgcmVmcwotICAgICAgICByZXNvbHZlSWRlbnRpdHlDb25zdHJhaW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXNvbHZlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChzSW1wbC5pc1Jlc29sdmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKHNJbXBsLmlzUmVzb2x2aW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZXJyb3IiLCBYbWxFcnJvckNvbnRleHQuQ1lDTElDX0RFUEVOREVOQ1ksIHNJbXBsLmdldFBhcnNlT2JqZWN0KCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjeWNsaWMgZGVwZW5kZW5jeSBlcnJvcgotICAgICAgICB9Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2aW5nICIgKyBzSW1wbCk7Ci0KLSAgICAgICAgc0ltcGwuc3RhcnRSZXNvbHZpbmcoKTsKLQotICAgICAgICBpZiAoc0ltcGwuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgIHJlc29sdmVEb2N1bWVudFR5cGUoc0ltcGwpOwotICAgICAgICBlbHNlIGlmIChzSW1wbC5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIHJlc29sdmVBdHRyaWJ1dGVUeXBlKHNJbXBsKTsKLSAgICAgICAgZWxzZSBpZiAoc0ltcGwuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVTaW1wbGVUeXBlKHNJbXBsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIucmVzb2x2ZUNvbXBsZXhUeXBlKHNJbXBsKTsKLQotICAgICAgICBzSW1wbC5maW5pc2hSZXNvbHZpbmcoKTsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCByZXNvbHZpbmcgIiArIHNJbXBsKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzSW1wbC5pc0RvY3VtZW50VHlwZSgpOwotCi0gICAgICAgIGlmIChzSW1wbC5pc1NHUmVzb2x2ZWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoc0ltcGwuaXNTR1Jlc29sdmluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkN5Y2xpYyBkZXBlbmRlbmN5IGVycm9yIiwgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBzSW1wbC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY3ljbGljIGRlcGVuZGVuY3kgZXJyb3IKLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnN0YXJ0UmVzb2x2aW5nU0dzKCk7Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSBzdWJzdGl0dXRpb24gZ3JvdXAKLQotICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWx0ID0gKFRvcExldmVsRWxlbWVudClzSW1wbC5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzdWJzdGl0dXRpb25Hcm91cCA9IG51bGw7Ci0gICAgICAgIFFOYW1lIGVsdE5hbWUgPSBuZXcgUU5hbWUoc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGVsdC5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIEJVRzogSG93IGRvIEkgdGVsbCBpZiB0aGUgdHlwZSBpcyBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQ/Ci0gICAgICAgIGlmIChlbHQuaXNTZXRTdWJzdGl0dXRpb25Hcm91cCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IFN0c2NTdGF0ZS5nZXQoKS5maW5kRG9jdW1lbnRUeXBlKGVsdC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCAKLSAgICAgICAgICAgICAgICBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cCA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5ub3RGb3VuZEVycm9yKGVsdC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9SRUZfTk9UX0ZPVU5ELCBlbHQueGdldFN1YnN0aXR1dGlvbkdyb3VwKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5IC0gaWdub3JlIHN1YnN0aXR1dGlvbiBncm91cAotICAgICAgICAgICAgZWxzZSBpZiAoISByZXNvbHZlU3Vic3RpdHV0aW9uR3JvdXAoc3Vic3RpdHV0aW9uR3JvdXApICkKLSAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc0ltcGwuc2V0U3Vic3RpdHV0aW9uR3JvdXAoZWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FsayB1cCB0aGUgY2hhaW4gb2Ygc3VidGl0dXRpb24gZ3JvdXBzIGFkZGluZyB0aGlzIHNjaGVtYXR5cGUgdG8gZWFjaCBoZWFkJ3MKLSAgICAgICAgLy8gbWVtYmVyIGxpc3QKLSAgICAgICAgd2hpbGUgKHN1YnN0aXR1dGlvbkdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoZWx0TmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gU3RzY1N0YXRlLmdldCgpLmZpbmREb2N1bWVudFR5cGUoCi0gICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotCi0gICAgICAgICAgICBhc3NlcnQgc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCA6ICJDb3VsZCBub3QgZmluZCBkb2N1bWVudCB0eXBlIGZvcjogIiArIHN1YnN0aXR1dGlvbkdyb3VwLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0KLSAgICAgICAgICAgIGlmICghIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCkgKQotICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gbnVsbDsgLy8gY3ljbGljIGRlcGVuZGVuY3kgLSBubyBzdWJzdCBncm91cAotCi0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5maW5pc2hSZXNvbHZpbmdTR3MoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZURvY3VtZW50VHlwZSAoIFNjaGVtYVR5cGVJbXBsIHNJbXBsICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzSW1wbC5pc1Jlc29sdmluZygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzRG9jdW1lbnRUeXBlKCk7Ci0gICAgICAgIAotCi0gICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgZ2xvYmFsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQgdHlwZQotICAgICAgICAvLyBhbmQgY29uc3RydWN0IGEgY29udGVudCBtb2RlbCB3aGljaCBhbGxvd3MganVzdCB0aGF0IGVsZW1lbnQKLSAgICAgICAgCi0gICAgICAgIExpc3QgYW5vblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGVsZW1lbnQgPQotICAgICAgICAgICAgKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKQotICAgICAgICAgICAgICAgIFN0c2NUcmFuc2xhdG9yLnRyYW5zbGF0ZUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSBzSW1wbC5nZXRQYXJzZU9iamVjdCgpLAotICAgICAgICAgICAgICAgICAgICBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuaXNDaGFtZWxlb24oKSwKLSAgICAgICAgICAgICAgICAgICAgYW5vblR5cGVzLCBzSW1wbCApOwotCi0gICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudEltcGwgY29udGVudE1vZGVsID0gbnVsbDsKLQotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuYWRkR2xvYmFsRWxlbWVudCggZWxlbWVudCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFBhcnRpY2xlVHlwZSggU2NoZW1hUGFydGljbGUuRUxFTUVOVCApOwotICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IuY29weUdsb2JhbEVsZW1lbnRUb0xvY2FsRWxlbWVudCggZWxlbWVudCwgY29udGVudE1vZGVsICk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0TWluT2NjdXJzKCBCaWdJbnRlZ2VyLk9ORSApOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldE1heE9jY3VycyggQmlnSW50ZWdlci5PTkUgKTsKLQotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFRyYW5zaXRpb25Ob3RlcyhRTmFtZVNldC5FTVBUWSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPQotICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoCi0gICAgICAgICAgICAgICAgY29udGVudE1vZGVsLCBzSW1wbCApOwotCi0gICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VUeXBlID0gc0ltcGwuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSA9PSBudWxsID8KLSAgICAgICAgICAgIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFIDoKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5maW5kRG9jdW1lbnRUeXBlKHNJbXBsLmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIAotICAgICAgICAgICAgICAgICBzSW1wbC5pc0NoYW1lbGVvbigpID8gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgOiBudWxsKQotICAgICAgICAgICAgOwotCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKCBiYXNlVHlwZS5nZXRSZWYoKSApOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoIGJhc2VUeXBlLmdldEJhc2VEZXB0aCgpICsgMSApOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZSggU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiApOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UICk7Ci0KLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKAotICAgICAgICAgICAgY29udGVudE1vZGVsLCBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCksCi0gICAgICAgICAgICBlbGVtZW50UHJvcGVydHlNb2RlbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KAotICAgICAgICAgICAgUU5hbWVTZXQuRU1QVFksIGZhbHNlLCBRTmFtZVNldC5FTVBUWSwgZmFsc2UgKTsKLQotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyggbWFrZVJlZkFycmF5KCBhbm9uVHlwZXMgKSApOwotCi0KLQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUF0dHJpYnV0ZVR5cGUgKCBTY2hlbWFUeXBlSW1wbCBzSW1wbCApCi0gICAgewotICAgICAgICBhc3NlcnQgc0ltcGwuaXNSZXNvbHZpbmcoKTsKLQotICAgICAgICBhc3NlcnQgc0ltcGwuaXNBdHRyaWJ1dGVUeXBlKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IGFub25UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCkgU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIChBdHRyaWJ1dGUpIHNJbXBsLmdldFBhcnNlT2JqZWN0KCksIHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgIHNJbXBsLmlzQ2hhbWVsZW9uKCksIGFub25UeXBlcywgc0ltcGwsIG51bGwsIGZhbHNlICk7Ci0KLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJpYnV0ZU1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmFkZEdsb2JhbEF0dHJpYnV0ZSggYXR0cmlidXRlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCBhdHRyaWJ1dGVDb3B5ID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpOwotICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IuY29weUdsb2JhbEF0dHJpYnV0ZVRvTG9jYWxBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgYXR0cmlidXRlQ29weSApOwotICAgICAgICAgICAgYXR0cmlidXRlTW9kZWwuYWRkQXR0cmlidXRlKCBhdHRyaWJ1dGVDb3B5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZiggQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUuZ2V0UmVmKCkgKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCBzSW1wbC5nZXRCYXNlRGVwdGgoKSArIDEgKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoIFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04gKTsKLSAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KCBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQgKTsKLSAgICAgICAgCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0KLSAgICAgICAgICAgIFN0c2NDb21wbGV4VHlwZVJlc29sdmVyLmJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlTW9kZWwsIHNJbXBsICk7Ci0KLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKAotICAgICAgICAgICAgbnVsbCwgYXR0cmlidXRlTW9kZWwsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgZmFsc2UgKTsKLQotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkoCi0gICAgICAgICAgICBRTmFtZVNldC5FTVBUWSwgZmFsc2UsIFFOYW1lU2V0LkVNUFRZLCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMoIG1ha2VSZWZBcnJheSggYW5vblR5cGVzICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZS5SZWZbXSBtYWtlUmVmQXJyYXkoQ29sbGVjdGlvbiB0eXBlTGlzdCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmW3R5cGVMaXN0LnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZSlpLm5leHQoKSkuZ2V0UmVmKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUlkZW50aXR5Q29uc3RyYWludHMoKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW10gaWRjcyA9IHN0YXRlLmlkQ29uc3RyYWludHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpZGNzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpZGNzW2ldLmlzUmVzb2x2ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBLZXlyZWYgeHNka3IgPSAoS2V5cmVmKWlkY3NbaV0uZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBrZXlOYW1lID0geHNka3IuZ2V0UmVmZXIoKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGtleSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBrZXkgPSBzdGF0ZS5maW5kSWRDb25zdHJhaW50KGtleU5hbWUsIGlkY3NbaV0uZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3Ioa2V5TmFtZSwgWG1sRXJyb3JDb250ZXh0LklEQ19OT1RfRk9VTkQsIHhzZGtyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5DQ19LRVlSRUYpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiS2V5cmVmIGNhbm5vdCByZWZlciB0byBhbm90aGVyIGtleXJlZi4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORCwgaWRjc1tpXS5nZXRQYXJzZU9iamVjdCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmdldEZpZWxkcygpLmxlbmd0aCAhPSBpZGNzW2ldLmdldEZpZWxkcygpLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJLZXlyZWYgZG9lcyBub3QgaGF2ZSBzYW1lIG51bWJlciBvZiBmaWVsZHMgYXMga2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORCwgaWRjc1tpXS5nZXRQYXJzZU9iamVjdCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZGNzW2ldLnNldFJlZmVyZW5jZWRLZXkoa2V5LmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyMmIwNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU2ltcGxlVHlwZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJ5dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTaG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkQnl0ZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLio7Ci0KLXB1YmxpYyBjbGFzcyBTdHNjU2ltcGxlVHlwZVJlc29sdmVyCi17Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiBTSU1QTEUgVFlQRSBSRVNPTFVUSU9OIEhFUkUKLSAgICAgKgotICAgICAqIFNpbXBsZSB0eXBlcyBjYW4gYmUgZGVjbGFyZWQgYXMgbGlzdHMsIHVuaW9ucywgb3IgcmVzdHJpY3Rpb25zLgotICAgICAqIFRoZXNlIHRocmVlIGNhc2VzIGFyZSB0cmVhdGVkIHNlcGFyYXRlbHkgaW4gcmVzb2x2ZUxpc3RUeXBlLAotICAgICAqIHJlc29sdmVVbmlvblR5cGUsIGFuZCByZXNvbHZlU2ltcGxlUmVzdHJpY3Rpb25UeXBlLgotICAgICAqCi0gICAgICogVGhlIGludHJpY2F0ZSB3b3JrIHdpdGggZmFjZXRzIGlzIGRvbmUgaW4gdGhlIHJlc3RyaWN0aW9uIGNhc2UsCi0gICAgICogdXNpbmcgbWV0aG9kIGNhbGxlZCByZXNvbHZlRmFjZXRzICh0aGUgdW5pb24gYW5kIGxpc3QgY2FzZXMgaGF2ZQotICAgICAqIHRyaXZpYWwgZmFjZXQgcnVsZXMpLiBUaGVuIGFsbCBzaW1wbGUgdHlwZXMgY2FsbCByZXNvbHZlUHJvcGVydGllcwotICAgICAqIGluIHRoZSBlbmQgdG8gaGF2ZSB0aGVpciAiZnVuZGFtZW50YWwgZmFjZXRzIiByZXNvbHZlZC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlU2ltcGxlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIFNpbXBsZVR5cGUgcGFyc2VTdCA9IChTaW1wbGVUeXBlKXNJbXBsLmdldFBhcnNlT2JqZWN0KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgc0ltcGwuaXNTaW1wbGVUeXBlKCk7Ci0KLSAgICAgICAgLy8gVmVyaWZ5OiBoYXZlIGxpc3QsIHVuaW9uLCBvciByZXN0cmljdGlvbiwgYnV0IG5vdCBtb3JlIHRoYW4gb25lCi0gICAgICAgIGludCBjb3VudCA9Ci0gICAgICAgICAgICAgICAgKHBhcnNlU3QuaXNTZXRMaXN0KCkgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgIChwYXJzZVN0LmlzU2V0VW5pb24oKSA/IDEgOiAwKSArCi0gICAgICAgICAgICAgICAgKHBhcnNlU3QuaXNTZXRSZXN0cmljdGlvbigpID8gMSA6IDApOwotICAgICAgICBpZiAoY291bnQgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJBIHNpbXBsZSB0eXBlIG11c3QgZGVmaW5lIGVpdGhlciBhIGxpc3QsIGEgdW5pb24sIG9yIGEgcmVzdHJpY3Rpb246IG1vcmUgdGhhbiBvbmUgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0Lk1BTEZPUk1FRF9TSU1QTEVfVFlQRV9ERUZOLAotICAgICAgICAgICAgICAgICAgICBwYXJzZVN0KTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyB0aGUgZmlyc3Qgb2YgbGlzdCwgdW5pb24sIHJlc3RyCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY291bnQgPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkEgc2ltcGxlIHR5cGUgbXVzdCBkZWZpbmUgZWl0aGVyIGEgbGlzdCwgYSB1bmlvbiwgb3IgYSByZXN0cmljdGlvbjogbm9uZSB3YXMgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0Lk1BTEZPUk1FRF9TSU1QTEVfVFlQRV9ERUZOLAotICAgICAgICAgICAgICAgICAgICBwYXJzZVN0KTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyByZXN0cmljdGlvbiBvZiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICByZXNvbHZlRXJyb3JTaW1wbGVUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBmaW5hbCBmbGFncwotICAgICAgICBib29sZWFuIGZpbmFsUmVzdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsTGlzdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsVW5pb24gPSBmYWxzZTsKLQotICAgICAgICBpZiAocGFyc2VTdC5pc1NldEZpbmFsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnNlU3QuZ2V0RmluYWwoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoIiNhbGwiKSkKLSAgICAgICAgICAgICAgICBmaW5hbFJlc3QgPSBmaW5hbExpc3QgPSBmaW5hbFVuaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFscygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgICAgICAgICBmaW5hbFJlc3QgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJsaXN0IikpCi0gICAgICAgICAgICAgICAgZmluYWxMaXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFscygidW5pb24iKSkKLSAgICAgICAgICAgICAgICBmaW5hbFVuaW9uID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBzSW1wbC5zZXRTaW1wbGVGaW5hbChmaW5hbFJlc3QsIGZpbmFsTGlzdCwgZmluYWxVbmlvbik7Ci0KLSAgICAgICAgTGlzdCBhbm9uVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaWYgKHBhcnNlU3QuZ2V0TGlzdCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXNvbHZlTGlzdFR5cGUoc0ltcGwsIHBhcnNlU3QuZ2V0TGlzdCgpLCBhbm9uVHlwZXMpOwotICAgICAgICBlbHNlIGlmIChwYXJzZVN0LmdldFVuaW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc29sdmVVbmlvblR5cGUoc0ltcGwsIHBhcnNlU3QuZ2V0VW5pb24oKSwgYW5vblR5cGVzKTsKLSAgICAgICAgZWxzZSBpZiAocGFyc2VTdC5nZXRSZXN0cmljdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICByZXNvbHZlU2ltcGxlUmVzdHJpY3Rpb25UeXBlKHNJbXBsLCBwYXJzZVN0LmdldFJlc3RyaWN0aW9uKCksIGFub25UeXBlcyk7Ci0KLSAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMobWFrZVJlZkFycmF5KGFub25UeXBlcykpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGUuUmVmW10gbWFrZVJlZkFycmF5KENvbGxlY3Rpb24gdHlwZUxpc3QpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZltdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlLlJlZlt0eXBlTGlzdC5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYVR5cGUpaS5uZXh0KCkpLmdldFJlZigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBzSW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShTY2hlbWFUeXBlLkFUT01JQyk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVMaXN0VHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCwgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5MaXN0RG9jdW1lbnQuTGlzdCBwYXJzZUxpc3QsIExpc3QgYW5vblR5cGVzKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuTElTVCk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKTsKLQotICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgcmVzdHJpY3QgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlTGlzdCk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogb2ggd2VsbC4KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgUU5hbWUgaXRlbU5hbWUgPSBwYXJzZUxpc3QuZ2V0SXRlbVR5cGUoKTsKLSAgICAgICAgTG9jYWxTaW1wbGVUeXBlIHBhcnNlSW5uZXIgPSBwYXJzZUxpc3QuZ2V0U2ltcGxlVHlwZSgpOwotCi0gICAgICAgIGlmIChpdGVtTmFtZSAhPSBudWxsICYmIHBhcnNlSW5uZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxpc3QgdHlwZSBkZWZpbml0aW9ucyBwcm92aWRlIGVpdGhlciBhbiBpdGVtVHlwZSBhdHRyaWJ1dGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJvciBjb250YWluIGEgbmVzdGVkIHNpbXBsZVR5cGU6IGJvdGggd2VyZSBmb3VuZC4iLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX05FU1RFRF9UWVBFLAotICAgICAgICAgICAgICAgICAgICBwYXJzZUxpc3QpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGUgaW5uZXIgc2ltcGxlIHR5cGUuCi0gICAgICAgICAgICBwYXJzZUlubmVyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGVJbXBsIGl0ZW1JbXBsOwotICAgICAgICBYbWxPYmplY3QgZXJyb3JMb2M7Ci0KLSAgICAgICAgaWYgKGl0ZW1OYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGl0ZW1JbXBsID0gc3RhdGUuZmluZEdsb2JhbFR5cGUoaXRlbU5hbWUsIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIGVycm9yTG9jID0gcGFyc2VMaXN0LnhnZXRJdGVtVHlwZSgpOwotICAgICAgICAgICAgaWYgKGl0ZW1JbXBsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihpdGVtTmFtZSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZUxpc3QueGdldEl0ZW1UeXBlKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhIGxpc3Qgb2YgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgICAgIGl0ZW1JbXBsID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJzZUlubmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGl0ZW1JbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgIGVycm9yTG9jID0gcGFyc2VJbm5lcjsKLSAgICAgICAgICAgIGl0ZW1JbXBsLnNldFNpbXBsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICBpdGVtSW1wbC5zZXRQYXJzZUNvbnRleHQocGFyc2VJbm5lciwgc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgIGl0ZW1JbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihzSW1wbC5nZXRSZWYoKSk7Ci0gICAgICAgICAgICBhbm9uVHlwZXMuYWRkKGl0ZW1JbXBsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJMaXN0IHR5cGUgZGVmaW5pdGlvbnMgcHJvdmlkZSBlaXRoZXIgYW4gaXRlbVR5cGUgYXR0cmlidXRlICIgKwotICAgICAgICAgICAgICAgICAgICAib3IgY29udGFpbiBhIG5lc3RlZCBzaW1wbGVUeXBlOiBuZWl0aGVyIHdhcyBmb3VuZC4iLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuTElTVF9NSVNTSU5HX0lURU0sCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlTGlzdCk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgYW4gZXh0ZW5zaW9uIG9mIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoc0ltcGwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVmVyaWZ5IGZpbmFsIHJlc3RyaWN0aW9ucwotICAgICAgICBpZiAoaXRlbUltcGwuZmluYWxMaXN0KCkpCi0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGRlcml2ZSBieSBsaXN0IGEgZmluYWwgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VMaXN0KTsKLQotICAgICAgICAvLyBSZWN1cnNpb24uLi4KLSAgICAgICAgU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKGl0ZW1JbXBsKTsKLQotICAgICAgICBpZiAoIWl0ZW1JbXBsLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiSXRlbSB0eXBlIGZvciB0aGlzIGxpc3QgdHlwZSBpcyBub3Qgc2ltcGxlIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LkxJU1RfSVRFTV9OT1RfU0lNUExFLCBlcnJvckxvYyk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgdGhlIGl0ZW0gdHlwZSBhcyBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICBzSW1wbCA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGl0ZW1JbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoaXMgaXRlbSB0eXBlIGlzIGFub3RoZXIgbGlzdCB0eXBlOyBsaXN0cyBvZiBsaXN0cyBhcmUgbm90IGFsbG93ZWQuIiwgWG1sRXJyb3JDb250ZXh0LkxJU1RfT0ZfTElTVCwgZXJyb3JMb2MpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCB0aGUgbGlzdCBhcyBhbiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICAgICAgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShzSW1wbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIGlmIChpdGVtSW1wbC5pc1VuaW9uT2ZMaXN0cygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoaXMgaXRlbSB0eXBlIGlzIGEgdW5pb24gY29udGFpbmluZyBhIGxpc3Q7IGxpc3RzIG9mIGxpc3RzIGFyZSBub3QgYWxsb3dlZC4iLCBYbWxFcnJvckNvbnRleHQuTElTVF9PRl9MSVNULCBlcnJvckxvYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoc0ltcGwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoOiBub25saXN0IHVuaW9ucyBhcmUganVzdCBsaWtlIGF0b21pYyBpdGVtcwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRMaXN0SXRlbVR5cGVSZWYoaXRlbUltcGwuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBkZWFsIHdpdGggZmFjZXRzCi0gICAgICAgIHNJbXBsLnNldEJhc2ljRmFjZXRzKFN0c2NTdGF0ZS5GQUNFVFNfTElTVCwgU3RzY1N0YXRlLkZJWEVEX0ZBQ0VUU19MSVNUKTsKLSAgICAgICAgc0ltcGwuc2V0V2hpdGVTcGFjZVJ1bGUoIFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UgKTsKLQotICAgICAgICAvLyBub3cgY29tcHV0ZSBvdXIgaW50cmluc2ljIHByb3BlcnRpZXMKLSAgICAgICAgcmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKHNJbXBsKTsKLSAgICB9Ci0KLQotCi0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlVW5pb25UeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBVbmlvbkRvY3VtZW50LlVuaW9uIHBhcnNlVW5pb24sIExpc3QgYW5vblR5cGVzKQotICAgIHsKLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoU2NoZW1hVHlwZS5VTklPTik7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKTsKLQotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgcmVzdHJpY3QgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVW5pb24pOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IG9oIHdlbGwuCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSBwYXJzZVVuaW9uLmdldE1lbWJlclR5cGVzKCk7Ci0gICAgICAgIFNpbXBsZVR5cGVbXSBzaW1wbGVUeXBlcyA9IHBhcnNlVW5pb24uZ2V0U2ltcGxlVHlwZUFycmF5KCk7Ci0KLSAgICAgICAgTGlzdCBtZW1iZXJJbXBsTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzaW1wbGVUeXBlcy5sZW5ndGggPT0gMCAmJiAobWVtYmVyVHlwZXMgPT0gbnVsbCB8fCBtZW1iZXJUeXBlcy5zaXplKCkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHVuaW9uIHR5cGUgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBtZW1iZXIgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5VTklPTl9NRU1CRVJfTk9UX1NJTVBMRSwgcGFyc2VVbmlvbik7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogb2ggd2VsbCwgemVybyBtZW1iZXIgdHlwZXMgaXMgZmluZS4KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1OYW1lcyA9IG1lbWJlclR5cGVzLml0ZXJhdG9yKCk7IG1OYW1lcy5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBtTmFtZSA9IChRTmFtZSltTmFtZXMubmV4dCgpOwotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIG1lbWJlckltcGwgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShtTmFtZSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIGlmIChtZW1iZXJJbXBsID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBza2lwIG1lbWJlcgotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKG1OYW1lLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlVW5pb24ueGdldE1lbWJlclR5cGVzKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVySW1wbExpc3QuYWRkKG1lbWJlckltcGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaW1wbGVUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQlVHQlVHOiBzZWUgaWYgbm9uPHNpbXBsZVR5cGU+IGNoaWxkcmVuIGNhbiBsZWFrIHRocm91Z2gKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIG1JbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgIG1JbXBsLnNldFNpbXBsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICBtSW1wbC5zZXRQYXJzZUNvbnRleHQoc2ltcGxlVHlwZXNbaV0sIHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICBtZW1iZXJJbXBsTGlzdC5hZGQobUltcGwpOwotICAgICAgICAgICAgbUltcGwuc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKHNJbXBsLmdldFJlZigpKTsKLSAgICAgICAgICAgIG1JbXBsLnNldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbChpICsgMSk7Ci0gICAgICAgICAgICBhbm9uVHlwZXMuYWRkKG1JbXBsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY3Vyc2UgYW5kIHJlc29sdmUgYWxsIG1lbWJlciB0eXBlcwotICAgICAgICBmb3IgKEl0ZXJhdG9yIG1JbXBscyA9IG1lbWJlckltcGxMaXN0Lml0ZXJhdG9yKCk7IG1JbXBscy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgbUltcGwgPSAoU2NoZW1hVHlwZUltcGwpbUltcGxzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKG1JbXBsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobUltcGwuZ2V0T3V0ZXJUeXBlKCkuZXF1YWxzKHNJbXBsKSkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1lbWJlciBoYXMgYSBjeWNsaWMgZGVwZW5kZW5jeSBvbiB0aGUgY29udGFpbmluZyB1bmlvbiIsICBYbWxFcnJvckNvbnRleHQuQ1lDTElDX0RFUEVOREVOQ1ksIG1JbXBsLmdldFBhcnNlT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1lbWJlciAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1JbXBsLmdldE5hbWUoKSkgKyAiIGhhcyBhIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIHRoZSB1bmlvbiIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgcGFyc2VVbmlvbi54Z2V0TWVtYmVyVHlwZXMoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBlcnJhbnQgdW5pb24gbWVtYmVyCi0gICAgICAgICAgICAgICAgbUltcGxzLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHZlcmlmeSBtZW1iZXJzCi0gICAgICAgIGJvb2xlYW4gaXNVbmlvbk9mTGlzdHMgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIG1JbXBscyA9IG1lbWJlckltcGxMaXN0Lml0ZXJhdG9yKCk7IG1JbXBscy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgbUltcGwgPSAoU2NoZW1hVHlwZUltcGwpbUltcGxzLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKCFtSW1wbC5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobUltcGwuZ2V0T3V0ZXJUeXBlKCkgIT0gbnVsbCAmJiBtSW1wbC5nZXRPdXRlclR5cGUoKS5lcXVhbHMoc0ltcGwpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWVtYmVyIGlzIG5vdCBzaW1wbGUiLCBYbWxFcnJvckNvbnRleHQuVU5JT05fTUVNQkVSX05PVF9TSU1QTEUsIG1JbXBsLmdldFBhcnNlT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1lbWJlciAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1JbXBsLmdldE5hbWUoKSkgKyAiIGlzIG5vdCBzaW1wbGUiLCBYbWxFcnJvckNvbnRleHQuVU5JT05fTUVNQkVSX05PVF9TSU1QTEUsIHBhcnNlVW5pb24ueGdldE1lbWJlclR5cGVzKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGUgZXJyYW50IHVuaW9uIG1lbWJlcgotICAgICAgICAgICAgICAgIG1JbXBscy5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbXBsLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QgfHwKLSAgICAgICAgICAgICAgICBtSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTiAmJiBtSW1wbC5pc1VuaW9uT2ZMaXN0cygpKQotICAgICAgICAgICAgICAgIGlzVW5pb25PZkxpc3RzID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFZlcmlmeSBhbnkgZmluYWwgcmVzdHJpY3Rpb25zCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1lbWJlckltcGxMaXN0LnNpemUoKSA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgbUltcGwgPSAoU2NoZW1hVHlwZUltcGwpbWVtYmVySW1wbExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKG1JbXBsLmZpbmFsVW5pb24oKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGRlcml2ZSBieSB1bmlvbiBhIGZpbmFsIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVW5pb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgc0ltcGwuc2V0VW5pb25PZkxpc3RzKGlzVW5pb25PZkxpc3RzKTsKLQotICAgICAgICBzSW1wbC5zZXRVbmlvbk1lbWJlclR5cGVSZWZzKG1ha2VSZWZBcnJheShtZW1iZXJJbXBsTGlzdCkpOwotCi0gICAgICAgIC8vIG5vdyBkZWFsIHdpdGggZmFjZXRzCi0gICAgICAgIHNJbXBsLnNldEJhc2ljRmFjZXRzKFN0c2NTdGF0ZS5GQUNFVFNfVU5JT04sIFN0c2NTdGF0ZS5GSVhFRF9GQUNFVFNfVU5JT04pOwotCi0gICAgICAgIC8vIG5vdyBjb21wdXRlIG91ciBpbnRyaW5zaWMgcHJvcGVydGllcwotICAgICAgICByZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoc0ltcGwpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVTaW1wbGVSZXN0cmljdGlvblR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwsIFJlc3RyaWN0aW9uRG9jdW1lbnQuUmVzdHJpY3Rpb24gcGFyc2VSZXN0ciwgTGlzdCBhbm9uVHlwZXMpCi0gICAgewotICAgICAgICBRTmFtZSBiYXNlTmFtZSA9IHBhcnNlUmVzdHIuZ2V0QmFzZSgpOwotICAgICAgICBTaW1wbGVUeXBlIHBhcnNlSW5uZXIgPSBwYXJzZVJlc3RyLmdldFNpbXBsZVR5cGUoKTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIGlmIChiYXNlTmFtZSAhPSBudWxsICYmIHBhcnNlSW5uZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNpbXBsZSB0eXBlIHJlc3RyaWN0aW9ucyBtdXN0IG5hbWUgYSBiYXNlIHR5cGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJvciBjb250YWluIGEgbmVzdGVkIHNpbXBsZSB0eXBlOiBib3RoIHdlcmUgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlJFU1RSSUNUSU9OX1JFRFVOREFOVF9CQVNFLAotICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3RyKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhlIGlubmVyIHNpbXBsZSB0eXBlLgotICAgICAgICAgICAgcGFyc2VJbm5lciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlSW1wbCBiYXNlSW1wbDsKLQotICAgICAgICBpZiAoYmFzZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZUltcGwgPSBzdGF0ZS5maW5kUmVkZWZpbmVkR2xvYmFsVHlwZShwYXJzZVJlc3RyLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCksIHNJbXBsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VJbXBsICE9IG51bGwgJiYgIWJhc2VJbXBsLmdldE5hbWUoKS5lcXVhbHMoc0ltcGwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCByZXN0cmljdCB0aGUgb3JpZ2luYWwgdHlwZSBkZWZpbml0aW9uIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlUmVzdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VJbXBsID0gc3RhdGUuZmluZEdsb2JhbFR5cGUoYmFzZU5hbWUsIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiYXNlSW1wbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IoYmFzZU5hbWUsIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VSZXN0ci54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgYW4gZXh0ZW5zaW9uIG9mIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgICAgICBiYXNlSW1wbCA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyc2VJbm5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCByZXN0cmljdCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VJbm5lcik7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IG9oIHdlbGwuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJhc2VJbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgIGJhc2VJbXBsLnNldFNpbXBsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICBiYXNlSW1wbC5zZXRQYXJzZUNvbnRleHQocGFyc2VJbm5lciwgc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgIC8vIGJhc2VJbXBsLnNldFNraXBwZWRBbm9ueW1vdXNUeXBlKHRydWUpOwotICAgICAgICAgICAgYmFzZUltcGwuc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKHNJbXBsLmdldFJlZigpKTsKLSAgICAgICAgICAgIGFub25UeXBlcy5hZGQoYmFzZUltcGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNpbXBsZSB0eXBlIHJlc3RyaWN0aW9ucyBtdXN0IG5hbWUgYSBiYXNlIHR5cGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJvciBjb250YWluIGEgbmVzdGVkIHNpbXBsZSB0eXBlOiBuZWl0aGVyIHdlcmUgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlJFU1RSSUNUSU9OX01JU1NJTkdfQkFTRSwKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXN0cik7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgYW4gZXh0ZW5zaW9uIG9mIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgIGJhc2VJbXBsID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY3Vyc2lvbiEKLSAgICAgICAgaWYgKCFTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUoYmFzZUltcGwpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjeWNsaWMgZGVwZW5kZW5jeSByZWNvdmVyeTogdHJlYXQgaXQgYXMgYW4gZXh0ZW5zaW9uIG9mIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgIGJhc2VJbXBsID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlSW1wbC5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IHJlc3RyaWN0IGEgZmluYWwgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVJlc3RyKTsKLQotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihiYXNlSW1wbC5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChiYXNlSW1wbC5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKTsKLQotICAgICAgICBpZiAoIWJhc2VJbXBsLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQmFzZSB0eXBlIGZvciB0aGlzIHNpbXBsZSB0eXBlIHJlc3RyaWN0aW9uIGlzIG5vdCBzaW1wbGUiLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuU0lNUExFX1JFU1RSSUNUSU9OX05PVF9TSU1QTEUsCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzdHIueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgYSByZXN0cmljdGlvbiBvZiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICByZXNvbHZlRXJyb3JTaW1wbGVUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KGJhc2VJbXBsLmdldFNpbXBsZVZhcmlldHkoKSk7Ci0KLSAgICAgICAgLy8gY29weSB2YXJpZXR5LXNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgICAgc3dpdGNoIChiYXNlSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihiYXNlSW1wbC5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldFVuaW9uT2ZMaXN0cyhiYXNlSW1wbC5pc1VuaW9uT2ZMaXN0cygpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRVbmlvbk1lbWJlclR5cGVSZWZzKG1ha2VSZWZBcnJheShBcnJheXMuYXNMaXN0KGJhc2VJbXBsLmdldFVuaW9uTWVtYmVyVHlwZXMoKSkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihiYXNlSW1wbC5nZXRMaXN0SXRlbVR5cGUoKS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWFsIHdpdGggZmFjZXRzCi0gICAgICAgIHJlc29sdmVGYWNldHMoc0ltcGwsIHBhcnNlUmVzdHIsIGJhc2VJbXBsKTsKLQotICAgICAgICAvLyBub3cgY29tcHV0ZSBvdXIgaW50cmluc2ljIHByb3BlcnRpZXMKLSAgICAgICAgcmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKHNJbXBsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IHRyYW5zbGF0ZVdoaXRlc3BhY2VDb2RlKFhtbEFueVNpbXBsZVR5cGUgdmFsdWUpCi0gICAgewotICAgICAgICAvLyBCVUdCVUc6IGFkZCB3aGl0ZXNwYWNlIHJ1bGUgdG8gdGV4dHZhbHVlLgotICAgICAgICBTdHJpbmcgdGV4dHZhbCA9IHZhbHVlLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKHRleHR2YWwuZXF1YWxzKCJjb2xsYXBzZSIpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuV1NfQ09MTEFQU0U7Ci0KLSAgICAgICAgaWYgKHRleHR2YWwuZXF1YWxzKCJwcmVzZXJ2ZSIpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7Ci0KLSAgICAgICAgaWYgKHRleHR2YWwuZXF1YWxzKCJyZXBsYWNlIikpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19SRVBMQUNFOwotCi0gICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVW5yZWNvZ25pemVkIHdoaXRlc3BhY2UgdmFsdWUgXCIiICsgdGV4dHZhbCArICJcIiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNNdWx0aXBsZUZhY2V0KGludCBmYWNldGNvZGUpCi0gICAgewotICAgICAgICByZXR1cm4gKGZhY2V0Y29kZSA9PSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OIHx8Ci0gICAgICAgICAgICAgICAgZmFjZXRjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTik7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gZmFjZXRBcHBsaWVzVG9UeXBlKGludCBmYWNldENvZGUsIFNjaGVtYVR5cGVJbXBsIGJhc2VJbXBsKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChiYXNlSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBhdG9taWMgY2FzZQotCi0gICAgICAgIHN3aXRjaCAoYmFzZUltcGwuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgb3RoZXJfc2ltaWxhcl9saW1pdChpbnQgZmFjZXRjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChmYWNldGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUZhY2V0cyhTY2hlbWFUeXBlSW1wbCBzSW1wbCwgWG1sT2JqZWN0IHJlc3RyaWN0aW9uLCBTY2hlbWFUeXBlSW1wbCBiYXNlSW1wbCkKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBib29sZWFuW10gc2VlbkZhY2V0ID0gbmV3IGJvb2xlYW5bU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUICsgMV07Ci0gICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSBteUZhY2V0cyA9IGJhc2VJbXBsLmdldEJhc2ljRmFjZXRzKCk7IC8vIG1ha2VzIGEgY29weQotICAgICAgICBib29sZWFuW10gZml4ZWRGYWNldHMgPSBiYXNlSW1wbC5nZXRGaXhlZEZhY2V0cygpOwotICAgICAgICBpbnQgd3NyID0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKLSAgICAgICAgTGlzdCBlbnVtZXJhdGVkVmFsdWVzID0gbnVsbDsKLSAgICAgICAgTGlzdCBwYXR0ZXJucyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHJlc3RyaWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSByZXN0cmljdGlvbi5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgIGZvciAoYm9vbGVhbiBtb3JlID0gY3VyLnRvRmlyc3RDaGlsZCgpOyBtb3JlOyBtb3JlID0gY3VyLnRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZSA9IHRyYW5zbGF0ZUZhY2V0Q29kZShjdXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBGYWNldCBmYWNldCA9IChGYWNldCljdXIuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWZhY2V0QXBwbGllc1RvVHlwZShjb2RlLCBiYXNlSW1wbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhlIGZhY2V0ICIgKyBmYWNldC5uZXdDdXJzb3IoKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBiYXNlIHR5cGUgIiArIGJhc2VJbXBsLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRE9FU19OT1RfQVBQTFksIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzZWVuRmFjZXRbY29kZV0gJiYgIWlzTXVsdGlwbGVGYWNldChjb2RlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJGYWNldCBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRFVQTElDQVRFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VlbkZhY2V0W2NvZGVdID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIXSAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3Qgc3BlY2lmeSBsZW5ndGggaW4gYWRkaXRpb24gdG8gbWluTGVuZ3RoIG9yIG1heExlbmd0aCIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9EVVBMSUNBVEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxJbnRlZ2VyIGxlbiA9IFN0c2NUcmFuc2xhdG9yLmJ1aWxkTm5JbnRlZ2VyKGZhY2V0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZEZhY2V0c1tjb2RlXSAmJiAhbXlGYWNldHNbY29kZV0udmFsdWVFcXVhbHMobGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBmYWNldCBpcyBmaXhlZCBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRklYRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW2NvZGVdID0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTEVOR1RIXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3Qgc3BlY2lmeSBtaW5MZW5ndGggb3IgbWF4TGVuZ3RoIGluIGFkZGl0aW9uIHRvIGxlbmd0aCIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9EVVBMSUNBVEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxJbnRlZ2VyIG1sZW4gPSBTdHNjVHJhbnNsYXRvci5idWlsZE5uSW50ZWdlcihmYWNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtbGVuID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkRmFjZXRzW2NvZGVdICYmICFteUZhY2V0c1tjb2RlXS52YWx1ZUVxdWFscyhtbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBmYWNldCBpcyBmaXhlZCBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRklYRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEhdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1sZW4uY29tcGFyZVZhbHVlKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSF0pID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJMYXJnZXIgdGhhbiBwcmlvciBtYXhMZW5ndGgiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEhdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1sZW4uY29tcGFyZVZhbHVlKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSF0pIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJTbWFsbGVyIHRoYW4gcHJpb3IgbWluTGVuZ3RoIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tjb2RlXSA9IG1sZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTOgotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc3RvdGFsZGlnID0gKGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgWG1sSW50ZWdlciBkaWcgPSBTdHNjVHJhbnNsYXRvci5idWlsZE5uSW50ZWdlcihmYWNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRGYWNldHNbY29kZV0gJiYgIW15RmFjZXRzW2NvZGVdLnZhbHVlRXF1YWxzKGRpZykpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoaXMgZmFjZXQgaXMgZml4ZWQgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0ZJWEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFNdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZy5jb21wYXJlVmFsdWUobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFNdKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJMYXJnZXIgdGhhbiBwcmlvciB0b3RhbERpZ2l0cyIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXN0b3RhbGRpZyAmJiBteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUU10gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlnLmNvbXBhcmVWYWx1ZShteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUU10pID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxhcmdlciB0aGFuIHByaW9yIGZyYWN0aW9uRGlnaXRzIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBkaWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRToKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5GYWNldFtvdGhlcl9zaW1pbGFyX2xpbWl0KGNvZGUpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGRlZmluZSBib3RoIGluY2x1c2l2ZSBhbmQgZXhjbHVzaXZlIGxpbWl0IGluIHRoZSBzYW1lIHJlc3RyaWNpdG9uIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0RVUExJQ0FURUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNtaW4gPSAoY29kZSA9PSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUgfHwgY29kZSA9PSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc2V4Y2x1c2l2ZSA9IChjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSB8fCBjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgbGltaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGJhc2VJbXBsLm5ld1ZhbHVlKGZhY2V0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGU6IHRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSBsaW1pdCBpcyBhIHZhbGlkIG51bWJlciBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGRhdGEgdHlwZSEhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk11c3QgYmUgdmFsaWQgdmFsdWUgaW4gYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQlVHQlVHOiBpZiB0aGVyZSBhcmUgYWN0dWFsIHNjaGVtYXMgdGhhdCByZWRlZmluZSBtaW4vbWF4RXhjbHVzaXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXkgd2lsbCBuZWVkIHRoaXMgcnVsZSByZWxheGVkIGZvciB0aGVtISEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZEZhY2V0c1tjb2RlXSAmJiAhbXlGYWNldHNbY29kZV0udmFsdWVFcXVhbHMobGltaXQpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGZhY2V0IGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9GSVhFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW2NvZGVdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSBsaW1pdC5jb21wYXJlVmFsdWUobXlGYWNldHNbY29kZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID09IDIgfHwgY29tcGFyaXNvbiA9PSAoaXNtaW4gPyAtMSA6IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoaXNtaW4gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc2V4Y2x1c2l2ZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcmV2aW91cyBtaW5FeGNsdXNpdmUiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHByZXZpb3VzIG1pbkluY2x1c2l2ZSIpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNleGNsdXNpdmUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcHJldmlvdXMgbWF4RXhjbHVzaXZlIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmV2aW91cyBtYXhJbmNsdXNpdmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW2NvZGVdID0gbGltaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tvdGhlcl9zaW1pbGFyX2xpbWl0KGNvZGUpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3c3IgPSB0cmFuc2xhdGVXaGl0ZXNwYWNlQ29kZShmYWNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlSW1wbC5nZXRXaGl0ZVNwYWNlUnVsZSgpID4gd3NyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzciA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBhcHBseSB0aGlzIHdoaXRlc3BhY2UgZmFjZXQgb3ZlciB0aGUgcHJldmlvdXMgb25lIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBTdHNjU3RhdGUuYnVpbGRfd3NzdHJpbmcod3NyKS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBlbnVtdmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bXZhbCA9IGJhc2VJbXBsLm5ld1ZhbHVlKGZhY2V0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudW12YWwuc2V0KGZhY2V0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICgoWG1sT2JqZWN0QmFzZSllbnVtdmFsKS5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRW51bWVyYXRlZCB2YWx1ZSBpbnZhbGlkIGluIGJhc2UgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtZXJhdGVkVmFsdWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlZFZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZWRWYWx1ZXMuYWRkKGVudW12YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24gcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHAgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uKGZhY2V0LmdldFZhbHVlKCkuZ2V0U3RyaW5nVmFsdWUoKSwgIlgiKTsgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5QYXJzZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5zID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJucy5hZGQocCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmFjZXQuZ2V0Rml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZml4ZWRGYWNldHNbY29kZV0gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RvcmUgdGhlIGFycmF5IG9mIGJhc2ljIGZhY2V0cwotCi0gICAgICAgIHNJbXBsLnNldEJhc2ljRmFjZXRzKG1ha2VWYWx1ZVJlZkFycmF5KG15RmFjZXRzKSwgZml4ZWRGYWNldHMpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbnVtZXJpYyB3aGl0ZXNwYWNlIHJ1bGUKLSAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgd3NyID0gYmFzZUltcGwuZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKLSAgICAgICAgc0ltcGwuc2V0V2hpdGVTcGFjZVJ1bGUod3NyKTsKLQotICAgICAgICAvLyBzdG9yZSBhd2F5IHRoZSBlbnVtZXJhdGVkIHZhbHVlcwotICAgICAgICBpZiAoZW51bWVyYXRlZFZhbHVlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzSW1wbC5zZXRFbnVtZXJhdGlvblZhbHVlcyhtYWtlVmFsdWVSZWZBcnJheSgoWG1sQW55U2ltcGxlVHlwZVtdKQotICAgICAgICAgICAgICAgIGVudW1lcmF0ZWRWYWx1ZXMudG9BcnJheShuZXcgWG1sQW55U2ltcGxlVHlwZVtlbnVtZXJhdGVkVmFsdWVzLnNpemUoKV0pKSk7Ci0KLSAgICAgICAgICAgIFNjaGVtYVR5cGUgYmVUeXBlID0gc0ltcGw7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuZ2V0QmFzZVR5cGUoKS5nZXRCYXNlRW51bVR5cGUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGJlVHlwZSA9IHNJbXBsLmdldEJhc2VUeXBlKCkuZ2V0QmFzZUVudW1UeXBlKCk7Ci0gICAgICAgICAgICBzSW1wbC5zZXRCYXNlRW51bVR5cGVSZWYoYmVUeXBlLmdldFJlZigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNJbXBsLmNvcHlFbnVtZXJhdGlvblZhbHVlcyhiYXNlSW1wbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdG9yZSB0aGUgcGF0dGVybiBsaXN0Ci0gICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHBhdHRlcm5BcnJheTsKLSAgICAgICAgaWYgKHBhdHRlcm5zICE9IG51bGwpCi0gICAgICAgICAgICBwYXR0ZXJuQXJyYXkgPSAob3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10pcGF0dGVybnMudG9BcnJheShFTVBUWV9SRUdFWF9BUlJBWSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhdHRlcm5BcnJheSA9IEVNUFRZX1JFR0VYX0FSUkFZOwotICAgICAgICBzSW1wbC5zZXRQYXR0ZXJuRmFjZXQoKHBhdHRlcm5BcnJheS5sZW5ndGggPiAwIHx8IGJhc2VJbXBsLmhhc1BhdHRlcm5GYWNldCgpKSk7Ci0gICAgICAgIHNJbXBsLnNldFBhdHRlcm5zKHBhdHRlcm5BcnJheSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sVmFsdWVSZWZbXSBtYWtlVmFsdWVSZWZBcnJheShYbWxBbnlTaW1wbGVUeXBlW10gc291cmNlKQotICAgIHsKLSAgICAgICAgWG1sVmFsdWVSZWZbXSByZXN1bHQgPSBuZXcgWG1sVmFsdWVSZWZbc291cmNlLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0W2ldID0gKHNvdXJjZVtpXSA9PSBudWxsID8gbnVsbCA6IG5ldyBYbWxWYWx1ZVJlZihzb3VyY2VbaV0pKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBFTVBUWV9SRUdFWF9BUlJBWSA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bMF07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlzY3JldGVUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIC8vIEJVR0JVRzogc3BlYyBpcyBzaWxlbnQgb24gZW51bWVyYXRpb25zOyB0aGV5J3JlIGZpbml0ZSB0b28uCi0gICAgICAgIHN3aXRjaCAoc0ltcGwuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOdW1lcmljUHJpbWl0aXZlKFNjaGVtYVR5cGUgc0ltcGwpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHNJbXBsLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBkZWNpbWFsU2l6ZU9mVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gbWF0aGVtYXRpY2FsU2l6ZU9mVHlwZShzSW1wbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBieXRlIGFuZCBzaG9ydCBhcmUgaW5jb252ZW5pZW50LCBiZWNhdXNlIHNldEJ5dGUoKGJ5dGUpNCkgcmVxdWlyZXMgYSBjYXN0LgotICAgICAgICAvLyBTbyB1c2UgImludCIgdW5sZXNzIHlvdSdyZSByZWFsbHkgYSB4czpieXRlLCB4czpzaG9ydCwgb3IgYW4geHM6dW5zaWduZWRCeXRlCi0gICAgICAgIC8vICh0aGUgbGFzdCBjYXNlIGlzIGluY2x1ZGVkIGZvciBhbGlnbm1lbnQgd2l0aCBKQVhCKQotICAgICAgICAKLSAgICAgICAgaWYgKHNpemUgPT0gU2NoZW1hVHlwZS5TSVpFX0JZVEUgJiYgIVhtbEJ5dGUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHNJbXBsKSkKLSAgICAgICAgICAgIHNpemUgPSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQ7Ci0gICAgICAgIGlmIChzaXplID09IFNjaGVtYVR5cGUuU0laRV9TSE9SVCAmJiAhWG1sU2hvcnQudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHNJbXBsKSAmJiAhWG1sVW5zaWduZWRCeXRlLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzSW1wbCkpCi0gICAgICAgICAgICBzaXplID0gU2NoZW1hVHlwZS5TSVpFX0lOVDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF0aGVtYXRpY2FsU2l6ZU9mVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChzSW1wbC5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgIT0gU2NoZW1hVHlwZS5CVENfREVDSU1BTCkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLk5PVF9ERUNJTUFMOwotCi0gICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUykgPT0gbnVsbCB8fAotICAgICAgICAgICAgKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUykpLmdldEJpZ0ludGVnZXJWYWx1ZSgpLnNpZ251bSgpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOwotCi0gICAgICAgIEJpZ0ludGVnZXIgbWluID0gbnVsbDsKLSAgICAgICAgQmlnSW50ZWdlciBtYXggPSBudWxsOwotCi0gICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpICE9IG51bGwpCi0gICAgICAgICAgICBtaW4gPSAoKFNpbXBsZVZhbHVlKXNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSkpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOyAvLyAuYWRkKEJpZ0ludGVnZXIuT05FKTsKLSAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSkgIT0gbnVsbCkKLSAgICAgICAgICAgIG1pbiA9ICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpICE9IG51bGwpCi0gICAgICAgICAgICBtYXggPSAoKFNpbXBsZVZhbHVlKXNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSAhPSBudWxsKQotICAgICAgICAgICAgbWF4ID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsgLy8gLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTsKLQotICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgcGVnID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgdG90YWxEaWdpdHMgPSAoKFNpbXBsZVZhbHVlKXNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRvdGFsRGlnaXRzLmludFZhbHVlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyA9IEJpZ0ludGVnZXIudmFsdWVPZig5OUwpOyAvLyBCWVRFIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcGVnID0gQmlnSW50ZWdlci52YWx1ZU9mKDk5OTlMKTsgLy8gU0hPUlQgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OiBjYXNlIDg6IGNhc2UgOToKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoOTk5OTk5OTk5TCk7IC8vIElOVCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IGNhc2UgMTE6IGNhc2UgMTI6IGNhc2UgMTM6IGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6IGNhc2UgMTY6IGNhc2UgMTc6IGNhc2UgMTg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcGVnID0gQmlnSW50ZWdlci52YWx1ZU9mKDk5OTk5OTk5OTk5OTk5OTk5OUwpOyAvLyBMT05HIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICBpZiAocGVnICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWluID0gKG1pbiA9PSBudWxsID8gcGVnLm5lZ2F0ZSgpIDogbWluLm1heChwZWcubmVnYXRlKCkpKTsKLSAgICAgICAgICAgICAgICBtYXggPSAobWF4ID09IG51bGwgPyBwZWcgOiBtYXgubWluKHBlZykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1pbiAhPSBudWxsICYmIG1heCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmaW5kIHRoZSBsYXJnZXN0ICJhYnNvbHV0ZSB2YWx1ZSIgbnVtYmVyIHRoYXQgbXVzdCBiZSBkZWFsdCB3aXRoCi0gICAgICAgICAgICBpZiAobWluLnNpZ251bSgpIDwgMCkKLSAgICAgICAgICAgICAgICBtaW4gPSBtaW4ubmVnYXRlKCkuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpOwotICAgICAgICAgICAgaWYgKG1heC5zaWdudW0oKSA8IDApCi0gICAgICAgICAgICAgICAgbWF4ID0gbWF4Lm5lZ2F0ZSgpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTsKLQotICAgICAgICAgICAgbWF4ID0gbWF4Lm1heChtaW4pOwotICAgICAgICAgICAgaWYgKG1heC5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFKSkgPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5TSVpFX0JZVEU7Ci0gICAgICAgICAgICBpZiAobWF4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLnZhbHVlT2YoU2hvcnQuTUFYX1ZBTFVFKSkgPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5TSVpFX1NIT1JUOwotICAgICAgICAgICAgaWYgKG1heC5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKSkgPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5TSVpFX0lOVDsKLSAgICAgICAgICAgIGlmIChtYXguY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSkpIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9MT05HOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKLSAgICB9Ci0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVGdW5kYW1lbnRhbEZhY2V0cyhTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIC8vIGRlYWwgd2l0aCwgaXNPcmRlcmVkLCBpc0JvdW5kZWQsIGlzRmluaXRlLCBpc051bWVyaWMKLSAgICAgICAgLy8gYWxzbyBkZWFsIHdpdGgKLSAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgYmFzZUltcGwgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRPcmRlcmVkKGJhc2VJbXBsLm9yZGVyZWQoKSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0Qm91bmRlZCgKLSAgICAgICAgICAgICAgICAgICAgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSkgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICBzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpICE9IG51bGwpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRGaW5pdGUoYmFzZUltcGwuaXNGaW5pdGUoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzSW1wbC5pc0JvdW5kZWQoKSAmJiBpc0Rpc2NyZXRlVHlwZShzSW1wbCkpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldE51bWVyaWMoYmFzZUltcGwuaXNOdW1lcmljKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOdW1lcmljUHJpbWl0aXZlKHNJbXBsLmdldFByaW1pdGl2ZVR5cGUoKSkpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldERlY2ltYWxTaXplKGRlY2ltYWxTaXplT2ZUeXBlKHNJbXBsKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIG1UeXBlcyA9IHNJbXBsLmdldFVuaW9uTWVtYmVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBpbnQgb3JkZXJlZCA9IFNjaGVtYVR5cGUuVU5PUkRFUkVEOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCb3VuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzRmluaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzTnVtZXJpYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gb3JkZXJlZCBpZiBhbnkgaXMgb3JkZXJlZCwgYm91bmRlZCBpZiBhbGwgYXJlIGJvdW5kZWQuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGVzW2ldLm9yZGVyZWQoKSAhPSBTY2hlbWFUeXBlLlVOT1JERVJFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBTY2hlbWFUeXBlLlBBUlRJQUxfT1JERVI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVR5cGVzW2ldLmlzQm91bmRlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgaXNCb3VuZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVR5cGVzW2ldLmlzRmluaXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0Zpbml0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1UeXBlc1tpXS5pc051bWVyaWMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtZXJpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRPcmRlcmVkKG9yZGVyZWQpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldEJvdW5kZWQoaXNCb3VuZGVkKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRGaW5pdGUoaXNGaW5pdGUpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldE51bWVyaWMoaXNOdW1lcmljKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXREZWNpbWFsU2l6ZShTY2hlbWFUeXBlLk5PVF9ERUNJTUFMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldE9yZGVyZWQoU2NoZW1hVHlwZS5VTk9SREVSRUQpOwotICAgICAgICAgICAgICAgIC8vIEJVR0JVRzogdGhlIHNjaGVtYSBzcGVjIGlzIHdyb25nIGhlcmU6IE1JTl9MRU5HVEggaXMgbm90IG5lZWRlZCwgYmVhdXNlIGxlbiA+PTAKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRCb3VuZGVkKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKSAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCkgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gQlVHQlVHOiB0aGUgc2NoZW1hIHNwZWMgaXMgd3JvbmcgaGVyZTogZmluaXRlIGNhcmRpbmFsaXR5IHJlcXVpcmVzIGl0ZW0gdHlwZSBpcyBmaW5pdGUKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRGaW5pdGUoc0ltcGwuZ2V0TGlzdEl0ZW1UeXBlKCkuaXNGaW5pdGUoKSAmJiBzSW1wbC5pc0JvdW5kZWQoKSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TnVtZXJpYyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RGVjaW1hbFNpemUoU2NoZW1hVHlwZS5OT1RfREVDSU1BTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2RlRm9yTmFtZUVudHJ5Ci0gICAgewotICAgICAgICBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lIG5hbWUsIGludCBjb2RlKQotICAgICAgICAgICAgeyB0aGlzLm5hbWUgPSBuYW1lOyB0aGlzLmNvZGUgPSBjb2RlOyB9Ci0gICAgICAgIHB1YmxpYyBRTmFtZSBuYW1lOwotICAgICAgICBwdWJsaWMgaW50IGNvZGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29kZUZvck5hbWVFbnRyeVtdIGZhY2V0Q29kZXMgPSBuZXcgQ29kZUZvck5hbWVFbnRyeVtdCi0gICAgewotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImxlbmd0aCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygibWluTGVuZ3RoIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygibWF4TGVuZ3RoIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygicGF0dGVybiIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk4pLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImVudW1lcmF0aW9uIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT04pLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIndoaXRlU3BhY2UiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygibWF4SW5jbHVzaXZlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygibWF4RXhjbHVzaXZlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygibWluSW5jbHVzaXZlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygibWluRXhjbHVzaXZlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygidG90YWxEaWdpdHMiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImZyYWN0aW9uRGlnaXRzIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTKSwKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIGZhY2V0Q29kZU1hcCA9IGJ1aWxkRmFjZXRDb2RlTWFwKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRGYWNldENvZGVNYXAoKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmFjZXRDb2Rlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoZmFjZXRDb2Rlc1tpXS5uYW1lLCAgbmV3IEludGVnZXIoZmFjZXRDb2Rlc1tpXS5jb2RlKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRyYW5zbGF0ZUZhY2V0Q29kZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoKEludGVnZXIpZmFjZXRDb2RlTWFwLmdldChuYW1lKSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTdGF0ZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjA5Y2QuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuU2NoZW1hQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxTdHJpbmdJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIgYXMgaXQncwotICogZ29pbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHNjU3RhdGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfZ2l2ZW5TdHNOYW1lOwotICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfZXJyb3JMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIF90YXJnZXQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFDb25maWcgX2NvbmZpZzsKLSAgICBwcml2YXRlIE1hcCBfY29tcGF0TWFwOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZG9pbmdEb3dubG9hZHM7Ci0gICAgcHJpdmF0ZSBieXRlW10gX2RpZ2VzdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ub0RpZ2VzdCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyIF9pbXBvcnRpbmdMb2FkZXI7Ci0KLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkR2xvYmFsVHlwZXMgICAgICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkTW9kZWxHcm91cHMgICAgICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbFR5cGVzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEVsZW1lbnRzICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEF0dHJpYnV0ZXMgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX21vZGVsR3JvdXBzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUdyb3VwcyAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2RvY3VtZW50VHlwZXMgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZVR5cGVzICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3R5cGVzQnlDbGFzc25hbWUgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX21pc3NwZWxsZWROYW1lcyAgICA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXQgX3Byb2Nlc3NpbmdHcm91cHMgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2lkQ29uc3RyYWludHMgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXQgX25hbWVzcGFjZXMgICAgICAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ub1VwYTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX25vUHZyOwotICAgIHByaXZhdGUgU2V0IF9tZGVmTmFtZXNwYWNlcyAgICAgPSBidWlsZERlZmF1bHRNZGVmTmFtZXNwYWNlcygpOwotICAgIHByaXZhdGUgRW50aXR5UmVzb2x2ZXIgX2VudGl0eVJlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGJ1aWxkRGVmYXVsdE1kZWZOYW1lc3BhY2VzKCkKLSAgICB7Ci0gICAgICAgIC8vIG5hbWVzcGFjZXMgd2hpY2ggYXJlIGtub3duIHRvIGFwcGVhciBpbiBXU0RMcyByZWR1bmRhbnRseQotICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCggbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub3BlbnVyaS5vcmcvMjAwMi8wNC9zb2FwL2NvbnZlcnNhdGlvbi8iLAotICAgICAgICAgICAgICAgIH0pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBuZXcgdGFyZ2V0IG5hbWVzcGFjZSBmb3IgYSBjaGFtZWxlb24KLSAgICAgKiBpbmNsdWRlZCBzY2hlbWEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgQ0hBTUVMRU9OX0lOQ0xVREVfVVJJID0gbmV3IE9iamVjdCgpOwotCi0gICAgLyoqCi0gICAgICogT25seSBjb25zdHJ1Y3RlZCB2aWEgU3RzY1N0YXRlLnN0YXJ0KCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHNjU3RhdGUoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplciBmb3Igc2NoZW1hdHlwZXBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbXBvcnRpbmdUeXBlTG9hZGVyKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyKQotICAgIHsKLSAgICAgICAgX2ltcG9ydGluZ0xvYWRlciA9IGxvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplciBmb3IgZXJyb3IgaGFuZGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JMaXN0ZW5lcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIpCi0gICAgICAgIHsgX2Vycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzZXMgYW4gZXJyb3Igb24gdG8gdGhlIGN1cnJlbnQgWG1sRXJyb3JDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgWG1sT2JqZWN0IGxvYykKLSAgICAgICAgeyBhZGRFcnJvcihfZXJyb3JMaXN0ZW5lciwgbWVzc2FnZSwgY29kZSwgbG9jKTsgfQotCi0gICAgLyoqCi0gICAgICogUGFzc2VzIGEgd2FybmluZyBvbiB0byB0aGUgY3VycmVudCBYbWxFcnJvckNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIFhtbE9iamVjdCBsb2MpCi0gICAgewotICAgICAgICAvLyBpdCdzIE9LIGZvciBYTUxTY2hlbWEueHNkIGl0c2VsZiB0byBoYXZlIHJlc2VydmVkIHR5cGUgbmFtZXMKLSAgICAgICAgaWYgKGNvZGUgPT0gWG1sRXJyb3JDb250ZXh0LlJFU0VSVkVEX1RZUEVfTkFNRSAmJgotICAgICAgICAgICAgICAgIGxvYy5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGxvYy5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCkuaW5kZXhPZigiWE1MU2NoZW1hLnhzZCIpID4gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBhZGRXYXJuaW5nKF9lcnJvckxpc3RlbmVyLCBtZXNzYWdlLCBjb2RlLCBsb2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhc3NlcyBhIHdhcm5pbmcgb24gdG8gdGhlIGN1cnJlbnQgWG1sRXJyb3JDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgIHsgYWRkSW5mbyhfZXJyb3JMaXN0ZW5lciwgbWVzc2FnZSk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFcnJvcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIsIFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgWG1sT2JqZWN0IGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgIFhtbEVycm9yLmZvck9iamVjdCgKLSAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IsCi0gICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZXJyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXJyb3IoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIEZpbGUgbG9jYXRpb24pCi0gICAgewotICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgWG1sRXJyb3IuZm9yTG9jYXRpb24oCi0gICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLAotICAgICAgICAgICAgICBsb2NhdGlvbi50b1VSSSgpLnRvU3RyaW5nKCksIDAsIDAsIDApOwotICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlcnIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXYXJuaW5nKENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lciwgU3RyaW5nIG1lc3NhZ2UsIGludCBjb2RlLCBYbWxPYmplY3QgbG9jYXRpb24pCi0gICAgewotICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgWG1sRXJyb3IuZm9yT2JqZWN0KAotICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9XQVJOSU5HLAotICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGVycik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEluZm8oQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvck1lc3NhZ2UobWVzc2FnZSwgWG1sRXJyb3IuU0VWRVJJVFlfSU5GTyk7Ci0gICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGVycik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEdpdmVuVHlwZVN5c3RlbU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsgX2dpdmVuU3RzTmFtZSA9IG5hbWU7IH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVyIGZvciByZWZlcmVuY2VzIHRvIHRoZSBTY2hlbWFUeXBlTG9hZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0U2NoZW1hVHlwZVN5c3RlbShTY2hlbWFUeXBlU3lzdGVtSW1wbCB0YXJnZXQpCi0gICAgICAgIHsgX3RhcmdldCA9IHRhcmdldDsgfQotICAgIAotICAgIC8qKgotICAgICAqIEFjY3VtdWxhdGVzIGEgc2NoZW1hIGRpZ2VzdC4uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNjaGVtYURpZ2VzdChieXRlW10gZGlnZXN0KQotICAgIHsKLSAgICAgICAgaWYgKF9ub0RpZ2VzdCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGlmIChkaWdlc3QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX25vRGlnZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIF9kaWdlc3QgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoX2RpZ2VzdCA9PSBudWxsKQotICAgICAgICAgICAgX2RpZ2VzdCA9IG5ldyBieXRlWzEyOC84XTsgLy8gMTI4IGJpdHMuCi0gICAgICAgIGludCBsZW4gPSBfZGlnZXN0Lmxlbmd0aDsKLSAgICAgICAgaWYgKGRpZ2VzdC5sZW5ndGggPCBsZW4pCi0gICAgICAgICAgICBsZW4gPSBkaWdlc3QubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICAgICAgX2RpZ2VzdFtpXSBePSBkaWdlc3RbaV07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBTY2hlbWFUeXBlU3lzdGVtIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHR5cGVzIG9uIGJlaGFsZiBvZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbUltcGwgc3RzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdGFyZ2V0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX3RhcmdldDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lID0gX2dpdmVuU3RzTmFtZTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBfZGlnZXN0ICE9IG51bGwpCi0gICAgICAgICAgICBuYW1lID0gInMiICsgbmV3IFN0cmluZyhIZXhCaW4uZW5jb2RlKF9kaWdlc3QpKTsKLSAgICAgICAgCi0gICAgICAgIF90YXJnZXQgPSBuZXcgU2NoZW1hVHlwZVN5c3RlbUltcGwobmFtZSk7Ci0gICAgICAgIHJldHVybiBfdGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGxvY2FsIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREb3dubG9hZFVSSShTdHJpbmcgdXJpU3RyaW5nKQotICAgIHsKLSAgICAgICAgaWYgKF9kb2luZ0Rvd25sb2FkcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmICh1cmlTdHJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkodXJpU3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiB1cmkuZ2V0U2NoZW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXIgZm9yIGNvbXBhdE1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gZGVmYXVsdHMgYXJlIGFsbCBmYWxzZS4gCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIF9jb21wYXRNYXAgPSAoTWFwKW9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuQ09NUElMRV9TVUJTVElUVVRFX05BTUVTKTsKLSAgICAgICAgX25vVXBhID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX05PX1VQQV9SVUxFKSA/IHRydWUgOgotICAgICAgICAgICAgICAgICEidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1sYmVhbi51bmlxdWVwYXJ0aWNsZWF0dHJpYnV0aW9uIiwgInRydWUiKSk7Ci0gICAgICAgIF9ub1B2ciA9IG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ09NUElMRV9OT19QVlJfUlVMRSkgPyB0cnVlIDoKLSAgICAgICAgICAgICAgICAhInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbGJlYW4ucGFydGljbGVyZXN0cmljdGlvbiIsICJ0cnVlIikpOwotICAgICAgICBfZG9pbmdEb3dubG9hZHMgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkNPTVBJTEVfRE9XTkxPQURfVVJMUykgPyB0cnVlIDoKLSAgICAgICAgICAgICAgICAidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1sYmVhbi5kb3dubG9hZHVybHMiLCAiZmFsc2UiKSk7Ci0gICAgICAgIF9lbnRpdHlSZXNvbHZlciA9IChFbnRpdHlSZXNvbHZlcilvcHRpb25zLmdldChYbWxPcHRpb25zLkVOVElUWV9SRVNPTFZFUik7Ci0gICAgICAgIGlmIChfZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIF9kb2luZ0Rvd25sb2FkcyA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX01ERUZfTkFNRVNQQUNFUykpCi0gICAgICAgICAgICBfbWRlZk5hbWVzcGFjZXMuYWRkQWxsKChDb2xsZWN0aW9uKW9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuQ09NUElMRV9NREVGX05BTUVTUEFDRVMpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWF5IHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGN1c3RvbSBlbnRpdHkgcmVzb2x2ZXIuCi0gICAgICovIAotICAgIHB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2VudGl0eVJlc29sdmVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIG5vIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBvcHRpb24gaXMgc2V0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbm9VcGEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ub1VwYTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBubyBwYXJ0aWNsZSB2YWxpZCAocmVzdHJpY2l0b24pIG9wdGlvbiBpcyBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBub1B2cigpCi0gICAgewotICAgICAgICByZXR1cm4gX25vUHZyOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIEludGVyY2VwdHMgWE1MIG5hbWVzIGFuZCB0cmFuc2xhdGVzIHRoZW0KLSAgICAgKiB0aHJvdWdoIHRoZSBjb21wYXQgbWFwLCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBBbHNvIGxvb2tzIGZvciBhIGRlZmF1bHQgbmFtZXNwYWNlIGZvciBnbG9iYWwgZGVmaW5pdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBRTmFtZSBjb21wYXROYW1lKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgYSBjaGFtZWxlb25OYW1lc3BhY2UgbmFtZXNwYWNlCi0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgJiYgY2hhbWVsZW9uTmFtZXNwYWNlICE9IG51bGwgJiYgY2hhbWVsZW9uTmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIG5hbWUgPSBuZXcgUU5hbWUoY2hhbWVsZW9uTmFtZXNwYWNlLCBuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBpZiAoX2NvbXBhdE1hcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0KLSAgICAgICAgUU5hbWUgc3Vic3QgPSAoUU5hbWUpX2NvbXBhdE1hcC5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChzdWJzdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIHJldHVybiBzdWJzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplciBmb3IgdGhlIHNjaGVtYSBjb25maWcgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUNvbmZpZyhTY2hlbWFDb25maWcgY29uZmlnKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBfY29uZmlnID0gY29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2tzIHVwIHBhY2thZ2Ugb3ZlcnJpZGUgZm9yIGEgbmFtZXNwYWNlIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU92ZXJyaWRlKFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBQYWNrYWdlRm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9va3MgdXAgcGFja2FnZSBvdmVycmlkZSBmb3IgYSBuYW1lc3BhY2UgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhUHJlZml4KFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBQcmVmaXhGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyB1cCBwYWNrYWdlIG92ZXJyaWRlIGZvciBhIG5hbWVzcGFjZSBVUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFTdWZmaXgoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29uZmlnLmxvb2t1cFN1ZmZpeEZvck5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2tzIHVwIGNvbmZpZ3VyZWQgamF2YSBuYW1lIGZvciB0aGUgZ2l2ZW4gcW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhbmFtZShRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29uZmlnLmxvb2t1cEphdmFuYW1lRm9yUU5hbWUocW5hbWUpOwotICAgIH0KLQotICAgIC8qIFNQRUxMSU5HUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNydW5jaE5hbWUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIGxvd2VyY2FzZSwgYW5kIGRyb3AgbmFtZXNwYWNlLgotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIHZvaWQgYWRkU3BlbGxpbmcoUU5hbWUgbmFtZSwgU2NoZW1hQ29tcG9uZW50IGNvbXApCi0gICAgewotICAgICAgICBfbWlzc3BlbGxlZE5hbWVzLnB1dChjcnVuY2hOYW1lKG5hbWUpLCBjb21wKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFDb21wb25lbnQgZmluZFNwZWxsaW5nKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUNvbXBvbmVudClfbWlzc3BlbGxlZE5hbWVzLmdldChjcnVuY2hOYW1lKG5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKiBOQU1FU1BBQ0VTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgICB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgX25hbWVzcGFjZXMuYWRkKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nW10gZ2V0TmFtZXNwYWNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKV9uYW1lc3BhY2VzLnRvQXJyYXkobmV3IFN0cmluZ1tfbmFtZXNwYWNlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGxpbmtlckRlZmluZXNOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW1wb3J0aW5nTG9hZGVyLmlzTmFtZXNwYWNlRGVmaW5lZChuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qIFRZUEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hVHlwZUltcGwgZmluZEdsb2JhbFR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfZ2xvYmFsVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kVHlwZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgU2NoZW1hVHlwZUltcGwgZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUU5hbWUgcmVkZWZpbmVkTmFtZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhyZWRlZmluZWROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlSW1wbClfcmVkZWZpbmVkR2xvYmFsVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgLy8gQlVHQlVHOiBzaG91bGQgYWxzbyBsaW5rIGFnYWluc3QgX2ltcG9ydGluZ0xvYWRlci5maW5kUmVkZWZpbmVkVHlwZQotICAgICAgICB9Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfZ2xvYmFsVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kVHlwZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEdsb2JhbFR5cGUoU2NoZW1hVHlwZUltcGwgdHlwZSwgYm9vbGVhbiByZWRlZmluZWQpCi0gICAgewotICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyZWRlZmluZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9yZWRlZmluZWRHbG9iYWxUeXBlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJEdXBsaWNhdGUgZ2xvYmFsIHR5cGU6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9yZWRlZmluZWRHbG9iYWxUeXBlcy5wdXQobmFtZSwgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9nbG9iYWxUeXBlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJEdXBsaWNhdGUgZ2xvYmFsIHR5cGU6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZ2xvYmFsVHlwZXMucHV0KG5hbWUsIHR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRTcGVsbGluZyhuYW1lLCB0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlTWRlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9tZGVmTmFtZXNwYWNlcy5jb250YWlucyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlW10gZ2xvYmFsVHlwZXMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZVtdKV9nbG9iYWxUeXBlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFUeXBlW19nbG9iYWxUeXBlcy5zaXplKCldKTsgfQotCi0gICAgU2NoZW1hVHlwZVtdIHJlZGVmaW5lZEdsb2JhbFR5cGVzKCkKLSAgICAgICAgeyByZXR1cm4gKFNjaGVtYVR5cGVbXSlfcmVkZWZpbmVkR2xvYmFsVHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfcmVkZWZpbmVkR2xvYmFsVHlwZXMuc2l6ZSgpXSk7IH0KLSAgICAKLSAgICAvKiBET0NVTUVOVCBUWVBFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYVR5cGVJbXBsIGZpbmREb2N1bWVudFR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfZG9jdW1lbnRUeXBlcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmREb2N1bWVudFR5cGUobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGREb2N1bWVudFR5cGUoU2NoZW1hVHlwZUltcGwgdHlwZSwgUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfZG9jdW1lbnRUeXBlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQotICAgICAgICAgICAgICAgIGVycm9yKCJEdXBsaWNhdGUgZ2xvYmFsIGVsZW1lbnQ6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX0VMRU1FTlQsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9kb2N1bWVudFR5cGVzLnB1dChuYW1lLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFUeXBlW10pX2RvY3VtZW50VHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfZG9jdW1lbnRUeXBlcy5zaXplKCldKTsgfQotCi0gICAgLyogQVRUUklCVVRFIFRZUEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hVHlwZUltcGwgZmluZEF0dHJpYnV0ZVR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfYXR0cmlidXRlVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kQXR0cmlidXRlVHlwZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEF0dHJpYnV0ZVR5cGUoU2NoZW1hVHlwZUltcGwgdHlwZSwgUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfYXR0cmlidXRlVHlwZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKLSAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCBhdHRyaWJ1dGU6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX0FUVFJJQlVURSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX2F0dHJpYnV0ZVR5cGVzLnB1dChuYW1lLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlW10gYXR0cmlidXRlVHlwZXMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZVtdKV9hdHRyaWJ1dGVUeXBlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFUeXBlW19hdHRyaWJ1dGVUeXBlcy5zaXplKCldKTsgfQotCi0gICAgLyogQVRUUklCVVRFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGZpbmRHbG9iYWxBdHRyaWJ1dGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwpX2dsb2JhbEF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmRBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRHbG9iYWxBdHRyaWJ1dGUoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgX2dsb2JhbEF0dHJpYnV0ZXMucHV0KG5hbWUsIGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICBhZGRTcGVsbGluZyhuYW1lLCBhdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gZ2xvYmFsQXR0cmlidXRlcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSlfZ2xvYmFsQXR0cmlidXRlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbX2dsb2JhbEF0dHJpYnV0ZXMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIEVMRU1FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZmluZEdsb2JhbEVsZW1lbnQoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIHJlc3VsdCA9IChTY2hlbWFHbG9iYWxFbGVtZW50SW1wbClfZ2xvYmFsRWxlbWVudHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kRWxlbWVudChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEdsb2JhbEVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZWxlbWVudCkKLSAgICB7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgICAgIF9nbG9iYWxFbGVtZW50cy5wdXQobmFtZSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBhZGRTcGVsbGluZyhuYW1lLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBnbG9iYWxFbGVtZW50cygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFHbG9iYWxFbGVtZW50W10pX2dsb2JhbEVsZW1lbnRzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRbX2dsb2JhbEVsZW1lbnRzLnNpemUoKV0pOyB9Ci0KLSAgICAvKiBBVFRSSUJVVEUgR1JPVVBTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBmaW5kQXR0cmlidXRlR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCByZXN1bHQgPSAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKV9hdHRyaWJ1dGVHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZEF0dHJpYnV0ZUdyb3VwKG5hbWUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBmaW5kUmVkZWZpbmVkQXR0cmlidXRlR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUU5hbWUgcmVkZWZpbml0aW9uRm9yKQotICAgIHsKLSAgICAgICAgbmFtZSA9IGNvbXBhdE5hbWUobmFtZSwgY2hhbWVsZW9uTmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHJlZGVmaW5pdGlvbkZvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKV9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgLy8gQlVHQlVHOiBzaG91bGQgYWxzbyBsaW5rIGFnYWluc3QgX2ltcG9ydGluZ0xvYWRlci5maW5kUmVkZWZpbmVkQXR0cmlidXRlR3JvdXAKLSAgICAgICAgfQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfYXR0cmlidXRlR3JvdXBzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmRBdHRyaWJ1dGVHcm91cChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEF0dHJpYnV0ZUdyb3VwKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBhdHRyaWJ1dGVHcm91cCwgYm9vbGVhbiByZWRlZmluZWQpCi0gICAgewotICAgICAgICBpZiAoYXR0cmlidXRlR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGF0dHJpYnV0ZUdyb3VwLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChyZWRlZmluZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGF0dHJpYnV0ZSBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy5wdXQobmFtZSwgYXR0cmlidXRlR3JvdXApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlR3JvdXBzLmNvbnRhaW5zS2V5KCBuYW1lICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGF0dHJpYnV0ZSBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVHcm91cHMucHV0KGF0dHJpYnV0ZUdyb3VwLmdldE5hbWUoKSwgYXR0cmlidXRlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICBhZGRTcGVsbGluZyhhdHRyaWJ1dGVHcm91cC5nZXROYW1lKCksIGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIGF0dHJpYnV0ZUdyb3VwcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFBdHRyaWJ1dGVHcm91cFtdKV9hdHRyaWJ1dGVHcm91cHMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBbX2F0dHJpYnV0ZUdyb3Vwcy5zaXplKCldKTsgfQotCi0gICAgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSByZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXBbXSlfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwW19yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIE1PREVMIEdST1VQUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hTW9kZWxHcm91cEltcGwgZmluZE1vZGVsR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIHJlc3VsdCA9IChTY2hlbWFNb2RlbEdyb3VwSW1wbClfbW9kZWxHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kTW9kZWxHcm91cChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBmaW5kUmVkZWZpbmVkTW9kZWxHcm91cChRTmFtZSBuYW1lLCBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlLCBRTmFtZSByZWRlZmluaXRpb25Gb3IpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBpZiAobmFtZS5lcXVhbHMocmVkZWZpbml0aW9uRm9yKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFNb2RlbEdyb3VwSW1wbClfcmVkZWZpbmVkTW9kZWxHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgLy8gQlVHQlVHOiBzaG91bGQgYWxzbyBsaW5rIGFnYWluc3QgX2ltcG9ydGluZ0xvYWRlci5maW5kUmVkZWZpbmVkTW9kZWxHcm91cAotICAgICAgICB9Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIHJlc3VsdCA9IChTY2hlbWFNb2RlbEdyb3VwSW1wbClfbW9kZWxHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kTW9kZWxHcm91cChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZE1vZGVsR3JvdXAoU2NoZW1hTW9kZWxHcm91cEltcGwgbW9kZWxHcm91cCwgYm9vbGVhbiByZWRlZmluZWQpCi0gICAgewotICAgICAgICBpZiAobW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbW9kZWxHcm91cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAocmVkZWZpbmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcmVkZWZpbmVkTW9kZWxHcm91cHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIG1vZGVsIGdyb3VwOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBfcmVkZWZpbmVkTW9kZWxHcm91cHMucHV0KG5hbWUsIG1vZGVsR3JvdXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfbW9kZWxHcm91cHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIG1vZGVsIGdyb3VwOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX21vZGVsR3JvdXBzLnB1dChtb2RlbEdyb3VwLmdldE5hbWUoKSwgbW9kZWxHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFNwZWxsaW5nKG1vZGVsR3JvdXAuZ2V0TmFtZSgpLCBtb2RlbEdyb3VwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTY2hlbWFNb2RlbEdyb3VwW10gbW9kZWxHcm91cHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hTW9kZWxHcm91cFtdKV9tb2RlbEdyb3Vwcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFNb2RlbEdyb3VwW19tb2RlbEdyb3Vwcy5zaXplKCldKTsgfQotICAgIAotICAgIFNjaGVtYU1vZGVsR3JvdXBbXSByZWRlZmluZWRNb2RlbEdyb3VwcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFNb2RlbEdyb3VwW10pX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYU1vZGVsR3JvdXBbX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnNpemUoKV0pOyB9Ci0KLSAgICAvKiBJREVOVElUWSBDT05TVFJBSU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwgZmluZElkQ29uc3RyYWludChRTmFtZSBuYW1lLCBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgbmFtZSA9IGNvbXBhdE5hbWUobmFtZSwgY2hhbWVsZW9uTmFtZXNwYWNlKTsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsKV9pZENvbnN0cmFpbnRzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZElkQ29uc3RyYWludChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGlkYykKLSAgICB7Ci0gICAgICAgIGlmIChpZGMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2lkQ29uc3RyYWludHMucHV0KGlkYy5nZXROYW1lKCksIGlkYyk7Ci0gICAgICAgICAgICBhZGRTcGVsbGluZyhpZGMuZ2V0TmFtZSgpLCBpZGMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbFtdIGlkQ29uc3RyYWludHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbFtdKV9pZENvbnN0cmFpbnRzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbX2lkQ29uc3RyYWludHMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIFJFQ1VSU0lPTiBBVk9JREFOQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotICAgIGJvb2xlYW4gaXNQcm9jZXNzaW5nKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3Byb2Nlc3NpbmdHcm91cHMuY29udGFpbnMob2JqKTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0UHJvY2Vzc2luZyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KCFfcHJvY2Vzc2luZ0dyb3Vwcy5jb250YWlucyhvYmopKTsKLSAgICAgICAgX3Byb2Nlc3NpbmdHcm91cHMuYWRkKG9iaik7Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hQcm9jZXNzaW5nKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBhc3NlcnQoX3Byb2Nlc3NpbmdHcm91cHMuY29udGFpbnMob2JqKSk7Ci0gICAgICAgIF9wcm9jZXNzaW5nR3JvdXBzLnJlbW92ZShvYmopOwotICAgIH0KLQotICAgIC8qIEpBVkFJWkFUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgTWFwIHR5cGVzQnlDbGFzc25hbWUoKQotICAgICAgICB7IHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoX3R5cGVzQnlDbGFzc25hbWUpOyB9Ci0KLSAgICB2b2lkIGFkZENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lLCBTY2hlbWFUeXBlIHR5cGUpCi0gICAgICAgIHsgX3R5cGVzQnlDbGFzc25hbWUucHV0KGNsYXNzbmFtZSwgdHlwZSk7IH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBTdGFjayBtYW5hZ2VtZW50IGlmIChoZWF2ZW4gaGVscCB1cykgd2UgZXZlciBuZWVkIHRvIGRvCi0gICAgICogbmVzdGVkIGNvbXBpbGF0aW9uIG9mIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHNjU3RhY2sKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBjdXJyZW50OwotICAgICAgICBBcnJheUxpc3Qgc3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIFN0c2NTdGF0ZSBwdXNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhY2suYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgY3VycmVudCA9IG5ldyBTdHNjU3RhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIHZvaWQgcG9wKCkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudCA9IChTdHNjU3RhdGUpc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgc3RzY1N0YWNrID0gbmV3IFRocmVhZExvY2FsKCkKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkgeyByZXR1cm4gbmV3IFN0c2NTdGFjaygpOyB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RzY1N0YXRlIHN0YXJ0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFN0c2NTdGFjaylzdHNjU3RhY2suZ2V0KCkpLnB1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0c2NTdGF0ZSBnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU3RzY1N0YWNrKXN0c2NTdGFjay5nZXQoKSkuY3VycmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5kKCkKLSAgICB7Ci0gICAgICAgICgoU3RzY1N0YWNrKXN0c2NTdGFjay5nZXQoKSkucG9wKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1BSRVNFUlZFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1JFUExBQ0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZiBYTUxTVFJfQ09MTEFQU0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKLQotICAgIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlW10gRU1QVFlfU1RfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZVswXTsKLSAgICBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZS5SZWZbXSBFTVBUWV9TVFJFRl9BUlJBWSA9IG5ldyBTY2hlbWFUeXBlLlJlZlswXTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19OT05FID0gbmV3IGJvb2xlYW5bXQotICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfV1NfQ09MTEFQU0UgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfV1MgPSBuZXcgYm9vbGVhbltdCi0gICAgICAgIHsgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKLQotICAgIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTklPTiA9IEZBQ0VUU19OT05FOwotICAgIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX1VOSU9OID0gRklYRURfRkFDRVRTX05PTkU7Ci0gICAgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0xJU1QgPSBGQUNFVFNfV1NfQ09MTEFQU0U7Ci0gICAgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfTElTVCA9IEZJWEVEX0ZBQ0VUU19XUzsKLQotICAgIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZF93c3N0cmluZyhpbnQgd3NyKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh3c3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19QUkVTRVJWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX1BSRVNFUlZFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9SRVBMQUNFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOgotICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfQ09MTEFQU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkU3RyaW5nKFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sU3RyaW5nSW1wbCBpID0gbmV3IFhtbFN0cmluZ0ltcGwoKTsKLSAgICAgICAgICAgIGkuc2V0KHN0cik7Ci0gICAgICAgICAgICBpLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZihpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90Rm91bmRFcnJvcihRTmFtZSBpdGVtTmFtZSwgaW50IGNvZGUsIFhtbE9iamVjdCBsb2MpCi0gICAgewotICAgICAgICBTdHJpbmcgYmFzaWNNZXNzYWdlOwotCi0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQ6Ci0gICAgICAgICAgICAgICAgYmFzaWNNZXNzYWdlID0gIlR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9SRUZfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9SRUZfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJBdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuTU9ERUxfR1JPVVBfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJNb2RlbCBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGl0ZW1OYW1lKSArICIgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfR1JPVVBfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJBdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORDoKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiSWRlbnRpdHkgY29uc3RyYWludCAnIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiJyBub3QgZm91bmQuIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiRGVmaW5pdGlvbiAiICsgUU5hbWVIZWxwZXIucHJldHR5KGl0ZW1OYW1lKSArICIgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGVscGZ1bE1lc3NhZ2UgPSAiIjsKLSAgICAgICAgU2NoZW1hQ29tcG9uZW50IGZvdW5kQ29tcG9uZW50ID0gZmluZFNwZWxsaW5nKGl0ZW1OYW1lKTsKLSAgICAgICAgUU5hbWUgbmFtZTsKLSAgICAgICAgaWYgKGZvdW5kQ29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUgPSBmb3VuZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lID0gKChTY2hlbWFUeXBlKWZvdW5kQ29tcG9uZW50KS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWUgPSAoKFNjaGVtYUdsb2JhbEVsZW1lbnQpZm91bmRDb21wb25lbnQpLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lID0gKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpZm91bmRDb21wb25lbnQpLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlID0gIiI7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9ICIgKGluICIgKyAgc291cmNlTmFtZS5zdWJzdHJpbmcoc291cmNlTmFtZS5sYXN0SW5kZXhPZignLycpICsgMSkgKyAiKSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtTmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSB0eXBlIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgZWxlbWVudCB3aXRoIHRoYXQgbmFtZSIgKyBzb3VyY2UgKyAiPyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgYXR0cmlidXRlIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURV9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgd2l0aCB0aGF0IG5hbWUiICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgbW9kZWwgZ3JvdXAgd2l0aCB0aGF0IG5hbWUiICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZm91bmRDb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIHR5cGUgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgZWxlbWVudCBuYW1lZCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lZCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGF0dHJpYnV0ZSBncm91cCBuYW1lZCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgbW9kZWwgZ3JvdXAgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVycm9yKGJhc2ljTWVzc2FnZSArIGhlbHBmdWxNZXNzYWdlLCBjb2RlLCBsb2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2R1Y2VzIHRoZSAic291cmNlTmFtZSIgKHRvIGJlIHVzZWQgd2l0aGluIHRoZSBzY2hlbWEgcHJvamVjdAotICAgICAqIHNvdXJjZSBmaWxlIGNvcGllcykgZnJvbSB0aGUgVVJJIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNvdXJjZU5hbWVGb3JVcmkoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKV9zb3VyY2VGb3JVcmkuZ2V0KHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd2hvbGUgc291cmNlQ29weU1hcCwgbWFwcGluZyBVUkkncyB0aGF0IGhhdmUKLSAgICAgKiBiZWVuIHJlYWQgdG8gInNvdXJjZU5hbWUiIGxvY2FsIG5hbWVzIHRoYXQgaGF2ZSBiZWVuIHVzZWQKLSAgICAgKiB0byB0YWcgdGhlIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgc291cmNlQ29weU1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKF9zb3VyY2VGb3JVcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBiYXNlIFVSSSB0byB1c2UgZm9yIG5pY2UgZmlsZW5hbWVzIHdoZW4gc2F2aW5nIHNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZVVyaShVUkkgdXJpKQotICAgIHsKLSAgICAgICAgX2Jhc2VVUkkgPSB1cmk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfVVJMX1BSRUZJWCA9ICJwcm9qZWN0Oi8vbG9jYWwiOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgcmVsYXRpdml6ZShTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZpemUodXJpLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZVNhdmVkRmlsZW5hbWUoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWxhdGl2aXplKHVyaSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0aXZpemUoU3RyaW5nIHVyaSwgYm9vbGVhbiBmb3JTYXZlZEZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIHRoaW5ncyB0aGF0IGRvIG5vdCBsb29rIGxpa2UgYWJzb2x1dGUgdXJpcwotICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgewotICAgICAgICAgICAgdXJpID0gUFJPSkVDVF9VUkxfUFJFRklYICsgdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgYSBVUkw/Ci0gICAgICAgICAgICBpbnQgY29sb24gPSB1cmkuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGNvbG9uIDw9IDEgfHwgIXVyaS5zdWJzdHJpbmcoMCwgY29sb24pLm1hdGNoZXMoIl5cXHcrJCIpKQotICAgICAgICAgICAgICAgIHVyaSA9IFBST0pFQ1RfVVJMX1BSRUZJWCArICIvIiArIHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgcmVsYXRpdml6ZSBhZ2FpbnN0IHRoYXQuLi4KLSAgICAgICAgaWYgKF9iYXNlVVJJICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVSSSByZWxhdGl2ZSA9IF9iYXNlVVJJLnJlbGF0aXZpemUobmV3IFVSSSh1cmkpKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlbGF0aXZlLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB1cmkgPSByZWxhdGl2ZS50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWZvclNhdmVkRmlsZW5hbWUpCi0gICAgICAgICAgICByZXR1cm4gdXJpOwotCi0gICAgICAgIGludCBsYXN0c2xhc2ggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgU3RyaW5nIGRpciA9IFFOYW1lSGVscGVyLmhleHNhZmUobGFzdHNsYXNoID09IC0xID8gIiIgOiB1cmkuc3Vic3RyaW5nKDAsIGxhc3RzbGFzaCkpOwotICAgICAgICByZXR1cm4gZGlyICsgIi8iICsgdXJpLnN1YnN0cmluZyhsYXN0c2xhc2ggKyAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlcyBhbm90aGVyIFVSSSB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIGR1cmluZyBjb21waWxhdGlvbgotICAgICAqICh0aGlzIGlzIHRoZSBVUkkgdGhhdCBpcyBpbiB0aGUgZG9jdW1lbnQgLk5BTUUgcHJvcGVydHkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU291cmNlVXJpKFN0cmluZyB1cmksIFN0cmluZyBuYW1lVG9Vc2UpCi0gICAgewotICAgICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKG5hbWVUb1VzZSA9PSBudWxsKQotICAgICAgICAgICAgbmFtZVRvVXNlID0gY29tcHV0ZVNhdmVkRmlsZW5hbWUodXJpKTsKLQotICAgICAgICBfc291cmNlRm9yVXJpLnB1dCh1cmksIG5hbWVUb1VzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXJyb3IgbGlzdGVuZXIgYmVpbmcgZmlsbGVkIGluIGR1cmluZyB0aGlzIGNvbXBpbGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JMaXN0ZW5lcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Vycm9yTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1hIHR5cGUgbG9hZGVyIHRvIHVzZSBmb3IgcHJvY2Vzc2luZyBzNHMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRTNFNMb2FkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zNHNsb2FkZXI7Ci0gICAgfQotCi0gICAgTWFwIF9zb3VyY2VGb3JVcmkgPSBuZXcgSGFzaE1hcCgpOwotICAgIFVSSSBfYmFzZVVSSSA9IFVSSS5jcmVhdGUoUFJPSkVDVF9VUkxfUFJFRklYICsgIi8iKTsKLSAgICBTY2hlbWFUeXBlTG9hZGVyIF9zNHNsb2FkZXIgPSBYbWxCZWFucy50eXBlTG9hZGVyRm9yQ2xhc3NMb2FkZXIoU2NoZW1hRG9jdW1lbnQuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjVHJhbnNsYXRvci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2MmY3Ni4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExNiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLio7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5SZWRlZmluZURvY3VtZW50LlJlZGVmaW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbEludGVnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU3RzY1RyYW5zbGF0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0RMX0FSUkFZVFlQRV9OQU1FID0KLSAgICAgICAgUU5hbWVIZWxwZXIuZm9yTE5TKCJhcnJheVR5cGUiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbGxEZWZpbml0aW9ucyhTdHNjSW1wb3J0ZXIuU2NoZW1hVG9Qcm9jZXNzW10gc2NoZW1hc0FuZENoYW1lbGVvbnMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXNBbmRDaGFtZWxlb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRBbGxEZWZpbml0aW9ucygKLSAgICAgICAgICAgICAgICBzY2hlbWFzQW5kQ2hhbWVsZW9uc1tpXS5nZXRTY2hlbWEoKSwKLSAgICAgICAgICAgICAgICBzY2hlbWFzQW5kQ2hhbWVsZW9uc1tpXS5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICBzY2hlbWFzQW5kQ2hhbWVsZW9uc1tpXS5nZXRSZWRlZmluZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbGxEZWZpbml0aW9ucyhTY2hlbWEgc2NoZW1hLCBTdHJpbmcgZ2l2ZW5UYXJnZXROYW1lc3BhY2UsIFJlZGVmaW5lIHJlZGVmaW5lKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIC8vIHF1aWNrIGNoZWNrIGZvciBhIGZldyB1bnN1cHBvcnRlZCBmZWF0dXJlcwotCi0gICAgICAgIGlmIChzY2hlbWEuc2l6ZU9mTm90YXRpb25BcnJheSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUud2FybmluZygiU2NoZW1hIDxub3RhdGlvbj4gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHRoaXMgcmVsZWFzZS4iLCBYbWxFcnJvckNvbnRleHQuVU5TVVBQT1JURURfRkVBVFVSRSwgc2NoZW1hLmdldE5vdGF0aW9uQXJyYXkoMCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBmaWd1cmUgbmFtZXNwYWNlICh0YWtpbmcgaW50byBhY2NvdW50IGNoYW1lbGVvbnMpCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gZmFsc2U7Ci0gICAgICAgIGlmIChnaXZlblRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBnaXZlblRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgIGNoYW1lbGVvbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgIAotICAgICAgICBzdGF0ZS5hZGROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICAvLyBtYWtlIGEgbm90ZSBvZiBhbGwgcmVkZWZpbml0aW9ucwotICAgICAgICBSZWRlZmluaXRpb25Ib2xkZXIgcmVkZWZpbml0aW9ucyA9IG5ldyBSZWRlZmluaXRpb25Ib2xkZXIocmVkZWZpbmUpOwotCi0gICAgICAgIFRvcExldmVsQ29tcGxleFR5cGVbXSBjb21wbGV4VHlwZXMgPSBzY2hlbWEuZ2V0Q29tcGxleFR5cGVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBsZXhUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVG9wTGV2ZWxDb21wbGV4VHlwZSByZWRlZiA9IHJlZGVmaW5pdGlvbnMucmVkZWZpbmVDb21wbGV4VHlwZShjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0YXRlLmFkZEdsb2JhbFR5cGUodHJhbnNsYXRlR2xvYmFsQ29tcGxleFR5cGUoY29tcGxleFR5cGVzW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgZmFsc2UpLCByZWRlZiAhPSBudWxsKTsKLSAgICAgICAgICAgIGlmIChyZWRlZiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLmFkZEdsb2JhbFR5cGUodHJhbnNsYXRlR2xvYmFsQ29tcGxleFR5cGUocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlW10gc2ltcGxlVHlwZXMgPSBzY2hlbWEuZ2V0U2ltcGxlVHlwZUFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2ltcGxlVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcExldmVsU2ltcGxlVHlwZSByZWRlZiA9IHJlZGVmaW5pdGlvbnMucmVkZWZpbmVTaW1wbGVUeXBlKHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5hZGRHbG9iYWxUeXBlKHRyYW5zbGF0ZUdsb2JhbFNpbXBsZVR5cGUoc2ltcGxlVHlwZXNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkR2xvYmFsVHlwZSh0cmFuc2xhdGVHbG9iYWxTaW1wbGVUeXBlKHJlZGVmLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgdHJ1ZSksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRvcExldmVsRWxlbWVudFtdIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgc3RhdGUuYWRkRG9jdW1lbnRUeXBlKHRyYW5zbGF0ZURvY3VtZW50VHlwZShlbGVtZW50LCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiksIFFOYW1lSGVscGVyLmZvckxOUyhlbGVtZW50LmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUb3BMZXZlbEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBzY2hlbWEuZ2V0QXR0cmlidXRlQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVG9wTGV2ZWxBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICAgIHN0YXRlLmFkZEF0dHJpYnV0ZVR5cGUodHJhbnNsYXRlQXR0cmlidXRlVHlwZShhdHRyaWJ1dGUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKSwgUU5hbWVIZWxwZXIuZm9yTE5TKGF0dHJpYnV0ZS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTmFtZWRHcm91cFtdIG1vZGVsZ3JvdXBzID0gc2NoZW1hLmdldEdyb3VwQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbGdyb3Vwcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZWRHcm91cCByZWRlZiA9IHJlZGVmaW5pdGlvbnMucmVkZWZpbmVNb2RlbEdyb3VwKG1vZGVsZ3JvdXBzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5hZGRNb2RlbEdyb3VwKHRyYW5zbGF0ZU1vZGVsR3JvdXAobW9kZWxncm91cHNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkTW9kZWxHcm91cCh0cmFuc2xhdGVNb2RlbEdyb3VwKHJlZGVmLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgdHJ1ZSksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXBbXSBhdHRyZ3JvdXBzID0gc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyZ3JvdXBzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lZEF0dHJpYnV0ZUdyb3VwIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZUF0dHJpYnV0ZUdyb3VwKGF0dHJncm91cHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0YXRlLmFkZEF0dHJpYnV0ZUdyb3VwKHRyYW5zbGF0ZUF0dHJpYnV0ZUdyb3VwKGF0dHJncm91cHNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkQXR0cmlidXRlR3JvdXAodHJhbnNsYXRlQXR0cmlidXRlR3JvdXAocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZWRlZmluaXRpb25zLmNvbXBsYWluQWJvdXRNaXNzaW5nRGVmaW5pdGlvbnMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVkZWZpbml0aW9uSG9sZGVyCi0gICAgewotICAgICAgICAvLyByZWNvcmQgcmVkZWZpbml0aW9ucwotICAgICAgICBwcml2YXRlIE1hcCBzdFJlZGVmaW5pdGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIHByaXZhdGUgTWFwIGN0UmVkZWZpbml0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgcHJpdmF0ZSBNYXAgYWdSZWRlZmluaXRpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgICAgICBwcml2YXRlIE1hcCBtZ1JlZGVmaW5pdGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gIiI7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCBidWlsZCBzZXQgb2YgcmVkZWZpbmVkIGNvbXBvbmVudHMKLSAgICAgICAgUmVkZWZpbml0aW9uSG9sZGVyKFJlZGVmaW5lIHJlZGVmaW5lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVkZWZpbmUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdFJlZGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIGN0UmVkZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgYWdSZWRlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICBtZ1JlZGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIGlmIChyZWRlZmluZS5nZXRTY2hlbWFMb2NhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uID0gcmVkZWZpbmUuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUb3BMZXZlbENvbXBsZXhUeXBlW10gY29tcGxleFR5cGVzID0gcmVkZWZpbmUuZ2V0Q29tcGxleFR5cGVBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxleFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0UmVkZWZpbml0aW9ucy5jb250YWluc0tleShjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRHVwbGljYXRlIHR5cGUgcmVkZWZpbml0aW9uOiAiICsgY29tcGxleFR5cGVzW2ldLmdldE5hbWUoKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RSZWRlZmluaXRpb25zLnB1dChjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpLCBjb21wbGV4VHlwZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIFRvcExldmVsU2ltcGxlVHlwZVtdIHNpbXBsZVR5cGVzID0gcmVkZWZpbmUuZ2V0U2ltcGxlVHlwZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaW1wbGVUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0UmVkZWZpbml0aW9ucy5jb250YWluc0tleShzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UmVkZWZpbml0aW9ucy5wdXQoc2ltcGxlVHlwZXNbaV0uZ2V0TmFtZSgpLCBzaW1wbGVUeXBlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTmFtZWRHcm91cFtdIG1vZGVsZ3JvdXBzID0gcmVkZWZpbmUuZ2V0R3JvdXBBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxncm91cHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZ1JlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRHVwbGljYXRlIHR5cGUgcmVkZWZpbml0aW9uOiAiICsgbW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ1JlZGVmaW5pdGlvbnMucHV0KG1vZGVsZ3JvdXBzW2ldLmdldE5hbWUoKSwgbW9kZWxncm91cHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXBbXSBhdHRyZ3JvdXBzID0gcmVkZWZpbmUuZ2V0QXR0cmlidXRlR3JvdXBBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmdyb3Vwcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyZ3JvdXBzW2ldLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWdSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGF0dHJncm91cHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRHVwbGljYXRlIHR5cGUgcmVkZWZpbml0aW9uOiAiICsgYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnUmVkZWZpbml0aW9ucy5wdXQoYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCksIGF0dHJncm91cHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgVG9wTGV2ZWxTaW1wbGVUeXBlIHJlZGVmaW5lU2ltcGxlVHlwZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhc3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChUb3BMZXZlbFNpbXBsZVR5cGUpc3RSZWRlZmluaXRpb25zLnJlbW92ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFRvcExldmVsQ29tcGxleFR5cGUgcmVkZWZpbmVDb21wbGV4VHlwZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhY3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChUb3BMZXZlbENvbXBsZXhUeXBlKWN0UmVkZWZpbml0aW9ucy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBOYW1lZEdyb3VwIHJlZGVmaW5lTW9kZWxHcm91cChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhbWdSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChOYW1lZEdyb3VwKW1nUmVkZWZpbml0aW9ucy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBOYW1lZEF0dHJpYnV0ZUdyb3VwIHJlZGVmaW5lQXR0cmlidXRlR3JvdXAoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgIWFnUmVkZWZpbml0aW9ucy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoTmFtZWRBdHRyaWJ1dGVHcm91cClhZ1JlZGVmaW5pdGlvbnMucmVtb3ZlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGFpbkFib3V0TWlzc2luZ0RlZmluaXRpb25zKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0UmVkZWZpbml0aW9ucy5pc0VtcHR5KCkgJiYgY3RSZWRlZmluaXRpb25zLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgICAgICAgICBhZ1JlZGVmaW5pdGlvbnMuaXNFbXB0eSgpICYmIG1nUmVkZWZpbml0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0UmVkZWZpbml0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlZGVmaW5lZCBzaW1wbGUgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBub3QgZm91bmQgaW4gIiArIHNjaGVtYUxvY2F0aW9uLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgKFhtbE9iamVjdClzdFJlZGVmaW5pdGlvbnMuZ2V0KG5hbWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY3RSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVkZWZpbmVkIGNvbXBsZXggdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBub3QgZm91bmQgaW4gIiArIHNjaGVtYUxvY2F0aW9uLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgKFhtbE9iamVjdCljdFJlZGVmaW5pdGlvbnMuZ2V0KG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYWdSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVkZWZpbmVkIGF0dHJpYnV0ZSBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBub3QgZm91bmQgaW4gIiArIHNjaGVtYUxvY2F0aW9uLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgKFhtbE9iamVjdClhZ1JlZGVmaW5pdGlvbnMuZ2V0KG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWdSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVkZWZpbmVkIG1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KW1nUmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRGaWxlbmFtZShYbWxPYmplY3QgeG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHNjU3RhdGUuZ2V0KCkuc291cmNlTmFtZUZvclVyaSh4b2JqLmRvY3VtZW50UHJvcGVydGllcygpLmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZUltcGwgdHJhbnNsYXRlRG9jdW1lbnRUeXBlICggVG9wTGV2ZWxFbGVtZW50IHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uICkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNUeXBlID0gbmV3IFNjaGVtYVR5cGVJbXBsKCBTdHNjU3RhdGUuZ2V0KCkuc3RzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHNUeXBlLnNldERvY3VtZW50VHlwZSh0cnVlKTsKLSAgICAgICAgc1R5cGUuc2V0UGFyc2VDb250ZXh0KCB4c2RUeXBlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgZmFsc2UpOwotICAgICAgICBzVHlwZS5zZXRGaWxlbmFtZSggZmluZEZpbGVuYW1lKCB4c2RUeXBlICkgKTsKLQotICAgICAgICByZXR1cm4gc1R5cGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVJbXBsIHRyYW5zbGF0ZUF0dHJpYnV0ZVR5cGUgKCBUb3BMZXZlbEF0dHJpYnV0ZSB4c2RUeXBlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiApCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZSA9IG5ldyBTY2hlbWFUeXBlSW1wbCggU3RzY1N0YXRlLmdldCgpLnN0cygpICk7Ci0gICAgICAgIAotICAgICAgICBzVHlwZS5zZXRBdHRyaWJ1dGVUeXBlKHRydWUpOwotICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoIHhzZFR5cGUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSk7Ci0gICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKCBmaW5kRmlsZW5hbWUoIHhzZFR5cGUgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNUeXBlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlSW1wbCB0cmFuc2xhdGVHbG9iYWxDb21wbGV4VHlwZShUb3BMZXZlbENvbXBsZXhUeXBlIHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0geHNkVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChsb2NhbG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkdsb2JhbCB0eXBlIG1pc3NpbmcgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkdMT0JBTF9UWVBFX01JU1NJTkdfTkFNRSwgeHNkVHlwZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHVubmFtZWQgdHlwZXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZE5DTmFtZShsb2NhbG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCB0eXBlIG5hbWUgXCIiICsgbG9jYWxuYW1lICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkVHlwZS54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCi0gICAgICAgIH0KLQotICAgICAgICBRTmFtZSBuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKGxvY2FsbmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpc1Jlc2VydmVkVHlwZU5hbWUobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIlNraXBwaW5nIGRlZmluaXRpb24gb2YgYnVpbHQtaW4gdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuUkVTRVJWRURfVFlQRV9OQU1FLCB4c2RUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiUmVjb3JkaW5nIHR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGUgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoeHNkVHlwZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbik7Ci0gICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKGZpbmRGaWxlbmFtZSh4c2RUeXBlKSk7Ci0gICAgICAgIHNUeXBlLnNldE5hbWUoUU5hbWVIZWxwZXIuZm9yTE5TKGxvY2FsbmFtZSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlSW1wbCB0cmFuc2xhdGVHbG9iYWxTaW1wbGVUeXBlKFRvcExldmVsU2ltcGxlVHlwZSB4c2RUeXBlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgYm9vbGVhbiByZWRlZmluaXRpb24pCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IHhzZFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobG9jYWxuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJHbG9iYWwgdHlwZSBtaXNzaW5nIGEgbmFtZSIsIFhtbEVycm9yQ29udGV4dC5HTE9CQUxfVFlQRV9NSVNTSU5HX05BTUUsIHhzZFR5cGUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB1bm5hbWVkIHR5cGVzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUobG9jYWxuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkludmFsaWQgdHlwZSBuYW1lIFwiIiArIGxvY2FsbmFtZSArICJcIiIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZFR5cGUueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogbGV0IHRoZSBuYW1lIGdvIHRocm91Z2ggYW55d2F5LgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBRTmFtZSBuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKGxvY2FsbmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpc1Jlc2VydmVkVHlwZU5hbWUobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIlNraXBwaW5nIGRlZmluaXRpb24gb2YgYnVpbHQtaW4gdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuUkVTRVJWRURfVFlQRV9OQU1FLCB4c2RUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiUmVjb3JkaW5nIHR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGUgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICBzVHlwZS5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoeHNkVHlwZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbik7Ci0gICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKGZpbmRGaWxlbmFtZSh4c2RUeXBlKSk7Ci0gICAgICAgIHNUeXBlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRm9ybUNob2ljZSBmaW5kRWxlbWVudEZvcm1EZWZhdWx0KFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3VyID0gb2JqLm5ld0N1cnNvcigpOwotICAgICAgICB3aGlsZSAoY3VyLmdldE9iamVjdCgpLnNjaGVtYVR5cGUoKSAhPSBTY2hlbWEudHlwZSkKLSAgICAgICAgICAgIGlmICghY3VyLnRvUGFyZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoKFNjaGVtYSljdXIuZ2V0T2JqZWN0KCkpLnhnZXRFbGVtZW50Rm9ybURlZmF1bHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXJpTWF0Y2goU3RyaW5nIHMxLCBTdHJpbmcgczIpCi0gICAgewotICAgICAgICBpZiAoczEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzMiA9PSBudWxsIHx8IHMyLmVxdWFscygiIik7Ci0gICAgICAgIGlmIChzMiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHMxLmVxdWFscygiIik7Ci0gICAgICAgIHJldHVybiBzMS5lcXVhbHMoczIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5R2xvYmFsRWxlbWVudFRvTG9jYWxFbGVtZW50KFNjaGVtYUdsb2JhbEVsZW1lbnQgcmVmZXJlbmNlZCwgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCB0YXJnZXQgKQotICAgIHsKLQotICAgICAgICB0YXJnZXQuc2V0TmFtZUFuZFR5cGVSZWYocmVmZXJlbmNlZC5nZXROYW1lKCksIHJlZmVyZW5jZWQuZ2V0VHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgdGFyZ2V0LnNldE5pbGxhYmxlKHJlZmVyZW5jZWQuaXNOaWxsYWJsZSgpKTsKLSAgICAgICAgdGFyZ2V0LnNldERlZmF1bHQocmVmZXJlbmNlZC5nZXREZWZhdWx0VGV4dCgpLCByZWZlcmVuY2VkLmlzRml4ZWQoKSwgKChTY2hlbWFHbG9iYWxFbGVtZW50SW1wbClyZWZlcmVuY2VkKS5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgdGFyZ2V0LnNldElkZW50aXR5Q29uc3RyYWludHMoKChTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKXJlZmVyZW5jZWQpLmdldElkZW50aXR5Q29uc3RyYWludFJlZnMoKSk7Ci0gICAgICAgIHRhcmdldC5zZXRCbG9jayhyZWZlcmVuY2VkLmJsb2NrRXh0ZW5zaW9uKCksICByZWZlcmVuY2VkLmJsb2NrUmVzdHJpY3Rpb24oKSwgIHJlZmVyZW5jZWQuYmxvY2tTdWJzdGl0dXRpb24oKSk7Ci0gICAgICAgIHRhcmdldC5zZXRBYnN0cmFjdChyZWZlcmVuY2VkLmlzQWJzdHJhY3QoKSk7Ci0gICAgICAgIHRhcmdldC5zZXRUcmFuc2l0aW9uUnVsZXMoKChTY2hlbWFQYXJ0aWNsZSlyZWZlcmVuY2VkKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSwKLSAgICAgICAgICAgICgoU2NoZW1hUGFydGljbGUpcmVmZXJlbmNlZCkuaXNTa2lwcGFibGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlHbG9iYWxBdHRyaWJ1dGVUb0xvY2FsQXR0cmlidXRlKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgcmVmZXJlbmNlZCwgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHRhcmdldCApCi0gICAgewotICAgICAgICB0YXJnZXQuaW5pdCgKLSAgICAgICAgICAgIHJlZmVyZW5jZWQuZ2V0TmFtZSgpLCByZWZlcmVuY2VkLmdldFR5cGVSZWYoKSwgcmVmZXJlbmNlZC5nZXRVc2UoKSwKLSAgICAgICAgICAgIHJlZmVyZW5jZWQuZ2V0RGVmYXVsdFRleHQoKSwKLSAgICAgICAgICAgICAgICByZWZlcmVuY2VkLmdldFBhcnNlT2JqZWN0KCksIHJlZmVyZW5jZWQuX2RlZmF1bHRWYWx1ZSwKLSAgICAgICAgICAgIHJlZmVyZW5jZWQuaXNGaXhlZCgpLAotICAgICAgICAgICAgcmVmZXJlbmNlZC5nZXRXU0RMQXJyYXlUeXBlKCkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIGEgbG9jYWwgb3IgZ2xvYmFsIHNjaGVtYSBlbGVtZW50LgotICAgICAqLwotICAgIC8vIGNoZWNrIHJ1bGUgMy4zLjMKLSAgICAvLyBodHRwOi8vd3d3LnczYy5vcmcvVFIvI3NlY3Rpb24tQ29uc3RyYWludHMtb24tWE1MLVJlcHJlc2VudGF0aW9ucy1vZi1FbGVtZW50LURlY2xhcmF0aW9ucwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCB0cmFuc2xhdGVFbGVtZW50KAotICAgICAgICBFbGVtZW50IHhzZEVsdCwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sCi0gICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMsIFNjaGVtYVR5cGUgb3V0ZXJUeXBlKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNnSGVhZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gdHJhbnNsYXRlIHNnIGhlYWQKLSAgICAgICAgaWYgKHhzZEVsdC5pc1NldFN1YnN0aXR1dGlvbkdyb3VwKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNnSGVhZCA9IHN0YXRlLmZpbmREb2N1bWVudFR5cGUoeHNkRWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksCi0gICAgICAgICAgICAgICAgKChTY2hlbWFUeXBlSW1wbClvdXRlclR5cGUpLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgaWYgKHNnSGVhZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIFN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZShzZ0hlYWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB4c2RFbHQuZ2V0TmFtZSgpOwotICAgICAgICBRTmFtZSByZWYgPSB4c2RFbHQuZ2V0UmVmKCk7Ci0KLQotICAgICAgICBpZiAocmVmICE9IG51bGwgJiYgbmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiAobmFtZS5lcXVhbHMocmVmLmdldExvY2FsUGFydCgpKSAmJiB1cmlNYXRjaCh0YXJnZXROYW1lc3BhY2UsIHJlZi5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgICAvLyAgICAgc3RhdGUud2FybmluZygiRWxlbWVudCAiICsgbmFtZSArICIgc3BlY2lmaWVzIGJvdGggYSByZWYgYW5kIGEgbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX0VYVFJBX1JFRiwgeHNkRWx0LnhnZXRSZWYoKSk7Ci0gICAgICAgICAgICAvLyBlbHNlCi0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIG5hbWUgKyAiIHNwZWNpZmllcyBib3RoIGEgcmVmIGFuZCBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9FWFRSQV9SRUYsIHhzZEVsdC54Z2V0UmVmKCkpOwotICAgICAgICAgICAgLy8gaWdub3JlIG5hbWUKLSAgICAgICAgICAgIG5hbWUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCAmJiBuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50IGhhcyBubyBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfTUlTU0lOR19OQU1FLCB4c2RFbHQpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkludmFsaWQgZWxlbWVudCBuYW1lIFwiIiArIG5hbWUgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RFbHQueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogbGV0IHRoZSBuYW1lIGdvIHRocm91Z2ggYW55d2F5LgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHNkRWx0LmdldFR5cGUoKSAhPSBudWxsIHx8IHhzZEVsdC5nZXRTaW1wbGVUeXBlKCkgIT0gbnVsbCB8fCB4c2RFbHQuZ2V0Q29tcGxleFR5cGUoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50IHJlZmVyZW5jZSBjYW5ub3QgYWxzbyBzcGVjaWZ5IGEgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHhzZEVsdC5nZXRGb3JtKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCByZWZlcmVuY2UgY2Fubm90IGFsc28gc3BlY2lmeSBmb3JtIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogbGV0IHRoZSBuYW1lIGdvIHRocm91Z2ggYW55d2F5LgotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LnNpemVPZktleUFycmF5KCkgPiAwIHx8IHhzZEVsdC5zaXplT2ZLZXlyZWZBcnJheSgpID4gMCB8fCB4c2RFbHQuc2l6ZU9mVW5pcXVlQXJyYXkoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUud2FybmluZygiRWxlbWVudCByZWZlcmVuY2UgY2Fubm90IGFsc28gY29udGFpbiBrZXksIGtleXJlZiwgb3IgdW5pcXVlIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4c2RFbHQuaXNTZXREZWZhdWx0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUud2FybmluZygiRWxlbWVudCB3aXRoIHJlZmVyZW5jZSB0byAnIiArIHJlZi5nZXRMb2NhbFBhcnQoKSArICInIGNhbm5vdCBhbHNvIHNwZWNpZnkgZGVmYXVsdCIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LmlzU2V0Rml4ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHdpdGggcmVmZXJlbmNlIHRvICciICsgcmVmLmdldExvY2FsUGFydCgpICsgIicgY2Fubm90IGFsc28gc3BlY2lmeSBmaXhlZCIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LmlzU2V0QmxvY2soKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHdpdGggcmVmZXJlbmNlIHRvICciICsgcmVmLmdldExvY2FsUGFydCgpICsgIicgY2Fubm90IGFsc28gc3BlY2lmeSBibG9jayIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LmlzU2V0TmlsbGFibGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHdpdGggcmVmZXJlbmNlIHRvICciICsgcmVmLmdldExvY2FsUGFydCgpICsgIicgY2Fubm90IGFsc28gc3BlY2lmeSBuaWxsYWJsZSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQoeHNkRWx0IGluc3RhbmNlb2YgTG9jYWxFbGVtZW50KTsKLSAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgcmVmZXJlbmNlZCA9IHN0YXRlLmZpbmRHbG9iYWxFbGVtZW50KHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocmVmLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9SRUZfTk9UX0ZPVU5ELCB4c2RFbHQueGdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCB0YXJnZXQgPSBuZXcgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCgpOwotICAgICAgICAgICAgdGFyZ2V0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKLSAgICAgICAgICAgIGNvcHlHbG9iYWxFbGVtZW50VG9Mb2NhbEVsZW1lbnQoIHJlZmVyZW5jZWQsIHRhcmdldCApOwotICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIHFuYW1lOwotICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGltcGw7Ci0gICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBudWxsOwotCi0gICAgICAgIGlmICh4c2RFbHQgaW5zdGFuY2VvZiBMb2NhbEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGltcGwgPSBuZXcgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCgpOwotICAgICAgICAgICAgRm9ybUNob2ljZSBmb3JtID0geHNkRWx0LnhnZXRGb3JtKCk7Ci0gICAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGZvcm0gPSBmaW5kRWxlbWVudEZvcm1EZWZhdWx0KHhzZEVsdCk7Ci0gICAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsIHx8IGZvcm0uZ2V0U3RyaW5nVmFsdWUoKS5lcXVhbHMoInVucXVhbGlmaWVkIikpCi0gICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTihuYW1lKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZ2VsdCA9IG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgICAgICBpbXBsID0gZ2VsdDsKLQotICAgICAgICAgICAgLy8gU2V0IHN1YnN0IGdyb3VwIGhlYWQKLSAgICAgICAgICAgIGlmIChzZ0hlYWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBoZWFkID0gc3RhdGUuZmluZEdsb2JhbEVsZW1lbnQoeHNkRWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChoZWFkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGdlbHQuc2V0U3Vic3RpdHV0aW9uR3JvdXAoaGVhZC5nZXRSZWYoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCBzdWJzdCBncm91cCBtZW1iZXJzCi0gICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgZG9jVHlwZSA9IChTY2hlbWFUeXBlSW1wbClvdXRlclR5cGU7Ci0KLSAgICAgICAgICAgIFFOYW1lW10gc2dNZW1iZXJzID0gZG9jVHlwZS5nZXRTdWJzdGl0dXRpb25Hcm91cE1lbWJlcnMoKTsKLSAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciB0cmFuc2l0aW9uUnVsZXMgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgICAgICB0cmFuc2l0aW9uUnVsZXMuYWRkKHFuYW1lKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2dNZW1iZXJzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZWx0LmFkZFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVyKHNnTWVtYmVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgdHJhbnNpdGlvblJ1bGVzLmFkZChzZ01lbWJlcnNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbXBsLnNldFRyYW5zaXRpb25SdWxlcyhRTmFtZVNldC5mb3JTcGVjaWZpY2F0aW9uKHRyYW5zaXRpb25SdWxlcyksIGZhbHNlKTsKLSAgICAgICAgICAgIGltcGwuc2V0VHJhbnNpdGlvbk5vdGVzKFFOYW1lU2V0LkVNUFRZLCB0cnVlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmaW5hbEV4dCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmaW5hbFJlc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIE9iamVjdCBkcyA9IHhzZEVsdC5nZXRGaW5hbCgpOwotICAgICAgICAgICAgaWYgKGRzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzIGluc3RhbmNlb2YgU3RyaW5nICYmIGRzLmVxdWFscygiI2FsbCIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gI0FMTCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBmaW5hbEV4dCA9IGZpbmFsUmVzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKExpc3QpZHMpLmNvbnRhaW5zKCJleHRlbnNpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoInJlc3RyaWN0aW9uIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFJlc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2VsdC5zZXRGaW5hbChmaW5hbEV4dCwgZmluYWxSZXN0KTsKLSAgICAgICAgICAgIGdlbHQuc2V0QWJzdHJhY3QoeHNkRWx0LmdldEFic3RyYWN0KCkpOwotICAgICAgICAgICAgZ2VsdC5zZXRGaWxlbmFtZShmaW5kRmlsZW5hbWUoeHNkRWx0KSk7Ci0gICAgICAgICAgICBnZWx0LnNldFBhcnNlQ29udGV4dCh4c2RFbHQsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4c2RFbHQuZ2V0VHlwZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNUeXBlID0gc3RhdGUuZmluZEdsb2JhbFR5cGUoeHNkRWx0LmdldFR5cGUoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCApOwotICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcih4c2RFbHQuZ2V0VHlwZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHhzZEVsdC54Z2V0VHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc2ltcGxlVHlwZWRlZiA9IGZhbHNlOwotICAgICAgICBYbWxPYmplY3QgdHlwZWRlZiA9IHhzZEVsdC5nZXRDb21wbGV4VHlwZSgpOwotICAgICAgICBpZiAodHlwZWRlZiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlZGVmID0geHNkRWx0LmdldFNpbXBsZVR5cGUoKTsKLSAgICAgICAgICAgIHNpbXBsZVR5cGVkZWYgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChzVHlwZSAhPSBudWxsKSAmJiB0eXBlZGVmICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbGxlZ2FsIHRvIGRlZmluZSBhIG5lc3RlZCB0eXBlIHdoZW4gYSB0eXBlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX05FU1RFRF9UWVBFLCB0eXBlZGVmKTsKLSAgICAgICAgICAgIHR5cGVkZWYgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGVkZWYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGVJbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgIHNUeXBlID0gc1R5cGVJbXBsOwotICAgICAgICAgICAgc1R5cGVJbXBsLnNldENvbnRhaW5lckZpZWxkKGltcGwpOwotICAgICAgICAgICAgc1R5cGVJbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihvdXRlclR5cGUgPT0gbnVsbCA/IG51bGwgOiBvdXRlclR5cGUuZ2V0UmVmKCkpOwotICAgICAgICAgICAgLy8gbGVhdmUgdGhlIGFub255bW91cyB0eXBlIHVucmVzb2x2ZWQ6IGl0IHdpbGwgYmUgcmVzb2x2ZWQgbGF0ZXIuCi0gICAgICAgICAgICBhbm9ueW1vdXNUeXBlcy5hZGQoc1R5cGUpOwotICAgICAgICAgICAgc1R5cGVJbXBsLnNldFNpbXBsZVR5cGUoc2ltcGxlVHlwZWRlZik7Ci0gICAgICAgICAgICBzVHlwZUltcGwuc2V0UGFyc2VDb250ZXh0KHR5cGVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdHlwZSBtYXkgaW5oZXJpdCBmcm9tIHN1YnN0aXR1dGlvbiBncm91cCBoZWFkCi0gICAgICAgICAgICBpZiAoc2dIZWFkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBoZWFkID0gc3RhdGUuZmluZEdsb2JhbEVsZW1lbnQoeHNkRWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwpOwotCi0gICAgICAgICAgICAgICAgLy8gQnVnIC0gRG8gSSBuZWVkIHRvIGNvcHkgdGhlIHR5cGUgaWYgaXQncyBhbm9ueW1vdXM/Ci0gICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBkb2VzIG5vdCBleGlzdCwgZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZAotICAgICAgICAgICAgICAgIGlmIChoZWFkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNUeXBlID0gaGVhZC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHNUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEU7Ci0KLSAgICAgICAgU09BUEFycmF5VHlwZSB3YXQgPSBudWxsOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHhzZEVsdC5uZXdDdXJzb3IoKTsKLSAgICAgICAgU3RyaW5nIGFycmF5VHlwZSA9IGMuZ2V0QXR0cmlidXRlVGV4dChXU0RMX0FSUkFZVFlQRV9OQU1FKTsKLSAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChhcnJheVR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd2F0ID0gbmV3IFNPQVBBcnJheVR5cGUoYXJyYXlUeXBlLCBuZXcgTmFtZXNwYWNlQ29udGV4dCh4c2RFbHQpKTsKLSAgICAgICAgfQotICAgICAgICBpbXBsLnNldFdzZGxBcnJheVR5cGUod2F0KTsKLQotICAgICAgICBib29sZWFuIGlzRml4ZWQgPSB4c2RFbHQuaXNTZXRGaXhlZCgpOwotICAgICAgICBpZiAoeHNkRWx0LmlzU2V0RGVmYXVsdCgpICYmIGlzRml4ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJTaG91bGQgbm90IHNldCBib3RoIGRlZmF1bHQgYW5kIGZpeGVkIG9uIHRoZSBzYW1lIGVsZW1lbnQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0RFRkFVTFRfRklYRUQsIHhzZEVsdC54Z2V0Rml4ZWQoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIGZpeGVkCi0gICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaW1wbC5zZXRQYXJ0aWNsZVR5cGUoU2NoZW1hUGFydGljbGUuRUxFTUVOVCk7Ci0gICAgICAgIGltcGwuc2V0TmFtZUFuZFR5cGVSZWYocW5hbWUsIHNUeXBlLmdldFJlZigpKTsKLSAgICAgICAgaW1wbC5zZXROaWxsYWJsZSh4c2RFbHQuZ2V0TmlsbGFibGUoKSk7Ci0gICAgICAgIGltcGwuc2V0RGVmYXVsdChpc0ZpeGVkID8geHNkRWx0LmdldEZpeGVkKCkgOiB4c2RFbHQuZ2V0RGVmYXVsdCgpLCBpc0ZpeGVkLCB4c2RFbHQpOwotCi0gICAgICAgIE9iamVjdCBibG9jayA9IHhzZEVsdC5nZXRCbG9jaygpOwotICAgICAgICBib29sZWFuIGJsb2NrRXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYmxvY2tSZXN0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYmxvY2tTdWJzdCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChibG9jayAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBTdHJpbmcgJiYgYmxvY2suZXF1YWxzKCIjYWxsIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gI0FMTCB2YWx1ZQotICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gYmxvY2tSZXN0ID0gYmxvY2tTdWJzdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChibG9jayBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoImV4dGVuc2lvbiIpKQotICAgICAgICAgICAgICAgICAgICBibG9ja0V4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoInJlc3RyaWN0aW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrUmVzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoInN1YnN0aXR1dGlvbiIpKQotICAgICAgICAgICAgICAgICAgICBibG9ja1N1YnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW1wbC5zZXRCbG9jayhibG9ja0V4dCwgYmxvY2tSZXN0LCBibG9ja1N1YnN0KTsKLQotICAgICAgICBib29sZWFuIGNvbnN0cmFpbnRGYWlsZWQgPSBmYWxzZTsKLQotICAgICAgICAvLyBUcmFuc2xhdGUgSWRlbnRpdHkgY29uc3RyYWludHMKLQotICAgICAgICBpbnQgbGVuZ3RoID0geHNkRWx0LnNpemVPZktleUFycmF5KCkgKyB4c2RFbHQuc2l6ZU9mS2V5cmVmQXJyYXkoKSArIHhzZEVsdC5zaXplT2ZVbmlxdWVBcnJheSgpOwotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW10gY29uc3RyYWludHMgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbFtsZW5ndGhdOwotICAgICAgICBpbnQgY3VyID0gMDsKLQotICAgICAgICAvLyBIYW5kbGUga2V5IGNvbnN0cmFpbnRzCi0gICAgICAgIEtleWJhc2VbXSBrZXlzID0geHNkRWx0LmdldEtleUFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGtleXMubGVuZ3RoIDsgaSsrLCBjdXIrKykgewotICAgICAgICAgICAgY29uc3RyYWludHNbY3VyXSA9IHRyYW5zbGF0ZUlkZW50aXR5Q29uc3RyYWludChrZXlzW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7Ci0gICAgICAgICAgICBpZiAoY29uc3RyYWludHNbY3VyXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0uc2V0Q29uc3RyYWludENhdGVnb3J5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRGYWlsZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIHVuaXF1ZSBjb25zdHJhaW50cwotICAgICAgICBLZXliYXNlW10gdWMgPSB4c2RFbHQuZ2V0VW5pcXVlQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdWMubGVuZ3RoIDsgaSsrLCBjdXIrKykgewotICAgICAgICAgICAgY29uc3RyYWludHNbY3VyXSA9IHRyYW5zbGF0ZUlkZW50aXR5Q29uc3RyYWludCh1Y1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOwotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzW2N1cl0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdLnNldENvbnN0cmFpbnRDYXRlZ29yeShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfVU5JUVVFKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50RmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBrZXlyZWYgY29uc3RyYWludHMKLSAgICAgICAgS2V5cmVmRG9jdW1lbnQuS2V5cmVmW10ga3JzID0geHNkRWx0LmdldEtleXJlZkFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGtycy5sZW5ndGggOyBpKyssIGN1cisrKSB7Ci0gICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdID0gdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KGtyc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOwotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzW2N1cl0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdLnNldENvbnN0cmFpbnRDYXRlZ29yeShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZUkVGKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50RmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29uc3RyYWludEZhaWxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIHJlZnMgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltsZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcmVmcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgcmVmc1tpXSA9IGNvbnN0cmFpbnRzW2ldLmdldFJlZigpOwotCi0gICAgICAgICAgICBpbXBsLnNldElkZW50aXR5Q29uc3RyYWludHMocmVmcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW1wbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlc3BhY2UoU3RyaW5nIHhwYXRoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhwYXRoLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB4cGF0aC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoWE1MQ2hhci5pc1NwYWNlKGNoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uIFhQQVRIX1JFR0VYUCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24oIihcXC4vLyk/KCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pLykqKCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pfCgoYXR0cmlidXRlOjp8QCkoKFxcaVxcYyo6KT8oXFxpXFxjKnxcXCopKSkpKFxcfChcXC4vLyk/KCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pLykqKCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pfCgoYXR0cmlidXRlOjp8QCkoKFxcaVxcYyo6KT8oXFxpXFxjKnxcXCopKSkpKSoiLCAiWCIpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tYUGF0aFN5bnRheChTdHJpbmcgeHBhdGgpCi0gICAgewotICAgICAgICBpZiAoeHBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8vIHN0cmlwIHdoaXRlc3BhY2UgZnJvbSB4cGF0aAotICAgICAgICB4cGF0aCA9IHJlbW92ZVdoaXRlc3BhY2UoeHBhdGgpOwotICAgICAgICAKLSAgICAgICAgLy8gYXBwbHkgcmVnZXhwCi0gICAgICAgIHN5bmNocm9uaXplZCAoWFBBVEhfUkVHRVhQKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFhQQVRIX1JFR0VYUC5tYXRjaGVzKHhwYXRoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIHRyYW5zbGF0ZUlkZW50aXR5Q29uc3RyYWludChLZXliYXNlIHBhcnNlSUMsIAotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGZpcnN0IGRvIHNvbWUgY2hlY2tpbmcKLSAgICAgICAgU3RyaW5nIHNlbGVjdG9yID0gcGFyc2VJQy5nZXRTZWxlY3RvcigpID09IG51bGwgPyBudWxsIDogcGFyc2VJQy5nZXRTZWxlY3RvcigpLmdldFhwYXRoKCk7Ci0gICAgICAgIGlmICghY2hlY2tYUGF0aFN5bnRheChzZWxlY3RvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW52YWxpZCB4cGF0aCBpbiBzZWxlY3Rvci4iLAotICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5YUEFUSF9DT01QSUxBVElPTl9GQUlMVVJFLCBwYXJzZUlDLmdldFNlbGVjdG9yKCkueGdldFhwYXRoKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpZWxkRG9jdW1lbnQuRmllbGRbXSBmaWVsZEVsdHMgPSBwYXJzZUlDLmdldEZpZWxkQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWVsZEVsdHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hlY2tYUGF0aFN5bnRheChmaWVsZEVsdHNbal0uZ2V0WHBhdGgoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbnZhbGlkIHhwYXRoIGluIGZpZWxkLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5YUEFUSF9DT01QSUxBVElPTl9GQUlMVVJFLCBmaWVsZEVsdHNbal0ueGdldFhwYXRoKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyB0aGVuIHRyYW5zbGF0ZS4KLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbCBpYyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgaWMuc2V0TmFtZShRTmFtZUhlbHBlci5mb3JMTlMocGFyc2VJQy5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSkpOwotICAgICAgICBpYy5zZXRTZWxlY3RvcihwYXJzZUlDLmdldFNlbGVjdG9yKCkuZ2V0WHBhdGgoKSk7Ci0gICAgICAgIGljLnNldFBhcnNlQ29udGV4dChwYXJzZUlDLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBucyBtYXAKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBwYXJzZUlDLm5ld0N1cnNvcigpOwotICAgICAgICBNYXAgbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGMuZ2V0QWxsTmFtZXNwYWNlcyhuc01hcCk7Ci0gICAgICAgIG5zTWFwLnJlbW92ZSgiIik7IC8vIFJlbW92ZSB0aGUgZGVmYXVsdCBtYXBwaW5nLiBUaGlzIGNhbm5vdCBiZSB1c2VkIGJ5IHRoZSB4cGF0aCBleHByZXNzaW9ucy4KLSAgICAgICAgaWMuc2V0TlNNYXAobnNNYXApOwotICAgICAgICBjLmRpc3Bvc2UoKTsKLQotICAgICAgICBTdHJpbmdbXSBmaWVsZHMgPSBuZXcgU3RyaW5nW2ZpZWxkRWx0cy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCBmaWVsZHMubGVuZ3RoIDsgaisrKQotICAgICAgICAgICAgZmllbGRzW2pdID0gZmllbGRFbHRzW2pdLmdldFhwYXRoKCk7Ci0gICAgICAgIGljLnNldEZpZWxkcyhmaWVsZHMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpYy5idWlsZFBhdGhzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhQYXRoLlhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkludmFsaWQgeHBhdGggaW4gaWRlbnRpdHkgY29uc3RyYWludDogIiArIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5YUEFUSF9DT01QSUxBVElPTl9GQUlMVVJFLCBwYXJzZUlDKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZS5hZGRJZENvbnN0cmFpbnQoaWMpOwotCi0gICAgICAgIHJldHVybiBpYzsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hTW9kZWxHcm91cEltcGwgdHJhbnNsYXRlTW9kZWxHcm91cChOYW1lZEdyb3VwIG5hbWVkR3JvdXAsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRHcm91cC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiTW9kZWwgZ3JvdXBzIG11c3QgYmUgbmFtZWQiLCBYbWxFcnJvckNvbnRleHQuTU9ERUxfR1JPVVBfTUlTU0lOR19OQU1FLCBuYW1lZEdyb3VwKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIHJlc3VsdCA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwSW1wbChTdHNjU3RhdGUuZ2V0KCkuc3RzKCkpOwotICAgICAgICByZXN1bHQuaW5pdChRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbiwgbmFtZWRHcm91cCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgdHJhbnNsYXRlQXR0cmlidXRlR3JvdXAoQXR0cmlidXRlR3JvdXAgYXR0ckdyb3VwLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgYm9vbGVhbiByZWRlZmluaXRpb24pCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJHcm91cC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQXR0cmlidXRlIGdyb3VwcyBtdXN0IGJlIG5hbWVkIiwgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9HUk9VUF9NSVNTSU5HX05BTUUsIGF0dHJHcm91cCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgcmVzdWx0ID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbChTdHNjU3RhdGUuZ2V0KCkuc3RzKCkpOwotICAgICAgICByZXN1bHQuaW5pdChRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbiwgYXR0ckdyb3VwKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRm9ybUNob2ljZSBmaW5kQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjdXIgPSBvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHdoaWxlIChjdXIuZ2V0T2JqZWN0KCkuc2NoZW1hVHlwZSgpICE9IFNjaGVtYS50eXBlKQotICAgICAgICAgICAgaWYgKCFjdXIudG9QYXJlbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuICgoU2NoZW1hKWN1ci5nZXRPYmplY3QoKSkueGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCB0cmFuc2xhdGVBdHRyaWJ1dGUoCi0gICAgICAgIEF0dHJpYnV0ZSB4c2RBdHRyLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgTGlzdCBhbm9ueW1vdXNUeXBlcywKLSAgICAgICAgU2NoZW1hVHlwZSBvdXRlclR5cGUsIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGJhc2VNb2RlbCwgYm9vbGVhbiBsb2NhbCkKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IHhzZEF0dHIuZ2V0TmFtZSgpOwotICAgICAgICBRTmFtZSByZWYgPSB4c2RBdHRyLmdldFJlZigpOwotCi0gICAgICAgIGlmIChyZWYgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhyZWYuZ2V0TG9jYWxQYXJ0KCkpICYmIHVyaU1hdGNoKHRhcmdldE5hbWVzcGFjZSwgcmVmLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJBdHRyaWJ1dGUgIiArIG5hbWUgKyAiIHNwZWNpZmllcyBib3RoIGEgcmVmIGFuZCBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9FWFRSQV9SRUYsIHhzZEF0dHIueGdldFJlZigpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlICIgKyBuYW1lICsgIiBzcGVjaWZpZXMgYm90aCBhIHJlZiBhbmQgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfRVhUUkFfUkVGLCB4c2RBdHRyLnhnZXRSZWYoKSk7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbmFtZQotICAgICAgICAgICAgbmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlZiA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZSBoYXMgbm8gbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX01JU1NJTkdfTkFNRSwgeHNkQXR0cik7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCBhdHRyaWJ1dGUgbmFtZSBcIiIgKyBuYW1lICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkQXR0ci54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCi0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGRlZnRleHQgPSBudWxsOwotICAgICAgICBRTmFtZSBxbmFtZTsKLSAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHNBdHRyOwotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gbnVsbDsKLSAgICAgICAgaW50IHVzZSA9IFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMOwotCi0gICAgICAgIGlmIChsb2NhbCkKLSAgICAgICAgICAgIHNBdHRyID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNBdHRyID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICAgICAgKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKXNBdHRyKS5zZXRQYXJzZUNvbnRleHQoeHNkQXR0ciwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHNkQXR0ci5nZXRUeXBlKCkgIT0gbnVsbCB8fCB4c2RBdHRyLmdldFNpbXBsZVR5cGUoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgcmVmZXJlbmNlIGNhbm5vdCBhbHNvIHNwZWNpZnkgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEF0dHIpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdHlwZSwgc2ltcGxlVHlwZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkQXR0ci5nZXRGb3JtKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIHJlZmVyZW5jZSBjYW5ub3QgYWxzbyBzcGVjaWZ5IGZvcm0iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIGZvcm0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlIHJlZmVyZW5jZWQgPSBzdGF0ZS5maW5kR2xvYmFsQXR0cmlidXRlKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocmVmLCBYbWxFcnJvckNvbnRleHQuQVRUUklCVVRFX1JFRl9OT1RfRk9VTkQsIHhzZEF0dHIueGdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxbmFtZSA9IHJlZjsKLSAgICAgICAgICAgIHVzZSA9IHJlZmVyZW5jZWQuZ2V0VXNlKCk7Ci0gICAgICAgICAgICBzVHlwZSA9IHJlZmVyZW5jZWQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgZGVmdGV4dCA9IHJlZmVyZW5jZWQuZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAgICAgICAgIGlmIChkZWZ0ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXNGaXhlZCA9IHJlZmVyZW5jZWQuaXNGaXhlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvY2FsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZvcm1DaG9pY2UgZm9ybSA9IHhzZEF0dHIueGdldEZvcm0oKTsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBmb3JtID0gZmluZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KHhzZEF0dHIpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwgfHwgZm9ybS5nZXRTdHJpbmdWYWx1ZSgpLmVxdWFscygidW5xdWFsaWZpZWQiKSkKLSAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTihuYW1lKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKG5hbWUsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHhzZEF0dHIuZ2V0VHlwZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc1R5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZSh4c2RBdHRyLmdldFR5cGUoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCApOwotICAgICAgICAgICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHhzZEF0dHIuZ2V0VHlwZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHhzZEF0dHIueGdldFR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgbmFtZXNwYWNlIGZvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkQXR0ci54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgJiYgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCJ4bWxucyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbGxlZ2FsIG5hbWUgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyLnhnZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBYbWxPYmplY3QgdHlwZWRlZiA9IHhzZEF0dHIuZ2V0U2ltcGxlVHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoKHNUeXBlICE9IG51bGwpICYmIHR5cGVkZWYgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSWxsZWdhbCB0byBkZWZpbmUgYSBuZXN0ZWQgdHlwZSB3aGVuIGEgdHlwZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIiwgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9ORVNURURfVFlQRSwgdHlwZWRlZik7Ci0gICAgICAgICAgICAgICAgdHlwZWRlZiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlZGVmICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGVJbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgICAgICBzVHlwZSA9IHNUeXBlSW1wbDsKLSAgICAgICAgICAgICAgICBzVHlwZUltcGwuc2V0Q29udGFpbmVyRmllbGQoc0F0dHIpOwotICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYob3V0ZXJUeXBlID09IG51bGwgPyBudWxsIDogb3V0ZXJUeXBlLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAvLyBsZWF2ZSB0aGUgYW5vbnltb3VzIHR5cGUgdW5yZXNvbHZlZDogaXQgd2lsbCBiZSByZXNvbHZlZCBsYXRlci4KLSAgICAgICAgICAgICAgICBhbm9ueW1vdXNUeXBlcy5hZGQoc1R5cGUpOwotICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRQYXJzZUNvbnRleHQodHlwZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwgJiYgYmFzZU1vZGVsICE9IG51bGwgJiYgYmFzZU1vZGVsLmdldEF0dHJpYnV0ZShxbmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzVHlwZSA9IGJhc2VNb2RlbC5nZXRBdHRyaWJ1dGUocW5hbWUpLmdldFR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgc1R5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotCi0gICAgICAgIGlmICghc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIHNpbXBsZSB0eXBlIChub3QgY29tcGxleCkuIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfU0NIRU1BLCB4c2RBdHRyKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBzd2l0Y2ggdG8gdGhlIGFueS10eXBlCi0gICAgICAgICAgICBzVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh4c2RBdHRyLmlzU2V0VXNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzZSA9IHRyYW5zbGF0ZVVzZUNvZGUoeHNkQXR0ci54Z2V0VXNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZ25vcmUgcmVmZXJlbmNlZCBkZWZhdWx0IGlmIG5vIGxvbmdlciBvcHRpb25hbAotICAgICAgICAgICAgaWYgKHVzZSAhPSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTCAmJiAhaXNGaXhlZCkKLSAgICAgICAgICAgICAgICBkZWZ0ZXh0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHhzZEF0dHIuaXNTZXREZWZhdWx0KCkgfHwgeHNkQXR0ci5pc1NldEZpeGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0ZpeGVkICYmICF4c2RBdHRyLmlzU2V0Rml4ZWQoKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB1c2Ugb2YgYSBmaXhlZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBtdXN0IGFsc28gYmUgZml4ZWQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0RFRkFVTFRfRklYRUQsIHhzZEF0dHIueGdldEZpeGVkKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpc0ZpeGVkID0geHNkQXR0ci5pc1NldEZpeGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4c2RBdHRyLmlzU2V0RGVmYXVsdCgpICYmIGlzRml4ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNob3VsZCBub3Qgc2V0IGJvdGggZGVmYXVsdCBhbmQgZml4ZWQgb24gdGhlIHNhbWUgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9ERUZBVUxUX0ZJWEVELCB4c2RBdHRyLnhnZXRGaXhlZCgpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIGZpeGVkCi0gICAgICAgICAgICAgICAgaXNGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmdGV4dCA9IGlzRml4ZWQgPyB4c2RBdHRyLmdldEZpeGVkKCkgOiB4c2RBdHRyLmdldERlZmF1bHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbG9jYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbClzQXR0cikuc2V0RmlsZW5hbWUoZmluZEZpbGVuYW1lKHhzZEF0dHIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNPQVBBcnJheVR5cGUgd2F0ID0gbnVsbDsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4c2RBdHRyLm5ld0N1cnNvcigpOwotICAgICAgICBTdHJpbmcgYXJyYXlUeXBlID0gYy5nZXRBdHRyaWJ1dGVUZXh0KFdTRExfQVJSQVlUWVBFX05BTUUpOwotICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXQgPSBuZXcgU09BUEFycmF5VHlwZShhcnJheVR5cGUsIG5ldyBOYW1lc3BhY2VDb250ZXh0KHhzZEF0dHIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNBdHRyLmluaXQoCi0gICAgICAgICAgICBxbmFtZSwKLSAgICAgICAgICAgIHNUeXBlLmdldFJlZigpLAotICAgICAgICAgICAgdXNlLAotICAgICAgICAgICAgZGVmdGV4dCwgeHNkQXR0ciwgbnVsbCwgaXNGaXhlZCwKLSAgICAgICAgICAgIHdhdCk7Ci0KLSAgICAgICAgcmV0dXJuIHNBdHRyOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgdHJhbnNsYXRlVXNlQ29kZShBdHRyaWJ1dGUuVXNlIGF0dHJ1c2UpCi0gICAgewotICAgICAgICBpZiAoYXR0cnVzZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMOwotCi0gICAgICAgIFN0cmluZyB2YWwgPSBhdHRydXNlLmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWwuZXF1YWxzKCJvcHRpb25hbCIpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMOwotICAgICAgICBpZiAodmFsLmVxdWFscygicmVxdWlyZWQiKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRDsKLSAgICAgICAgaWYgKHZhbC5lcXVhbHMoInByb2hpYml0ZWQiKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5QUk9ISUJJVEVEOwotICAgICAgICByZXR1cm4gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEludGVnZXIgYnVpbGRObkludGVnZXIoWG1sQW55U2ltcGxlVHlwZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgQmlnSW50ZWdlciBiaWdJbnQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBiaWdJbnQgPSBuZXcgQmlnSW50ZWdlcih0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiTXVzdCBiZSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0Lk1BTEZPUk1FRF9OVU1CRVIsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJpZ0ludC5zaWdudW0oKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiTXVzdCBiZSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0Lk1BTEZPUk1FRF9OVU1CRVIsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxJbnRlZ2VySW1wbCBpID0gbmV3IFhtbEludGVnZXJJbXBsKCk7Ci0gICAgICAgICAgICBpLnNldChiaWdJbnQpOwotICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nIG51bWJlciIsIFhtbEVycm9yQ29udGV4dC5NQUxGT1JNRURfTlVNQkVSLCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZXNlcnZlZFR5cGVOYW1lKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmdldCgpLmZpbmRUeXBlKG5hbWUpICE9IG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1htbFZhbHVlUmVmLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9YbWxWYWx1ZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM1NWFkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1htbFZhbHVlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVSZWYKLXsKLSAgICBYbWxBbnlTaW1wbGVUeXBlIF9vYmo7Ci0gICAgU2NoZW1hVHlwZS5SZWYgX3R5cGVyZWY7Ci0gICAgT2JqZWN0IF9pbml0VmFsOwotCi0gICAgWG1sVmFsdWVSZWYoWG1sQW55U2ltcGxlVHlwZSB4b2JqKQotICAgIHsKLSAgICAgICAgaWYgKHhvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgX29iaiA9IHhvYmo7Ci0gICAgfQotCi0gICAgWG1sVmFsdWVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZiwgT2JqZWN0IGluaXRWYWwpCi0gICAgewotICAgICAgICBpZiAodHlwZXJlZiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICBfdHlwZXJlZiA9IHR5cGVyZWY7Ci0gICAgICAgIF9pbml0VmFsID0gaW5pdFZhbDsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgWG1sQW55U2ltcGxlVHlwZSBnZXQoKQotICAgIHsKLSAgICAgICAgaWYgKF9vYmogPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gX3R5cGVyZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgICAgIF9vYmogPSB0eXBlLm5ld1ZhbHVlKF9pbml0VmFsKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IGFjdHVhbFZhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChMaXN0KV9pbml0VmFsKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sVmFsdWVSZWYgcmVmID0gKFhtbFZhbHVlUmVmKWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhY3R1YWxWYWxzLmFkZChyZWYuZ2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfb2JqID0gdHlwZS5uZXdWYWx1ZShhY3R1YWxWYWxzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX29iajsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvQmFzZTY0LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvQmFzZTY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzVkNzUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC91dGlsL0Jhc2U2NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGVuY29kZS9kZWNvZGUgZm9yIFJGQyAyMDQ1IEJhc2U2NCBhcwotICogZGVmaW5lZCBieSBSRkMgMjA0NSwgTi4gRnJlZWQgYW5kIE4uIEJvcmVuc3RlaW4uCi0gKiBSRkMgMjA0NTogTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucyAoTUlNRSkKLSAqIFBhcnQgT25lOiBGb3JtYXQgb2YgSW50ZXJuZXQgTWVzc2FnZSBCb2RpZXMuIFJlZmVyZW5jZQotICogMTk5NiBBdmFpbGFibGUgYXQ6IGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUudHh0Ci0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgWE1MIFNjaGVtYSBiaW5hcnkgZm9ybWF0IHZhbGlkYXRpb24KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGVuY29kZS9kZWNvZGUgc3RyZWFtaW5nCi0gKiBkYXRhLiBZb3UgbmVlZCB0aGUgZGF0YSB0aGF0IHlvdSB3aWxsIGVuY29kZS9kZWNvZGUKLSAqIGFscmVhZHkgb24gYSBieXRlIGFycnJheS4KLSAqCi0gKiBAYXV0aG9yIEplZmZyZXkgUm9kcmlndWV6Ci0gKiBAYXV0aG9yIFNhbmR5IEdhbwotICogQHZlcnNpb24gJElkOiBCYXNlNjQuamF2YSx2IDEuMyAyMDA0LzAyLzEyIDIwOjA1OjU2IGVyaWN2YXMgRXhwICQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzICBCYXNlNjQgewotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBCQVNFTEVOR1RIICAgICAgICAgPSAyNTU7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBMT09LVVBMRU5HVEggICAgICAgPSA2NDsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIFRXRU5UWUZPVVJCSVRHUk9VUCA9IDI0OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgRUlHSFRCSVQgICAgICAgICAgID0gODsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIFNJWFRFRU5CSVQgICAgICAgICA9IDE2OwotICAgIC8vc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBTSVhCSVQgICAgICAgICAgICAgPSA2OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgRk9VUkJZVEUgICAgICAgICAgID0gNDsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIFNJR04gICAgICAgICAgICAgICA9IC0xMjg7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgYnl0ZSBQQUQgICAgICAgICAgICAgICAgPSAoIGJ5dGUgKSAnPSc7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmRGVidWcgICAgICAgICAgPSBmYWxzZTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBieXRlIFtdIGJhc2U2NEFscGhhYmV0ICAgICAgICA9IG5ldyBieXRlW0JBU0VMRU5HVEhdOwotICAgIHN0YXRpYyBwcml2YXRlIGJ5dGUgW10gbG9va1VwQmFzZTY0QWxwaGFiZXQgID0gbmV3IGJ5dGVbTE9PS1VQTEVOR1RIXTsKLQotICAgIHN0YXRpYyB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8QkFTRUxFTkdUSDsgaSsrKSB7Ci0gICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAnWic7IGkgPj0gJ0EnOyBpLS0pIHsKLSAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpIChpLSdBJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9ICd6JzsgaT49ICdhJzsgaS0tKSB7Ci0gICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoIGktJ2EnICsgMjYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9ICc5JzsgaSA+PSAnMCc7IGktLSkgewotICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKGktJzAnICsgNTIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYmFzZTY0QWxwaGFiZXRbJysnXSAgPSA2MjsKLSAgICAgICAgYmFzZTY0QWxwaGFiZXRbJy8nXSAgPSA2MzsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaTw9MjU7IGkrKykKLSAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpICgnQScraSApOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAyNiwgIGogPSAwOyBpPD01MTsgaSsrLCBqKyspCi0gICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoJ2EnKyBqICk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDUyLCAgaiA9IDA7IGk8PTYxOyBpKyssIGorKykKLSAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpICgnMCcgKyBqICk7Ci0gICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0WzYyXSA9IChieXRlKSAnKyc7Ci0gICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0WzYzXSA9IChieXRlKSAnLyc7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKGJ5dGUgb2N0ZWN0KSB7Ci0gICAgICAgIHJldHVybiAob2N0ZWN0ID09IDB4MjAgfHwgb2N0ZWN0ID09IDB4ZCB8fCBvY3RlY3QgPT0gMHhhIHx8IG9jdGVjdCA9PSAweDkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1BhZChieXRlIG9jdGVjdCkgewotICAgICAgICByZXR1cm4gKG9jdGVjdCA9PSBQQUQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0RhdGEoYnl0ZSBvY3RlY3QpIHsKLSAgICAgICAgcmV0dXJuIChiYXNlNjRBbHBoYWJldFtvY3RlY3RdICE9IC0xKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNCYXNlNjQoYnl0ZSBvY3RlY3QpIHsKLSAgICAgICAgcmV0dXJuIChpc1doaXRlU3BhY2Uob2N0ZWN0KSB8fCBpc1BhZChvY3RlY3QpIHx8IGlzRGF0YShvY3RlY3QpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIGhleCBvY3RlY3RzIGludG8gQmFzZTY0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YSBBcnJheSBjb250YWluaW5nIGJpbmFyeURhdGEKLSAgICAgKiBAcmV0dXJuIEVuY29kZWQgQmFzZTY0IGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKGJ5dGVbXSBiaW5hcnlEYXRhKSB7Ci0KLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGludCAgICAgIGxlbmd0aERhdGFCaXRzICAgID0gYmluYXJ5RGF0YS5sZW5ndGgqRUlHSFRCSVQ7Ci0gICAgICAgIGludCAgICAgIGZld2VyVGhhbjI0Yml0cyAgID0gbGVuZ3RoRGF0YUJpdHMlVFdFTlRZRk9VUkJJVEdST1VQOwotICAgICAgICBpbnQgICAgICBudW1iZXJUcmlwbGV0cyAgICA9IGxlbmd0aERhdGFCaXRzL1RXRU5UWUZPVVJCSVRHUk9VUDsKLSAgICAgICAgYnl0ZSAgICAgZW5jb2RlZERhdGFbXSAgICAgPSBudWxsOwotCi0gICAgICAgIGlmIChmZXdlclRoYW4yNGJpdHMgIT0gMCkgLy9kYXRhIG5vdCBkaXZpc2libGUgYnkgMjQgYml0Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YSA9IG5ldyBieXRlWyAobnVtYmVyVHJpcGxldHMgKyAxICkqNCAgXTsKLSAgICAgICAgZWxzZSAvLyAxNiBvciA4IGJpdAotICAgICAgICAgICAgZW5jb2RlZERhdGEgPSBuZXcgYnl0ZVsgbnVtYmVyVHJpcGxldHMqNCBdOwotCi0gICAgICAgIGJ5dGUgaz0wLCBsPTAsIGIxPTAsYjI9MCxiMz0wOwotCi0gICAgICAgIGludCBlbmNvZGVkSW5kZXggPSAwOwotICAgICAgICBpbnQgZGF0YUluZGV4ICAgPSAwOwotICAgICAgICBpbnQgaSAgICAgICAgICAgPSAwOwotICAgICAgICBpZiAoZkRlYnVnKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm51bWJlciBvZiB0cmlwbGV0cyA9ICIgKyBudW1iZXJUcmlwbGV0cyApOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGk8bnVtYmVyVHJpcGxldHM7IGkrKykgewotCi0gICAgICAgICAgICBkYXRhSW5kZXggPSBpKjM7Ci0gICAgICAgICAgICBiMSA9IGJpbmFyeURhdGFbZGF0YUluZGV4XTsKLSAgICAgICAgICAgIGIyID0gYmluYXJ5RGF0YVtkYXRhSW5kZXggKyAxXTsKLSAgICAgICAgICAgIGIzID0gYmluYXJ5RGF0YVtkYXRhSW5kZXggKyAyXTsKLQotICAgICAgICAgICAgaWYgKGZEZWJ1ZykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImIxPSAiICsgYjEgKyIsIGIyPSAiICsgYjIgKyAiLCBiMz0gIiArIGIzICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGwgID0gKGJ5dGUpKGIyICYgMHgwZik7Ci0gICAgICAgICAgICBrICA9IChieXRlKShiMSAmIDB4MDMpOwotCi0gICAgICAgICAgICBlbmNvZGVkSW5kZXggPSBpKjQ7Ci0gICAgICAgICAgICBieXRlIHZhbDEgPSAoKGIxICYgU0lHTik9PTApPyhieXRlKShiMT4+Mik6KGJ5dGUpKChiMSk+PjJeMHhjMCk7Ci0KLSAgICAgICAgICAgIGJ5dGUgdmFsMiA9ICgoYjIgJiBTSUdOKT09MCk/KGJ5dGUpKGIyPj40KTooYnl0ZSkoKGIyKT4+NF4weGYwKTsKLSAgICAgICAgICAgIGJ5dGUgdmFsMyA9ICgoYjMgJiBTSUdOKT09MCk/KGJ5dGUpKGIzPj42KTooYnl0ZSkoKGIzKT4+Nl4weGZjKTsKLQotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDEgXTsKLSAgICAgICAgICAgIGlmIChmRGVidWcpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJ2YWwyID0gIiArIHZhbDIgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJrNCAgID0gIiArIChrPDw0KSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAidmFrICA9ICIgKyAodmFsMiB8IChrPDw0KSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrMV0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMiB8ICggazw8NCApXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsyXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyAobCA8PDIgKSB8IHZhbDMgXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCszXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyBiMyAmIDB4M2YgXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZvcm0gaW50ZWdyYWwgbnVtYmVyIG9mIDYtYml0IGdyb3VwcwotICAgICAgICBkYXRhSW5kZXggICAgPSBpKjM7Ci0gICAgICAgIGVuY29kZWRJbmRleCA9IGkqNDsKLSAgICAgICAgaWYgKGZld2VyVGhhbjI0Yml0cyA9PSBFSUdIVEJJVCkgewotICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07Ci0gICAgICAgICAgICBrID0gKGJ5dGUpICggYjEgJjB4MDMgKTsKLSAgICAgICAgICAgIGlmIChmRGVidWcpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImIxPSIgKyBiMSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiMTw8MiA9ICIgKyAoYjE+PjIpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlIHZhbDEgPSAoKGIxICYgU0lHTik9PTApPyhieXRlKShiMT4+Mik6KGJ5dGUpKChiMSk+PjJeMHhjMCk7Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXhdICAgICA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwxIF07Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAxXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyBrPDw0IF07Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAyXSA9IFBBRDsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDNdID0gUEFEOwotICAgICAgICB9IGVsc2UgaWYgKGZld2VyVGhhbjI0Yml0cyA9PSBTSVhURUVOQklUKSB7Ci0KLSAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOwotICAgICAgICAgICAgYjIgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCArMSBdOwotICAgICAgICAgICAgbCA9ICggYnl0ZSApICggYjIgJjB4MGYgKTsKLSAgICAgICAgICAgIGsgPSAoIGJ5dGUgKSAoIGIxICYweDAzICk7Ci0KLSAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKT09MCk/KGJ5dGUpKGIxPj4yKTooYnl0ZSkoKGIxKT4+Ml4weGMwKTsKLSAgICAgICAgICAgIGJ5dGUgdmFsMiA9ICgoYjIgJiBTSUdOKT09MCk/KGJ5dGUpKGIyPj40KTooYnl0ZSkoKGIyKT4+NF4weGYwKTsKLQotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgICAgPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMSBdOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMV0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMiB8ICggazw8NCApXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDJdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIGw8PDIgXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDNdID0gUEFEOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVuY29kZWREYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY29kZXMgQmFzZTY0IGRhdGEgaW50byBvY3RlY3RzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZTY0RGF0YSBCeXRlIGFycmF5IGNvbnRhaW5pbmcgQmFzZTY0IGRhdGEKLSAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmQgZGVjb2RlZCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShieXRlW10gYmFzZTY0RGF0YSkgewotCi0gICAgICAgIGlmIChiYXNlNjREYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAvLyByZW1vdmUgd2hpdGUgc3BhY2VzCi0gICAgICAgIGJhc2U2NERhdGEgPSByZW1vdmVXaGl0ZVNwYWNlKGJhc2U2NERhdGEpOwotCi0gICAgICAgIGlmIChiYXNlNjREYXRhLmxlbmd0aCVGT1VSQllURSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsvL3Nob3VsZCBiZSBkaXZpc2libGUgYnkgZm91cgotICAgICAgICB9Ci0KLSAgICAgICAgaW50ICAgICAgbnVtYmVyUXVhZHJ1cGxlICAgID0gKGJhc2U2NERhdGEubGVuZ3RoL0ZPVVJCWVRFICk7Ci0KLSAgICAgICAgaWYgKG51bWJlclF1YWRydXBsZSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOwotCi0gICAgICAgIGJ5dGUgICAgIGRlY29kZWREYXRhW10gICAgICA9IG51bGw7Ci0gICAgICAgIGJ5dGUgICAgIGIxPTAsYjI9MCxiMz0wLCBiND0wOy8vLCBtYXJrZXIwPTAsIG1hcmtlcjE9MDsKLSAgICAgICAgYnl0ZSAgICAgZDE9MCxkMj0wLGQzPTAsZDQ9MDsKLQotICAgICAgICAvLyBUaHJvdyBhd2F5IGFueXRoaW5nIG5vdCBpbiBub3JtYWxpemVkQmFzZTY0RGF0YQotICAgICAgICAvLyBBZGp1c3Qgc2l6ZQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBlbmNvZGVkSW5kZXggPSAwOwotICAgICAgICBpbnQgZGF0YUluZGV4ICAgID0gMDsKLSAgICAgICAgZGVjb2RlZERhdGEgICAgICA9IG5ldyBieXRlWyAobnVtYmVyUXVhZHJ1cGxlKSozXTsKLQotICAgICAgICBmb3IgKDsgaTxudW1iZXJRdWFkcnVwbGUtMTsgaSsrKSB7Ci0KLSAgICAgICAgICAgIGlmICghaXNEYXRhKCAoZDEgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkgKXx8Ci0gICAgICAgICAgICAgICAgIWlzRGF0YSggKGQyID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICl8fAotICAgICAgICAgICAgICAgICFpc0RhdGEoIChkMyA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApfHwKLSAgICAgICAgICAgICAgICAhaXNEYXRhKCAoZDQgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsvL2lmIGZvdW5kICJubyBkYXRhIiBqdXN0IHJldHVybiBudWxsCi0KLSAgICAgICAgICAgIGIxID0gYmFzZTY0QWxwaGFiZXRbZDFdOwotICAgICAgICAgICAgYjIgPSBiYXNlNjRBbHBoYWJldFtkMl07Ci0gICAgICAgICAgICBiMyA9IGJhc2U2NEFscGhhYmV0W2QzXTsKLSAgICAgICAgICAgIGI0ID0gYmFzZTY0QWxwaGFiZXRbZDRdOwotCi0gICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoICBiMSA8PDIgfCBiMj4+NCApIDsKLSAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSgoKGIyICYgMHhmKTw8NCApIHwoIChiMz4+MikgJiAweGYpICk7Ci0gICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoIGIzPDw2IHwgYjQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNEYXRhKCAoZDEgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkgKSB8fAotICAgICAgICAgICAgIWlzRGF0YSggKGQyID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOy8vaWYgZm91bmQgIm5vIGRhdGEiIGp1c3QgcmV0dXJuIG51bGwKLSAgICAgICAgfQotCi0gICAgICAgIGIxID0gYmFzZTY0QWxwaGFiZXRbZDFdOwotICAgICAgICBiMiA9IGJhc2U2NEFscGhhYmV0W2QyXTsKLQotICAgICAgICBkMyA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdOwotICAgICAgICBkNCA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdOwotICAgICAgICBpZiAoIWlzRGF0YSggKGQzICkgKSB8fAotICAgICAgICAgICAgIWlzRGF0YSggKGQ0ICkgKSkgey8vQ2hlY2sgaWYgdGhleSBhcmUgUEFEIGNoYXJhY3RlcnMKLSAgICAgICAgICAgIGlmIChpc1BhZCggZDMgKSAmJiBpc1BhZCggZDQpKSB7ICAgICAgICAgICAgICAgLy9Ud28gUEFEIGUuZy4gM2NbUGFkXVtQYWRdCi0gICAgICAgICAgICAgICAgaWYgKChiMiAmIDB4ZikgIT0gMCkvL2xhc3QgNCBiaXRzIHNob3VsZCBiZSB6ZXJvCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVsgaSozICsgMSBdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGRlY29kZWREYXRhLCAwLCB0bXAsIDAsIGkqMyApOwotICAgICAgICAgICAgICAgIHRtcFtlbmNvZGVkSW5kZXhdICAgPSAoYnl0ZSkoICBiMSA8PDIgfCBiMj4+NCApIDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNQYWQoIGQzKSAmJiBpc1BhZChkNCkpIHsgICAgICAgICAgICAgICAvL09uZSBQQUQgIGUuZy4gM2NRW1BhZF0KLSAgICAgICAgICAgICAgICBiMyA9IGJhc2U2NEFscGhhYmV0WyBkMyBdOwotICAgICAgICAgICAgICAgIGlmICgoYjMgJiAweDMgKSAhPSAwKS8vbGFzdCAyIGJpdHMgc2hvdWxkIGJlIHplcm8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlWyBpKjMgKyAyIF07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggZGVjb2RlZERhdGEsIDAsIHRtcCwgMCwgaSozICk7Ci0gICAgICAgICAgICAgICAgdG1wW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSggIGIxIDw8MiB8IGIyPj40ICk7Ci0gICAgICAgICAgICAgICAgdG1wW2VuY29kZWRJbmRleF0gICA9IChieXRlKSgoKGIyICYgMHhmKTw8NCApIHwoIChiMz4+MikgJiAweGYpICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9hbiBlcnJvciAgbGlrZSAiM2NbUGFkXXIiLCAiM2NkWCIsICIzY1hkIiwgIjNjWFgiIHdoZXJlIFggaXMgbm9uIGRhdGEKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy9ObyBQQUQgZS5nIDNjUWwKLSAgICAgICAgICAgIGIzID0gYmFzZTY0QWxwaGFiZXRbIGQzIF07Ci0gICAgICAgICAgICBiNCA9IGJhc2U2NEFscGhhYmV0WyBkNCBdOwotICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCAgYjEgPDwyIHwgYjI+PjQgKSA7Ci0gICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoKChiMiAmIDB4Zik8PDQgKSB8KCAoYjM+PjIpICYgMHhmKSApOwotICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCBiMzw8NiB8IGI0ICk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZWNvZGVkRGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVzIEJhc2U2NCBkYXRhIGludG8gb2N0ZWN0cwotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2U2NERhdGEgU3RyaW5nIGNvbnRhaW5pbmcgQmFzZTY0IGRhdGEKLSAgICAgKiBAcmV0dXJuIHN0cmluZyBjb250YWluaW5nIGRlY29kZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIGJhc2U2NERhdGEpIHsKLSAgICAgICAgaWYgKGJhc2U2NERhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGJ5dGVbXSBkZWNvZGVkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlY29kZWQgPSBkZWNvZGUoYmFzZTY0RGF0YS5nZXRCeXRlcygidXRmLTgiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlZCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoZGVjb2RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIG9jdGVjdHMgKHVzaW5nIHV0Zi04KSBpbnRvIEJhc2U2NCBkYXRhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YSBTdHJpbmcgY29udGFpbmluZyBIZXggZGF0YQotICAgICAqIEByZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgYmluYXJ5RGF0YSkgewotICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBlbmNvZGVkID0gZW5jb2RlKGJpbmFyeURhdGEuZ2V0Qnl0ZXMoInV0Zi04IikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkge30KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICByZXR1cm4gZW5jb2RlZCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoZW5jb2RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZW1vdmUgV2hpdGVTcGFjZSBmcm9tIE1JTUUgY29udGFpbmluZyBlbmNvZGVkIEJhc2U2NCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgIHRoZSBieXRlIGFycmF5IG9mIGJhc2U2NCBkYXRhICh3aXRoIFdTKQotICAgICAqIEByZXR1cm4gICAgICB0aGUgYnl0ZSBhcnJheSBvZiBiYXNlNjQgZGF0YSAod2l0aG91dCBXUykKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSByZW1vdmVXaGl0ZVNwYWNlKGJ5dGVbXSBkYXRhKSB7Ci0gICAgICAgIGlmIChkYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAvLyBjb3VudCBjaGFyYWN0ZXJzIHRoYXQncyBub3Qgd2hpdGVzcGFjZQotICAgICAgICBpbnQgbmV3U2l6ZSA9IDA7Ci0gICAgICAgIGludCBsZW4gPSBkYXRhLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoZGF0YVtpXSkpCi0gICAgICAgICAgICAgICAgbmV3U2l6ZSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm8gd2hpdGVzcGFjZSwganVzdCByZXR1cm4gdGhlIGlucHV0IGFycmF5Ci0gICAgICAgIGlmIChuZXdTaXplID09IGxlbikKLSAgICAgICAgICAgIHJldHVybiBkYXRhOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgYXJyYXkgdG8gcmV0dXJuCi0gICAgICAgIGJ5dGVbXSBuZXdBcnJheSA9IG5ldyBieXRlW25ld1NpemVdOwotCi0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoZGF0YVtpXSkpCi0gICAgICAgICAgICAgICAgbmV3QXJyYXlbaisrXSA9IGRhdGFbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld0FycmF5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdXRpbC9IZXhCaW4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdXRpbC9IZXhCaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3NjRhYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvSGV4QmluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0vKioKLSAqIGZvcm1hdCB2YWxpZGF0aW9uCi0gKgotICogVGhpcyBjbGFzcyBlbmNvZGVzL2RlY29kZXMgaGV4YWRlY2ltYWwgZGF0YQotICogQGF1dGhvciBKZWZmcmV5IFJvZHJpZ3VlegotICogQHZlcnNpb24gJElkOiBIZXhCaW4uamF2YSx2IDEuMyAyMDA0LzAyLzEyIDIwOjA1OjU2IGVyaWN2YXMgRXhwICQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzICBIZXhCaW4gewotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgQkFTRUxFTkdUSCAgID0gMjU1OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgTE9PS1VQTEVOR1RIID0gMTY7Ci0gICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBoZXhOdW1iZXJUYWJsZSAgICA9IG5ldyBieXRlW0JBU0VMRU5HVEhdOwotICAgIHN0YXRpYyBwcml2YXRlIGJ5dGUgW10gbG9va1VwSGV4QWxwaGFiZXQgPSBuZXcgYnl0ZVtMT09LVVBMRU5HVEhdOwotCi0KLSAgICBzdGF0aWMgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaTxCQVNFTEVOR1RIOyBpKysgKSB7Ci0gICAgICAgICAgICBoZXhOdW1iZXJUYWJsZVtpXSA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGludCBpID0gJzknOyBpID49ICcwJzsgaS0tKSB7Ci0gICAgICAgICAgICBoZXhOdW1iZXJUYWJsZVtpXSA9IChieXRlKSAoaS0nMCcpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGludCBpID0gJ0YnOyBpPj0gJ0EnOyBpLS0pIHsKLSAgICAgICAgICAgIGhleE51bWJlclRhYmxlW2ldID0gKGJ5dGUpICggaS0nQScgKyAxMCApOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGludCBpID0gJ2YnOyBpPj0gJ2EnOyBpLS0pIHsKLSAgICAgICAgICAgaGV4TnVtYmVyVGFibGVbaV0gPSAoYnl0ZSkgKCBpLSdhJyArIDEwICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpPDEwOyBpKysgKQotICAgICAgICAgICAgbG9va1VwSGV4QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCcwJytpICk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDEwOyBpPD0xNTsgaSsrICkKLSAgICAgICAgICAgIGxvb2tVcEhleEFscGhhYmV0W2ldID0gKGJ5dGUpICgnQScraSAtMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJ5dGUgdG8gYmUgdGVzdGVkIGlmIGl0IGlzIEJhc2U2NCBhbHBoYWJldAotICAgICAqCi0gICAgICogQHBhcmFtIG9jdGVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0hleChieXRlIG9jdGVjdCkgewotICAgICAgICByZXR1cm4gKGhleE51bWJlclRhYmxlW29jdGVjdF0gIT0gLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGJ5dGVzIHRvIGEgaGV4IHN0cmluZwotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGJ5dGVzVG9TdHJpbmcoYnl0ZVtdIGJpbmFyeURhdGEpCi0gICAgewotICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGVuY29kZShiaW5hcnlEYXRhKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgYnl0ZSBhcnJheS4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSBzdHJpbmdUb0J5dGVzKFN0cmluZyBoZXhFbmNvZGVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZShoZXhFbmNvZGVkLmdldEJ5dGVzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFycmF5IG9mIGJ5dGUgdG8gZW5jb2RlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YQotICAgICAqIEByZXR1cm4gcmV0dXJuIGVuY29kZSBiaW5hcnkgYXJyYXkKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSBlbmNvZGUoYnl0ZVtdIGJpbmFyeURhdGEpIHsKLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpbnQgbGVuZ3RoRGF0YSAgID0gYmluYXJ5RGF0YS5sZW5ndGg7Ci0gICAgICAgIGludCBsZW5ndGhFbmNvZGUgPSBsZW5ndGhEYXRhICogMjsKLSAgICAgICAgYnl0ZVtdIGVuY29kZWREYXRhID0gbmV3IGJ5dGVbbGVuZ3RoRW5jb2RlXTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8bGVuZ3RoRGF0YTsgaSsrICl7Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtpKjJdID0gbG9va1VwSGV4QWxwaGFiZXRbKGJpbmFyeURhdGFbaV0gPj4gNCkgJiAweGZdOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbaSoyKzFdID0gbG9va1VwSGV4QWxwaGFiZXRbIGJpbmFyeURhdGFbaV0gJiAweGZdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVkRGF0YTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSBkZWNvZGUoYnl0ZVtdIGJpbmFyeURhdGEpIHsKLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpbnQgbGVuZ3RoRGF0YSAgID0gYmluYXJ5RGF0YS5sZW5ndGg7Ci0gICAgICAgIGlmIChsZW5ndGhEYXRhICUgMiAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaW50IGxlbmd0aERlY29kZSA9IGxlbmd0aERhdGEgLyAyOwotICAgICAgICBieXRlW10gZGVjb2RlZERhdGEgPSBuZXcgYnl0ZVtsZW5ndGhEZWNvZGVdOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxsZW5ndGhEZWNvZGU7IGkrKyApewotICAgICAgICAgICAgaWYgKCFpc0hleChiaW5hcnlEYXRhW2kqMl0pIHx8ICFpc0hleChiaW5hcnlEYXRhW2kqMisxXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlY29kZWREYXRhW2ldID0gKGJ5dGUpKChoZXhOdW1iZXJUYWJsZVtiaW5hcnlEYXRhW2kqMl1dIDw8IDQpIHwgaGV4TnVtYmVyVGFibGVbYmluYXJ5RGF0YVtpKjIrMV1dKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVjb2RlZERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjb2RlcyBIZXggZGF0YSBpbnRvIG9jdGVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5hcnlEYXRhIFN0cmluZyBjb250YWluaW5nIEhleCBkYXRhCi0gICAgICogQHJldHVybiBzdHJpbmcgY29udGFpbmluZyBkZWNvZGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBiaW5hcnlEYXRhKSB7Ci0gICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBieXRlW10gZGVjb2RlZCA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgIGRlY29kZWQgPSBkZWNvZGUoYmluYXJ5RGF0YS5nZXRCeXRlcygidXRmLTgiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICByZXR1cm4gZGVjb2RlZCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoZGVjb2RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIG9jdGVjdHMgKHVzaW5nIHV0Zi04KSBpbnRvIEhleCBkYXRhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YSBTdHJpbmcgY29udGFpbmluZyBIZXggZGF0YQotICAgICAqIEByZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgYmluYXJ5RGF0YSkgewotICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBlbmNvZGVkID0gZW5jb2RlKGJpbmFyeURhdGEuZ2V0Qnl0ZXMoInV0Zi04IikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkge30KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICByZXR1cm4gZW5jb2RlZCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoZW5jb2RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOWFjM2EuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uQ2hhcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uR2VuZXJpY1htbElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0KLSAgICBleHRlbmRzIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIEV2ZW50Ci17Ci0gICAgcHVibGljIFZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhpcywKLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciB0eXBlTG9hZGVyLCBTY2hlbWFUeXBlIHNUeXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX3NvdXJjZSA9IHhpczsKLQotICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSByb290IHR5cGUKLQotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwotICAgICAgICAKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gKFNjaGVtYVR5cGUpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKTsKLQotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdHlwZSA9IHNUeXBlOwotCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRTsKLQotICAgICAgICAgICAgeGlzID0geGlzLmdldFN1YlN0cmVhbSgpOwotCi0gICAgICAgICAgICBpZiAoeGlzLnNraXAoIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIGRvY1R5cGUgPQotICAgICAgICAgICAgICAgICAgICB0eXBlTG9hZGVyLmZpbmREb2N1bWVudFR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxOYW1lSGVscGVyLmdldFFOYW1lKCB4aXMubmV4dCgpLmdldE5hbWUoKSApICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9jVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0eXBlID0gZG9jVHlwZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeGlzLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgdGhlIHZhbGlkYXRvcgotCi0gICAgICAgIF92YWxpZGF0b3IgPQotICAgICAgICAgICAgbmV3IFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICB0eXBlLCBudWxsLCB0eXBlTG9hZGVyLCBvcHRpb25zLCBuZXcgRXhjZXB0aW9uWG1sRXJyb3JMaXN0ZW5lcigpICk7Ci0KLSAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5CRUdJTiApOwotICAgIH0KLQotICAgIC8vIFRPRE8gLSB0aGlzIGlzIHRoZSBxdWljayBhbmQgZGlydHkgaW1wbCBvZiBzdHJlYW1pbmcgdmFsaWRhdGlvbiwKLSAgICAvLyBtYXkgb2JqZWN0cyBhcmUgY3JlYXRlZCAobGlrZSBzdHJpbmdzKSB3aGljaCBjYW4gYmUgb3B0aW1pemVkCi0gICAgCi0gICAgcHJvdGVjdGVkIFhNTEV2ZW50IG5leHRFdmVudCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWE1MRXZlbnQgZSA9IF9zb3VyY2UubmV4dCgpOwotCi0gICAgICAgIGlmIChlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX2ZpbmlzaGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsdXNoVGV4dCgpOwotICAgICAgICAgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuRU5EICk7Ci0gICAgICAgICAgICAgICAgX2ZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIGUuZ2V0VHlwZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuQ0hBUkFDVEVSX0RBVEEgOgotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TUEFDRSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZCA9IChDaGFyYWN0ZXJEYXRhKSBlOwotCi0gICAgICAgICAgICAgICAgaWYgKGNkLmhhc0NvbnRlbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgX3RleHQuYXBwZW5kKCBjZC5nZXRDb250ZW50KCkgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGFydEVsZW1lbnQgc2UgPSAoU3RhcnRFbGVtZW50KSBlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZsdXNoVGV4dCgpOwotCi0gICAgICAgICAgICAgICAgLy8gVXNlZCBmb3IgcHJlZml4IHRvIG5hbWVzcGFjZSBtYXBwaW5nCi0gICAgICAgICAgICAgICAgX3N0YXJ0RWxlbWVudCA9IHNlOwotCi0gICAgICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgeHNpOiogdmFsdWVzCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlSXRlcmF0b3IgYXR0cnMgPSBzZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIGF0dHJzLmhhc05leHQoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IGF0dHJzLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBYTUxOYW1lIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lLmdldE5hbWVzcGFjZVVyaSgpICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IGF0dHJOYW1lLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwuZXF1YWxzKCAidHlwZSIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfeHNpVHlwZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5pbCIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfeHNpTmlsID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAic2NoZW1hTG9jYXRpb24iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzaUxvYyA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzaU5vTG9jID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRW1pdCB0aGUgU1RBUlQKLQotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBzaG91bGQgZGVsYXkgdGhlIGFxdWlzaXRpb24gb2YgdGhlIG5hbWUKLSAgICAgICAgICAgICAgICBfbmFtZSA9IGUuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5CRUdJTiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEVtaXQgdGhlIGF0dHJzCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYXR0cnMgPSBzZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIGF0dHJzLmhhc05leHQoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IGF0dHJzLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBYTUxOYW1lIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lLmdldE5hbWVzcGFjZVVyaSgpICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IGF0dHJOYW1lLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwuZXF1YWxzKCAidHlwZSIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5pbCIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggInNjaGVtYUxvY2F0aW9uIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBHb2QsIHRoaXMgaXMgbGFtZSA6LSkKLQotICAgICAgICAgICAgICAgICAgICBfdGV4dC5hcHBlbmQoIGF0dHIuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2xlYXJUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBfc3RhcnRFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkVORF9FTEVNRU5UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmbHVzaFRleHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuZXh0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVORCApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xlYXJUZXh0ICggKQotICAgIHsKLSAgICAgICAgX3RleHQuZGVsZXRlKCAwLCBfdGV4dC5sZW5ndGgoKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZmx1c2hUZXh0ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQgKTsKLSAgICAgICAgICAgIGNsZWFyVGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBpZiAoX3N0YXJ0RWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgTWFwIG1hcCA9IF9zdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlTWFwKCk7Ci0KLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIG1hcC5nZXQoIHByZWZpeCApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxDdXJzb3IgZ2V0TG9jYXRpb25Bc0N1cnNvciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lUeXBlICggQ2hhcnMgY2hhcnMgKQotICAgIHsKLSAgICAgICAgaWYgKF94c2lUeXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgY2hhcnMuc3RyaW5nID0gX3hzaVR5cGU7Ci0gICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldFhzaU5pbCAoIENoYXJzIGNoYXJzICkKLSAgICB7Ci0gICAgICAgIGlmIChfeHNpTmlsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgY2hhcnMuc3RyaW5nID0gX3hzaU5pbDsKLSAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lMb2MgKCBDaGFycyBjaGFycyApCi0gICAgewotICAgICAgICBpZiAoX3hzaUxvYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNoYXJzLnN0cmluZyA9IF94c2lMb2M7Ci0gICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTm9Mb2MgKCBDaGFycyBjaGFycyApCi0gICAgewotICAgICAgICBpZiAoX3hzaU5vTG9jID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgY2hhcnMuc3RyaW5nID0gX3hzaU5vTG9jOwotICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFhNTE5hbWVIZWxwZXIuZ2V0UU5hbWUoIF9uYW1lICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzICkKLSAgICB7Ci0gICAgICAgIGNoYXJzLnN0cmluZyA9IF90ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzLCBpbnQgd3NyICkKLSAgICB7Ci0gICAgICAgIGNoYXJzLnN0cmluZyA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoIF90ZXh0LnRvU3RyaW5nKCksIHdzciApOwotICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotICAgIH0KLQotICAgIC8vIFRPRE8gLSB2ZXJ5IGV4cGVuc2l2ZSB0byBnZXQgYSBzdHJpbmcgaGVyZQotICAgIHB1YmxpYyBib29sZWFuIHRleHRJc1doaXRlc3BhY2UgKCApCi0gICAgewotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX3RleHQubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBfdGV4dC5jaGFyQXQoIGkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRXhjZXB0aW9uWG1sRXJyb3JMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLnRoaXMuX2V4Y2VwdGlvbiA9PSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0udGhpcy5fZXhjZXB0aW9uID0gCi0gICAgICAgICAgICAgICAgbmV3IFhNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24oIChYbWxFcnJvcilvICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBuZXh0RXZlbnQgKCBpbnQga2luZCApCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydCBfZXhjZXB0aW9uID09IG51bGw7Ci0gICAgICAgIAotICAgICAgICBfdmFsaWRhdG9yLm5leHRFdmVudCgga2luZCwgdGhpcyApOwotCi0gICAgICAgIGlmIChfZXhjZXB0aW9uICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBfZXhjZXB0aW9uOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFhNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24gX2V4Y2VwdGlvbjsKLQotICAgIHByaXZhdGUgWE1MSW5wdXRTdHJlYW0gX3NvdXJjZTsKLSAgICBwcml2YXRlIFZhbGlkYXRvciAgICAgIF92YWxpZGF0b3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgICBfdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgIF9maW5pc2hlZDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgIF94c2lUeXBlOwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgX3hzaU5pbDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgIF94c2lMb2M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICBfeHNpTm9Mb2M7Ci0gICAgcHJpdmF0ZSBYTUxOYW1lICAgICAgICBfbmFtZTsKLSAgICBwcml2YXRlIFN0YXJ0RWxlbWVudCAgIF9zdGFydEVsZW1lbnQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1MTc4NC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uQ2hhcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlVmlzaXRvckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhVXJpSG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQmFzZTY0SG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sRGF0ZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRGVjaW1hbEhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURvdWJsZUhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sRHVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUZsb2F0SG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSGV4QmluYXJ5SG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFFOYW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFRTmFtZUhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRvcgotICAgIGltcGxlbWVudHMgVmFsaWRhdG9yTGlzdGVuZXIKLXsKLSAgICBwdWJsaWMgVmFsaWRhdG9yICgKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBTY2hlbWFGaWVsZCBmaWVsZCwgU2NoZW1hVHlwZUxvYWRlciBnbG9iYWxMb2FkZXIsCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucywgQ29sbGVjdGlvbiBkZWZhdWx0RXJyb3JMaXN0ZW5lciApCi0gICAgewotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbChvcHRpb25zKTsKLSAgICAgICAgX2Vycm9yTGlzdGVuZXIgPSAoQ29sbGVjdGlvbikgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5FUlJPUl9MSVNURU5FUik7Ci0KLSAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyID09IG51bGwpCi0gICAgICAgICAgICBfZXJyb3JMaXN0ZW5lciA9IGRlZmF1bHRFcnJvckxpc3RlbmVyOwotCi0gICAgICAgIF9jb25zdHJhaW50RW5naW5lID0gbmV3IElkZW50aXR5Q29uc3RyYWludChfZXJyb3JMaXN0ZW5lciwgdHlwZS5pc0RvY3VtZW50VHlwZSgpKTsKLQotICAgICAgICBfZ2xvYmFsVHlwZXMgPSBnbG9iYWxMb2FkZXI7Ci0gICAgICAgIF9jaGFycyA9IG5ldyBDaGFycygpOwotICAgICAgICBfcm9vdFR5cGUgPSB0eXBlOwotICAgICAgICBfcm9vdEZpZWxkID0gZmllbGQ7Ci0KLSAgICAgICAgX3ZjID0gbmV3IFZhbGlkYXRvclZDKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWYWxpZGF0b3JWQyBpbXBsZW1lbnRzIFZhbGlkYXRpb25Db250ZXh0Ci0gICAgewotICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkICggU3RyaW5nIG1lc3NhZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0b3IudGhpcy5lbWl0RXJyb3IoIF9ldmVudCwgbWVzc2FnZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgRXZlbnQgX2V2ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gIV9pbnZhbGlkICYmIF9jb25zdHJhaW50RW5naW5lLmlzVmFsaWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgZW1pdEVycm9yKGV2ZW50LCBtc2csIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2csIGludCBzZXZlcml0eSApCi0gICAgewotICAgICAgICBfZXJyb3JTdGF0ZSsrOwotCi0gICAgICAgIGlmIChfc3VzcGVuZEVycm9ycyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpCi0gICAgICAgICAgICAgICAgX2ludmFsaWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoX2Vycm9yTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZXZlbnQgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgIF9lcnJvckxpc3RlbmVyLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yQ3Vyc29yKCBtc2csIHNldmVyaXR5LCBldmVudC5nZXRMb2NhdGlvbkFzQ3Vyc29yKCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRGaWVsZEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2csIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgZW1pdEZpZWxkRXJyb3IoIGV2ZW50LCBtc2cgKyAiICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoIG5hbWUgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbWl0RmllbGRFcnJvciAoIEV2ZW50IGV2ZW50LCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCBtc2csIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEZpZWxkRXJyb3IgKCBFdmVudCBldmVudCwgU3RyaW5nIG1zZywgaW50IHNldmVyaXR5ICkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhdGVTdGFjayAhPSBudWxsICYmIF9zdGF0ZVN0YWNrLl9maWVsZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtc2cgKz0KLSAgICAgICAgICAgICAgICAiIGluIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eSggX3N0YXRlU3RhY2suX2ZpZWxkLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdG9yLnRoaXMuZW1pdEVycm9yKCBldmVudCwgbXNnLCBzZXZlcml0eSApOwotICAgIH0KLQotICAgIC8vIEZvciBYbWxFdmVudExpc3RlbmVyLmVycm9yCi0KLSAgICBwdWJsaWMgdm9pZCBlcnJvciAoIFhtbEVycm9yIGVycm9yICkKLSAgICB7Ci0gICAgICAgIF9lcnJvclN0YXRlKys7Ci0KLSAgICAgICAgaWYgKF9zdXNwZW5kRXJyb3JzID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnZhbGlkID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIuYWRkKCBlcnJvciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbmV4dEV2ZW50ICggaW50IGtpbmQsIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIHJlc2V0VmFsdWVzKCk7Ci0KLSAgICAgICAgaWYgKF9lYXRDb250ZW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICgga2luZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEVORCAgIDogX2VhdENvbnRlbnQtLTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJFR0lOIDogX2VhdENvbnRlbnQrKzsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICBraW5kID09IEJFR0lOIHx8IGtpbmQgPT0gQVRUUiB8fAotICAgICAgICAgICAgICAgICAgICBraW5kID09IEVORCB8fCBraW5kID09IFRFWFQgfHwga2luZCA9PSBFTkRBVFRSUzsKLQotICAgICAgICAgICAgc3dpdGNoICgga2luZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEJFR0lOICAgIDogYmVnaW5FdmVudCggICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFUVFIgICAgIDogYXR0ckV2ZW50KCAgICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVOREFUVFJTIDogZW5kQXR0cnNFdmVudCggZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRFWFQgICAgIDogdGV4dEV2ZW50KCAgICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVORCAgICAgIDogZW5kRXZlbnQoICAgICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmVnaW5FdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIF9sb2NhbEVsZW1lbnQgPSBudWxsOwotICAgICAgICBfd2lsZGNhcmRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSAgZWxlbWVudFR5cGUgID0gbnVsbDsKLSAgICAgICAgU2NoZW1hRmllbGQgZWxlbWVudEZpZWxkID0gbnVsbDsKLQotICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudFR5cGUgPSBfcm9vdFR5cGU7Ci0gICAgICAgICAgICBlbGVtZW50RmllbGQgPSBfcm9vdEZpZWxkOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgICAgICBRTmFtZSBuYW1lID0gZXZlbnQuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgICAgICBzdGF0ZS5faXNFbXB0eSA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoc3RhdGUuX2lzTmlsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAgIk5pbCBlbGVtZW50IGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCIpOwotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc3RhdGUudmlzaXQoIG5hbWUgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gZmluZERldGFpbGVkRXJyb3JCZWdpbihzdGF0ZSAsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgIkVsZW1lbnQgbm90IGFsbG93ZWQ6IiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY3VycmVudFBhcnRpY2xlID0gc3RhdGUuY3VycmVudFBhcnRpY2xlKCk7Ci0gICAgICAgICAgICBfd2lsZGNhcmRFbGVtZW50ID0gY3VycmVudFBhcnRpY2xlOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudFBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vX3dpbGRjYXJkRWxlbWVudCA9IGN1cnJlbnRQYXJ0aWNsZTsKLSAgICAgICAgICAgICAgICBRTmFtZVNldCBlbGVtV2lsZGNhcmRTZXQgPSBjdXJyZW50UGFydGljbGUuZ2V0V2lsZGNhcmRTZXQoKTsKLQotICAgICAgICAgICAgICAgIGlmICghZWxlbVdpbGRjYXJkU2V0LmNvbnRhaW5zKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsIHByb2Nlc3NpbmcgbWF5IGJlIG5lZWRlZCB0byBnZW5lcmF0ZSBtb3JlCi0gICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0aXZlIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKCBldmVudCwgIkVsZW1lbnQgbm90IGFsbG93ZWQ6IiwgbmFtZSApOwotICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCB3aWxkY2FyZFByb2Nlc3MgPSBjdXJyZW50UGFydGljbGUuZ2V0V2lsZGNhcmRQcm9jZXNzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYVBhcnRpY2xlLlNLSVApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfbG9jYWxFbGVtZW50ID0gX2dsb2JhbFR5cGVzLmZpbmRFbGVtZW50KCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkID0gX2xvY2FsRWxlbWVudDsKLQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50RmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hUGFydGljbGUuU1RSSUNUKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgIkVsZW1lbnQgbm90IGFsbG93ZWQgKHN0cmljdCB3aWxkY2FyZCwgYW5kIG5vIGRlZmluaXRpb24gZm91bmQpOiIsIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVDsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGVsZW1lbnQgcGFydGljbGUgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgbmFtZQotICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBldmVudCwgdGhlbiB0aGUgY3VycmVudCBlbGVtZW50IGlzIGEgc3Vic3RpdHV0ZSBmb3IKLSAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNsZS4gUmVwbGFjZSB0aGUgZmllbGQgd2l0aCB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgICAgLy8gZWxlbWVudCBmb3IgdGhlIHJlcGxhY2VtZW50Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBjdXJyZW50UGFydGljbGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKFNjaGVtYUxvY2FsRWxlbWVudCljdXJyZW50UGFydGljbGUpLmJsb2NrU3Vic3RpdHV0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCBzdWJzdGl0dXRpb24gbm90IGFsbG93ZWQgd2hlbiBncm91cCBoZWFkIGhhcyBibG9jaz0nc3Vic3RpdHV0aW9uJyIsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBuZXdGaWVsZCA9IF9nbG9iYWxUeXBlcy5maW5kRWxlbWVudChuYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbmV3RmllbGQgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobmV3RmllbGQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkID0gbmV3RmllbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfbG9jYWxFbGVtZW50ID0gbmV3RmllbGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkID0gKFNjaGVtYUZpZWxkKSBjdXJyZW50UGFydGljbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbGVtZW50VHlwZSA9IGVsZW1lbnRGaWVsZC5nZXRUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgZWxlbWVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICAvLwotICAgICAgICAvLyB0aGUgbm8tdHlwZSBpcyBhbHdheXMgaW52YWxpZCAoZXZlbiBpZiB0aGVyZSBpcyBhbiB4c2k6dHlwZSkKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoZWxlbWVudFR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsICJJbnZhbGlkIHR5cGUuIik7Ci0gICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBTZWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIHhzaTp0eXBlIG9uIGl0Ci0gICAgICAgIC8vCi0KLSAgICAgICAgU2NoZW1hVHlwZSB4c2lUeXBlID0gbnVsbDsKLQotICAgICAgICBpZiAoZXZlbnQuZ2V0WHNpVHlwZSggX2NoYXJzICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IF9jaGFycy5hc1N0cmluZygpOwotCi0gICAgICAgICAgICAvLyBUdXJuIG9mZiB0aGUgbGlzdGVuZXIgc28gYSBwdWJsaWMgZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgLy8gZG9lcyBub3QgZ2V0IGdlbmVyYXRlZCwgYnV0IEkgY2FuIHNlZSBpZiB0aGVyZSB3YXMKLSAgICAgICAgICAgIC8vIGFuIGVycm9yIHRocm91Z2ggdGhlIGVycm9yIHN0YXRlCi0KLSAgICAgICAgICAgIGludCBvcmlnaW5hbEVycm9yU3RhdGUgPSBfZXJyb3JTdGF0ZTsKLQotICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMrKzsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ZjLl9ldmVudCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB4c2lUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgX2dsb2JhbFR5cGVzLmZpbmRUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgWG1sUU5hbWVJbXBsLnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIF92YywgZXZlbnQgKSApOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZXJyb3JTdGF0ZSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zdXNwZW5kRXJyb3JzLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvcmlnaW5hbEVycm9yU3RhdGUgIT0gX2Vycm9yU3RhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LCAiSW52YWxpZCB4c2k6dHlwZSBxbmFtZTogJyIgKyB2YWx1ZSArICInIiApOwotCi0gICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoeHNpVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcihldmVudCwgICJDb3VsZCBub3QgZmluZCB4c2k6dHlwZTogJyIgKyB2YWx1ZSArICInIik7Ci0KLSAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeHNpVHlwZSAhPSBudWxsICYmICF4c2lUeXBlLmVxdWFscyhlbGVtZW50VHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZWxlbWVudFR5cGUuaXNBc3NpZ25hYmxlRnJvbSh4c2lUeXBlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJUeXBlICciICsgeHNpVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiJyBpcyBub3QgZGVyaXZlZCBmcm9tICciICsgZWxlbWVudFR5cGUgKyAiJyIgKTsKLQotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlLmJsb2NrRXh0ZW5zaW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggU2NoZW1hVHlwZSB0ID0geHNpVHlwZSA7ICEgdC5lcXVhbHMoIGVsZW1lbnRUeXBlICkgOwotICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmdldEJhc2VUeXBlKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiB0eXBlOiAnIiArIHhzaVR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtYXkgbm90IGJlIHN1YnN0aXR1dGVkIGZvcjogJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgKyAiJyIgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZS5ibG9ja1Jlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggU2NoZW1hVHlwZSB0ID0geHNpVHlwZSA7ICEgdC5lcXVhbHMoIGVsZW1lbnRUeXBlICkgOwotICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmdldEJhc2VUeXBlKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzdHJpY3Rpb24gdHlwZTogJyIgKyB4c2lUeXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbWF5IG5vdCBiZSBzdWJzdGl0dXRlZCBmb3I6ICciICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlICsgIiciICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZWxlbWVudEZpZWxkIGluc3RhbmNlb2YgU2NoZW1hTG9jYWxFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBzbGUgID0gKFNjaGVtYUxvY2FsRWxlbWVudCllbGVtZW50RmllbGQ7Ci0gICAgICAgICAgICAgICAgX2xvY2FsRWxlbWVudCA9IHNsZTsKLQotICAgICAgICAgICAgICAgIGlmIChzbGUuYmxvY2tFeHRlbnNpb24oKSB8fCBzbGUuYmxvY2tSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggU2NoZW1hVHlwZSB0ID0geHNpVHlwZSA7ICEgdC5lcXVhbHMoIGVsZW1lbnRUeXBlICkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5nZXRCYXNlVHlwZSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0LmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiAmJiBzbGUuYmxvY2tSZXN0cmljdGlvbigpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0LmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9FWFRFTlNJT04gJiYgc2xlLmJsb2NrRXh0ZW5zaW9uKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXJpdmVkIHR5cGU6ICciICsgeHNpVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtYXkgbm90IGJlIHN1YnN0aXR1dGVkIGZvciBlbGVtZW50ICciICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lSGVscGVyLnByZXR0eShzbGUuZ2V0TmFtZSgpKSArICInIiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsZW1lbnRUeXBlID0geHNpVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtZW50RmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBzbGUgPSAoU2NoZW1hTG9jYWxFbGVtZW50KWVsZW1lbnRGaWVsZDsKLSAgICAgICAgICAgIF9sb2NhbEVsZW1lbnQgPSBzbGU7Ci0KLSAgICAgICAgICAgIGlmIChzbGUuaXNBYnN0cmFjdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcihldmVudCwgICJFbGVtZW50ICciICsgUU5hbWVIZWxwZXIucHJldHR5KHNsZS5nZXROYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgIicgaXMgYWJzdHJhY3QgYW5kIGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudFR5cGUgIT0gbnVsbCAmJiBlbGVtZW50VHlwZS5pc0Fic3RyYWN0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJBYnN0cmFjdCB0eXBlOiAiICsgZWxlbWVudFR5cGUgKwotICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIiApOwotCi0gICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNOaWwgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBoYXNOaWwgPSBmYWxzZTsKLQotICAgICAgICBpZiAoZXZlbnQuZ2V0WHNpTmlsKF9jaGFycykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92Yy5fZXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgIGlzTmlsID0gSmF2YUJvb2xlYW5Ib2xkZXIudmFsaWRhdGVMZXhpY2FsKF9jaGFycy5hc1N0cmluZygpLCBfdmMpOwotICAgICAgICAgICAgaGFzTmlsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbm90ZSBpbiBzY2hlbWEgc3BlYyAzLjMuNCwgeW91J3JlIG5vdCBldmVuIGFsbG93ZWQgdG8gc2F5IHhzaTpuaWw9ImZhbHNlIiBpZiB5b3UncmUgbm90IG5pbGxhYmxlIQotICAgICAgICBpZiAoaGFzTmlsICYmICFlbGVtZW50RmllbGQuaXNOaWxsYWJsZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgICJFbGVtZW50IGhhcyB4c2k6bmlsIGF0dHJpYnV0ZSBidXQgaXMgbm90IG5pbGxhYmxlIik7Ci0KLSAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG5ld1N0YXRlKCBlbGVtZW50VHlwZSwgZWxlbWVudEZpZWxkLCBpc05pbCApOwotCi0gICAgICAgIC8vIERpc3BhdGNoIHRoaXMgZWxlbWVudCBldmVudCB0byBhbnkgaWRlbnRpdHkgY29uc3RyYWludHMKLSAgICAgICAgLy8gQXMgd2VsbCBhcyBhZGRpbmcgYW55IG5ldyBpZGVudGl0eSBjb25zdHJhaW50cyB0aGF0IGV4aXN0Ci0KLSAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuZWxlbWVudCgKLSAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgZWxlbWVudFR5cGUsCi0gICAgICAgICAgICBlbGVtZW50RmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQKLSAgICAgICAgICAgICAgICA/ICgoU2NoZW1hTG9jYWxFbGVtZW50KSBlbGVtZW50RmllbGQpLmdldElkZW50aXR5Q29uc3RyYWludHMoKQotICAgICAgICAgICAgICAgIDogbnVsbCApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhdHRyRXZlbnQgKCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBRTmFtZSBhdHRyTmFtZSA9IGV2ZW50LmdldE5hbWUoKTsKLQotICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKHN0YXRlLl9hdHRycyA9PSBudWxsKQotICAgICAgICAgICAgc3RhdGUuX2F0dHJzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBpZiAoc3RhdGUuX2F0dHJzLmNvbnRhaW5zKCBhdHRyTmFtZSApKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAiRHVwbGljYXRlIGF0dHJpYnV0ZTogIiArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZS5fYXR0cnMuYWRkKCBhdHRyTmFtZSApOwotCi0gICAgICAgIGlmICghc3RhdGUuX2NhbkhhdmVBdHRycykKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoIGV2ZW50LCAiQ2FuJ3QgaGF2ZSBhdHRyaWJ1dGVzIiApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYXR0clNjaGVtYSA9Ci0gICAgICAgICAgICBzdGF0ZS5fYXR0ck1vZGVsID09IG51bGwKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHN0YXRlLl9hdHRyTW9kZWwuZ2V0QXR0cmlidXRlKCBhdHRyTmFtZSApOwotCi0gICAgICAgIGlmIChhdHRyU2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sb2NhbEF0dHJpYnV0ZSA9IGF0dHJTY2hlbWE7Ci0KLSAgICAgICAgICAgIGlmIChhdHRyU2NoZW1hLmdldFVzZSgpID09IFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIGlzIHByb2hpYml0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgICAgICBhdHRyU2NoZW1hLmdldFR5cGUoKSwgYXR0clNjaGVtYSwgZXZlbnQsIGZhbHNlLCBmYWxzZSApOwotCi0gICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS5hdHRyKCBldmVudCwgYXR0ck5hbWUsIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCB2YWx1ZSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lsZGNhcmRQcm9jZXNzID0gc3RhdGUuX2F0dHJNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKTsKLSAgICAgICAgX3dpbGRjYXJkQXR0cmlidXRlID0gc3RhdGUuX2F0dHJNb2RlbDsKLQotICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLk5PTkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFsbG93ZWQgKG5vIHdpbGRjYXJkcyBhbGxvd2VkKTogIgotICAgICAgICAgICAgICAgICAgICArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBRTmFtZVNldCBhdHRyV2lsZGNhcmRTZXQgPSBzdGF0ZS5fYXR0ck1vZGVsLmdldFdpbGRjYXJkU2V0KCk7Ci0KLSAgICAgICAgaWYgKCFhdHRyV2lsZGNhcmRTZXQuY29udGFpbnMoIGF0dHJOYW1lICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFsbG93ZWQ6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5TS0lQKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGF0dHJTY2hlbWEgPSBfZ2xvYmFsVHlwZXMuZmluZEF0dHJpYnV0ZSggYXR0ck5hbWUgKTsKLSAgICAgICAgX2xvY2FsQXR0cmlidXRlID0gYXR0clNjaGVtYTsKLQotICAgICAgICBpZiAoYXR0clNjaGVtYSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLkxBWCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGFzc2VydCB3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuU1RSSUNUOwotCi0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAiQXR0cmlidXRlIG5vdCBhbGxvd2VkIChzdHJpY3Qgd2lsZGNhcmQsIGFuZCBubyBkZWZpbml0aW9uIGZvdW5kKTogIiArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdmFsdWUgPQotICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCBhdHRyU2NoZW1hLCBldmVudCwgZmFsc2UsIGZhbHNlICk7Ci0KLSAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuYXR0ciggZXZlbnQsIGF0dHJOYW1lLCBhdHRyU2NoZW1hLmdldFR5cGUoKSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5kQXR0cnNFdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKLQotICAgICAgICBpZiAoc3RhdGUuX2F0dHJNb2RlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJzID0gc3RhdGUuX2F0dHJNb2RlbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBhdHRycy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHNsYSA9IGF0dHJzWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX2F0dHJzID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFzdGF0ZS5fYXR0cnMuY29udGFpbnMoIHNsYS5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzbGEuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUkVRVUlSRUQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCAiRXhwZWN0ZWQgYXR0cmlidXRlOiAiLCBzbGEuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2xhLmlzRGVmYXVsdCgpIHx8IHNsYS5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLmF0dHIoZXZlbnQsIHNsYS5nZXROYW1lKCksIHNsYS5nZXRUeXBlKCksIHNsYS5nZXREZWZhdWx0VGV4dCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBhdHRyaWJ1dGUgZGVmYXVsdHMgYmVjYXVzZSB0aGlzIGlzIGRvbmUgYXQgY29tcGlsZXRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc2xhLmdldERlZmF1bHRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBzbGEuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sUU5hbWUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IFFOYW1lIHZhbHVlcyBhcmUgdW5zdXBwb3J0ZWQgZm9yIGF0dHJpYnV0ZTogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWVIZWxwZXIucHJldHR5KHNsYS5nZXROYW1lKCkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBzbGEuZ2V0RGVmYXVsdFRleHQoKSwgZXZlbnQgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLmF0dHIoIGV2ZW50LCB0eXBlLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmRFdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIF9sb2NhbEVsZW1lbnQgPSBudWxsOwotICAgICAgICBfd2lsZGNhcmRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKCFzdGF0ZS5faXNOaWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RhdGUuZW5kKCkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gZmluZERldGFpbGVkRXJyb3JFbmQoc3RhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgIkV4cGVjdGVkIGVsZW1lbnQocykiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgZW5kIGV2ZW50IGhhcyBubyB0ZXh0LCB1c2UgdGhpcyBmYWN0IHRvIHBhc3Mgbm8gdGV4dCB0bwotICAgICAgICAgICAgLy8gaGFuZGxlVGV4dAotCi0gICAgICAgICAgICBpZiAoc3RhdGUuX2lzRW1wdHkpCi0gICAgICAgICAgICAgICAgaGFuZGxlVGV4dCggZXZlbnQsIHRydWUsIHN0YXRlLl9maWVsZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9wU3RhdGUoIGV2ZW50ICk7Ci0KLSAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuZW5kRWxlbWVudCggZXZlbnQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGV4dEV2ZW50ICggRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgU3RhdGUgc3RhdGUgPSB0b3BTdGF0ZSgpOwotCi0gICAgICAgIGlmIChzdGF0ZS5faXNOaWwpCi0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgIk5pbCBlbGVtZW50IGNhbm5vdCBoYXZlIHNpbXBsZSBjb250ZW50Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhhbmRsZVRleHQoIGV2ZW50LCBmYWxzZSwgc3RhdGUuX2ZpZWxkICk7Ci0KLSAgICAgICAgc3RhdGUuX2lzRW1wdHkgPSBmYWxzZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUZXh0ICgKLSAgICAgICAgRXZlbnQgZXZlbnQsIGJvb2xlYW4gZW1wdHlDb250ZW50LCBTY2hlbWFGaWVsZCBmaWVsZCApCi0gICAgewotICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKCFzdGF0ZS5fc2F3VGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0YXRlLl9oYXNTaW1wbGVDb250ZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlU2ltcGxlVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl90eXBlLCBmaWVsZCwgZXZlbnQsIGVtcHR5Q29udGVudCwgdHJ1ZSApOwotCi0gICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUudGV4dCggZXZlbnQsIHN0YXRlLl90eXBlLCB2YWx1ZSwgZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGVtcHR5Q29udGVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS50ZXh0KCBldmVudCwgc3RhdGUuX3R5cGUsIG51bGwsIHRydWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS50ZXh0KCBldmVudCwgc3RhdGUuX3R5cGUsICIiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtcHR5Q29udGVudCAmJiAhc3RhdGUuX2NhbkhhdmVNaXhlZENvbnRlbnQgJiYgCi0gICAgICAgICAgICAhZXZlbnQudGV4dElzV2hpdGVzcGFjZSgpICYgIXN0YXRlLl9oYXNTaW1wbGVDb250ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBlID0gKFNjaGVtYUxvY2FsRWxlbWVudClmaWVsZDsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZXZlbnQsICJFbGVtZW50OiAnIiArIFFOYW1lSGVscGVyLnByZXR0eShlLmdldE5hbWUoKSkgKyAiJyBjYW5ub3QgaGF2ZSBtaXhlZCBjb250ZW50LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXRFcnJvciggZXZlbnQsICJDYW4ndCBoYXZlIG1peGVkIGNvbnRlbnQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtcHR5Q29udGVudCkKLSAgICAgICAgICAgIHN0YXRlLl9zYXdUZXh0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaW5kRGV0YWlsZWRFcnJvckJlZ2luKFN0YXRlIHN0YXRlLCBRTmFtZSBxTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wZXJ0aWVzID0gc3RhdGUuX3R5cGUuZ2V0RWxlbWVudFByb3BlcnRpZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgZWx0UHJvcGVydGllcy5sZW5ndGg7IGlpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vR2V0IHRoZSBlbGVtZW50IGZyb20gdGhlIHNjaGVtYQotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgc1Byb3AgPSBlbHRQcm9wZXJ0aWVzW2lpXTsKLQotICAgICAgICAgICAgLy8gdGVzdCBpZiB0aGUgZWxlbWVudCBpcyB2YWxpZAotICAgICAgICAgICAgaWYgKHN0YXRlLnRlc3Qoc1Byb3AuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkV4cGVjdGVkIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShzUHJvcC5nZXROYW1lKCkpICsgIiBpbnN0ZWFkIG9mICIgKyBRTmFtZUhlbHBlci5wcmV0dHkocU5hbWUpICsgIiBoZXJlIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaW5kRGV0YWlsZWRFcnJvckVuZChTdGF0ZSBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5W10gZWx0UHJvcGVydGllcyAgPSBzdGF0ZS5fdHlwZS5nZXRFbGVtZW50UHJvcGVydGllcygpOwotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGVsdFByb3BlcnRpZXMubGVuZ3RoOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0dldCB0aGUgZWxlbWVudCBmcm9tIHRoZSBzY2hlbWEKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHNQcm9wID0gZWx0UHJvcGVydGllc1tpaV07Ci0KLSAgICAgICAgICAgIC8vIHRlc3QgaWYgdGhlIGVsZW1lbnQgaXMgdmFsaWQKLSAgICAgICAgICAgIGlmIChzdGF0ZS50ZXN0KHNQcm9wLmdldE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCBlbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc1Byb3AuZ2V0TmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFN0YXRlCi0gICAgewotICAgICAgICBib29sZWFuIHZpc2l0ICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY2FuSGF2ZUVsZW1lbnRzICYmIF92aXNpdG9yLnZpc2l0KCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHRlc3QoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NhbkhhdmVFbGVtZW50cyAmJiBfdmlzaXRvci50ZXN0VmFsaWQoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZW5kICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIV9jYW5IYXZlRWxlbWVudHMgfHwgX3Zpc2l0b3IudmlzaXQoIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGN1cnJlbnRQYXJ0aWNsZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF92aXNpdG9yICE9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gX3Zpc2l0b3IuY3VycmVudFBhcnRpY2xlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlICBfdHlwZTsKLSAgICAgICAgU2NoZW1hRmllbGQgX2ZpZWxkOwotCi0gICAgICAgIGJvb2xlYW4gX2NhbkhhdmVBdHRyczsKLSAgICAgICAgYm9vbGVhbiBfY2FuSGF2ZU1peGVkQ29udGVudDsKLSAgICAgICAgYm9vbGVhbiBfaGFzU2ltcGxlQ29udGVudDsKLQotICAgICAgICBib29sZWFuIF9zYXdUZXh0OwotICAgICAgICBib29sZWFuIF9pc0VtcHR5OwotICAgICAgICBib29sZWFuIF9pc05pbDsKLQotICAgICAgICBTY2hlbWFUeXBlVmlzaXRvckltcGwgX3Zpc2l0b3I7Ci0gICAgICAgIGJvb2xlYW4gX2NhbkhhdmVFbGVtZW50czsKLQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBfYXR0ck1vZGVsOwotCi0gICAgICAgIEhhc2hTZXQgX2F0dHJzOwotCi0gICAgICAgIFN0YXRlIF9uZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBuZXdTdGF0ZSAoIFNjaGVtYVR5cGUgdHlwZSwgU2NoZW1hRmllbGQgZmllbGQsIGJvb2xlYW4gaXNOaWwgKQotICAgIHsKLSAgICAgICAgU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoKTsKLQotICAgICAgICBzdGF0ZS5fdHlwZSA9IHR5cGU7Ci0gICAgICAgIHN0YXRlLl9maWVsZCA9IGZpZWxkOwotICAgICAgICBzdGF0ZS5faXNFbXB0eSA9IHRydWU7Ci0gICAgICAgIHN0YXRlLl9pc05pbCA9IGlzTmlsOwotCi0gICAgICAgIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5faGFzU2ltcGxlQ29udGVudCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5fY2FuSGF2ZUF0dHJzID0gdHJ1ZTsKLSAgICAgICAgICAgIHN0YXRlLl9hdHRyTW9kZWwgPSB0eXBlLmdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIHR5cGUuZ2V0Q29udGVudFR5cGUoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCA6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCA6Ci0gICAgICAgICAgICAgICAgc3RhdGUuX2hhc1NpbXBsZUNvbnRlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCA6Ci0gICAgICAgICAgICAgICAgc3RhdGUuX2NhbkhhdmVNaXhlZENvbnRlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UIDoKLQotICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gdHlwZS5nZXRDb250ZW50TW9kZWwoKTsKLQotICAgICAgICAgICAgICAgIHN0YXRlLl9jYW5IYXZlRWxlbWVudHMgPSBwYXJ0aWNsZSAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLl9jYW5IYXZlRWxlbWVudHMpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLl92aXNpdG9yID0gaW5pdFZpc2l0b3IoIHBhcnRpY2xlICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJVbmV4cGVjdGVkIGNvbnRlbnQgdHlwZSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1c2hTdGF0ZSggc3RhdGUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUgKCBFdmVudCBlICkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhdGVTdGFjay5fdmlzaXRvciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb29sVmlzaXRvciggX3N0YXRlU3RhY2suX3Zpc2l0b3IgKTsKLSAgICAgICAgICAgIF9zdGF0ZVN0YWNrLl92aXNpdG9yID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIF9zdGF0ZVN0YWNrID0gX3N0YXRlU3RhY2suX25leHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHB1c2hTdGF0ZSAoIFN0YXRlIHN0YXRlICkKLSAgICB7Ci0gICAgICAgIHN0YXRlLl9uZXh0ID0gX3N0YXRlU3RhY2s7Ci0gICAgICAgIF9zdGF0ZVN0YWNrID0gc3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaW5rZWRMaXN0IF92aXNpdG9yUG9vbCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICBwcml2YXRlIHZvaWQgcG9vbFZpc2l0b3IoIFNjaGVtYVR5cGVWaXNpdG9ySW1wbCB2aXNpdG9yICkKLSAgICB7Ci0gICAgICAgIF92aXNpdG9yUG9vbC5hZGQoIHZpc2l0b3IgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGVWaXNpdG9ySW1wbCBpbml0VmlzaXRvciggU2NoZW1hUGFydGljbGUgcGFydGljbGUgKQotICAgIHsKLSAgICAgICAgaWYgKF92aXNpdG9yUG9vbC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNjaGVtYVR5cGVWaXNpdG9ySW1wbCggcGFydGljbGUgKTsKLQotICAgICAgICBTY2hlbWFUeXBlVmlzaXRvckltcGwgcmVzdWx0ID0KLSAgICAgICAgICAgIChTY2hlbWFUeXBlVmlzaXRvckltcGwpIF92aXNpdG9yUG9vbC5yZW1vdmVMYXN0KCk7Ci0KLSAgICAgICAgcmVzdWx0LmluaXQoIHBhcnRpY2xlICk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0YXRlIHRvcFN0YXRlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdGF0ZVN0YWNrOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gU2ltcGxlIFR5cGUgVmFsaWRhdGlvbgotICAgIC8vCi0gICAgLy8gZW1wdHlDb250ZW50IG1lYW5zIHRoYXQgeW91IGNhbid0IHVzZSB0aGUgZXZlbnQgdG8gZ2V0IHRleHQ6IHRoZXJlIGlzCi0gICAgLy8gbm8gdGV4dCwgYnV0IHlvdSBjYW4gdXNlIHRoZSBldmVudCB0byBkbyBwcmVmaXggcmVzb2x1dGlvbiAoaW4gdGhlIGNhc2UKLSAgICAvLyB3aGVyZSB0aGUgZGVmYXVsdCBpcyBhIHFuYW1lKQotICAgIC8vCi0KLSAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZVNpbXBsZVR5cGUgKAotICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFNjaGVtYUZpZWxkIGZpZWxkLCBFdmVudCBldmVudCwKLSAgICAgICAgYm9vbGVhbiBlbXB0eUNvbnRlbnQsIGJvb2xlYW4gY2FuQXBwbHlEZWZhdWx0ICkKLSAgICB7Ci0gICAgICAgIGlmICghdHlwZS5pc1NpbXBsZVR5cGUoKSAmJgotICAgICAgICAgICAgICAgIHR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICAvLyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vdCBhIHNpbXBsZSB0eXBlIiApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIHRoZSBuby10eXBlIGlzIGFsd2F5cyBpbnZhbGlkCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEVycm9yKGV2ZW50LCAiSW52YWxpZCB0eXBlLiIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIGFzIGEgc3RyaW5nIChhcyBub3JtYWxpemVkIGJ5IHRoZSB3aGl0ZSBzcGFjZSBydWxlCi0gICAgICAgIC8vIFRPRE8gLSB3aWxsIHdhbnQgdG8gb3B0aW1pemUgdGhpcyBsYXRlcgotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9ICIiOwotCi0gICAgICAgIGlmICghZW1wdHlDb250ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBldmVudC5nZXRUZXh0KCBfY2hhcnMsIHR5cGUuZ2V0V2hpdGVTcGFjZVJ1bGUoKSApOwotICAgICAgICAgICAgdmFsdWUgPSBfY2hhcnMuYXNTdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlZSBpZiBJIGNhbiBhcHBseSBhIGRlZmF1bHQvZml4ZWQgdmFsdWUKLQotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCAmJiBjYW5BcHBseURlZmF1bHQgJiYgZmllbGQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmaWVsZC5pc0RlZmF1bHQoKSB8fCBmaWVsZC5pc0ZpeGVkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWG1sUU5hbWUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IFFOYW1lIHZhbHVlcyBhcmUgdW5zdXBwb3J0ZWQgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKyAiIC0gaWdub3JpbmcuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfSU5GTyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSgKLSAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVmYXVsdFRleHQoKSwgdHlwZS5nZXRXaGl0ZVNwYWNlUnVsZSgpICk7Ci0KLS8vIEJVR0JVRyAtIHNob3VsZCB2YWxpZGF0ZSBkZWZhdWx0VmFsdWUgYXQgY29tcGlsZSB0aW1lCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoIHR5cGUsIGRlZmF1bHRWYWx1ZSwgZXZlbnQgKQotICAgICAgICAgICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbGlkYXRlU2ltcGxlVHlwZSggdHlwZSwgdmFsdWUsIGV2ZW50ICkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5pc0ZpeGVkKCkpCi0gICAgICAgIHsKLS8vIFRPRE8gLSBmaXhlZCB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuIGNvb2tlZCBhdCBjb21waWxlIHRpbWUKLSAgICAgICAgICAgIFN0cmluZyBmaXhlZFZhbHVlID0KLSAgICAgICAgICAgICAgICBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKAotICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXREZWZhdWx0VGV4dCgpLCB0eXBlLmdldFdoaXRlU3BhY2VSdWxlKCkgKTsKLQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVNpbXBsZVR5cGUoIHR5cGUsIGZpeGVkVmFsdWUsIGV2ZW50ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIFhtbE9iamVjdCB2YWwgPSB0eXBlLm5ld1ZhbHVlKCB2YWx1ZSApOwotICAgICAgICAgICAgWG1sT2JqZWN0IGRlZiA9IHR5cGUubmV3VmFsdWUoIGZpeGVkVmFsdWUgKTsKLQotICAgICAgICAgICAgaWYgKCF2YWwudmFsdWVFcXVhbHMoIGRlZiApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEJVR0JVRyAtIG1ha2UgdGhpcyBtb3JlIHZlcmJvc2UKLQotICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJWYWx1ZSBub3QgZXF1YWwgdG8gZml4ZWQgdmFsdWUuICIgKyB2YWx1ZSApOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlU2ltcGxlVHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBpZiAoIXR5cGUuaXNTaW1wbGVUeXBlKCkgJiYKLSAgICAgICAgICAgICAgICB0eXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJOb3QgYSBzaW1wbGUgdHlwZSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXRTdGF0ZSA9IF9lcnJvclN0YXRlOwotCi0gICAgICAgIHN3aXRjaCAoIHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICkKLSAgICAgICAgewotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDIDogdmFsaWRhdGVBdG9taWNUeXBlKCB0eXBlLCB2YWx1ZSwgZXZlbnQgKTticmVhazsKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OICA6IHZhbGlkYXRlVW5pb25UeXBlKCAgdHlwZSwgdmFsdWUsIGV2ZW50ICk7YnJlYWs7Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUICAgOiB2YWxpZGF0ZUxpc3RUeXBlKCAgIHR5cGUsIHZhbHVlLCBldmVudCApO2JyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOiB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgc2ltcGxlIHZhcmlldHkiICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0U3RhdGUgPT0gX2Vycm9yU3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQXRvbWljVHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgb25seSBhbiBhdG9taWMgdHlwZSB0byB2YWxpZGF0ZQotCi0gICAgICAgIGFzc2VydCB0eXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkFUT01JQzsKLQotICAgICAgICAvLyBSZWNvcmQgdGhlIGN1cnJlbnQgZXJyb3Igc3RhdGUgdG8gc2VlIGlmIGFueSBuZXcgZXJyb3JzIGFyZSBtYWRlCi0gICAgICAgIGludCBlcnJvclN0YXRlID0gX2Vycm9yU3RhdGU7Ci0gICAgICAgIF92Yy5fZXZlbnQgPSBldmVudDsKLQotICAgICAgICBzd2l0Y2ggKCB0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFIDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWx3YXlzIHZhbGlkIQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkcgOgotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLSAgICAgICAgICAgIF9zdHJpbmdWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMIDoKLSAgICAgICAgewotICAgICAgICAgICAgSmF2YURlY2ltYWxIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgaWYgKGVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RlY2ltYWxWYWx1ZSA9IG5ldyBCaWdEZWNpbWFsKCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIEphdmFEZWNpbWFsSG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggX2RlY2ltYWxWYWx1ZSwgdHlwZSwgX3ZjICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9ib29sZWFuVmFsdWUgPSBKYXZhQm9vbGVhbkhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZsb2F0IGYgPQotICAgICAgICAgICAgICAgIEphdmFGbG9hdEhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgICAgICBKYXZhRmxvYXRIb2xkZXJFeC52YWxpZGF0ZVZhbHVlKCBmLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgX2Zsb2F0VmFsdWUgPSBmOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEUgOgotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgZCA9Ci0gICAgICAgICAgICAgICAgSmF2YURvdWJsZUhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgICAgICBKYXZhRG91YmxlSG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggZCwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIF9kb3VibGVWYWx1ZSA9IGQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FIDoKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbiA9Ci0gICAgICAgICAgICAgICAgSmF2YVFOYW1lSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKAotICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgdHlwZSwgX3ZjLCBldmVudCApOwotCi0gICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgICAgICBKYXZhUU5hbWVIb2xkZXJFeC52YWxpZGF0ZVZhbHVlKCBuLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgX3FuYW1lVmFsdWUgPSBuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJIDoKLSAgICAgICAgewotICAgICAgICAgICAgSmF2YVVyaUhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotICAgICAgICAgICAgX3N0cmluZ1ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVIgOgotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEdEYXRlIGQgPSBYbWxEYXRlSW1wbC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBYbWxEYXRlSW1wbC52YWxpZGF0ZVZhbHVlKCBkLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgX2dkYXRlVmFsdWUgPSBkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEdEdXJhdGlvbiBkID0gWG1sRHVyYXRpb25JbXBsLnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIFhtbER1cmF0aW9uSW1wbC52YWxpZGF0ZVZhbHVlKCBkLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgX2dkdXJhdGlvblZhbHVlID0gZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlkgOgotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gdiA9Ci0gICAgICAgICAgICAgICAgSmF2YUJhc2U2NEhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAodiAhPSBudWxsKQotICAgICAgICAgICAgICAgIEphdmFCYXNlNjRIb2xkZXJFeC52YWxpZGF0ZVZhbHVlKCB2LCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgX2J5dGVBcnJheVZhbHVlID0gdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSB2ID0KLSAgICAgICAgICAgICAgICBKYXZhSGV4QmluYXJ5SG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgSmF2YUhleEJpbmFyeUhvbGRlckV4LnZhbGlkYXRlVmFsdWUoIHYsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBfYnl0ZUFycmF5VmFsdWUgPSB2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTiA6Ci0gICAgICAgICAgICAvLyBVbmltcGxlbWVudGVkLiAKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJVbmV4cGVjdGVkIHByaW1pdGl2ZSB0eXBlIGNvZGUiICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVMaXN0VHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBpbnQgZXJyb3JTdGF0ZSA9IF9lcnJvclN0YXRlOwotCi0gICAgICAgIGlmICghdHlwZS5tYXRjaFBhdHRlcm5GYWNldCggdmFsdWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJMaXN0ICciICsgdmFsdWUgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gWG1sTGlzdEltcGwuc3BsaXRfbGlzdCh2YWx1ZSk7Ci0KLSAgICAgICAgCi0gICAgICAgIGludCBpOwotICAgICAgICBYbWxPYmplY3QgbzsKLQotICAgICAgICBpZiAoKG8gPSB0eXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpICE9IGl0ZW1zLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIHZhbHVlICsgIikgZG9lcyBub3QgaGF2ZSAiICsgaSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zIHBlciBsZW5ndGggZmFjZXQgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG8gPSB0eXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSA+IGl0ZW1zLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIHZhbHVlICsgIikgaGFzIG9ubHkgIiArIGl0ZW1zLmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zLCBmZXdlciB0aGFuIG1pbiBsZW5ndGggZmFjZXQgKCIgKyBpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKG8gPSB0eXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSA8IGl0ZW1zLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIHZhbHVlICsgIikgaGFzICIgKyBpdGVtcy5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcywgbW9yZSB0aGFuIG1heCBsZW5ndGggZmFjZXQgKCIgKyBpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZSBpdGVtVHlwZSA9IHR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0gICAgICAgIF9saXN0VmFsdWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIF9saXN0VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgaXRlbXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgIGl0ZW1UeXBlLCBpdGVtc1tpXSwgZXZlbnQgKTsKLSAgICAgICAgICAgIGFkZFRvTGlzdChpdGVtVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBubyBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCwgdGhlbiBJIGNhbiBjcmVhdGUgYW4KLSAgICAgICAgLy8gWG1sTGlzdCBmcm9tIHRoaXMgdmFsdWUgYW5kIGNhbXBhcmUgaXQgYWdhaW4gZW51bXMuCi0KLSAgICAgICAgaWYgKGVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBMaXN0cyB3aGljaCBjb250YWluIFFOYW1lcyB3aWxsIG5lZWQgYSByZXNvbHZlcgotCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKAotICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZXNwYWNlQ29udGV4dCggZXZlbnQgKSApOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QgbGlzdFZhbHVlID0gKCAoU2NoZW1hVHlwZUltcGwpIHR5cGUpLm5ld1ZhbGlkYXRpbmdWYWx1ZSggdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTGlzdCB2YWx1ZSAoIiArIHZhbHVlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVVbmlvblR5cGUgKAotICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgLy8gVE9ETyAtIGlmIHhzaTp0eXBlIGlzIHNwZWNpZmllZCBvbiBhIHVuaW9uLCBpdCBzZWxlY3RzCi0gICAgICAgIC8vIHRoYXQgdW5pb24gbWVtYmVyIHR5cGUKLQotICAgICAgICBpZiAoIXR5cGUubWF0Y2hQYXR0ZXJuRmFjZXQoIHZhbHVlICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAiVW5pb24gJyIgKyB2YWx1ZSArICInIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY3VycmVudFdzciA9IFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWUgPSB2YWx1ZTsKLQotICAgICAgICBTY2hlbWFUeXBlW10gdHlwZXMgPSB0eXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKTsKLQotICAgICAgICBpbnQgb3JpZ2luYWxTdGF0ZSA9IF9lcnJvclN0YXRlOwotCi0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCB0eXBlcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbWVtYmVyV3NyID0gdHlwZXNbIGkgXS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotCi0gICAgICAgICAgICBpZiAobWVtYmVyV3NyID09IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICAgICAgbWVtYmVyV3NyID0gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsKLQotICAgICAgICAgICAgaWYgKG1lbWJlcldzciAhPSBjdXJyZW50V3NyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRXc3IgPSBtZW1iZXJXc3I7Ci0gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSggdmFsdWUsIGN1cnJlbnRXc3IgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IG9yaWdpbmFsRXJyb3JTdGF0ZSA9IF9lcnJvclN0YXRlOwotCi0gICAgICAgICAgICBfc3VzcGVuZEVycm9ycysrOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoIHR5cGVzWyBpIF0sIGN1cnJlbnRWYWx1ZSwgZXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc3VzcGVuZEVycm9ycy0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob3JpZ2luYWxFcnJvclN0YXRlID09IF9lcnJvclN0YXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF91bmlvblR5cGUgPSB0eXBlc1tpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIF9lcnJvclN0YXRlID0gb3JpZ2luYWxTdGF0ZTsKLQotICAgICAgICBpZiAoaSA+PSB0eXBlcy5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAiVW5pb24gJyIgKyB2YWx1ZSArICInIGRvZXMgbm90IG1hdGNoIGFueSBtZW1iZXJzIG9mICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0W10gdW5pb25FbnVtdmFscyA9IHR5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAgaWYgKHVuaW9uRW51bXZhbHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBVbmlvbnMgd2hpY2ggY29udGFpbiBRTmFtZXMgd2lsbCBuZWVkIGEgcmVzb2x2ZXIKLQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaCggbmV3IE5hbWVzcGFjZUNvbnRleHQoIGV2ZW50ICkgKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IHVuaW9uVmFsdWUgPSB0eXBlLm5ld1ZhbHVlKCB2YWx1ZSApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IHVuaW9uRW51bXZhbHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaW9uVmFsdWUudmFsdWVFcXVhbHMoIHVuaW9uRW51bXZhbHNbIGkgXSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gdW5pb25FbnVtdmFscy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pb24gJyIgKyB2YWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSwgdGhlIGN1cnJlbnQgdW5pb24gY29kZSBhbHdheXMgZW5kcyB1cCBoZXJlIHdoZW4gaW52YWxpZAotICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmlvbiAnIiArIHZhbHVlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvTGlzdChTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHR5cGUuZ2V0VW5pb25NZW1iZXJUeXBlcygpLmxlbmd0aD4wICYmIGdldFVuaW9uVHlwZSgpIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gZ2V0VW5pb25UeXBlKCk7Ci0gICAgICAgICAgICBfdW5pb25UeXBlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIF9saXN0VHlwZXMuYWRkKHR5cGUpOwotCi0gICAgICAgIHN3aXRjaCAoIHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKF9zdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKF9zdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIF9zdHJpbmdWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTCA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZCggX2RlY2ltYWxWYWx1ZSApOwotICAgICAgICAgICAgICAgICAgICBfZGVjaW1hbFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKF9ib29sZWFuVmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgX2Jvb2xlYW5WYWx1ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKG5ldyBGbG9hdChfZmxvYXRWYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICBfZmxvYXRWYWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKG5ldyBEb3VibGUoX2RvdWJsZVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIF9kb3VibGVWYWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUUgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3RWYWx1ZS5hZGQoX3FuYW1lVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBfcW5hbWVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGlzdFR5cGVzLmFkZChfc3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSA6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUUgOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFIDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIIDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSIDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVkgOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWSA6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEggOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3RWYWx1ZS5hZGQoX2dkYXRlVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBfZ2RhdGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT04gOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3RWYWx1ZS5hZGQoX2dkdXJhdGlvblZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgX2dkdXJhdGlvblZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZChfYnl0ZUFycmF5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBfYnl0ZUFycmF5VmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlkgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3RWYWx1ZS5hZGQoX2J5dGVBcnJheVZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgX2J5dGVBcnJheVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTiA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZChfc3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBfc3RyaW5nVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5leHBlY3RlZCBwcmltaXRpdmUgdHlwZSBjb2RlIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBNZW1iZXJzIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MKLSAgICAvLwotCi0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgX2ludmFsaWQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlICAgICAgICAgX3Jvb3RUeXBlOwotICAgIHByaXZhdGUgU2NoZW1hRmllbGQgICAgICAgIF9yb290RmllbGQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyICAgX2dsb2JhbFR5cGVzOwotICAgIHByaXZhdGUgQ2hhcnMgICAgICAgICAgICAgIF9jaGFyczsKLSAgICBwcml2YXRlIFN0YXRlICAgICAgICAgICAgICBfc3RhdGVTdGFjazsKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICBfZXJyb3JTdGF0ZTsKLSAgICBwcml2YXRlIENvbGxlY3Rpb24gICAgICAgICBfZXJyb3JMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFZhbGlkYXRvclZDICAgICAgICBfdmM7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnM7Ci0gICAgcHJpdmF0ZSBJZGVudGl0eUNvbnN0cmFpbnQgX2NvbnN0cmFpbnRFbmdpbmU7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQ7Ci0KLSAgICBwcml2YXRlIFNjaGVtYUxvY2FsRWxlbWVudCAgIF9sb2NhbEVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFQYXJ0aWNsZSAgICAgICBfd2lsZGNhcmRFbGVtZW50OwotICAgIHByaXZhdGUgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgX2xvY2FsQXR0cmlidXRlOwotICAgIHByaXZhdGUgU2NoZW1hQXR0cmlidXRlTW9kZWwgX3dpbGRjYXJkQXR0cmlidXRlOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZSAgICAgICAgICAgX3VuaW9uVHlwZTsKLQotICAgIC8vIFN0cm9uZ2x5IHR5cGVkIHZhbHVlcwotICAgIHByaXZhdGUgU3RyaW5nIF9zdHJpbmdWYWx1ZTsKLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgX2RlY2ltYWxWYWx1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Jvb2xlYW5WYWx1ZTsKLSAgICBwcml2YXRlIGZsb2F0IF9mbG9hdFZhbHVlOwotICAgIHByaXZhdGUgZG91YmxlIF9kb3VibGVWYWx1ZTsKLSAgICBwcml2YXRlIFFOYW1lIF9xbmFtZVZhbHVlOwotICAgIHByaXZhdGUgR0RhdGUgX2dkYXRlVmFsdWU7Ci0gICAgcHJpdmF0ZSBHRHVyYXRpb24gX2dkdXJhdGlvblZhbHVlOwotICAgIHByaXZhdGUgYnl0ZVtdIF9ieXRlQXJyYXlWYWx1ZTsKLSAgICBwcml2YXRlIExpc3QgX2xpc3RWYWx1ZTsKLSAgICBwcml2YXRlIExpc3QgX2xpc3RUeXBlczsKLQotICAgIHByaXZhdGUgdm9pZCByZXNldFZhbHVlcygpCi0gICAgewotICAgICAgICBfbG9jYWxBdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICBfd2lsZGNhcmRBdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICBfc3RyaW5nVmFsdWUgPSBudWxsOwotICAgICAgICBfZGVjaW1hbFZhbHVlID0gbnVsbDsKLSAgICAgICAgX2Jvb2xlYW5WYWx1ZSA9IGZhbHNlOwotICAgICAgICBfZmxvYXRWYWx1ZSA9IDA7Ci0gICAgICAgIF9kb3VibGVWYWx1ZSA9IDA7Ci0gICAgICAgIF9xbmFtZVZhbHVlID0gbnVsbDsKLSAgICAgICAgX2dkYXRlVmFsdWUgPSBudWxsOwotICAgICAgICBfZ2R1cmF0aW9uVmFsdWUgPSBudWxsOwotICAgICAgICBfYnl0ZUFycmF5VmFsdWUgPSBudWxsOwotICAgICAgICBfbGlzdFZhbHVlID0gbnVsbDsKLSAgICAgICAgX2xpc3RUeXBlcyA9IG51bGw7Ci0gICAgICAgIF91bmlvblR5cGUgPSBudWxsOwotICAgICAgICBfbG9jYWxBdHRyaWJ1dGUgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFMb2NhbEVsZW1lbnQgZ2V0Q3VycmVudEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgaWYgKF9sb2NhbEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfbG9jYWxFbGVtZW50OwotCi0gICAgICAgIC8vIGl0IG1lYW5zIHRoZSBlbGVtZW50IGlzIHRvIGJlIHNraXBlZCBhbmQgaXQgZG9lc24ndCBoYXZlIGEga25vd24gU2NoZW1hTG9jYWxFbGVtZW50Ci0gICAgICAgIGlmIChfZWF0Q29udGVudD4wKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy90cnkgZ2V0dGluZyBpdCBmcm9tIHRoZSBzdGFjayAodGhpcyBzaG91bGQgaGFwcGVuIGFmdGVyIEVORCkKLSAgICAgICAgaWYgKF9zdGF0ZVN0YWNrIT1udWxsICYmIF9zdGF0ZVN0YWNrLl9maWVsZCBpbnN0YW5jZW9mIFNjaGVtYUxvY2FsRWxlbWVudCApCi0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYUxvY2FsRWxlbWVudClfc3RhdGVTdGFjay5fZmllbGQ7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVBhcnRpY2xlIGdldEN1cnJlbnRXaWxkY2FyZEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF93aWxkY2FyZEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUxvY2FsQXR0cmlidXRlIGdldEN1cnJlbnRBdHRyaWJ1dGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhbEF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlTW9kZWwgZ2V0Q3VycmVudFdpbGRjYXJkQXR0cmlidXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfd2lsZGNhcmRBdHRyaWJ1dGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3N0cmluZ1ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldERlY2ltYWxWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2RlY2ltYWxWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ib29sZWFuVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9mbG9hdFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kb3VibGVWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3FuYW1lVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIEdEYXRlIGdldEdEYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9nZGF0ZVZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBHRHVyYXRpb24gZ2V0R0R1cmF0aW9uVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9nZHVyYXRpb25WYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYnl0ZUFycmF5VmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0TGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbGlzdFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldExpc3RUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gX2xpc3RUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRVbmlvblR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91bmlvblR5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDNkNmY0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCYXNlNjRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJhc2U2NEJpbmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUJhc2U2NEhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQkFTRV82NF9CSU5BUlk7IH0KLQotICAgIHByb3RlY3RlZCBieXRlW10gX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKF92YWx1ZSkpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIF9oYXNoY2FjaGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgX3ZhbHVlID0gdmFsaWRhdGVMZXhpY2FsKHMsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF92YWx1ZSA9IGxleChzLCBfdm9vclZjKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGxleChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgYykKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSB2Qnl0ZXMgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdkJ5dGVzID0gdi5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGlzIGFsd2F5cyBzdXBwb3J0ZWQKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBCYXNlNjQuZGVjb2RlKHZCeXRlcyk7Ci0KLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBnZXQgYSBkZWNlbnQgZXJyb3Igd2l0aCBsaW5lIG51bWJlcnMgYW5kIHN1Y2ggaGVyZQotICAgICAgICAgICAgYy5pbnZhbGlkKCJCYXNlIDY0IGVuY29kZWQgZGF0YSBub3QgZW5jb2RlZCBwcm9wZXJseSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IGxleCh2LCBjb250ZXh0KTsKLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiQmFzZSA2NCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtfdmFsdWUubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfdmFsdWUsIDAsIHJlc3VsdCwgMCwgX3ZhbHVlLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CeXRlQXJyYXkoYnl0ZVtdIGJhKQotICAgIHsKLSAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgX3ZhbHVlID0gbmV3IGJ5dGVbYmEubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShiYSwgMCwgX3ZhbHVlLCAwLCBiYS5sZW5ndGgpOwotICAgIH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBieXRlW10gaXZhbCA9ICgoWG1sQmFzZTY0QmluYXJ5KSBpKS5nZXRCeXRlQXJyYXlWYWx1ZSgpOwotICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhfdmFsdWUsIGl2YWwpOwotICAgIH0KLQotICAgIC8vYmVjYXVzZSBjb21wdXRpbmcgaGFzaGNvZGUgaXMgZXhwZW5zaXZlIHdlJ2xsIGNhY2hlIGl0Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgaW50IGhhc2hjb2RlID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbWQ1OwotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIE1ENSBoYXNoIEFsZ29yaXRobSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgaWYoIF9oYXNoY2FjaGVkICkKLSAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKLQotICAgICAgICBfaGFzaGNhY2hlZCA9IHRydWU7Ci0KLSAgICAgICAgaWYoIF92YWx1ZSA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBoYXNoY29kZSA9IDA7Ci0KLSAgICAgICAgYnl0ZVtdIHJlcyA9IG1kNS5kaWdlc3QoX3ZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGhhc2hjb2RlID0gcmVzWzBdPDwyNCArIHJlc1sxXTw8MTYgKyByZXNbMl08PDggKyByZXNbM107Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmZjNkNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhQmFzZTY0SG9sZGVyRXggZXh0ZW5kcyBKYXZhQmFzZTY0SG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgSmF2YUJhc2U2NEhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGZpbmFsIGJ5dGVbXSB2OwotCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdiA9IHZhbGlkYXRlTGV4aWNhbChzLCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gbGV4KHMsIF92b29yVmMpOwotCi0gICAgICAgIGlmICh2ICE9IG51bGwgJiYgX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgc2NoZW1hVHlwZSgpLCBYbWxPYmplY3RCYXNlLl92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0X0J5dGVBcnJheSh2KTsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0X0J5dGVBcnJheSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShieXRlW10gdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBYbWxPYmplY3QgbzsKLQotICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSAhPSB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJCYXNlIDY0IGVuY29kZWQgZGF0YSBkb2VzIG5vdCBoYXZlICIgKyBpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcGVyIGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpID4gdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiQmFzZSA2NCBlbmNvZGVkIGRhdGEgaGFzIG9ubHkgIiArIHYubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsIGZld2VyIHRoYW4gbWluIGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpIDwgdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiQmFzZSA2NCBlbmNvZGVkIGRhdGEgaGFzICIgKyB2Lmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCBtb3JlIHRoYW4gbWF4IGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZW51bUxvb3A6IGZvciAoIGkgPSAwIDsgaSA8IHZhbHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gZW51bUJ5dGVzID0gKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmJ5dGVBcnJheVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW51bUJ5dGVzLmxlbmd0aCAhPSB2Lmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZW51bUJ5dGVzLmxlbmd0aCA7IGorKyApCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbnVtQnl0ZXNbal0gIT0gdltqXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGVudW1Mb29wOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSB2YWxzLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkJhc2UgNjQgZW5jb2RlZCBkYXRhIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgZW51bWVyYXRpb24gdmFsdWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGJ5dGVBcnJheVZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTZkNTBlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCb29sZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhQm9vbGVhbkhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQk9PTEVBTjsgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBfdmFsdWUgPSB2YWxpZGF0ZUxleGljYWwocywgX3Zvb3JWYyk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAodi5lcXVhbHMoInRydWUiKSB8fCB2LmVxdWFscygiMSIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBpZiAodi5lcXVhbHMoImZhbHNlIikgfHwgdi5lcXVhbHMoIjAiKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjb250ZXh0LmludmFsaWQoIkludmFsaWQgdmFsdWUgZm9yIGJvb2xlYW46ICIgKyB2KTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gZmFsc2U7Ci0gICAgfQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2Jvb2xlYW4oYm9vbGVhbiBmKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gZjsKLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIC8vIG5vIG9yZGVyaW5nIGRlZmluZWQgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZQotICAgICAgICByZXR1cm4gX3ZhbHVlID09ICgoWG1sQm9vbGVhbilpKS5nZXRCb29sZWFuVmFsdWUoKSA/IDAgOiAyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbEJvb2xlYW4paSkuZ2V0Qm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZSA/IDk1NzM3OTU1NCA6IDY3NjMzNTk3NTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjY5N2MuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJvb2xlYW5Ib2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUJvb2xlYW5Ib2xkZXJFeCBleHRlbmRzIEphdmFCb29sZWFuSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBiID0gSmF2YUJvb2xlYW5Ib2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotICAgICAgICB2YWxpZGF0ZVBhdHRlcm4odiwgc1R5cGUsIGNvbnRleHQpOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUGF0dGVybihTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIHRoZSBvbmx5IG5ldyBmYWNldCB0aGF0IGNhbiBhcHBseSB0byBib29sZWFucyBpcyBwYXR0ZXJuIQotICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJCb29sZWFuICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSmF2YUJvb2xlYW5Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVBhdHRlcm4ocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTA5ZDEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1wdWJsaWMgY2xhc3MgSmF2YURlY2ltYWxIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0RFQ0lNQUw7IH0KLQotICAgIHByaXZhdGUgQmlnRGVjaW1hbCBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIHNldHMvZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWUudG9TdHJpbmcoKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3Zvb3JWYyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldF9CaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKHMpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92b29yVmMuaW52YWxpZCgiSW52YWxpZCBEZWNpbWFsIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGxleGljYWwgdmFsaWRhdGlvbiBvbmx5LgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIFRPRE8gLSB3aWxsIHdhbnQgdG8gdmFsaWRhdGUgQ2hhcnMgd2l0aCBidWlsdCBpbiB3aGl0ZSBzcGFjZSBoYW5kbGluZwotICAgICAgICAvLyAgICAgICAgSG93ZXZlciwgdGhpcyBmY24gc29tZXRpbWVzIHRha2VzIGEgdmFsdWUgd2l0aCB3c3IgYXBwbGllZAotICAgICAgICAvLyAgICAgICAgYWxyZWFkeQotICAgICAgICBpbnQgbCA9IHYubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgCi0gICAgICAgIGlmIChpIDwgbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNoID0gdi5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjaCA9PSAnKycgfHwgY2ggPT0gJy0nKQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBzYXdEb3QgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBzYXdEaWdpdCA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoIDsgaSA8IGwgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2ggPSB2LmNoYXJBdChpKTsKLQotICAgICAgICAgICAgaWYgKGNoID09ICcuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2F3RG90KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbGxlZ2FsIGRlY2ltYWwsIHNhdyAnLicgbW9yZSB0aGFuIG9uY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNhd0RvdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNhd0RpZ2l0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gbWF5IG5lZWQgdG8gZXNjYXBlIGVycm9yIGNoYXIKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIklsbGVnYWwgZGVjaW1hbCwgdW5leHBlY3RlZCBjaGFyOiAiICsgY2gpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc2F3RGlnaXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSWxsZWdhbCBkZWNpbWFsLCBleHBlY3RlZCBhdCBsZWFzdCBvbmUgZGlnaXQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IF92YWx1ZSA9IHY7IH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBkZWNpbWFsKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5jb21wYXJlVG8oKChYbWxPYmplY3RCYXNlKWRlY2ltYWwpLmJpZ0RlY2ltYWxWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGRlY2ltYWwpCi0gICAgewotICAgICAgICByZXR1cm4gKF92YWx1ZS5jb21wYXJlVG8oKChYbWxPYmplY3RCYXNlKWRlY2ltYWwpLmJpZ0RlY2ltYWxWYWx1ZSgpKSkgPT0gMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9tYXhsb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9taW5sb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKTsKLQotICAgIC8qKgotICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKLSAgICAgKiBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsdWUuc2NhbGUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdmFsdWUuc2V0U2NhbGUoMCwgQmlnRGVjaW1hbC5ST1VORF9ET1dOKS5jb21wYXJlVG8oX3ZhbHVlKSAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBkZWNpbWFsSGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJpZ0ludGVnZXIgaW50dmFsID0gX3ZhbHVlLnRvQmlnSW50ZWdlcigpOwotCi0gICAgICAgIGlmIChpbnR2YWwuY29tcGFyZVRvKF9tYXhsb25nKSA+IDAgfHwKLSAgICAgICAgICAgIGludHZhbC5jb21wYXJlVG8oX21pbmxvbmcpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBpbnR2YWwuaGFzaENvZGUoKTsKLQotICAgICAgICBsb25nIGxvbmd2YWwgPSBpbnR2YWwubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIChpbnQpKChsb25ndmFsID4+IDMyKSAqIDE5ICsgbG9uZ3ZhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBoYXMgQmlnRGVjaW1hbHMgd2l0aCB0aGUgc2FtZSBhcml0aG1ldGljIHZhbHVlIHRvCi0gICAgICogdGhlIHNhbWUgaGFzaCBjb2RlIChlZywgMi4zICYgMi4zMCB3aWxsIGhhdmUgdGhlIHNhbWUgaGFzaC4pCi0gICAgICogVGhpcyBkaWZmZXJzIGZyb20gQmlnRGVjaW1hbC5oYXNoQ29kZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBkZWNpbWFsSGFzaENvZGUoKSB7Ci0gICAgICAgIGFzc2VydCBfdmFsdWUuc2NhbGUoKSA+IDA7Ci0KLSAgICAgICAgLy8gR2V0IGRlY2ltYWwgdmFsdWUgYXMgc3RyaW5nLCBhbmQgc3RyaXAgb2ZmIHplcm9lcyBvbiB0aGUgcmlnaHQKLSAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gX3ZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSBzdHJWYWx1ZS5sZW5ndGgoKSAtIDEgOyBpID49IDAgOyBpIC0tKQotICAgICAgICAgICAgaWYgKHN0clZhbHVlLmNoYXJBdChpKSAhPSAnMCcpIGJyZWFrOwotCi0gICAgICAgIGFzc2VydCBzdHJWYWx1ZS5pbmRleE9mKCcuJykgPCBpOwotCi0gICAgICAgIC8vIFJldHVybiB0aGUgY2Fub25pY2FsaXplZCBzdHJpbmcgaGFzaGNvZGUKLSAgICAgICAgcmV0dXJuIHN0clZhbHVlLnN1YnN0cmluZygwLCBpICsgMSkuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZWFhZjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFEZWNpbWFsSG9sZGVyRXggZXh0ZW5kcyBKYXZhRGVjaW1hbEhvbGRlcgotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHVibGljIEphdmFEZWNpbWFsSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBCaWdEZWNpbWFsIHYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdiA9IG5ldyBCaWdEZWNpbWFsKHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgX3Zvb3JWYy5pbnZhbGlkKCJJbnZhbGlkIERlY2ltYWwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgc3VwZXIuc2V0X0JpZ0RlY2ltYWwodik7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIHN1cGVyLnNldF9CaWdEZWNpbWFsKHYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgSmF2YURlY2ltYWxIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgcGF0dGVybgotICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlc2NyaWJlIHN0cmluZyBhbmQgcGF0dGVybiBoZXJlIGluIGVycm9yCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEZWNpbWFsICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGZhY2V0IHZhbGlkYXRpb24gb25seS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKEJpZ0RlY2ltYWwgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIGZyYWN0aW9uYWwgZGlnaXRzCi0gICAgICAgIFhtbE9iamVjdCBmZCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTKTsKLSAgICAgICAgaWYgKGZkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBzY2FsZSA9ICgoWG1sT2JqZWN0QmFzZSlmZCkuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2LnNjYWxlKCkgPiBzY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEZWNpbWFsIGZyYWN0aW9uYWwgZGlnaXRzICgiICsgdi5zY2FsZSgpICsgIikgZG9lcyBub3QgbWF0Y2ggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZnJhY3Rpb25hbCBkaWdpdHMgZmFjZXQgKCIgKyBzY2FsZSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0b3RhbCBkaWdpdHMKLSAgICAgICAgWG1sT2JqZWN0IHRkID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOwotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSB2LnVuc2NhbGVkVmFsdWUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgaW50IHRkZiA9ICgoWG1sT2JqZWN0QmFzZSl0ZCkuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0ZW1wLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgdGVtcC5jaGFyQXQoMCkgPT0gJy0nKQotICAgICAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICAgICAgaWYgKGxlbiA+IHRkZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEZWNpbWFsIHRvdGFsIGRpZ2l0cyAoIiArIHRlbXAgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgZGlnaXRzIGZhY2V0ICgiICsgdGRmICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBleAotICAgICAgICBYbWxPYmplY3QgbWluZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgbSA9ICgoWG1sT2JqZWN0QmFzZSltaW5lKS5iaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUbyhtKSA8PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBpbgotICAgICAgICBYbWxPYmplY3QgbWluaSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgbSA9ICgoWG1sT2JqZWN0QmFzZSltaW5pKS5iaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUbyhtKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGluCi0gICAgICAgIFhtbE9iamVjdCBtYXhpID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBtID0gKChYbWxPYmplY3RCYXNlKW1heGkpLmJpZ0RlY2ltYWxWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKG0pID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEZWNpbWFsICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggZXgKLSAgICAgICAgWG1sT2JqZWN0IG1heGUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWF4ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIG0gPSAoKFhtbE9iamVjdEJhc2UpbWF4ZSkuYmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG8obSkgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEZWNpbWFsICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlbnVtZXJhdGlvbgotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmICh2LmVxdWFscygoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuYmlnRGVjaW1hbFZhbHVlKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRlY2ltYWwgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggYW55IGVudW1lcmF0aW9uIHZhbHVlcyBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGJpZ0RlY2ltYWxWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2Y0NTIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRG91YmxlSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9ET1VCTEU7IH0KLQotICAgIGRvdWJsZSBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGdldHMvc2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBzZXJpYWxpemUoX3ZhbHVlKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplKGRvdWJsZSBkKQotICAgIHsKLSAgICAgICAgaWYgKGQgPT0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKQotICAgICAgICAgICAgcmV0dXJuICJJTkYiOwotICAgICAgICBlbHNlIGlmIChkID09IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkKLSAgICAgICAgICAgIHJldHVybiAiLUlORiI7Ci0gICAgICAgIGVsc2UgaWYgKGQgPT0gRG91YmxlLk5hTikKLSAgICAgICAgICAgIHJldHVybiAiTmFOIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS50b1N0cmluZyhkKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBzZXRfZG91YmxlKHZhbGlkYXRlTGV4aWNhbChzLF92b29yVmMpKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUodik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2LmVxdWFscygiSU5GIikpICByZXR1cm4gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCItSU5GIikpIHJldHVybiBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFk7Ci0gICAgICAgICAgICBpZiAodi5lcXVhbHMoIk5hTiIpKSAgcmV0dXJuIERvdWJsZS5OYU47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW52YWxpZCBkb3VibGUgdmFsdWUiKTsKLQotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSAwLjA7Ci0gICAgfQotCi0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBuZXcgQmlnRGVjaW1hbChfdmFsdWUpOyB9Ci0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gKGZsb2F0KV92YWx1ZTsgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpIHsgX3ZhbHVlID0gdjsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KSB7IHNldF9kb3VibGUoKGRvdWJsZSl2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikgeyBzZXRfZG91YmxlKChkb3VibGUpdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X2RvdWJsZSh2LmRvdWJsZVZhbHVlKCkpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KSB7IHNldF9kb3VibGUodi5kb3VibGVWYWx1ZSgpKTsgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGQpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZShfdmFsdWUsKChYbWxPYmplY3RCYXNlKWQpLmRvdWJsZVZhbHVlKCkpOwotICAgIH0KLSAgICBzdGF0aWMgaW50IGNvbXBhcmUoZG91YmxlIHRoaXNWYWx1ZSwgZG91YmxlIHRoYXRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzVmFsdWUgPCB0aGF0VmFsdWUpIHJldHVybiAtMTsKLSAgICAgICAgaWYgKHRoaXNWYWx1ZSA+IHRoYXRWYWx1ZSkgcmV0dXJuICAxOwotCi0gICAgICAgIGxvbmcgdGhpc0JpdHMgPSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzVmFsdWUpOwotICAgICAgICBsb25nIHRoYXRCaXRzID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhhdFZhbHVlKTsKLQotICAgICAgICByZXR1cm4gdGhpc0JpdHMgPT0gdGhhdEJpdHMgPyAwIDogdGhpc0JpdHMgPCB0aGF0Qml0cyA/IC0xIDogMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlKF92YWx1ZSwgKChYbWxPYmplY3RCYXNlKWQpLmRvdWJsZVZhbHVlKCkpID09IDA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgbG9uZyB2ID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoX3ZhbHVlKTsKLSAgICAgICAgcmV0dXJuIChpbnQpKCh2ID4+IDMyKSAqIDE5ICsgdik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2MjQwYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRG91YmxlSG9sZGVyRXggZXh0ZW5kcyBKYXZhRG91YmxlSG9sZGVyCi17Ci0gICAgcHVibGljIEphdmFEb3VibGVIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBzdXBlci5zZXRfZG91YmxlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGRvdWJsZSBkID0gSmF2YURvdWJsZUhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRG91YmxlICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGRvdWJsZSB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIGRvdWJsZSBkOwotCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlKHYsIGQgPSAoKFhtbE9iamVjdEJhc2UpeCkuZG91YmxlVmFsdWUoKSkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEb3VibGUgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBkICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRG91YmxlICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZCArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRG91YmxlICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgZCArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRvdWJsZSAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIGQgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmRvdWJsZVZhbHVlKCkpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRG91YmxlICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGRvdWJsZVZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRmxvYXRIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTI1ODU3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRmxvYXRIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0ZMT0FUOyB9Ci0KLSAgICBwcml2YXRlIGZsb2F0IF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cytzZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsKLSAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZShfdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShmbG9hdCBmKQotICAgIHsKLSAgICAgICAgaWYgKGYgPT0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkpCi0gICAgICAgICAgICByZXR1cm4gIklORiI7Ci0gICAgICAgIGVsc2UgaWYgKGYgPT0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpCi0gICAgICAgICAgICByZXR1cm4gIi1JTkYiOwotICAgICAgICBlbHNlIGlmIChmID09IEZsb2F0Lk5hTikKLSAgICAgICAgICAgIHJldHVybiAiTmFOIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnRvU3RyaW5nKGYpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHNldF9mbG9hdCh2YWxpZGF0ZUxleGljYWwocyxfdm9vclZjKSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KHYpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodi5lcXVhbHMoIklORiIpKSAgcmV0dXJuIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCItSU5GIikpIHJldHVybiBGbG9hdC5ORUdBVElWRV9JTkZJTklUWTsKLSAgICAgICAgICAgIGlmICh2LmVxdWFscygiTmFOIikpICByZXR1cm4gRmxvYXQuTmFOOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludmFsaWQgZmxvYXQgdmFsdWUiKTsKLQotICAgICAgICAgICAgcmV0dXJuIEZsb2F0Lk5hTjsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IDAuMGY7Ci0gICAgfQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gbmV3IEJpZ0RlY2ltYWwoX3ZhbHVlKTsgfQotICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpIHsgc2V0X2Zsb2F0KChmbG9hdCl2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KSB7IF92YWx1ZSA9IHY7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIHYpIHsgc2V0X2Zsb2F0KChmbG9hdCl2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdikgeyBzZXRfZmxvYXQodi5mbG9hdFZhbHVlKCkpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KSB7IHNldF9mbG9hdCh2LmZsb2F0VmFsdWUoKSk7IH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmUoX3ZhbHVlLCgoWG1sT2JqZWN0QmFzZSlmKS5mbG9hdFZhbHVlKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgY29tcGFyZShmbG9hdCB0aGlzVmFsdWUsIGZsb2F0IHRoYXRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzVmFsdWUgPCB0aGF0VmFsdWUpIHJldHVybiAtMTsKLSAgICAgICAgaWYgKHRoaXNWYWx1ZSA+IHRoYXRWYWx1ZSkgcmV0dXJuICAxOwotCi0gICAgICAgIGludCB0aGlzQml0cyA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXNWYWx1ZSk7Ci0gICAgICAgIGludCB0aGF0Qml0cyA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoYXRWYWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXNCaXRzID09IHRoYXRCaXRzID8gMCA6IHRoaXNCaXRzIDwgdGhhdEJpdHMgPyAtMSA6IDE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGYpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZShfdmFsdWUsICgoWG1sT2JqZWN0QmFzZSlmKS5mbG9hdFZhbHVlKCkpID09IDA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZsb2F0LmZsb2F0VG9JbnRCaXRzKF92YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUZsb2F0SG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYzRlZmMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUZsb2F0SG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRmxvYXRIb2xkZXJFeCBleHRlbmRzIEphdmFGbG9hdEhvbGRlcgotewotICAgIHB1YmxpYyBKYXZhRmxvYXRIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgc3VwZXIuc2V0X2Zsb2F0KHYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGZsb2F0IGYgPSBKYXZhRmxvYXRIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotCi0gICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkZsb2F0ICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGZsb2F0IHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgZmxvYXQgZjsKLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBmID0gKChYbWxPYmplY3RCYXNlKXgpLmZsb2F0VmFsdWUoKSkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBmID0gKChYbWxPYmplY3RCYXNlKXgpLmZsb2F0VmFsdWUoKSkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkZsb2F0ICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZiA9ICgoWG1sT2JqZWN0QmFzZSl4KS5mbG9hdFZhbHVlKCkpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlKHYsIGYgPSAoKFhtbE9iamVjdEJhc2UpeCkuZmxvYXRWYWx1ZSgpKSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkZsb2F0ICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCAoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZmxvYXRWYWx1ZSgpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkZsb2F0ICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShmbG9hdFZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRGF0ZUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgwNDNjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRGF0ZUhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFHRGF0ZUhvbGRlckV4IGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhR0RhdGVIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICB7Ci0gICAgICAgIF9zY2hlbWFUeXBlID0gdHlwZTsKLSAgICAgICAgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLSAgICBwcml2YXRlIEdEYXRlIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gc2V0cy9nZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgICAgIHsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gIiIgOiBfdmFsdWUudG9TdHJpbmcoKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBHRGF0ZSBuZXdWYWw7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgbmV3VmFsID0gdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3VmFsID0gbGV4KHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSAmJiBuZXdWYWwgIT0gbnVsbCkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUobmV3VmFsLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gbmV3VmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgR0RhdGUgbGV4KFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgR0RhdGUgZGF0ZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGF0ZSA9IG5ldyBHRGF0ZSh2KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSB2YWx1ZSBpcyBtYWxmb3JtZWQ6ICIrdik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGF0ZS5nZXRCdWlsdGluVHlwZUNvZGUoKSAhPSBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlIHZhbHVlIGlzIG9mIHdyb25nIHR5cGU6ICIgKyB2KTsKLSAgICAgICAgICAgICAgICBkYXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFkYXRlLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgdmFsdWUgaXMgaW52YWxpZDogIiArIHYpOwotICAgICAgICAgICAgICAgIGRhdGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHRGF0ZSB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotCi0gICAgICAgIEdEYXRlIGRhdGUgPSBsZXgodiwgc1R5cGUsIGNvbnRleHQpOwotCi0gICAgICAgIGlmIChkYXRlICE9IG51bGwgJiYgc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoJyArIHYgKyAnKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKEdEYXRlU3BlY2lmaWNhdGlvbiB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIEdEYXRlIGc7Ci0gICAgICAgIAotICAgICAgICBpZiAodi5nZXRCdWlsdGluVHlwZUNvZGUoKSAhPSBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgZG9lcyBub3QgaGF2ZSB0aGUgc2V0IG9mIGZpZWxkcyByZXF1aXJlZCBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEYXRlKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0RhdGVWYWx1ZSgpKSA8PSAwKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEYXRlKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0RhdGVWYWx1ZSgpKSA8IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpID49IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpID4gMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmdEYXRlVmFsdWUoKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBudW1lcmljczogZ1llYXIsIGdNb250aCwgZ0RheSBhY2NlcHQgYW4gaW50ZWdlcgotICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIGlmIChjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfREFZICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX1lFQVIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLQotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZS5nZXREYXkoKTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlLmdldE1vbnRoKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlLmdldFllYXIoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotCi0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBfdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZS5nZXRDYWxlbmRhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRlIGRhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotCi0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUuZ2V0RGF0ZSgpOwotICAgIH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCB2KQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIGlmIChjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfREFZICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX1lFQVIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIHZhbHVlID0gbmV3IEdEYXRlQnVpbGRlcigpOwotCi0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICB2YWx1ZS5zZXREYXkodik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHZhbHVlLnNldE1vbnRoKHYpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgIHZhbHVlLnNldFllYXIodik7IGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHZhbHVlLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gdmFsdWUudG9HRGF0ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gdikKLSAgICB7Ci0gICAgICAgIGludCBjb2RlID0gc2NoZW1hVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKTsKLQotICAgICAgICBHRGF0ZSBjYW5kaWRhdGU7Ci0KLSAgICAgICAgaWYgKHYuaXNJbW11dGFibGUoKSAmJiAodiBpbnN0YW5jZW9mIEdEYXRlKSAmJiB2LmdldEJ1aWx0aW5UeXBlQ29kZSgpID09IGNvZGUpCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSAoR0RhdGUpdjsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0cnVuY2F0ZSBleHRyYSBmaWVsZHMgZnJvbSB0aGUgZGF0ZSBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICBpZiAodi5nZXRCdWlsdGluVHlwZUNvZGUoKSAhPSBjb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdEYXRlQnVpbGRlciBnRGF0ZUJ1aWxkZXIgPSBuZXcgR0RhdGVCdWlsZGVyKHYpOwotICAgICAgICAgICAgICAgIGdEYXRlQnVpbGRlci5zZXRCdWlsdGluVHlwZUNvZGUoY29kZSk7Ci0gICAgICAgICAgICAgICAgdiA9IGdEYXRlQnVpbGRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG5ldyBHRGF0ZSh2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShjYW5kaWRhdGUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBfdmFsdWUgPSBjYW5kaWRhdGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9DYWxlbmRhcihDYWxlbmRhciBjKQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIEdEYXRlQnVpbGRlciBnRGF0ZUJ1aWxkZXIgPSBuZXcgR0RhdGVCdWlsZGVyKGMpOwotICAgICAgICBnRGF0ZUJ1aWxkZXIuc2V0QnVpbHRpblR5cGVDb2RlKGNvZGUpOwotICAgICAgICBHRGF0ZSB2YWx1ZSA9IGdEYXRlQnVpbGRlci50b0dEYXRlKCk7Ci0gCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2YWx1ZSwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9EYXRlKERhdGUgdikKLSAgICB7Ci0gICAgICAgIGludCBjb2RlID0gc2NoZW1hVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKTsKLQotICAgICAgICBpZiAoY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19EQVRFICYmIGNvZGUgIT0gU2NoZW1hVHlwZS5CVENfREFURV9USU1FIHx8Ci0gICAgICAgICAgICB2ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIGdEYXRlQnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIodik7Ci0gICAgICAgIGdEYXRlQnVpbGRlci5zZXRCdWlsdGluVHlwZUNvZGUoY29kZSk7Ci0gICAgICAgIEdEYXRlIHZhbHVlID0gZ0RhdGVCdWlsZGVyLnRvR0RhdGUoKTsKLSAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHZhbHVlLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5jb21wYXJlVG9HRGF0ZSgoKFhtbE9iamVjdEJhc2Upb2JqKS5nRGF0ZVZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmVxdWFscygoKFhtbE9iamVjdEJhc2Upb2JqKS5nRGF0ZVZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGdEYXRlVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRHVyYXRpb25Ib2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEdXJhdGlvbkhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZWQ3ZjMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEdXJhdGlvbkhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUdEdXJhdGlvbkhvbGRlckV4IGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhR0R1cmF0aW9uSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBHRHVyYXRpb24gX3ZhbHVlOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKSB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBHRHVyYXRpb24gbmV3VmFsOwotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIG5ld1ZhbCA9IHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5ld1ZhbCA9IGxleChzLCBfdm9vclZjKTsKLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSAmJiBuZXdWYWwgIT0gbnVsbCkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUobmV3VmFsLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gbmV3VmFsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiB2KQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh2LmlzSW1tdXRhYmxlKCkgJiYgKHYgaW5zdGFuY2VvZiBHRHVyYXRpb24pKQotICAgICAgICAgICAgX3ZhbHVlID0gKEdEdXJhdGlvbil2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfdmFsdWUgPSBuZXcgR0R1cmF0aW9uKHYpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgICAgICB7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/ICIiIDogX3ZhbHVlLnRvU3RyaW5nKCk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6IF92YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEdEdXJhdGlvbiBsZXgoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBHRHVyYXRpb24gZHVyYXRpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGR1cmF0aW9uID0gbmV3IEdEdXJhdGlvbih2KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gdmFsdWUgaXMgbWFsZm9ybWVkOiAiK3YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGR1cmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgR0R1cmF0aW9uIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEdEdXJhdGlvbiBkdXJhdGlvbiA9IGxleCh2LCBjb250ZXh0KTsKLQotICAgICAgICBpZiAoZHVyYXRpb24gIT0gbnVsbCAmJiBzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShHRHVyYXRpb25TcGVjaWZpY2F0aW9uIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgR0R1cmF0aW9uIGc7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0R1cmF0aW9uVmFsdWUoKSkgPD0gMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0R1cmF0aW9uVmFsdWUoKSkgPCAwKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRHVyYXRpb24oZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRHVyYXRpb25WYWx1ZSgpKSA+PSAwKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRHVyYXRpb24oZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRHVyYXRpb25WYWx1ZSgpKSA+IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gbWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRHVyYXRpb24oKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmdEdXJhdGlvblZhbHVlKCkpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuY29tcGFyZVRvR0R1cmF0aW9uKCgoWG1sT2JqZWN0QmFzZSkgZCkuZ0R1cmF0aW9uVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGQpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmVxdWFscygoKFhtbE9iamVjdEJhc2UpIGQpLmdEdXJhdGlvblZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGdEdXJhdGlvblZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSGV4QmluYXJ5SG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSGV4QmluYXJ5SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNGE3OWQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSGV4QmluYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSGV4QmluYXJ5SG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9IRVhfQklOQVJZOyB9Ci0KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShfdmFsdWUpKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIF92YWx1ZSA9IHZhbGlkYXRlTGV4aWNhbChzLCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfdmFsdWUgPSBsZXgocywgX3Zvb3JWYyk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBsZXgoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBieXRlW10gdkJ5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZCeXRlcyA9IHYuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCi0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gSGV4QmluLmRlY29kZSh2Qnl0ZXMpOwotCi0gICAgICAgIGlmIChieXRlcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gZ2V0IGEgZGVjZW50IGVycm9yIHdpdGggbGluZSBudW1iZXJzIGFuZCBzdWNoIGhlcmUKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSGV4IGVuY29kZWQgZGF0YSBub3QgZW5jb2RlZCBwcm9wZXJseSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IGxleCh2LCBjb250ZXh0KTsKLQotICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiSGV4IGVuY29kZWQgZGF0YSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5VmFsdWUoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW192YWx1ZS5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF92YWx1ZSwgMCwgcmVzdWx0LCAwLCBfdmFsdWUubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gYmEpCi0gICAgewotICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgICAgICBfdmFsdWUgPSBuZXcgYnl0ZVtiYS5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJhLCAwLCBfdmFsdWUsIDAsIGJhLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBpdmFsID0gKChYbWxIZXhCaW5hcnkpIGkpLmdldEJ5dGVBcnJheVZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKF92YWx1ZSwgaXZhbCk7Ci0gICAgfQotCi0gICAgLy9iZWNhdXNlIGNvbXB1dGluZyBoYXNoY29kZSBpcyBleHBlbnNpdmUgd2UnbGwgY2FjaGUgaXQKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBpbnQgaGFzaGNvZGUgPSAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDU7Ci0gICAgc3RhdGljCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgTUQ1IGhhc2ggQWxnb3JpdGhtIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICBpZiggX2hhc2hjYWNoZWQgKQotICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOwotCi0gICAgICAgIF9oYXNoY2FjaGVkID0gdHJ1ZTsKLQotICAgICAgICBpZiggX3ZhbHVlID09IG51bGwgKQotICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlID0gMDsKLQotICAgICAgICBieXRlW10gcmVzID0gbWQ1LmRpZ2VzdChfdmFsdWUpOwotICAgICAgICByZXR1cm4gaGFzaGNvZGUgPSByZXNbMF08PDI0ICsgcmVzWzFdPDwxNiArIHJlc1syXTw8OCArIHJlc1szXTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYjMwN2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSGV4QmluYXJ5SG9sZGVyRXggZXh0ZW5kcyBKYXZhSGV4QmluYXJ5SG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhSGV4QmluYXJ5SG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgYnl0ZVtdIHY7Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2ID0gdmFsaWRhdGVMZXhpY2FsKHMsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHYgPSBsZXgocywgX3Zvb3JWYyk7Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkgJiYgdiAhPSBudWxsKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIFhtbE9iamVjdEJhc2UuX3Zvb3JWYyk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5zZXRfQnl0ZUFycmF5KHYpOwotCi0gICAgICAgIF92YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CeXRlQXJyYXkoYnl0ZVtdIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgc2NoZW1hVHlwZSgpLCBfdm9vclZjKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnNldF9CeXRlQXJyYXkodik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoYnl0ZVtdIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgWG1sT2JqZWN0IG87Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgIT0gdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSGV4IGVuY29kZWQgZGF0YSBkb2VzIG5vdCBoYXZlICIgKyBpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcGVyIGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpID4gdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSGV4IGVuY29kZWQgZGF0YSBoYXMgb25seSAiICsgdi5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcywgZmV3ZXIgdGhhbiBtaW4gbGVuZ3RoIGZhY2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPCB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJIZXggZW5jb2RlZCBkYXRhIGhhcyAiICsgdi5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcywgbW9yZSB0aGFuIG1heCBsZW5ndGggZmFjZXQiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotCi0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudW1Mb29wOiBmb3IgKCBpID0gMCA7IGkgPCB2YWxzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGVudW1CeXRlcyA9ICgoWG1sT2JqZWN0QmFzZSl2YWxzW2ldKS5ieXRlQXJyYXlWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVudW1CeXRlcy5sZW5ndGggIT0gdi5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGogPSAwIDsgaiA8IGVudW1CeXRlcy5sZW5ndGggOyBqKysgKQotICAgICAgICAgICAgICAgICAgICBpZiAoZW51bUJ5dGVzW2pdICE9IHZbal0pCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBlbnVtTG9vcDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gdmFscy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJIZXggZW5jb2RlZCBkYXRhIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgZW51bWVyYXRpb24gdmFsdWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoYnl0ZUFycmF5VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyNzhmMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUGFyc2VVdGlsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUludEhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfSU5UOyB9Ci0KLSAgICBwcml2YXRlIGludCBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gTG9uZy50b1N0cmluZyhfdmFsdWUpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkgeyBzZXRfaW50KEludGVnZXIucGFyc2VJbnQoUGFyc2VVdGlsLnRyaW1Jbml0aWFsUGx1cyhzKSkpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSAwOwotICAgIH0KLSAgICAvLyBudW1lcmljczogZnJhY3Rpb25hbAotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKF92YWx1ZSk7IH0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YoX3ZhbHVlKTsgfQotICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLQotICAgIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9tYXggPSBCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpOwotICAgIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9taW4gPSBCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpOwotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdikgeyBzZXRfQmlnSW50ZWdlcih2LnRvQmlnSW50ZWdlcigpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikKLSAgICB7Ci0gICAgICAgIGlmICh2LmNvbXBhcmVUbyhfbWF4KSA+IDAgfHwgdi5jb21wYXJlVG8oX21pbikgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICBzZXRfaW50KHYuaW50VmFsdWUoKSk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgbCkKLSAgICB7Ci0gICAgICAgIGlmIChsID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgbCA8IEludGVnZXIuTUlOX1ZBTFVFKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICBzZXRfaW50KChpbnQpbCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9pbnQoaW50IGkpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBpOwotICAgIH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBpKQotICAgIHsKLSAgICAgICAgaWYgKCgoU2ltcGxlVmFsdWUpaSkuaW5zdGFuY2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKSA+IFNjaGVtYVR5cGUuU0laRV9JTlQpCi0gICAgICAgICAgICByZXR1cm4gLWkuY29tcGFyZVRvKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUgPT0gKChYbWxPYmplY3RCYXNlKWkpLmludFZhbHVlKCkgPyAwIDoKLSAgICAgICAgICAgICAgIF92YWx1ZSA8ICgoWG1sT2JqZWN0QmFzZSlpKS5pbnRWYWx1ZSgpID8gLTEgOiAxOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBpKQotICAgIHsKLSAgICAgICAgaWYgKCgoU2ltcGxlVmFsdWUpaSkuaW5zdGFuY2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKSA+IFNjaGVtYVR5cGUuU0laRV9JTlQpCi0gICAgICAgICAgICByZXR1cm4gaS52YWx1ZUVxdWFscyh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX3ZhbHVlID09ICgoWG1sT2JqZWN0QmFzZSlpKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKLSAgICAgKiBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50SG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlMmU0Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50SG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlBhcnNlVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFJbnRIb2xkZXJFeCBleHRlbmRzIEphdmFJbnRIb2xkZXIKLXsKLSAgICBwdWJsaWMgSmF2YUludEhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpbnQgdjsKLQotICAgICAgICB0cnkgeyB2ID0gSW50ZWdlci5wYXJzZUludChQYXJzZVV0aWwudHJpbUluaXRpYWxQbHVzKHMpKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIAotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuc2V0X2ludCh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2ludChpbnQgdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgc3VwZXIuc2V0X2ludCh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEphdmFEZWNpbWFsSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KLSAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoaW50IHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICAvLyB0b3RhbCBkaWdpdHMKLSAgICAgICAgWG1sT2JqZWN0IHRkID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOwotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKHYpOwotICAgICAgICAgICAgaW50IGxlbiA9IHRlbXAubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0ZW1wLmNoYXJBdCgwKSA9PSAnLScpCi0gICAgICAgICAgICAgICAgbGVuIC09IDE7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKHRkKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiBtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgdG90YWwgZGlnaXRzICgiICsgdGVtcCArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBkaWdpdHMgZmFjZXQgKCIgKyBnZXRJbnRWYWx1ZSh0ZCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGV4Ci0gICAgICAgIFhtbE9iamVjdCBtaW5lID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSBnZXRJbnRWYWx1ZShtaW5lKTsKLSAgICAgICAgICAgIGlmICghKHYgPiBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gaW4KLSAgICAgICAgWG1sT2JqZWN0IG1pbmkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWluaSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1pbmkpOwotICAgICAgICAgICAgaWYgKCEodiA+PSBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggaW4KLSAgICAgICAgWG1sT2JqZWN0IG1heGkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWF4aSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1heGkpOwotICAgICAgICAgICAgaWYgKCEodiA8PSBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggZXgKLSAgICAgICAgWG1sT2JqZWN0IG1heGUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWF4ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1heGUpOwotICAgICAgICAgICAgaWYgKCEodiA8IG0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVudW1lcmF0aW9uCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gZ2V0SW50VmFsdWUodmFsc1tpXSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBhbnkgZW51bWVyYXRpb24gdmFsdWVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRJbnRWYWx1ZShYbWxPYmplY3QgbykgewotICAgICAgICBTY2hlbWFUeXBlIHMgPSBvLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgc3dpdGNoIChzLmdldERlY2ltYWxTaXplKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0RlY2ltYWxWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiAoaW50KSgoWG1sT2JqZWN0QmFzZSlvKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoaW50VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZmJlNTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUludGVnZXJIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0lOVEVHRVI7IH0KLQotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGdldHMvc2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWUudG9TdHJpbmcoKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgc2V0X0JpZ0ludGVnZXIobGV4KHMsIF92b29yVmMpKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGxleChTdHJpbmcgcywgVmFsaWRhdGlvbkNvbnRleHQgdmMpIAotICAgIHsKLSAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAwICYmIHMuY2hhckF0KCAwICkgPT0gJysnICkKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEJpZ0ludGVnZXIocyk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHZjLmludmFsaWQoIk5vdCBhIHZhbGlkIGludGVnZXI6ICIgKyBzKTsgcmV0dXJuIG51bGw7IH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLSAgICAvLyBudW1lcmljczogZnJhY3Rpb25hbAotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6IG5ldyBCaWdEZWNpbWFsKF92YWx1ZSk7IH0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgX3ZhbHVlID0gdi50b0JpZ0ludGVnZXIoKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikgeyBfdmFsdWUgPSB2OyB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWkpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVIpCi0gICAgICAgICAgICByZXR1cm4gLWkuY29tcGFyZVRvKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUuY29tcGFyZVRvKCgoWG1sT2JqZWN0QmFzZSlpKS5iaWdJbnRlZ2VyVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBpZiAoKChTaW1wbGVWYWx1ZSlpKS5pbnN0YW5jZVR5cGUoKS5nZXREZWNpbWFsU2l6ZSgpID4gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSKQotICAgICAgICAgICAgcmV0dXJuIGkudmFsdWVFcXVhbHModGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxPYmplY3RCYXNlKWkpLmJpZ0ludGVnZXJWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9tYXhsb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9taW5sb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKTsKLQotICAgIC8qKgotICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKLSAgICAgKiBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsdWUuY29tcGFyZVRvKF9tYXhsb25nKSA+IDAgfHwKLSAgICAgICAgICAgIF92YWx1ZS5jb21wYXJlVG8oX21pbmxvbmcpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLQotICAgICAgICBsb25nIGxvbmd2YWwgPSBfdmFsdWUubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIChpbnQpKChsb25ndmFsID4+IDMyKSAqIDE5ICsgbG9uZ3ZhbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTMyN2ExLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUludGVnZXJIb2xkZXJFeCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyCi17Ci0gICAgcHVibGljIEphdmFJbnRlZ2VySG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgQmlnSW50ZWdlciB2ID0gbGV4KHMsIF92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIHN1cGVyLnNldF9CaWdJbnRlZ2VyKHYpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIHN1cGVyLnNldF9CaWdJbnRlZ2VyKHYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgSmF2YURlY2ltYWxIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgcGF0dGVybgotICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnRlZ2VyICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKEJpZ0ludGVnZXIgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIHRvdGFsIGRpZ2l0cwotICAgICAgICBYbWxJbnQgdGQgPSAoWG1sSW50KXNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKTsKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gdi50b1N0cmluZygpOwotICAgICAgICAgICAgaW50IGxlbiA9IHRlbXAubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0ZW1wLmNoYXJBdCgwKSA9PSAnLScpCi0gICAgICAgICAgICAgICAgbGVuIC09IDE7Ci0gICAgICAgICAgICBpZiAobGVuID4gdGQuZ2V0SW50VmFsdWUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyIHRvdGFsIGRpZ2l0cyAoIiArIHRlbXAgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgZGlnaXRzIGZhY2V0ICgiICsgdGQuZ2V0SW50VmFsdWUoKSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gZXgKLSAgICAgICAgWG1sT2JqZWN0IG1pbmUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWluZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG0gPSBnZXRCaWdJbnRlZ2VyVmFsdWUobWluZSk7Ci0gICAgICAgICAgICBpZiAoISh2LmNvbXBhcmVUbyhtKSA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBpbgotICAgICAgICBYbWxPYmplY3QgbWluaSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbSA9IGdldEJpZ0ludGVnZXJWYWx1ZShtaW5pKTsKLSAgICAgICAgICAgIGlmICghKHYuY29tcGFyZVRvKG0pID49IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBpbgotICAgICAgICBYbWxPYmplY3QgbWF4aSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbSA9IGdldEJpZ0ludGVnZXJWYWx1ZShtYXhpKTsKLSAgICAgICAgICAgIGlmICghKHYuY29tcGFyZVRvKG0pIDw9IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBleAotICAgICAgICBYbWxPYmplY3QgbWF4ZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbSA9IGdldEJpZ0ludGVnZXJWYWx1ZShtYXhlKTsKLSAgICAgICAgICAgIGlmICghKHYuY29tcGFyZVRvKG0pIDwgMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZW51bWVyYXRpb24KLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoZ2V0QmlnSW50ZWdlclZhbHVlKHZhbHNbaV0pKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnRlZ2VyICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIGFueSBlbnVtZXJhdGlvbiB2YWx1ZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoWG1sT2JqZWN0IG8pCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHMgPSBvLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgc3dpdGNoIChzLmdldERlY2ltYWxTaXplKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0RlY2ltYWxWYWx1ZSgpLnRvQmlnSW50ZWdlcigpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmFkIGZhY2V0IHR5cGUgZm9yIEJpZyBJbnQ6ICIgKyBzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShiaWdJbnRlZ2VyVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTG9uZ0hvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGJmYjBiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QYXJzZVV0aWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhTG9uZ0hvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTE9ORzsgfQotCi0gICAgcHJpdmF0ZSBsb25nIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBMb25nLnRvU3RyaW5nKF92YWx1ZSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeSB7IHNldF9sb25nKExvbmcucGFyc2VMb25nKFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gMEw7Ci0gICAgfQotCi0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBCaWdEZWNpbWFsLnZhbHVlT2YoX3ZhbHVlKTsgfQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihfdmFsdWUpOyB9Ci0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9tYXggPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21pbiA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1JTl9WQUxVRSk7Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IHNldF9CaWdJbnRlZ2VyKHYudG9CaWdJbnRlZ2VyKCkpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KQotICAgIHsKLSAgICAgICAgaWYgKHYuY29tcGFyZVRvKF9tYXgpID4gMCB8fCB2LmNvbXBhcmVUbyhfbWluKSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF92YWx1ZSA9IHYubG9uZ1ZhbHVlKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgbCkgeyBfdmFsdWUgPSBsOyB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgbCkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWwpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfTE9ORykKLSAgICAgICAgICAgIHJldHVybiAtbC5jb21wYXJlVG8odGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbE9iamVjdEJhc2UpbCkubG9uZ1ZhbHVlKCkgPyAwIDoKLSAgICAgICAgICAgICAgIF92YWx1ZSA8ICgoWG1sT2JqZWN0QmFzZSlsKS5sb25nVmFsdWUoKSA/IC0xIDogMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgbCkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWwpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfTE9ORykKLSAgICAgICAgICAgIHJldHVybiBsLnZhbHVlRXF1YWxzKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUgPT0gKChYbWxPYmplY3RCYXNlKWwpLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKLSAgICAgKiBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KSgoX3ZhbHVlID4+IDMyKSAqIDE5ICsgX3ZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0MDZkOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTG9uZ0hvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QYXJzZVV0aWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhTG9uZ0hvbGRlckV4IGV4dGVuZHMgSmF2YUxvbmdIb2xkZXIKLXsKLSAgICBwdWJsaWMgSmF2YUxvbmdIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgbG9uZyB2OwotCi0gICAgICAgIHRyeSB7IHYgPSBMb25nLnBhcnNlTG9uZyhQYXJzZVV0aWwudHJpbUluaXRpYWxQbHVzKHMpKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIAotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuc2V0X2xvbmcodik7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgc3VwZXIuc2V0X2xvbmcodik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEphdmFEZWNpbWFsSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KLSAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUobG9uZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gdG90YWwgZGlnaXRzCi0gICAgICAgIFhtbE9iamVjdCB0ZCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKTsKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgbSA9IGdldExvbmdWYWx1ZSh0ZCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcCA9IExvbmcudG9TdHJpbmcodik7Ci0gICAgICAgICAgICBpbnQgbGVuID0gdGVtcC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHRlbXAuY2hhckF0KDApID09ICctJykKLSAgICAgICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgICAgIGlmIChsZW4gPiBtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgdG90YWwgZGlnaXRzICgiICsgdGVtcCArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBkaWdpdHMgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBleAotICAgICAgICBYbWxPYmplY3QgbWluZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgbSA9IGdldExvbmdWYWx1ZShtaW5lKTsKLSAgICAgICAgICAgIGlmICghKHYgPiBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gaW4KLSAgICAgICAgWG1sT2JqZWN0IG1pbmkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWluaSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG0gPSBnZXRMb25nVmFsdWUobWluaSk7Ci0gICAgICAgICAgICBpZiAoISh2ID49IG0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBpbgotICAgICAgICBYbWxPYmplY3QgbWF4aSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgbSA9IGdldExvbmdWYWx1ZShtYXhpKTsKLSAgICAgICAgICAgIGlmICghKHYgPD0gbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGV4Ci0gICAgICAgIFhtbE9iamVjdCBtYXhlID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKG1heGUpOwotICAgICAgICAgICAgaWYgKCEodiA8IG0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVudW1lcmF0aW9uCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gZ2V0TG9uZ1ZhbHVlKHZhbHNbaV0pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludGVnZXIgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggYW55IGVudW1lcmF0aW9uIHZhbHVlcyBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldExvbmdWYWx1ZShYbWxPYmplY3QgbykgewotICAgICAgICBTY2hlbWFUeXBlIHMgPSBvLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgc3dpdGNoIChzLmdldERlY2ltYWxTaXplKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0RlY2ltYWxWYWx1ZSgpLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmFkIGZhY2V0IHR5cGU6ICIgKyBzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGxvbmdWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzMjljMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU5vdGF0aW9uSG9sZGVyIGV4dGVuZHMgWG1sUU5hbWVJbXBsCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PVEFUSU9OOyB9Ci0KLS8vICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0vLyAgICAgICAgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0ODQ2My4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFOb3RhdGlvbkhvbGRlckV4IGV4dGVuZHMgSmF2YU5vdGF0aW9uSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhTm90YXRpb25Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjaGVjayhzLCBfc2NoZW1hVHlwZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldF90ZXh0KHMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9ub3RhdGlvbihTdHJpbmcgdikKLSAgICB7IHNldF90ZXh0KHYpOyB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IGxlbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKTsKLSAgICAgICAgaWYgKGxlbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSlsZW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpICE9IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbWluID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKTsKLSAgICAgICAgaWYgKG1pbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltaW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpID49IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbWF4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKTsKLSAgICAgICAgaWYgKG1heCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpIDw9IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhUU5hbWVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3OTMyYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhUU5hbWVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QcmVmaXhSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotICAgCi1wdWJsaWMgY2xhc3MgSmF2YVFOYW1lSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhUU5hbWVIb2xkZXIoKSB7fQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX1FOQU1FOyB9Ci0KLSAgICBwcml2YXRlIFFOYW1lIF92YWx1ZTsKLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgICAgIHsgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7IH0KLSAgICAKLSAgICAvLyBhbiBlcmdvbm9taWMgcHJlZml4ZXIgc28gdGhhdCB5b3UgY2FuIHNheSBzdHJpbmdWYWx1ZSgpIG9uIGEgZnJlZS1mbG9hdGluZyBRTmFtZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lc3BhY2VNYW5hZ2VyIFBSRVRUWV9QUkVGSVhFUiA9IG5ldyBQcmV0dHlOYW1lc3BhY2VNYW5hZ2VyKCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJldHR5TmFtZXNwYWNlTWFuYWdlciBpbXBsZW1lbnRzIE5hbWVzcGFjZU1hbmFnZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpKFN0cmluZyBuc3VyaSwgU3RyaW5nIHN1Z2dlc3RlZF9wcmVmaXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBRTmFtZUhlbHBlci5zdWdnZXN0UHJlZml4KHN1Z2dlc3RlZF9wcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKLSAgICB7Ci0gICAgICAgIGlmIChuc20gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgdXNlZCB0bzogdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBRTmFtZSBwcmVmaXggb3V0c2lkZSBvZiBhIGRvY3VtZW50Iik7Ci0gICAgICAgICAgICAvLyBidXQgaXQncyBub3QgbmljZSB0byB0aHJvdyBvbiBzdHJpbmdWYWx1ZSgpCi0gICAgICAgICAgICBuc20gPSBQUkVUVFlfUFJFRklYRVI7Ci0gICAgICAgIH0KLQotLy8gVE9ETyAtIHdoYXQgSSByZWFsbHkgbmVlZCB0byBkbyBoZXJlIGlzIHRoYXQgaWYgdGhlcmUgaXMgbm8KLS8vIG5hbWVzcGFjZSBmb3IgdGhpcyBxbmFtZSwgdGhlbiBpbnN0ZWFkIG9mIGZpbmRpbmcgdGhlIHByZWZpeCBmb3IgdGhlCi0vLyB1cmksIEkgc2hvdWxkIG1ha2UgYSBjYWxsIHRvIHNldCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZQotLy8gaW1tZWRpYXRlIGNvbnRleHQgZm9yIHRoaXMgcW5hbWUgdG8gYmUgIiIuICAKLSAgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gX3ZhbHVlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gX3ZhbHVlLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsb2NhbFBhcnQ7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnNtLmZpbmRfcHJlZml4X2Zvcl9uc3VyaSggbmFtZXNwYWNlLCBudWxsICk7Ci0KLSAgICAgICAgYXNzZXJ0IHByZWZpeCAhPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIGxvY2FsUGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHZhbGlkYXRlTGV4aWNhbCgKLSAgICAgICAgU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgUU5hbWUgbmFtZTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gcGFyc2UodiwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgbmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgcGFyc2UoU3RyaW5nIHYsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCwgbG9jYWxuYW1lOwotICAgICAgICBpbnQgc3RhcnQ7Ci0gICAgICAgIGludCBlbmQ7Ci0gICAgICAgIGZvciAoZW5kID0gdi5sZW5ndGgoKTsgZW5kID4gMDsgZW5kIC09IDEpCi0gICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZSh2LmNoYXJBdChlbmQtMSkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IDEpCi0gICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZSh2LmNoYXJBdChzdGFydCkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGludCBmaXJzdGNvbG9uID0gdi5pbmRleE9mKCc6Jywgc3RhcnQpOwotICAgICAgICBpZiAoZmlyc3Rjb2xvbiA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmaXggPSB2LnN1YnN0cmluZyhzdGFydCwgZmlyc3Rjb2xvbik7Ci0gICAgICAgICAgICBsb2NhbG5hbWUgPSB2LnN1YnN0cmluZyhmaXJzdGNvbG9uICsgMSwgZW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgbG9jYWxuYW1lID0gdi5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB1cmkgPQotICAgICAgICAgICAgcmVzb2x2ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvbHZlci5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigiQ2FuJ3QgcmVzb2x2ZSBwcmVmaXg6ICIgKyBwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB1cmkgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoIHVyaSwgbG9jYWxuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIgPSBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKTsKLQotICAgICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCAmJiBoYXNfc3RvcmUoKSkKLSAgICAgICAgICAgIHJlc29sdmVyID0gZ2V0X3N0b3JlKCk7Ci0gICAgICAgIAotICAgICAgICBfdmFsdWUgPSBwYXJzZShzLCByZXNvbHZlcik7Ci0gICAgfQotCi0gICAgLy8gQlVHQlVHIC0gaGF2aW5nIHByZWZpeCBoZXJlIG1heSBub3Qgd29yawotICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8vIFN5bmMgZm9yY2Ugb2YgY3JlYXRpb24gb2YgbmFtZXNhcGNlIG1hcHBpbmcgLi4KLSAgICAgICAgCi0gICAgICAgIGlmIChoYXNfc3RvcmUoKSkKLSAgICAgICAgICAgIGdldF9zdG9yZSgpLmZpbmRfcHJlZml4X2Zvcl9uc3VyaSggbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgX3ZhbHVlID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sYW55c2ltcGxlKFhtbEFueVNpbXBsZVR5cGUgdmFsdWUpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBwYXJzZSh2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpLCBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpIHsgX3ZhbHVlID0gbnVsbDsgfQotCi0gICAgLy8gc2V0dGVycywgZ2V0dGVycyAoc2V0dGVyIGFscmVhZHkgaGFuZGxlZCB2aWEgc2V0X3RleHQpCi0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxPYmplY3RCYXNlKW9iaikucU5hbWVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFRTmFtZUhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWI5Y2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUHJlZml4UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhUU5hbWVIb2xkZXJFeCBleHRlbmRzIEphdmFRTmFtZUhvbGRlcgotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgSmF2YVFOYW1lSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIgPSBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKTsKLQotICAgICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCAmJiBoYXNfc3RvcmUoKSkKLSAgICAgICAgICAgIHJlc29sdmVyID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgUU5hbWUgdjsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYgPSB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMsIHJlc29sdmVyKTsKLSAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdiA9IEphdmFRTmFtZUhvbGRlci52YWxpZGF0ZUxleGljYWwocywgX3Zvb3JWYywgcmVzb2x2ZXIpOwotCi0gICAgICAgIHN1cGVyLnNldF9RTmFtZSh2KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfUU5hbWUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShuYW1lLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIHN1cGVyLnNldF9RTmFtZSggbmFtZSApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxhbnlzaW1wbGUoWG1sQW55U2ltcGxlVHlwZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIFFOYW1lIHY7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ID0gdmFsaWRhdGVMZXhpY2FsKHZhbHVlLmdldFN0cmluZ1ZhbHVlKCksIF9zY2hlbWFUeXBlLCBfdm9vclZjLCBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdiA9IEphdmFRTmFtZUhvbGRlci52YWxpZGF0ZUxleGljYWwodmFsdWUuZ2V0U3RyaW5nVmFsdWUoKSwgX3Zvb3JWYywgTmFtZXNwYWNlQ29udGV4dC5nZXRDdXJyZW50KCkpOwotCi0gICAgICAgIHN1cGVyLnNldF9RTmFtZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwgUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBRTmFtZSBuYW1lID0gSmF2YVFOYW1lSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0LCByZXNvbHZlcik7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBwYXR0ZXJuCi0gICAgICAgIGlmIChzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gZGVzY3JpYmUgc3RyaW5nIGFuZCBwYXR0ZXJuIGhlcmUgaW4gZXJyb3IKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlFOYW1lICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKCgoKFhtbE9iamVjdEJhc2UpeCkuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgIT0gdi5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlFOYW1lICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBmYWNldCBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKCgoKFhtbE9iamVjdEJhc2UpeCkuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPiB2Lmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbWluIGxlbmd0aCBmYWNldCBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKCgoKFhtbE9iamVjdEJhc2UpeCkuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPCB2Lmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbWF4IGxlbmd0aCBmYWNldCBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoUU5hbWUgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSl2YWxzW2ldKS5xTmFtZVZhbHVlKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlFOYW1lICciICsgdiArICInIGlzIG5vdCBhIHZhbGlkIGVudWVtcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZVZhbHVlKHFOYW1lVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDg5ZDguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXggZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXgKLXsKLSAgICBwdWJsaWMgSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgewotICAgICAgICBzdXBlcih0eXBlLCBjb21wbGV4KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgX3ZhbDsKLQotICAgIC8vIHVwZGF0ZSB0aGUgaW50dmFsIHdoZW4gc2V0dGluZyB2aWEgdGV4dCwgbmlsLgotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUgPSBzY2hlbWFUeXBlKCkuZW51bUZvclN0cmluZyhzKTsKLSAgICAgICAgaWYgKGVudW1WYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigiU3RyaW5nICciICsgcyArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBzY2hlbWFUeXBlKCkpOwotCi0gICAgICAgIHN1cGVyLnNldF90ZXh0KHMpOwotICAgICAgICBfdmFsID0gZW51bVZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBKYXZhU3RyaW5nSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKHYsIHNUeXBlLCBjb250ZXh0KTsKLQotICAgICAgICBpZiAoc1R5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1R5cGUuZW51bUZvclN0cmluZyh2KSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlN0cmluZyAnIiArIHYgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWwgPSBudWxsOwotICAgICAgICBzdXBlci5zZXRfbmlsKCk7Ci0gICAgfQotCi0gICAgLy8gc2V0L2dldCB0aGUgZW51bVZhbHVlCi0gICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiBfdmFsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9lbnVtKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKQotICAgIHsKLSAgICAgICAgQ2xhc3MgZWpjID0gc2NoZW1hVHlwZSgpLmdldEVudW1KYXZhQ2xhc3MoKTsKLSAgICAgICAgaWYgKGVqYyAhPSBudWxsICYmICFlbnVtVmFsdWUuZ2V0Q2xhc3MoKS5lcXVhbHMoZWpjKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBzdXBlci5zZXRfdGV4dChlbnVtVmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIF92YWwgPSBlbnVtVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0NzI3MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGNsYXNzIEphdmFTdHJpbmdIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIEphdmFTdHJpbmdIb2xkZXIoKSB7fQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX1NUUklORzsgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlOwotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICAgICAgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKSB7IF92YWx1ZSA9IHM7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkgeyBfdmFsdWUgPSBudWxsOyB9Ci0KLSAgICAvLyBzdHJpbmcgc2V0dGVyIGFuZCBnZXR0ZXIgYWxyZWFkeSBoYW5kbGVkIGJ5IFhtbE9iamVjdEJhc2UKLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSlvYmopLnN0cmluZ1ZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxNzNlYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFTdHJpbmdIb2xkZXJFeCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhU3RyaW5nSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICAgICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0X3RleHQocyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbCh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IHBhdHRlcm4KLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiU3RyaW5nOiAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBsZW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCk7Ci0gICAgICAgIGlmIChsZW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbGVuKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYubGVuZ3RoKCkgIT0gbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJTdHJpbmcgbGVuZ3RoICgiICsgdi5sZW5ndGgoKSArICIpIGRvZXMgbm90IG1hdGNoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBtaW4gbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBtaW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEgpOwotICAgICAgICBpZiAobWluICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtID0gKChYbWxPYmplY3RCYXNlKW1pbikuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2Lmxlbmd0aCgpIDwgbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJTdHJpbmcgbGVuZ3RoICgiICsgdi5sZW5ndGgoKSArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gbGVuZ3RoIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IG1heCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCk7Ci0gICAgICAgIGlmIChtYXggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbWF4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYubGVuZ3RoKCkgPiBtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBsZW5ndGggKCIgKyB2Lmxlbmd0aCgpICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBsZW5ndGggZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChzdHJpbmdWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDlkYmM3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFVcmlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlVUkk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhVXJpSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhVXJpSG9sZGVyKCkge30KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVVJJOyB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAiIiA6IF92YWx1ZTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3Zvb3JWYyk7Ci0gICAgICAgIF92YWx1ZSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIEVub3VnaCB2YWxpZGF0aW9uIHRvIGdldCBzY2hlbWEgZm9yIHNjaGVtYSB3b3JraW5nCi0KLSAgICAgICAgaWYgKHYuc3RhcnRzV2l0aCggIiMjIiApKQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJYbWxBbnlVUkkgaXMgbWFsZm9ybWVkOiAiICsgdiApOwotCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKSB7IF92YWx1ZSA9IG51bGw7IH0KLQotICAgIC8vIHN0cmluZyBzZXR0ZXIgYW5kIGdldHRlciBhbHJlYWR5IGhhbmRsZWQgYnkgWG1sT2JqZWN0QmFzZQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxBbnlVUkkpb2JqKS5nZXRTdHJpbmdWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3MTM4Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YVVyaUhvbGRlckV4IGV4dGVuZHMgSmF2YVVyaUhvbGRlcgotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHVibGljIEphdmFVcmlIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjaGVjayhzLCBfc2NoZW1hVHlwZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldF90ZXh0KHMpOwotICAgIH0KLQotLy8gICAgLy8gc2V0dGVycwotLy8gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3VyaShVUkkgdXJpKQotLy8gICAgewotLy8gICAgICAgIGlmICghY2hlY2sodXJpLnRvU3RyaW5nKCksIF9zY2hlbWFUeXBlKSkKLS8vICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotLy8KLS8vICAgICAgICBzdXBlci5zZXRfdXJpKHVyaSk7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sQW55VXJpSW1wbC52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLQotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgdmFscy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBlID0gKChTaW1wbGVWYWx1ZSl2YWxzW2ldKS5nZXRTdHJpbmdWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGUuZXF1YWxzKCB2ICkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSB2YWxzLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSAnIiArIHYgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgcGF0dGVybgotICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlc2NyaWJlIHN0cmluZyBhbmQgcGF0dGVybiBoZXJlIGluIGVycm9yCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJhbnlVUkkgdmFsdWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3QgeDsKLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAoKCgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgIT0gdi5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSB2YWx1ZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBsZW5ndGggZmFjZXQgKCIgKyAoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICgoKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA+IHYubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJhbnlVUkkgdmFsdWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbWluIGxlbmd0aCBmYWNldCAoIiArICgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKCgoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpIDwgdi5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSB2YWx1ZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBtYXggbGVuZ3RoIGZhY2V0ICgiICsgKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVjayhTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIGludCBsZW5ndGggPSB2PT1udWxsID8gMCA6IHYubGVuZ3RoKCk7Ci0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBsZW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCk7Ci0gICAgICAgIGlmIChsZW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFNpbXBsZVZhbHVlKWxlbikuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghKGxlbmd0aCAhPSBtKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IG1pbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCk7Ci0gICAgICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFNpbXBsZVZhbHVlKW1pbikuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghKGxlbmd0aCA+PSBtKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IG1heCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCk7Ci0gICAgICAgIGlmIChtYXggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFNpbXBsZVZhbHVlKW1heCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghKGxlbmd0aCA8PSBtKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChzdHJpbmdWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlQ29udGV4dC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI1NjA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QcmVmaXhSZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudDsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUNvbnRleHQgaW1wbGVtZW50cyBQcmVmaXhSZXNvbHZlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX1NUT1JFICAgID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVCAgICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUCAgICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9FTEVNRU5UID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xWRVIgICAgICA9IDU7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBfb2JqOwotICAgIHByaXZhdGUgaW50IF9jb2RlOwotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQoTWFwIHByZWZpeFRvVXJpTWFwKQotICAgIHsKLSAgICAgICAgX2NvZGUgPSBNQVA7Ci0gICAgICAgIF9vYmogPSBwcmVmaXhUb1VyaU1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChUeXBlU3RvcmUgdHlwZVN0b3JlKQotICAgIHsKLSAgICAgICAgX2NvZGUgPSBUWVBFX1NUT1JFOwotICAgICAgICBfb2JqID0gdHlwZVN0b3JlOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0KFhtbE9iamVjdCB4bWxPYmplY3QpCi0gICAgewotICAgICAgICBfY29kZSA9IFhNTF9PQkpFQ1Q7Ci0gICAgICAgIF9vYmogPSB4bWxPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQoU3RhcnRFbGVtZW50IHN0YXJ0KQotICAgIHsKLSAgICAgICAgX2NvZGUgPSBTVEFSVF9FTEVNRU5UOwotICAgICAgICBfb2JqID0gc3RhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQoUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBfY29kZSA9IFJFU09MVkVSOwotICAgICAgICBfb2JqID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhY2sgbWFuYWdlbWVudCBpZiAoaGVhdmVuIGhlbHAgdXMpIHdlIGV2ZXIgbmVlZCB0byBkbwotICAgICAqIG5lc3RlZCBjb21waWxhdGlvbiBvZiBzY2hlbWEgdHlwZSBzeXN0ZW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTmFtZXNwYWNlQ29udGV4dFN0YWNrCi0gICAgewotICAgICAgICBOYW1lc3BhY2VDb250ZXh0IGN1cnJlbnQ7Ci0gICAgICAgIEFycmF5TGlzdCBzdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZmluYWwgdm9pZCBwdXNoKE5hbWVzcGFjZUNvbnRleHQgbmV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhY2suYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgdm9pZCBwb3AoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50ID0gKE5hbWVzcGFjZUNvbnRleHQpc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgTmFtZXNwYWNlQ29udGV4dFN0YWNrID0gbmV3IFRocmVhZExvY2FsKCkKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkgeyByZXR1cm4gbmV3IE5hbWVzcGFjZUNvbnRleHRTdGFjaygpOyB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXNoKE5hbWVzcGFjZUNvbnRleHQgbmV4dCkKLSAgICB7Ci0gICAgICAgICgoTmFtZXNwYWNlQ29udGV4dFN0YWNrKU5hbWVzcGFjZUNvbnRleHRTdGFjay5nZXQoKSkucHVzaChuZXh0KTsKLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeChTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoInhtbCIpKQotICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChfY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYTUxfT0JKRUNUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgaW1wbDsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gX29iajsKLSAgICAgICAgICAgICAgICBpZiAoUHJveHkuaXNQcm94eUNsYXNzKG9iai5nZXRDbGFzcygpKSkKLSAgICAgICAgICAgICAgICAgICAgb2JqID0gUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIob2JqKTsKLQotICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUeXBlU3RvcmVVc2VyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChUeXBlU3RvcmVVc2VyKW9iaikuZ2V0X3N0b3JlKCkuZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gKChYbWxPYmplY3QpX29iaikubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1ci5jdXJyZW50VG9rZW5UeXBlKCkgPT0gWG1sQ3Vyc29yLlRva2VuVHlwZS5BVFRSKQotICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnRvUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7IHJldHVybiBjdXIubmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7IH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSgoTWFwKV9vYmopLmdldChwcmVmaXgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBUWVBFX1NUT1JFOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFR5cGVTdG9yZSlfb2JqKS5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdGFydEVsZW1lbnQpX29iaikuZ2V0TmFtZXNwYWNlVXJpKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFJFU09MVkVSOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFByZWZpeFJlc29sdmVyKV9vYmopLmdldE5hbWVzcGFjZUZvclByZWZpeChwcmVmaXgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAiSW1wcm9wZXJseSBpbml0aWFsaXplZCBOYW1lc3BhY2VDb250ZXh0LiI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByZWZpeFJlc29sdmVyIGdldEN1cnJlbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoTmFtZXNwYWNlQ29udGV4dFN0YWNrKU5hbWVzcGFjZUNvbnRleHRTdGFjay5nZXQoKSkuY3VycmVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBvcCgpCi0gICAgewotICAgICAgICAoKE5hbWVzcGFjZUNvbnRleHRTdGFjaylOYW1lc3BhY2VDb250ZXh0U3RhY2suZ2V0KCkpLnBvcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvU3RyaW5nRW51bVZhbHVlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9TdHJpbmdFbnVtVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3N2ZjNC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9TdHJpbmdFbnVtVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTdHJpbmdFbnVtVmFsdWUgZXh0ZW5kcyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlCi17Ci0gICAgcHVibGljIFN0cmluZ0VudW1WYWx1ZShTdHJpbmcgcywgaW50IGkpCi0gICAgICAgIHsgc3VwZXIocywgaSk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVNpbXBsZVR5cGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmZlN2U3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVNpbXBsZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgYW55U2ltcGxlVHlwZSBmb3IgWE1MLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhtbEFueVNpbXBsZVR5cGVJbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZUltcGwoKQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBTdHJpbmcgX3RleHR2YWx1ZSA9ICIiOwotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotICAgIH0KLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gX3RleHR2YWx1ZTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgX3RleHR2YWx1ZSA9IHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdGV4dHZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICAvLyBjb21wYXJlcyBhZ2FpbnN0IGFub3RoZXIgYW55U2ltcGxlVHlwZQotICAgICAgICAvLyBydWxlIGlzOiBsZXhpY2FsIHZhbHVlcyBtdXN0IG1hdGNoLgotICAgICAgICByZXR1cm4gX3RleHR2YWx1ZS5lcXVhbHMoKChYbWxBbnlTaW1wbGVUeXBlKW9iaikuZ2V0U3RyaW5nVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgLy8gbWF0Y2hlcyBKYXZhU3RyaW5nSG9sZGVyJ3MgdmFsdWVfaGFzaF9jb2RlLCBzbyB3ZSBjYW4gYmUgaGFzZWQgYWdhaW5zdCBzdHJpbmdzCi0gICAgICAgIHJldHVybiAoX3RleHR2YWx1ZSA9PSBudWxsID8gMCA6IF90ZXh0dmFsdWUuaGFzaENvZGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyOWNiNi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24gZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlSW1wbAotewotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVR5cGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVhOWJhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgYW55VHlwZSBmb3IgWE1MLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhtbEFueVR5cGVJbXBsIGV4dGVuZHMgWG1sQ29tcGxleENvbnRlbnRJbXBsIGltcGxlbWVudHMgWG1sT2JqZWN0Ci17Ci0gICAgcHVibGljIFhtbEFueVR5cGVJbXBsKCkKLSAgICAgICAgeyBzdXBlcih0eXBlKTsgfQotCi0gICAgcHVibGljIFhtbEFueVR5cGVJbXBsKFNjaGVtYVR5cGUgdHlwZSkKLSAgICAgICAgeyBzdXBlcih0eXBlKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWFjZDk3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVVyaUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxBbnlVcmlJbXBsIGV4dGVuZHMgSmF2YVVyaUhvbGRlciBpbXBsZW1lbnRzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55VVJJCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmOWYwYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbEFueVVyaVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YVVyaUhvbGRlckV4IGltcGxlbWVudHMgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlVUkkKLXsKLSAgICBwdWJsaWMgWG1sQW55VXJpUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0ZTM0NC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmFzZTY0QmluYXJ5OwotCi0KLXB1YmxpYyBjbGFzcyBYbWxCYXNlNjRCaW5hcnlJbXBsIGV4dGVuZHMgSmF2YUJhc2U2NEhvbGRlciBpbXBsZW1lbnRzIFhtbEJhc2U2NEJpbmFyeQotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzY2MWUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCYXNlNjRCaW5hcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbiBleHRlbmRzIEphdmFCYXNlNjRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEJhc2U2NEJpbmFyeQotewotICAgIHB1YmxpYyBYbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQm9vbGVhbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDJlYzAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQm9vbGVhbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJvb2xlYW47Ci0KLXB1YmxpYyBjbGFzcyBYbWxCb29sZWFuSW1wbCBleHRlbmRzIEphdmFCb29sZWFuSG9sZGVyIGltcGxlbWVudHMgWG1sQm9vbGVhbgotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQm9vbGVhblJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkYTRiYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJvb2xlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sQm9vbGVhblJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YUJvb2xlYW5Ib2xkZXJFeCBpbXBsZW1lbnRzIFhtbEJvb2xlYW4KLXsKLSAgICBwdWJsaWMgWG1sQm9vbGVhblJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCeXRlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQnl0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxOGFhYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCeXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQnl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbEJ5dGVJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sQnl0ZQotewotICAgIHB1YmxpYyBYbWxCeXRlSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sQnl0ZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sQnl0ZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbENvbXBsZXhDb250ZW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1M2E1OTIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7Ci0KLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVZpc2l0b3JJbXBsOwotCi1wdWJsaWMgY2xhc3MgWG1sQ29tcGxleENvbnRlbnRJbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBYbWxDb21wbGV4Q29udGVudEltcGwoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgX3NjaGVtYVR5cGUgPSAoU2NoZW1hVHlwZUltcGwpdHlwZTsKLSAgICAgICAgaW5pdENvbXBsZXhUeXBlKHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlSW1wbCBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgICAgICB7IHJldHVybiBudWxsOyB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRfU3RyaW5nKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9zY2hlbWFUeXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDsKLQotICAgICAgICBpZiAoX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgJiYKLSAgICAgICAgICAgICAgICAhX3NjaGVtYVR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVHlwZSBkb2VzIG5vdCBhbGxvdyBmb3IgdGV4dHVhbCBjb250ZW50OiAiICsgX3NjaGVtYVR5cGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldF9TdHJpbmcodik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldF90ZXh0KFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgIF9zY2hlbWFUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UIHx8Ci0gICAgICAgICAgICAgICAgX3NjaGVtYVR5cGUuaXNOb1R5cGUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVfZnJvbV9jb21wbGV4X2NvbnRlbnQoKQotICAgIHsKLSAgICAgICAgLy8gTm8gY29tcGxleCBjYWNoaW5nIHlldCAuLi4KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0X25pbCgpCi0gICAgICAgIHsgLyogQlVHQlVHOiB3aGF0IHRvIGRvPyAqLyB9Ci0KLSAgICAvLyBMRUZUCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGNvbXBsZXhPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLmVxdWFscyhjb21wbGV4T2JqZWN0LnNjaGVtYVR5cGUoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gQlVHQlVHOiBieS12YWx1ZSBzdHJ1Y3R1cmUgY29tcGFyaXNvbiB1bmRvbmUKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTEVGVAotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbXBsZXggdHlwZXMgY2Fubm90IGJlIHVzZWQgYXMgaGFzaCBrZXlzIik7Ci0gICAgfQotCi0gICAgLy8gRE9ORQotICAgIHB1YmxpYyBUeXBlU3RvcmVWaXNpdG9yIG5ld192aXNpdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKF9zY2hlbWFUeXBlLmdldENvbnRlbnRNb2RlbCgpKTsKLSAgICB9Ci0KLSAgICAvLyBET05FCi0gICAgcHVibGljIGJvb2xlYW4gaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5pc09yZGVyU2Vuc2l0aXZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRfZWxlbWVudGZsYWdzKFFOYW1lIGVsdE5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gc2NoZW1hVHlwZSgpLmdldEVsZW1lbnRQcm9wZXJ0eShlbHROYW1lKTsKLSAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUgfHwKLSAgICAgICAgICAgIHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/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+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzIxN2UuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxEYXRlSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sRGF0ZQotewotICAgIHB1YmxpYyBYbWxEYXRlSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sRGF0ZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sRGF0ZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERhdGVUaW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZVRpbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMmRiNmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZVRpbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZVRpbWU7Ci0KLQotcHVibGljIGNsYXNzIFhtbERhdGVUaW1lSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sRGF0ZVRpbWUKLXsKLSAgICBwdWJsaWMgWG1sRGF0ZVRpbWVJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxEYXRlVGltZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sRGF0ZVRpbWVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEZWNpbWFsSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiM2VhMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEZWNpbWFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbDsKLQotcHVibGljIGNsYXNzIFhtbERlY2ltYWxJbXBsIGV4dGVuZHMgSmF2YURlY2ltYWxIb2xkZXIgaW1wbGVtZW50cyBYbWxEZWNpbWFsCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEZWNpbWFsUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmYyMGM3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxEZWNpbWFsUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhRGVjaW1hbEhvbGRlckV4IGltcGxlbWVudHMgWG1sRGVjaW1hbAotewotICAgIHB1YmxpYyBYbWxEZWNpbWFsUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1MjZmMC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEb3VibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb3VibGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxEb3VibGVJbXBsIGV4dGVuZHMgSmF2YURvdWJsZUhvbGRlciBpbXBsZW1lbnRzIFhtbERvdWJsZQotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWU4OTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvdWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxEb3VibGVSZXN0cmljdGlvbiBleHRlbmRzIEphdmFEb3VibGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbERvdWJsZQotewotICAgIHB1YmxpYyBYbWxEb3VibGVSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRHVyYXRpb25JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEdXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiMTMxZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEdXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbER1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRHVyYXRpb25JbXBsIGV4dGVuZHMgSmF2YUdEdXJhdGlvbkhvbGRlckV4IGltcGxlbWVudHMgWG1sRHVyYXRpb24KLXsKLSAgICBwdWJsaWMgWG1sRHVyYXRpb25JbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxEdXJhdGlvbi50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sRHVyYXRpb25JbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxFbnRpdGllc0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEVudGl0aWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDYyMTI5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEVudGl0aWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVOVElUSUVTOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdGllc0ltcGwgZXh0ZW5kcyBYbWxMaXN0SW1wbCBpbXBsZW1lbnRzIFhtbEVOVElUSUVTCi17Ci0gICAgcHVibGljIFhtbEVudGl0aWVzSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sRU5USVRJRVMudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbEVudGl0aWVzSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXR5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmM3ZjRiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVOVElUWTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbEVudGl0eUltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxFTlRJVFkKLXsKLSAgICBwdWJsaWMgWG1sRW50aXR5SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sRU5USVRZLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxFbnRpdHlJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxGbG9hdEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDQzNDNkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmxvYXQ7Ci0KLQotcHVibGljIGNsYXNzIFhtbEZsb2F0SW1wbCBleHRlbmRzIEphdmFGbG9hdEhvbGRlciBpbXBsZW1lbnRzIFhtbEZsb2F0Ci17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxGbG9hdFJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxGbG9hdFJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmI2YTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmxvYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sRmxvYXRSZXN0cmljdGlvbiBleHRlbmRzIEphdmFGbG9hdEhvbGRlckV4IGltcGxlbWVudHMgWG1sRmxvYXQKLXsKLSAgICBwdWJsaWMgWG1sRmxvYXRSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR0RheUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdEYXlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjY1NDUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR0RheUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdEYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxHRGF5SW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR0RheQotewotICAgIHB1YmxpYyBYbWxHRGF5SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sR0RheS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR0RheUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aERheUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aERheUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiNzZlZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHTW9udGhEYXlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR01vbnRoRGF5OwotCi1wdWJsaWMgY2xhc3MgWG1sR01vbnRoRGF5SW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR01vbnRoRGF5Ci17Ci0gICAgcHVibGljIFhtbEdNb250aERheUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbEdNb250aERheS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR01vbnRoRGF5SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ2YjUxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHTW9udGg7IAotCi1wdWJsaWMgY2xhc3MgWG1sR01vbnRoSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR01vbnRoCi17Ci0gICAgcHVibGljIFhtbEdNb250aEltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbEdNb250aC50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR01vbnRoSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwZjgzNC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHWWVhcjsKLQotcHVibGljIGNsYXNzIFhtbEdZZWFySW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR1llYXIKLXsKLSAgICBwdWJsaWMgWG1sR1llYXJJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxHWWVhci50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR1llYXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhck1vbnRoSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJNb250aEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4OTdjNy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhck1vbnRoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdZZWFyTW9udGg7IAotCi1wdWJsaWMgY2xhc3MgWG1sR1llYXJNb250aEltcGwgZXh0ZW5kcyBKYXZhR0RhdGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEdZZWFyTW9udGgKLXsKLSAgICBwdWJsaWMgWG1sR1llYXJNb250aEltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbEdZZWFyTW9udGgudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbEdZZWFyTW9udGhJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxIZXhCaW5hcnlJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxIZXhCaW5hcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODllMzQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSGV4QmluYXJ5OwotCi0KLXB1YmxpYyBjbGFzcyBYbWxIZXhCaW5hcnlJbXBsIGV4dGVuZHMgSmF2YUhleEJpbmFyeUhvbGRlciBpbXBsZW1lbnRzIFhtbEhleEJpbmFyeQotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5UmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDIwMjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5UmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxIZXhCaW5hcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxIZXhCaW5hcnlSZXN0cmljdGlvbiBleHRlbmRzIEphdmFIZXhCaW5hcnlIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEhleEJpbmFyeQotewotICAgIHB1YmxpYyBYbWxIZXhCaW5hcnlSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2MGIxMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRDsKLQotCi1wdWJsaWMgY2xhc3MgWG1sSWRJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sSUQKLXsKLSAgICBwdWJsaWMgWG1sSWRJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxJRC50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sSWRJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGZlYTYyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEUkVGOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJZFJlZkltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxJRFJFRgotewotICAgIHB1YmxpYyBYbWxJZFJlZkltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbElEUkVGLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxJZFJlZkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmc0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5ZmIxNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSURSRUZTOwotCi1wdWJsaWMgY2xhc3MgWG1sSWRSZWZzSW1wbCBleHRlbmRzIFhtbExpc3RJbXBsIGltcGxlbWVudHMgWG1sSURSRUZTCi17Ci0gICAgcHVibGljIFhtbElkUmVmc0ltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbElEUkVGUy50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sSWRSZWZzSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjg2MTgxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludDsKLQotCi1wdWJsaWMgY2xhc3MgWG1sSW50SW1wbCBleHRlbmRzIEphdmFJbnRIb2xkZXIgaW1wbGVtZW50cyBYbWxJbnQKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludFJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjA4NTA0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludFJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50OwotCi1wdWJsaWMgY2xhc3MgWG1sSW50UmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhSW50SG9sZGVyRXggaW1wbGVtZW50cyBYbWxJbnQKLXsKLSAgICBwdWJsaWMgWG1sSW50UmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFmNjE5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyIGltcGxlbWVudHMgWG1sSW50ZWdlcgotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50ZWdlclJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VyUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4NzVhYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VyUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotCi1wdWJsaWMgY2xhc3MgWG1sSW50ZWdlclJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sSW50ZWdlclJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMYW5ndWFnZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExhbmd1YWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmM1MDA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExhbmd1YWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sTGFuZ3VhZ2VJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTGFuZ3VhZ2UKLXsKLSAgICBwdWJsaWMgWG1sTGFuZ3VhZ2VJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxMYW5ndWFnZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTGFuZ3VhZ2VJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMaXN0SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiYjhjZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTaW1wbGVMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFhtbExpc3RJbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICBwdWJsaWMgWG1sTGlzdEltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLSAgICBwcml2YXRlIFhtbFNpbXBsZUxpc3QgX3ZhbHVlOwotICAgIHByaXZhdGUgWG1sU2ltcGxlTGlzdCBfanZhbHVlOwotCi0KLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBudWxsQXNFbXB0eShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb21wdXRlX2xpc3RfdGV4dChMaXN0IHhMaXN0KQotICAgIHsKLSAgICAgICAgaWYgKHhMaXN0LnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICIiOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKG51bGxBc0VtcHR5KCgoU2ltcGxlVmFsdWUpeExpc3QuZ2V0KDApKS5nZXRTdHJpbmdWYWx1ZSgpKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB4TGlzdC5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobnVsbEFzRW1wdHkoKChTaW1wbGVWYWx1ZSl4TGlzdC5nZXQoaSkpLmdldFN0cmluZ1ZhbHVlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVfbGlzdF90ZXh0KF92YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhtbFNpbXBsZUxpc3Qgc2F2ZWRWYWx1ZSA9IF92YWx1ZTsKLSAgICAgICAgICAgIHNldF90ZXh0KHYpOwotCi0gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBzYXZlZCB2YWx1ZQotICAgICAgICAgICAgX3ZhbHVlID0gc2F2ZWRWYWx1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGFnYWluc3QgYW55IHBhdHRlcm5zLi4uCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpICYmICFfc2NoZW1hVHlwZS5tYXRjaFBhdHRlcm5GYWNldChzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBTY2hlbWFUeXBlIGl0ZW1UeXBlID0gX3NjaGVtYVR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0KLSAgICAgICAgWG1sU2ltcGxlTGlzdCBuZXd2YWwgPSBsZXgocywgaXRlbVR5cGUsIF92b29yVmMsIGhhc19zdG9yZSgpID8gZ2V0X3N0b3JlKCkgOiBudWxsKTsKLQotICAgICAgICAvLyBjaGVjayBlbnVtZXJhdGlvbgotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUobmV3dmFsLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgLy8gd2UgbWFkZSBpdCBhbGwgdGhlIHdheSB0aHJvdWdoOyBzbyB3ZSdyZSBPSy4KLSAgICAgICAgX3ZhbHVlID0gbmV3dmFsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdBUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdF9saXN0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVFJJTkdBUlJBWTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmIFhNTENoYXIuaXNTcGFjZShzLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgaWYgKGkgPj0gcy5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KEVNUFRZX1NUUklOR0FSUkFZKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgcy5sZW5ndGgoKSAmJiAhWE1MQ2hhci5pc1NwYWNlKHMuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHMuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBYbWxTaW1wbGVMaXN0IGxleChTdHJpbmcgcywgU2NoZW1hVHlwZSBpdGVtVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY3R4LCBQcmVmaXhSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHBhcnRzID0gc3BsaXRfbGlzdChzKTsKLQotICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gbmV3QXJyYXkgPSBuZXcgWG1sQW55U2ltcGxlVHlwZVtwYXJ0cy5sZW5ndGhdOwotICAgICAgICBib29sZWFuIHB1c2hlZCA9IGZhbHNlOwotICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KHJlc29sdmVyKSk7Ci0gICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0FycmF5W2ldID0gaXRlbVR5cGUubmV3VmFsdWUocGFydHNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdHguaW52YWxpZCgiTGlzdCBpdGVtICciICsgcGFydHNbaV0gKyAiJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBvZiAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoaXRlbVR5cGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHVzaGVkKQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBYbWxTaW1wbGVMaXN0KEFycmF5cy5hc0xpc3QobmV3QXJyYXkpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgeGxpc3RWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICByZXR1cm4gX3ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGxpc3RWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKF9qdmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfanZhbHVlOwotICAgICAgICBMaXN0IGphdmFSZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3ZhbHVlLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgamF2YVJlc3VsdC5hZGQoamF2YV92YWx1ZSgoWG1sT2JqZWN0KV92YWx1ZS5nZXQoaSkpKTsKLSAgICAgICAgX2p2YWx1ZSA9IG5ldyBYbWxTaW1wbGVMaXN0KGphdmFSZXN1bHQpOwotICAgICAgICByZXR1cm4gX2p2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHBlcm1pdHNfaW5uZXJfc3BhY2UoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoKChTaW1wbGVWYWx1ZSlvYmopLmluc3RhbmNlVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zX3doaXRlX3NwYWNlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHMuaW5kZXhPZignICcpID49IDAgfHwKLSAgICAgICAgICAgICAgICBzLmluZGV4T2YoJ1x0JykgPj0gMCB8fAotICAgICAgICAgICAgICAgIHMuaW5kZXhPZignXG4nKSA+PSAwIHx8Ci0gICAgICAgICAgICAgICAgcy5pbmRleE9mKCdccicpID49IDA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0X2xpc3QoTGlzdCBsaXN0KQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBpdGVtVHlwZSA9IF9zY2hlbWFUeXBlLmdldExpc3RJdGVtVHlwZSgpOwotICAgICAgICBYbWxTaW1wbGVMaXN0IHhMaXN0OwotCi0gICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChoYXNfc3RvcmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KGdldF9zdG9yZSgpKSk7Ci0gICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIG5ld3ZhbCA9IG5ldyBYbWxBbnlTaW1wbGVUeXBlW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZW50cnkgPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGVudHJ5IGluc3RhbmNlb2YgWG1sT2JqZWN0KSAmJiBwZXJtaXRzX2lubmVyX3NwYWNlKChYbWxPYmplY3QpbGlzdC5nZXQoaSkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ3JlcCA9IGxpc3QuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc193aGl0ZV9zcGFjZShzdHJpbmdyZXApKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXd2YWxbaV0gPSBpdGVtVHlwZS5uZXdWYWx1ZShlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4TGlzdCA9IG5ldyBYbWxTaW1wbGVMaXN0KEFycmF5cy5hc0xpc3QobmV3dmFsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHVzaGVkKQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGVudW1lcmF0aW9uICsgbWluL21heC9ldGMKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUoeExpc3QsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgfQotCi0gICAgICAgIF92YWx1ZSA9IHhMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKFhtbFNpbXBsZUxpc3QgaXRlbXMsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3RbXSBlbnVtdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGNoZWNrRW51bTogaWYgKGVudW12YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bXZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGVxdWFsX3htbExpc3RzKGl0ZW1zLCAoKFhtbE9iamVjdEJhc2UpZW51bXZhbHNbaV0pLnhsaXN0VmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGNoZWNrRW51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiTGlzdCAoIiArIGl0ZW1zICsgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3QgbzsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIICkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoU2ltcGxlVmFsdWUpbykuZ2V0SW50VmFsdWUoKSkgIT0gaXRlbXMuc2l6ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyBpdGVtcyArICIpIGRvZXMgbm90IGhhdmUgIiArIGkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcyBwZXIgbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSA+IGl0ZW1zLnNpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJMaXN0ICgiICsgaXRlbXMgKyAiKSBoYXMgb25seSAiICsgaXRlbXMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXRlbXMsIGZld2VyIHRoYW4gbWluIGxlbmd0aCBmYWNldCAoIiArIGkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpIDwgaXRlbXMuc2l6ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyBpdGVtcyArICIpIGhhcyAiICsgaXRlbXMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXRlbXMsIG1vcmUgdGhhbiBtYXggbGVuZ3RoIGZhY2V0ICgiICsgaSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIC8vIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkgLSBubyBzb3J0aW5nIG9yZGVyOyBpbmhlcml0IGZyb20gYmFzZQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcXVhbF94bWxMaXN0cyhfdmFsdWUsICgoWG1sT2JqZWN0QmFzZSlvYmopLnhsaXN0VmFsdWUoKSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsX3htbExpc3RzKExpc3QgYSwgTGlzdCBiKQotICAgIHsKLSAgICAgICAgaWYgKGEuc2l6ZSgpICE9IGIuc2l6ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghYS5nZXQoaSkuZXF1YWxzKGIuZ2V0KGkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gaGFzaCBjb2RlIHByb2JlcyA5IGRpc3RyaWJ1dGVkIHZhbHVlcywgcGx1cyB0aGUgbGFzdAotICAgICAgICBpbnQgaGFzaCA9IF92YWx1ZS5zaXplKCk7Ci0gICAgICAgIGludCBpbmNyID0gX3ZhbHVlLnNpemUoKSAvIDk7Ci0gICAgICAgIGlmIChpbmNyIDwgMSkKLSAgICAgICAgICAgIGluY3IgPSAxOwotCi0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3ZhbHVlLnNpemUoKTsgaSArPSBpbmNyKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYXNoICo9IDE5OwotICAgICAgICAgICAgaGFzaCArPSBfdmFsdWUuZ2V0KGkpLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA8IF92YWx1ZS5zaXplKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhc2ggKj0gMTk7Ci0gICAgICAgICAgICBoYXNoICs9IF92YWx1ZS5nZXQoaSkuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZSgoWG1sU2ltcGxlTGlzdCl4bGlzdFZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTG9uZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1YjBiYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTG9uZzsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTG9uZ0ltcGwgZXh0ZW5kcyBKYXZhTG9uZ0hvbGRlciBpbXBsZW1lbnRzIFhtbExvbmcKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExvbmdSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTG9uZ1Jlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTM2ZGUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTG9uZ1Jlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTG9uZzsKLQotcHVibGljIGNsYXNzIFhtbExvbmdSZXN0cmljdGlvbiBleHRlbmRzIEphdmFMb25nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxMb25nCi17Ci0gICAgcHVibGljIFhtbExvbmdSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTkNOYW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTkNOYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFiYzJmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5DTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5DTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci0KLXB1YmxpYyBjbGFzcyBYbWxOQ05hbWVJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTkNOYW1lCi17Ci0gICAgcHVibGljIFhtbE5DTmFtZUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbE5DTmFtZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTkNOYW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmICggIVhNTENoYXIuaXNWYWxpZE5DTmFtZSh2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiVmFsdWUgJyIgKyB2ICsgIicgaXQncyBub3QgYSB2YWxpZCBOQ05hbWUuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmFtZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmM2EwODEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxOYW1lSW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbE5hbWUKLXsKLSAgICBwdWJsaWMgWG1sTmFtZUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbE5hbWUudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbE5hbWVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOZWdhdGl2ZUludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOZWdhdGl2ZUludGVnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGZmMzUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5lZ2F0aXZlSW50ZWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTmVnYXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOZWdhdGl2ZUludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sTmVnYXRpdmVJbnRlZ2VySW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTmVnYXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOZWdhdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxObVRva2VuSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NjJjNC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxObVRva2VuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk1UT0tFTjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci0KLQotcHVibGljIGNsYXNzIFhtbE5tVG9rZW5JbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTk1UT0tFTgotewotICAgIHB1YmxpYyBYbWxObVRva2VuSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTk1UT0tFTi50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTm1Ub2tlbkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAoICFYTUxDaGFyLmlzVmFsaWRObXRva2VuKHYpICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJWYWx1ZSAnIiArIHYgKyAiJyBpdCdzIG5vdCBhIHZhbGlkIE5NVE9LRU4uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxObVRva2Vuc0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5zSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjhjZDRiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5NVE9LRU5TOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxObVRva2Vuc0ltcGwgZXh0ZW5kcyBYbWxMaXN0SW1wbCBpbXBsZW1lbnRzIFhtbE5NVE9LRU5TCi17Ci0gICAgcHVibGljIFhtbE5tVG9rZW5zSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTk1UT0tFTlMudHlwZSwgZmFsc2UpO30KLSAgICBwdWJsaWMgWG1sTm1Ub2tlbnNJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjZiOTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uTmVnYXRpdmVJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOb25OZWdhdGl2ZUludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWU1ZWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vblBvc2l0aXZlSW50ZWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOb25Qb3NpdGl2ZUludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3JtYWxpemVkU3RyaW5nSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9ybWFsaXplZFN0cmluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkZTQ2My4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3JtYWxpemVkU3RyaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vcm1hbGl6ZWRTdHJpbmc7Ci0KLXB1YmxpYyBjbGFzcyBYbWxOb3JtYWxpemVkU3RyaW5nSW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbE5vcm1hbGl6ZWRTdHJpbmcKLXsKLSAgICBwdWJsaWMgWG1sTm9ybWFsaXplZFN0cmluZ0ltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbE5vcm1hbGl6ZWRTdHJpbmcudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3RhdGlvbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vdGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjYzMmIwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vdGF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk9UQVRJT047Ci0KLXB1YmxpYyBjbGFzcyBYbWxOb3RhdGlvbkltcGwgZXh0ZW5kcyBKYXZhTm90YXRpb25Ib2xkZXIgaW1wbGVtZW50cyBYbWxOT1RBVElPTgotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25SZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25SZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIzMDU3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vdGF0aW9uUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5PVEFUSU9OOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbE5vdGF0aW9uUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhTm90YXRpb25Ib2xkZXJFeCBpbXBsZW1lbnRzIFhtbE5PVEFUSU9OCi17Ci0gICAgcHVibGljIFhtbE5vdGF0aW9uUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE9iamVjdEJhc2UuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE9iamVjdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4ZGI5NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxPYmplY3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjM4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkdsb2JhbExvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvcldhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVZpc2l0b3JJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWxpZGF0b3IuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb2N1bWVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkZpbHRlclhtbE9iamVjdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFR5cGVTdG9yZVVzZXIsIFNlcmlhbGl6YWJsZSwgWG1sT2JqZWN0LCBTaW1wbGVWYWx1ZQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTUFKT1JfVkVSU0lPTl9OVU1CRVIgPSAoc2hvcnQpIDE7IC8vIGZvciBzZXJpYWxpemF0aW9uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNSU5PUl9WRVJTSU9OX05VTUJFUiA9IChzaG9ydCkgMTsgLy8gZm9yIHNlcmlhbGl6YXRpb24KLQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbW9uaXRvcigpCi0gICAgewotICAgICAgICBpZiAoaGFzX3N0b3JlKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0X3N0b3JlKCkuZ2V0X3Jvb3Rfb2JqZWN0KCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBYbWxPYmplY3RCYXNlIHVuZGVybHlpbmcoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWG1sT2JqZWN0QmFzZSkKLSAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0QmFzZSlvYmo7Ci0gICAgICAgIHdoaWxlIChvYmogaW5zdGFuY2VvZiBGaWx0ZXJYbWxPYmplY3QpCi0gICAgICAgICAgICBvYmogPSAoKEZpbHRlclhtbE9iamVjdClvYmopLnVuZGVybHlpbmdYbWxPYmplY3QoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdEJhc2UpCi0gICAgICAgICAgICByZXR1cm4gKFhtbE9iamVjdEJhc2Upb2JqOwotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb24tbmF0aXZlIGltcGxlbWVudGF0aW9ucyBvZiBYbWxPYmplY3Qgc2hvdWxkIGV4dGVuZCBGaWx0ZXJYbWxPYmplY3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgWG1sT2JqZWN0IGNvcHkoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGltbXV0YWJsZSBvYmplY3RzIGRvbid0IGdldCBjb3BpZWQuIFRoZXkncmUgaW1tdXRhYmxlCi0gICAgICAgICAgICBpZiAoaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLQotICAgICAgICAgICAgY2hlY2tfb3JwaGFuZWQoKTsKLQotICAgICAgICAgICAgLy8gY29weSB0aGUgdHlwZQotICAgICAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGdldF9zdG9yZSgpLmdldF9zY2hlbWF0eXBlbG9hZGVyKCkubmV3SW5zdGFuY2Uoc2NoZW1hVHlwZSgpLCBudWxsKTsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvLyBjb3B5IHRoZSBkYXRhCi0gICAgICAgICAgICBYbWxPYmplY3RCYXNlIHRhcmdldCA9IHVuZGVybHlpbmcocmVzdWx0KTsKLSAgICAgICAgICAgIHRhcmdldC5nZXRfc3RvcmUoKS5jb3B5X2NvbnRlbnRzX2Zyb20oZ2V0X3N0b3JlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbERvY3VtZW50UHJvcGVydGllcyBkb2N1bWVudFByb3BlcnRpZXMoKQotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLmRvY3VtZW50UHJvcGVydGllcygpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSgpCi0gICAgICAgIHsgcmV0dXJuIG5ld1hNTElucHV0U3RyZWFtKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKQotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLm5ld1hNTElucHV0U3RyZWFtKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSgpCi0gICAgICAgIHsgcmV0dXJuIG5ld0lucHV0U3RyZWFtKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKQotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLm5ld0lucHV0U3RyZWFtKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyKCkKLSAgICAgICAgeyByZXR1cm4gbmV3UmVhZGVyKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgUmVhZGVyIG5ld1JlYWRlcihYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIubmV3UmVhZGVyKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUoKQotICAgICAgICB7IHJldHVybiBuZXdEb21Ob2RlKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgTm9kZSBuZXdEb21Ob2RlKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgcmV0dXJuIGN1ci5uZXdEb21Ob2RlKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgY3VyLnNhdmUoY2gsIGxoLCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgY3VyLnNhdmUoZmlsZSwgbWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IGN1ci5zYXZlKG9zLCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyBjdXIuc2F2ZSh3LCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKENvbnRlbnRIYW5kbGVyIGNoLCBMZXhpY2FsSGFuZGxlciBsaCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7IHNhdmUoIGNoLCBsaCwgbnVsbCApOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgc2F2ZSggZmlsZSwgbnVsbCApOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgc2F2ZSggb3MsIG51bGwgKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgc2F2ZSggdywgbnVsbCApOyB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld0N1cnNvckZvcmNlKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZW5zdXJlU3RvcmUoKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgWG1sT2JqZWN0IGVuc3VyZVN0b3JlKCkKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0KLSAgICAgICAgICAgIChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMAotICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICA6IGNvbXB1dGVfdGV4dCggaGFzX3N0b3JlKCkgPyBnZXRfc3RvcmUoKSA6IG51bGwgKTsKLQotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpLnNldERvY3VtZW50VHlwZShzY2hlbWFUeXBlKCkpOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoIG9wdGlvbnMgKTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5pbnNlcnRDaGFycyggdmFsdWUgKTsKLQotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxPcHRpb25zIG1ha2VJbm5lck9wdGlvbnMoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgWG1sT3B0aW9ucyBpbm5lck9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOwotICAgICAgICBpbm5lck9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfSU5ORVIgKTsKLSAgICAgICAgcmV0dXJuIGlubmVyT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld0N1cnNvcigpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJYTUwgVmFsdWUgT2JqZWN0cyBjYW5ub3QgY3JlYXRlIGN1cnNvcnMiKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tfb3JwaGFuZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RvcmUoKS5uZXdfY3Vyc29yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKQotICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHJldHVybiBpc05pbCgpID8gbnVsbCA6IHNjaGVtYVR5cGUoKTsgfSB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYUZpZWxkIHNjaGVtYUZpZWxkKCkgewotICAgICAgICBTY2hlbWFUeXBlIHN0ID0gc2NoZW1hVHlwZSgpOwotICAgICAgICBTY2hlbWFGaWVsZCBmaWVsZDsKLQotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGZpZWxkIGhhcyBhbiBhbm9ueW1vdXMgdHlwZQotICAgICAgICBmaWVsZCA9IHN0LmdldENvbnRhaW5lckZpZWxkKCk7Ci0KLSAgICAgICAgaWYgKGZpZWxkID09IG51bGwpCi0gICAgICAgICAgICBmaWVsZCA9IGdldF9zdG9yZSgpLmdldF9zY2hlbWFfZmllbGQoKTsKLQotICAgICAgICByZXR1cm4gZmllbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIF92b29yVmMgd2hlbiB5b3Ugd2FudCB0byB0aHJvdyBhIFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiB3aGVuCi0gICAgICogdmFsaWRhdGluZyBhIHNpbXBsZSB0eXBlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFZhbHVlT3V0T2ZSYW5nZVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudHMgVmFsaWRhdGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGludmFsaWQoU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oIG1lc3NhZ2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc3VwcGx5IHZhbGlkYXRpb24gY29udGV4dCBmb3IgdGhlIHZhbGlkYXRlX3ZhbHVlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbW11dGFibGVWYWx1ZVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudHMgVmFsaWRhdGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgWG1sT2JqZWN0IF9sb2M7Ci0gICAgICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfY29sbDsKLSAgICAgICAgSW1tdXRhYmxlVmFsdWVWYWxpZGF0aW9uQ29udGV4dChDb2xsZWN0aW9uIGNvbGwsIFhtbE9iamVjdCBsb2MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb2xsID0gY29sbDsKLSAgICAgICAgICAgIF9sb2MgPSBsb2M7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZChTdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgICBfY29sbC5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KG1lc3NhZ2UsIF9sb2MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsaWRhdGlvbkNvbnRleHQgX3Zvb3JWYyA9IG5ldyBWYWx1ZU91dE9mUmFuZ2VWYWxpZGF0aW9uQ29udGV4dCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKQotICAgICAgICB7IHJldHVybiB2YWxpZGF0ZShudWxsKTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9pbW11dGFibGUob3B0aW9ucyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJYTUwgb2JqZWN0cyB3aXRoIG5vIHVuZGVybHlpbmcgc3RvcmUgY2Fubm90IGJlIHZhbGlkYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzY2hlbWFGaWVsZCgpOwotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gc2NoZW1hVHlwZSgpOwotCi0gICAgICAgICAgICBUeXBlU3RvcmUgdHlwZVN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPQotICAgICAgICAgICAgICAgIG5ldyBWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGZpZWxkLCB0eXBlU3RvcmUuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSwgb3B0aW9ucywgbnVsbCk7Ci0KLSAgICAgICAgICAgIHR5cGVTdG9yZS52YWxpZGF0ZSggdmFsaWRhdG9yICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IuaXNWYWxpZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlX2ltbXV0YWJsZShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIgPSBvcHRpb25zID09IG51bGwgPyBudWxsIDogKENvbGxlY3Rpb24pb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5FUlJPUl9MSVNURU5FUik7Ci0gICAgICAgIFhtbEVycm9yV2F0Y2hlciB3YXRjaGVyID0gbmV3IFhtbEVycm9yV2F0Y2hlcihlcnJvckxpc3RlbmVyKTsKLSAgICAgICAgaWYgKCFzY2hlbWFUeXBlKCkuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNhbm5vdCBoYXZlIGFueSByZXF1aXJlZCBhdHRyaWJ1dGVzIG9yIGVsZW1lbnRzCi0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMgPSBzY2hlbWFUeXBlKCkuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLmdldE1pbk9jY3VycygpLnNpZ251bSgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVyLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIk1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkocHJvcGVydGllc1tpXS5nZXROYW1lKCkpLCB0aGlzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXIuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTWlzc2luZyByZXF1aXJlZCBlbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkocHJvcGVydGllc1tpXS5nZXROYW1lKCkpLCB0aGlzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSgpLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIXdhdGNoZXIuaGFzRXJyb3IoKTsgLy8gZG9uJ3QgdmFsaWRhdGUgbm9uLXNpbXBsZS1jb250ZW50Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGV4dCA9IChTdHJpbmcpX3RleHRzb3VyY2U7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICB0ZXh0ID0gIiI7Ci0gICAgICAgIHZhbGlkYXRlX3NpbXBsZXZhbCh0ZXh0LCBuZXcgSW1tdXRhYmxlVmFsdWVWYWxpZGF0aW9uQ29udGV4dCh3YXRjaGVyLCB0aGlzKSk7Ci0gICAgICAgIHJldHVybiAhd2F0Y2hlci5oYXNFcnJvcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbE9iamVjdFtdIF90eXBlZEFycmF5KFhtbE9iamVjdFtdIGlucHV0KQotICAgIHsKLSAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGlucHV0OwotICAgICAgICBTY2hlbWFUeXBlIGNvbW1vblR5cGUgPSBpbnB1dFswXS5zY2hlbWFUeXBlKCk7Ci0gICAgICAgIGlmIChjb21tb25UeXBlLmVxdWFscyhYbWxPYmplY3QudHlwZSkpCi0gICAgICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1vblR5cGUgPSBjb21tb25UeXBlLmdldENvbW1vbkJhc2VUeXBlKGlucHV0W2ldLnNjaGVtYVR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAoY29tbW9uVHlwZS5lcXVhbHMoWG1sT2JqZWN0LnR5cGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKLSAgICAgICAgfQotICAgICAgICBDbGFzcyBkZXNpcmVkQ2xhc3MgPSBjb21tb25UeXBlLmdldEphdmFDbGFzcygpOwotICAgICAgICB3aGlsZSAoZGVzaXJlZENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1vblR5cGUgPSBjb21tb25UeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoWG1sT2JqZWN0LnR5cGUuZXF1YWxzKGNvbW1vblR5cGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKLSAgICAgICAgICAgIGRlc2lyZWRDbGFzcyA9IGNvbW1vblR5cGUuZ2V0SmF2YUNsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3RbXSByZXN1bHQgPSAoWG1sT2JqZWN0W10pQXJyYXkubmV3SW5zdGFuY2UoZGVzaXJlZENsYXNzLCBpbnB1dC5sZW5ndGgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGlucHV0LCAwLCByZXN1bHQsIDAsIGlucHV0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApCi0gICAgewotICAgICAgICByZXR1cm4gc2VsZWN0UGF0aCggcGF0aCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3RbXSBzZWxlY3RQYXRoICggU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBYbWxPYmplY3QgW10gc2VsZWN0aW9uczsKLQotICAgICAgICAvLyBhbGwgdXNlci1sZXZlbCBjb2RlOyBkb2Vzbid0IG5lZWQgdG8gYmUgc3luY2hyb25pemVkCi0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBuZXdDdXJzb3IoKTsKLQotICAgICAgICBpZiAoYyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuc2VsZWN0UGF0aCggcGF0aCwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICBpZiAoIWMuaGFzTmV4dFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMgPSBuZXcgWG1sT2JqZWN0WyAwIF07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9ucyA9IG5ldyBYbWxPYmplY3QgWyBjLmdldFNlbGVjdGlvbkNvdW50KCkgXTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgYy50b05leHRTZWxlY3Rpb24oKSA7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc2VsZWN0aW9uc1sgaSBdID0gYy5nZXRPYmplY3QoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdGggbXVzdCBzZWxlY3Qgb25seSBlbGVtZW50cyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgYXR0cmlidXRlcyIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF90eXBlZEFycmF5KHNlbGVjdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3RbXSBleGVjUXVlcnkgKCBTdHJpbmcgcGF0aCApCi0gICAgewotICAgICAgICByZXR1cm4gZXhlY1F1ZXJ5KCBwYXRoLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlIHR5cGVTdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgICAgICBpZiAodHlwZVN0b3JlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRvIFhRdWVyeSBvbiBYTUwgVmFsdWUgT2JqZWN0cyIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF90eXBlZEFycmF5KHR5cGVTdG9yZS5leGVjX3F1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY2hhbmdlVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgdHlwZSAobnVsbCkiICk7Ci0KLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJYTUwgVmFsdWUgT2JqZWN0cyBjYW5ub3QgaGF2ZSB0aGllciB0eXBlIGNoYW5nZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tfb3JwaGFuZWQoKTsKLSAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBnZXRfc3RvcmUoKS5jaGFuZ2VfdHlwZSggdHlwZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgX2ZsYWdzOwotICAgIHByaXZhdGUgT2JqZWN0IF90ZXh0c291cmNlOwotCi0gICAgcHJvdGVjdGVkIFhtbE9iamVjdEJhc2UoKQotICAgIHsKLSAgICAgICAgX2ZsYWdzID0gRkxBR19OSUxMQUJMRSB8IEZMQUdfTklMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRfZmxhZ3MoU2NoZW1hUHJvcGVydHkgcHJvcCkKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpIHJldHVybjsKLQotICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUgfHwKLSAgICAgICAgICAgIHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIF9mbGFncyB8PQotICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCkgfAotICAgICAgICAgICAgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuTklMTEFCTEUpIHwKLSAgICAgICAgICAgIChGTEFHX05PVF9WQVJJQUJMRSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBhc3NlcnQgVHlwZVN0b3JlLk5JTExBQkxFICAgPT0gMTsKLSAgICAgICAgYXNzZXJ0IFR5cGVTdG9yZS5IQVNERUZBVUxUID09IDI7Ci0gICAgICAgIGFzc2VydCBUeXBlU3RvcmUuRklYRUQgICAgICA9PSA0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX05JTExBQkxFICAgICAgICA9IFR5cGVTdG9yZS5OSUxMQUJMRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNERUZBVUxUICAgICAgPSBUeXBlU3RvcmUuSEFTREVGQVVMVDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSVhFRCAgICAgICAgICAgPSBUeXBlU3RvcmUuRklYRUQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVRUUklCVVRFICAgICAgID0gICAgIDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1RPUkUgICAgICAgICAgID0gICAgMTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVkFMVUVfREFURUQgICAgID0gICAgMzI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTklMICAgICAgICAgICAgID0gICAgNjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTklMX0RBVEVEICAgICAgID0gICAxMjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSVNERUZBVUxUICAgICAgID0gICAyNTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRUxFTUVOVF9EQVRFRCAgID0gICA1MTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0VUVElOR0RFRkFVTFQgID0gIDEwMjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JQSEFORUQgICAgICAgID0gIDIwNDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU1NVVRBQkxFICAgICAgID0gIDQwOTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NUExFWFRZUEUgICAgID0gIDgxOTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NUExFWENPTlRFTlQgID0gMTYzODQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTk9UX1ZBUklBQkxFICAgID0gMzI3Njg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVkFMSURBVEVfT05fU0VUID0gNjU1MzY7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSB0aHJlZSBkYXRlZCBmbGFncyBhcmUgYWx3YXlzIHN0YWNrZWQ6Ci0gICAgICogICAgIEZMQUdfRUxFTUVOVF9EQVRFRCBpbXBsaWVzIEZMQUdfTklMX0RBVEVEIGlzIHNldAotICAgICAqICAgICBGTEFHX05JTF9EQVRFRCBpbXBsaWVzIEZMQUdfVEVYVF9EQVRFRCBpcyBzZXQuCi0gICAgICogY2hlY2tlcnMgd29yayBvbiB0aGUgZmxhZ3MgZnJvbSB0b3AgdG8gYm90dG9tLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHU19EQVRFRCA9Ci0gICAgICAgICAgICBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQgfCBGTEFHX0VMRU1FTlRfREFURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGhyZWUgZWxlbWVudCBzdGF0dXMgZmxhZ3MgaGF2ZSBvbmUgaW50ZXJybGF0aW9uc2hpb3A6Ci0gICAgICogICAgIEZMQUdfRklYRUQgaW1wbGllcyBGTEFHX0hBU0RFRkFVTFQgaXMgc2V0LgotICAgICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdoZW4gc2V0dGluZyBuaWxzLCBkZWZhdWx0cywgc3RyaW5ncy4KLSAgICAgKiBTaW5jZSBhbiBpbml0aWFsIGdldCBpbXBsaWVzIHNldHRpbmcgZnJvbSB0ZXh0LCB0aGV5J3JlCi0gICAgICogYWxzbyB1c2VkIGR1cmluZyBnZXR0aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHU19FTEVNRU5UID0KLSAgICAgICAgICAgIEZMQUdfTklMTEFCTEUgfCBGTEFHX0ZJWEVEIHwgRkxBR19IQVNERUZBVUxUOwotCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgcmVzdHJpY3Rpb24gc3ViY2xhc3NlcyB3aXRoaW4gdGhlaXIgY29uc3RydWN0b3JzIHRvIGVuYWJsZQotICAgICAqIGNvbXBsZXggdHlwZSBzdXBwb3J0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wbGV4VHlwZShib29sZWFuIGNvbXBsZXhUeXBlLCBib29sZWFuIGNvbXBsZXhDb250ZW50KQotICAgIHsKLSAgICAgICAgX2ZsYWdzIHw9IChjb21wbGV4VHlwZSA/IEZMQUdfQ09NUExFWFRZUEUgOiAwKSB8Ci0gICAgICAgICAgICAgICAgICAoY29tcGxleENvbnRlbnQgPyBGTEFHX0NPTVBMRVhDT05URU5UIDogMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2lzQ29tcGxleFR5cGUoKQotICAgICAgICB7IHJldHVybiAoX2ZsYWdzICYgRkxBR19DT01QTEVYVFlQRSkgIT0gMDsgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2lzQ29tcGxleENvbnRlbnQoKQotICAgICAgICB7IHJldHVybiAoX2ZsYWdzICYgRkxBR19DT01QTEVYQ09OVEVOVCkgIT0gMDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGVPblNldCgpIHsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMSURBVEVfT05fU0VUOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIF92YWxpZGF0ZU9uU2V0KCkKLSAgICAgICAgeyByZXR1cm4gKF9mbGFncyAmIEZMQUdfVkFMSURBVEVfT05fU0VUKSAhPSAwOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBuaWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOaWwoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gKChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBmaXhlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpeGVkKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKLSAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19GSVhFRCkgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYWxsb3dlZCB0byBiZSBuaWwuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgewotICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiAoKF9mbGFncyAmIEZMQUdfTklMTEFCTEUpICE9IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIGN1cnJlbnRseSBkZWZhdWx0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0YWJsZSgpCi0gICAgewotICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiAoKF9mbGFncyAmIEZMQUdfSEFTREVGQVVMVCkgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgY3VycmVudGx5IGRlZmF1bHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHQoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19JU0RFRkFVTFQpICE9IDApOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTmlscyB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TmlsKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSdyZSBub3QgbmlsbGFibGUsIHRocm93IGV4Y2VwdGlvbiBvbiBzZXROaWwodHJ1ZSkKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OSUxMQUJMRSkgPT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICAvLyB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHplcm8gdGhlIHZhbHVlIHRvIHJlZmxlY3QgbmlsCi0gICAgICAgICAgICBzZXRfbmlsKCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgbmlsIGZsYWcKLSAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX05JTDsKLQotICAgICAgICAgICAgLy8gb3JkaW5hcnkgY29tbWl0IGV4Y2VwdCBubyBjbGVhcmluZyBvZiBuaWwgZmxhZwotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR1NfREFURUQ7Ci0gICAgICAgICAgICAgICAgZ2V0X3N0b3JlKCkuaW52YWxpZGF0ZV9uaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdGV4dHNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciBzaXR1YXRpb25zIHdoZXJlIHRoZXNlIGZsYWdzIG11c3QgYmUgcGFzc2VkIG9uIHRvCi0gICAgICogY2hhaW5lZCB2YWx1ZXMuIChTZWUgWG1sQW55U2ltcGxlVHlwZSAoYWxsU2ltcGxlVmFsdWUpLCB1bmlvbgotICAgICAqIGltcGxlbWVudGF0aW9ucykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBlbGVtZW50RmxhZ3MoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZWxlbWVudF9kYXRlZCgpOwotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdTX0VMRU1FTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gbWFrZSBhIGZyZWUtc3RhbmRpbmcgeG1sIHNpbXBsZSB2YWx1ZSBpbnN0YW5jZSBpbW11dGFibGUuCi0gICAgICogVGhpcyBpcyBhIG9uZS13YXkgc3RyZWV0LCBhbmQgaXQgaXMgaWxsZWdhbCB0byBhdHRlbXB0IHRvIG1ha2UgYQotICAgICAqIHZhbHVlIHRoYXQgaXMgZW1iZWRkZWQgaW4gYW4geG1sIGRvY3VtZW50IGltbXV0YWJsZS4KLSAgICAgKgotICAgICAqIE9uY2UgYSB2YWx1ZSBpcyBtYXJrZWQgYXMgaW1tdXRhYmxlLCBpdCBpcyBpbGxlZ2FsIHRvIGNhbGwgc2V0dGVycwotICAgICAqIG9mIGFueSBraW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltbXV0YWJsZSgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIChGTEFHX0lNTVVUQUJMRSB8IEZMQUdfU1RPUkUpKSAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIF9mbGFncyB8PSBGTEFHX0lNTVVUQUJMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGlzIGluc3RhbmNlIGFuIGltbXV0YWJsZSB2YWx1ZT8KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwOwotICAgIH0KLQotCi0KLQotICAgIC8vIFRFWFRVU0VSIGltcGxlbWVudGF0aW9uCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgVHlwZVN0b3JlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFhtbE9iamVjdAotICAgICAqIGltcGxlbWVudGF0aW9uLiBJZiBub3QgY2FsbGVkLCB0aGlzIGlzIGEgZnJlZS1mbG9hdGluZyB2YWx1ZSBob2xkZXIuCi0gICAgICoKLSAgICAgKiBXaGVuIGEgdmFsdWUgaXMgZmlyc3QgYXR0YWNoZWQsIGl0IGlzIHB1dCBpbiBhIGNvbXBsZXRlbHkgaW52YWxpZGF0ZWQKLSAgICAgKiBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhdHRhY2hfc3RvcmUoVHlwZVN0b3JlIHN0b3JlKQotICAgIHsKLSAgICAgICAgX3RleHRzb3VyY2UgPSBzdG9yZTsKLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0lNTVVUQUJMRSkgIT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfU1RPUkUgfCBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQgfCBGTEFHX0VMRU1FTlRfREFURUQ7Ci0KLSAgICAgICAgaWYgKHN0b3JlLmlzX2F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfQVRUUklCVVRFOwotCi0gICAgICAgIGlmIChzdG9yZS52YWxpZGF0ZV9vbl9zZXQoKSkKLSAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX1ZBTElEQVRFX09OX1NFVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGV4dCBoYXMgYmVlbgotICAgICAqIGludmFsaWRhdGVkIGFuZCBzaG91bGQgYmUgZmV0Y2hlZCBuZXh0IHRpbWUgdGhlIHZhbHVlIGlzCi0gICAgICogbmVlZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludmFsaWRhdGVfdmFsdWUoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMVUVfREFURUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gdXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IHNjaGVtYVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIHR5cGUuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGEgVHlwZVN0b3JlIHRvIGluZGljYXRlIHRoYXQgdGhlIHhzaTpuaWwgYXR0cmlidXRlCi0gICAgICogb24gdGhlIGNvbnRhaW5pbmcgZWxlbWVudCAoYW5kIHBvc3NpYmx5IHRoZSB0ZXh0KSBoYXMgYmVlbgotICAgICAqIGludmFsaWRhdGVkIGFuZCBib3RoIHNob3VsZCBiZSBjb25zdWx0ZWQgbmV4dCB0aW1lIHRoZSB2YWx1ZQotICAgICAqIGlzIG5lZWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZhbGlkYXRlX25pbHZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIF9mbGFncyB8PSBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGEgVHlwZVN0b3JlIHRvIGluZGljYXRlIHRoYXQgdGhlIGVsZW1lbnQncyBkZWZhdWx0Ci0gICAgICogdmFsdWUsIG5pbGxhYmlsaXR5LCBmaXhlZG5lc3MsIGV0YywgbWF5IGhhdmUgY2hhbmdlZCBieQotICAgICAqIHZpcnR1ZSBvZiB0aGUgZWxlbWVudCBvcmRlciBjaGFuZ2luZyAoYW5kIHhzaTpuaWwgYW5kIHRoZQotICAgICAqIHRleHQgbWF5IGhhdmUgY2hhbmdlZCB0b28pOyBzbyB0aGUgc3RvcmUgc2hvdWxkIGJlIGNvbnN1bHRlZAotICAgICAqIG5leHQgdGltZSBhbnkgc2V0dGVyIG9yIGdldHRlciBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIF9mbGFncyB8PSBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQgfCBGTEFHX0VMRU1FTlRfREFURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCBieSB0aGUgQ29tcGxleFR5cGVJbXBsIHN1YmNsYXNzIHRvIGdldCBkaXJlY3QgYWNjZXNzCi0gICAgICogdG8gdGhlIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBUeXBlU3RvcmUgZ2V0X3N0b3JlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIHJldHVybiAoVHlwZVN0b3JlKV90ZXh0c291cmNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc19zdG9yZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGEgVHlwZVN0b3JlIHRvIHB1bGwgb3V0IHRoZSBtb3N0IHJlYXNvbmFibGUKLSAgICAgKiB0ZXh0IHZhbHVlIGZyb20gdXMuIFRoaXMgaXMgZG9uZSBhZnRlciB3ZSBoYXZlIGludmFsaWRhdGVkCi0gICAgICogdGhlIHN0b3JlICh0eXBpY2FsbHkgd2hlbiBvdXIgdmFsdWUgaGFzIGJlZW4gc2V0KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGJ1aWxkX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgewotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOwotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfVkFMVUVfREFURUQpID09IDApOwotICAgICAgICBpZiAoKF9mbGFncyAmIChGTEFHX05JTCB8IEZMQUdfSVNERUZBVUxUKSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVfdGV4dCgKLSAgICAgICAgICAgICAgICAgICAgbnNtID09IG51bGwgPyBoYXNfc3RvcmUoKSA/IGdldF9zdG9yZSgpIDogbnVsbCA6IG5zbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBidWlsZF9uaWwgYWZ0ZXIgd2UndmUgY2FsbGVkIGludmFsaWRhdGVfbmlsCi0gICAgICogYW5kIGl0IG5lZWRzIHRvIGtub3cgd2hhdCB0aGUgbmlsIHZhbHVlIGlzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGJ1aWxkX25pbCgpCi0gICAgewotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOwotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfVkFMVUVfREFURUQpID09IDApOwotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgd2lsbCBjYWxsIGJhY2sgb24gdmFsaWRhdGVfbm93IHRvIGZvcmNlIHVzIHRvIGxvb2sgYXQKLSAgICAgKiB0aGUgdGV4dCBpZiB3ZSdyZSBpbiBhbiBpbnZhbGlkIHN0YXRlLiBXZSdyZSBhbGxvd2VkIHRvIHRocm93Ci0gICAgICogYW4gZXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGlzbid0IHZhbGlkIGZvciBvdXIgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZV9ub3coKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIGNhbGxzIGJhY2sgaGVyZSBpbiBvcmRlciB0byBmb3JjZSBhIGRpc2Nvbm5lY3QuCi0gICAgICogQWZ0ZXIgdGhpcyBpcyBkb25lLCB0aGUgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGludmFsaWQuCi0gICAgICogQW55IGF0dGVtcHQgdG8gYWNjZXNzIG9yIHNldCBhIHZhbHVlIHNob3VsZCByZXN1bHQgaW4gYW4KLSAgICAgKiBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBob3cgd2UgaGFuZGxlIGRlbGV0aW9ucyBhbmQgeHNpOnR5cGUgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0X3N0b3JlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIF9mbGFncyB8PSBGTEFHU19EQVRFRCB8IEZMQUdfT1JQSEFORUQ7Ci0gICAgICAgIC8vIGRvIE5PVCBudWxsIG91dCBfdGV4dHNvdXJjZSwgYmVjYXVzZSB3ZSBuZWVkIGl0IG5vbi1udWxsIGZvciBzeW5jaHJvbml6YXRpb24KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKLSAgICAgKiBhIGdpdmVuIGVsZW1lbnQgY2hpbGQgbmFtZSBhcyBsb25nIGFzIHlvdSBhbHNvIHBhc3MgdGhlCi0gICAgICogcW5hbWUgY29udGFpbmVkIGJ5IHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUsIGlmIGFueS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB3ZSB3aWxsIGlnbm9yZSB0aGUgeHNpVHlwZSBpZiBpdCB0dXJucyBvdXQgdG8gYmUgaW52YWxpZC4KLSAgICAgKgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzdHJvbmdseSB0eXBlZCBpbmZvcm1hdGlvbiBmb3IgdGhhdAotICAgICAqIGdpdmVuIGVsZW1lbnQgKHdoaWNoIGltcGxpZXMsIHJlY3VzaXZlbHksIG5vIHN0cm9uZ2x5IHR5cGVkIGluZm9ybWF0aW9uCi0gICAgICogZG93bndhcmRzKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBjcmVhdGVfZWxlbWVudF91c2VyKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChUeXBlU3RvcmVVc2VyKQotICAgICAgICAgICAgICAgICgoU2NoZW1hVHlwZUltcGwpIHNjaGVtYVR5cGUoKSkuY3JlYXRlRWxlbWVudFR5cGUoCi0gICAgICAgICAgICAgICAgICAgIGVsdE5hbWUsIHhzaVR5cGUsIGdldF9zdG9yZSgpLmdldF9zY2hlbWF0eXBlbG9hZGVyKCkgKTsKLQotICAgICAgICAvKgotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzdHlwZSA9IChTY2hlbWFUeXBlSW1wbClzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFR5cGUoZWx0TmFtZSwgeHNpVHlwZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSk7Ci0gICAgICAgIGlmIChzdHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoVHlwZVN0b3JlVXNlcilzdHlwZS5jcmVhdGVVbmF0dGFjaGVkTm9kZSgpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdHlwZXN0b3JlIHVzZXIgY2FuIGNyZWF0ZSBhIG5ldyBUeXBlU3RvcmVVc2VyIGluc3RhbmNlIGZvcgotICAgICAqIGEgZ2l2ZW4gYXR0cmlidXRlIGNoaWxkLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3Ryb25nbHkgdHlwZWQgaW5mb3JtYXRpb24gZm9yIHRoYXQKLSAgICAgKiBnaXZlbiBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9hdHRyaWJ1dGVfdXNlcihRTmFtZSBhdHRyTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVHlwZVN0b3JlVXNlcikoKFNjaGVtYVR5cGVJbXBsKXNjaGVtYVR5cGUoKSkuY3JlYXRlQXR0cmlidXRlVHlwZShhdHRyTmFtZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0X3NjaGVtYV90eXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0X2VsZW1lbnRfdHlwZShRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50VHlwZSgKLSAgICAgICAgICAgIGVsdE5hbWUsIHhzaVR5cGUsIGdldF9zdG9yZSgpLmdldF9zY2hlbWF0eXBlbG9hZGVyKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRfYXR0cmlidXRlX3R5cGUoUU5hbWUgYXR0ck5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldEF0dHJpYnV0ZVR5cGUoCi0gICAgICAgICAgICBhdHRyTmFtZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZWxlbWVudCB0ZXh0LCBpZiBpdCdzIGNvbnNpc3RlbnQuIElmIGl0J3MKLSAgICAgKiBub3QgY29uc2lzdGVudCwgcmV0dXJucyBudWxsLCBhbmQgcmVxdWlyZXMgYSB2aXNpdG9yIHdhbGsuCi0gICAgICoKLSAgICAgKiBBbHNvIHJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGF0IGFsbCAoYWx0aG91Z2gKLSAgICAgKiB0aGF0IGNhbiBhbHNvIGJlIGRpc2NvdmVyZWQgdmlhIGdldF9lbGVtZW50ZmxhZ3Mgd2l0aG91dAotICAgICAqIGRvaW5nIGEgd2FsaykuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9lbGVtZW50X3RleHQoUU5hbWUgZWx0TmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydChfaXNDb21wbGV4Q29udGVudCgpKTsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4Q29udGVudCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gcHJvcC5nZXREZWZhdWx0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHRleHQgZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aAotICAgICAqIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vIGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdGV4dChRTmFtZSBhdHRyTmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydChfaXNDb21wbGV4VHlwZSgpKTsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4VHlwZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0QXR0cmlidXRlUHJvcGVydHkoYXR0ck5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gcHJvcC5nZXREZWZhdWx0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRmbGFncywgaWYgdGhleSdyZSBjb25zaXN0ZW50LiBJZiB0aGV5J3JlCi0gICAgICogbm90LCByZXR1cm5zIC0xLCBhbmQgcmVxdWlyZXMgYSB2aXN0b3Igd2Fsay4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldF9lbGVtZW50ZmxhZ3MoUU5hbWUgZWx0TmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICghX2lzQ29tcGxleENvbnRlbnQoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8Ci0gICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCkgfAotICAgICAgICAgICAgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuTklMTEFCTEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZsYWdzIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0X2F0dHJpYnV0ZWZsYWdzKFFOYW1lIGF0dHJOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4VHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0QXR0cmlidXRlUHJvcGVydHkoYXR0ck5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCk7Ci0gICAgICAgIC8vIEJVR0JVRzogdG9kbzogaG9vayB1cCByZXF1aXJlZD8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIGNoaWxkIGVsZW1lbnRzIGFyZSBpbnNlbnNpdGl2ZSB0byBvcmRlcjsKLSAgICAgKiBpZiBpdCByZXR1cm5zIHRydWUsIHlvdSdyZSByZXF1aXJlZCB0byBjYWxsIGludmFsaWRhdGVfZWxlbWVudF9vcmRlcgotICAgICAqIG9uIGNoaWxkcmVuIHRvIHRoZSByaWdodCBvZiBhbnkgY2hpbGQgb3JkZXIgcmVhcnJhbmdlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpCi0gICAgewotICAgICAgICBpZiAoIV9pc0NvbXBsZXhUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuaXNPcmRlclNlbnNpdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydGluZyBhIG5ldyBlbGVtZW50IGlzIGFsd2F5cyB1bmFtYmlndW91cyBleGNlcHQgaW4gb25lCi0gICAgICogc2l0dWF0aW9uOiB3aGVuIGFkZGluZyBhbiBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IG9uZSB3aXRoCi0gICAgICogdGhhdCBuYW1lIChvciB0aGUgZmlyc3Qgb25lIGlmIHRoZXJlIGFyZSBub25lKS4KLSAgICAgKgotICAgICAqIEluIHRoYXQgY2FzZSwgYWRkIHRoZSBlbGVtZW50IGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBzbG90Ci0gICAgICogQkVGT1JFIGFueSBlbGVtZW50IHdob3NlIHFuYW1lIGlzIGNvbnRhaW5lZCBpbiB0aGUgUU5hbWVTZXQKLSAgICAgKiBnaXZlbi4gKElmIHRoZSBRTmFtZVNldCBpcyBlbXB0eSwgdGhhdCBtZWFucyBhZGQgdGhlIG5ldwotICAgICAqIGVsZW1lbnQgYXQgdGhlIHZlcnkgZW5kLikKLSAgICAgKgotICAgICAqIElmIHRoZSByZXR1cm5lZCBRTmFtZVNldCBpcyBudWxsLCB0cmVhdCBpdCBhcyBpZiB0aGUgUU5hbWVTZXQKLSAgICAgKiBjb250YWluZWQgYWxsIFFOYW1lcywgaS5lLiwgYWRkIHRoZSBuZXcgZWxlbWVudCBhdCB0aGUgdmVyeQotICAgICAqIGZpcnN0IHBvc2l0aW9uIHBvc3NpYmxlIChhZGphY2VudCB0byB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQotICAgICAqIHNhbWUgbmFtZSwgb3IgYXQgdGhlIHZlcnkgZmlyc3Qgc2xvdCBpZiBpdCBpcyB0aGUgZmlyc3QgZWx0Ci0gICAgICogd2l0aCB0aGF0IG5hbWUpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBRTmFtZVNldCBnZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyhRTmFtZSBlbHRuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50UHJvcGVydHkoZWx0bmFtZSk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHByb3AuZ2V0SmF2YVNldHRlckRlbGltaXRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdHlwZXN0b3JlIHVzZXIgY2FuIHJldHVybiBhIHZpc2l0b3IgdGhhdCBpcyB1c2VkIHRvIGNvbXB1dGUKLSAgICAgKiBkZWZhdWx0IHRleHQgYW5kIGVsZW1lbnRmbGFncyBmb3IgYW4gYXJiaXRyYXJ5IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFR5cGVTdG9yZVZpc2l0b3IgbmV3X3Zpc2l0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKHNjaGVtYVR5cGUoKS5nZXRDb250ZW50TW9kZWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUZpZWxkIGdldF9hdHRyaWJ1dGVfZmllbGQoUU5hbWUgYXR0ck5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBtb2RlbCA9IHNjaGVtYVR5cGUoKS5nZXRBdHRyaWJ1dGVNb2RlbCgpOwotICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHRpbmcgYSBzdHJpbmcgcHJlc2VydmVzIGFueSBub25jYW5vbmljYWwgbGl0ZXJhbAotICAgICAqIHJlcHJlc2VudGF0aW9uLiBUaGlzIGlzIGRvbmUgYnkgc3RvcmluZyB0aGUgYWN0dWFsCi0gICAgICogc3RyaW5nIGluIHRoZSB1bmRlcmx5aW5nIHN0b3JlIGFmdGVyIGNoZWNraW5nIGl0Ci0gICAgICogYWdhaW5zdCB0aGUgcHJpbWl0aXZlIHR5cGUgZm9yIHZhbGlkaXR5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9TdHJpbmcoU3RyaW5nIHYpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIGJvb2xlYW4gd2FzTmlsbGVkID0gKChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGZyb20gdGhlIHN0cmluZwotICAgICAgICBTdHJpbmcgd3NjYW5vbiA9IGFwcGx5X3dzY2Fub24odik7Ci0gICAgICAgIHVwZGF0ZV9mcm9tX3dzY2Fub25fdGV4dCh3c2Nhbm9uKTsKLQotICAgICAgICAvLyBOb3cgc3RvcmUgdGhlIGxpdGVyYWwgdGV4dCBpbW1lZGlhdGVseSBpbiB0aGUgdW5kZXJseWluZwotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19WQUxVRV9EQVRFRDsKLSAgICAgICAgICAgIGdldF9zdG9yZSgpLnN0b3JlX3RleHQodik7Ci0gICAgICAgICAgICBpZiAod2FzTmlsbGVkKQotICAgICAgICAgICAgICAgIGdldF9zdG9yZSgpLmludmFsaWRhdGVfbmlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX3RleHRzb3VyY2UgPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgdmFsdWUgYmFzZWQgb24gY29tcGxleCBjb250ZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZV9mcm9tX2NvbXBsZXhfY29udGVudCgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSB0byB1cGRhdGUgdGhlIHZhbHVlIGJhc2VkIG9uIGEgc3RyaW5nIHRoYXQKLSAgICAgKiB3YXMgcGFzc2VkIGVpdGhlciBmcm9tIHRoZSB0ZXh0IHN0b3JlIG9yIGZyb20gdGhlIHVzZXIuCi0gICAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjYXNlcyB3aGVyZSB0aGVyZSBpcyBhIGRlZmF1bHQKLSAgICAgKiB0aGF0IG11c3QgYmUgYXBwbGllZCwgYW5kIHdoZXJlIHRoZSB2YWx1ZSBtdXN0IG1hdGNoCi0gICAgICogYSBmaXhlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgdXBkYXRlX2Zyb21fd3NjYW5vbl90ZXh0KFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgLy8gV2hpdGVzcGFjZSBpcyBkZWZhdWx0IGlmIHRoaXMgdHlwZSB0cmVhdHMgdGhpcyBzcGFjZSBhcyBkZWZhdWx0YWJsZQotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSEFTREVGQVVMVCkgIT0gMCAmJiAgKF9mbGFncyAmIEZMQUdfU0VUVElOR0RFRkFVTFQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgcXVpdGUgY29ycmVjdCBzaW5jZSB0aGUgLmVxdWFscygiIikgdGVzdCBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGRvbmUgb24gdGhlIGFjdHVhbCB0ZXh0LCBub3QgdGhlIHdzY2Fub24gdGV4dAotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FUVFJJQlVURSkgPT0gMCAmJiB2LmVxdWFscygiIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlZiA9IGdldF9zdG9yZSgpLmNvbXB1dGVfZGVmYXVsdF90ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaW9uIHdpdGggdGhpcyBmbGFnCi0gICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfU0VUVElOR0RFRkFVTFQ7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgdGhpcy5zZXQoZGVmKTsgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBfZmxhZ3MgJj0gfkZMQUdfU0VUVElOR0RFRkFVTFQ7IH0KLSAgICAgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfTklMOwotICAgICAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0lTREVGQVVMVDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCByZXR1cm5lZCB5ZXQsIHRoZSBkZWZhdWx0IGRvZXNuJ3QgYXBwbHkuCi0KLSAgICAgICAgLy8gQXNrIHVuZGVybHlpbmcgaW1wbCB0byBwYXJzZSBvcmRpbmFyeSBub24tZGVmYXVsdCB0ZXh0Ci0gICAgICAgIHNldF90ZXh0KHYpOwotICAgICAgICBfZmxhZ3MgJj0gfihGTEFHX05JTCB8IEZMQUdfSVNERUZBVUxUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUeXBlcyBzaG91bGQgcmV0dXJuIGZhbHNlIGlmIHRoZXkgZG9uJ3QgdHJlYXQgdGhlIGdpdmVuCi0gICAgICogd2hpdGVzcGFjZSBhcyBhIGRlZmF1bHQgdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aGl0ZXNwYWNlIHJ1bGUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgYmVmb3JlCi0gICAgICogYnVpbGRpbmcgYSBzdHJpbmcgdG8gcGFzcyB0byBnZXRfdGV4dCgpLgotICAgICAqCi0gICAgICogT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgbmVlZCB0aGVpciB0ZXh0Ci0gICAgICogZm9yIHNldF90ZXh0IGNhbm9uaWNhbGl6ZWQ7IHBlcmhhcHMgdGhleSBhbHJlYWR5IGltcGxlbWVudAotICAgICAqIHNjYW5uZXJzIHRoYXQgY2FuIGRlYWwgd2l0aCB3aGl0ZXNwYWNlLCBhbmQgdGhleSBrbm93Ci0gICAgICogdGhleSBoYXZlIG5vIHJlZ2V4IHBhdHRlcm4gcmVzdHJpY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19DT0xMQVBTRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gY2Fub25pY2FsaXplIHdoaXRlc3BhY2UgYmVmb3JlIGNhbGxpbmcgc2V0X3RleHQuCi0gICAgICoKLSAgICAgKiBUcmllcyB0byBhdm9pZCBhbGxvY2F0aW9uIHdoZW4gdGhlIHN0cmluZyBpcyBhbHJlYWR5IGNhbm9uaWNhbCwgYnV0Ci0gICAgICogb3RoZXJ3aXNlIHRoaXMgaXMgbm90IHBhcnRpY3VsYXJseSBlZmZpY2llbnQuIEhvcGVmdWxseSB0aGUgY29tbW9uCi0gICAgICogY2FzZSBpcyB0aGF0IHdlIHBhc3Mgb3VyIHdzY2Fub24gcnVsZSB0byB0aGUgc3RvcmUgdmlhIGZldGNoX3RleHQKLSAgICAgKiBhbmQgaXQncyBjYW5vbmljYWxpemVkIGJlZm9yZSB3ZSBldmVuIHNlZSBpdCBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcHBseV93c2Nhbm9uKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFhtbFdoaXRlc3BhY2UuY29sbGFwc2UodiwgZ2V0X3dzY2Fub25fcnVsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IHNldCBhbmQgZ2V0LCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlCi0gICAgICogYSBjb3JyZWN0IHBpY3R1cmUgb2Ygd2hldGhlciB3ZSdyZSBuaWxsYWJsZSwgZml4ZWQsIG9yCi0gICAgICogaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYmUgYXBwbGllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgY2hlY2tfZWxlbWVudF9kYXRlZCgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfRUxFTUVOVF9EQVRFRCkgIT0gMCAmJgotICAgICAgICAgICAgKF9mbGFncyAmIEZMQUdfTk9UX1ZBUklBQkxFKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfT1JQSEFORUQpICE9IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIGludCBlbHRmbGFncyA9IGdldF9zdG9yZSgpLmNvbXB1dGVfZmxhZ3MoKTsKLSAgICAgICAgICAgIC8vIGludCBlbHRmbGFncyA9IDA7Ci0gICAgICAgICAgICBfZmxhZ3MgJj0gfihGTEFHU19FTEVNRU5UIHwgRkxBR19FTEVNRU5UX0RBVEVEKTsKLSAgICAgICAgICAgIF9mbGFncyB8PSBlbHRmbGFnczsKLSAgICAgICAgfQotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfTk9UX1ZBUklBQkxFKSAhPSAwKQotICAgICAgICAgICAgX2ZsYWdzICY9IH4oRkxBR19FTEVNRU5UX0RBVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgdGhlIG9ycGhhbmVkIHN0YXR1cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc19vcnBoYW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfT1JQSEFORUQpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBnZXR0ZXIgYW5kIHNldHRlciBvbiB0aGUgc3Ryb25nbHkKLSAgICAgKiB0eXBlZCBjbGFzc2VzIHRvIGVuc3VyZSB0aGF0IHRoZSBvYmplY3QgaGFzIG5vdCBiZWVuCi0gICAgICogb3JwaGFuZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tfb3JwaGFuZWQoKQotICAgIHsKLSAgICAgICAgaWYgKGlzX29ycGhhbmVkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgcHJpb3IgdG8gZXZlcnkgZ2V0IG9wZXJhdGlvbiwgdG8gZW5zdXJlCi0gICAgICogdGhhdCB0aGUgdmFsdWUgYmVpbmcgcmVhZCBpcyB2YWxpZC4gSWYgdGhlIHZhbHVlCi0gICAgICogaGFzIGJlZW4gaW52YWxpZGF0ZWQsIGl0IGlzIHJlLXJlYWQgZnJvbSB0aGUgdW5kZXJseWluZwotICAgICAqIHRleHQgc3RvcmUsIGFuZCB0aGlzIG1heSBjYXVzZSBhbiBvdXQgb2YgcmFuZ2UgZXhjZXB0aW9uLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgZGVhbHMgd2l0aCBuaWxzLCBuaWxsYWJpbGl0eSwgZGVmYXVsdHMsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjaGVja19kYXRlZCgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdTX0RBVEVEKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfT1JQSEFORUQpICE9IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0KLSAgICAgICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKLQotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0VMRU1FTlRfREFURUQpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGVsdGZsYWdzID0gZ2V0X3N0b3JlKCkuY29tcHV0ZV9mbGFncygpOwotICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdTX0VMRU1FTlQgfCBGTEFHX0VMRU1FTlRfREFURUQpOwotICAgICAgICAgICAgICAgIF9mbGFncyB8PSBlbHRmbGFnczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBuaWxsZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTF9EQVRFRCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0X3N0b3JlKCkuZmluZF9uaWwoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OSUxMQUJMRSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgLy8gbmlsIG5vdCBhbGxvd2VkCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBpbXBsZW1lbnRhdGlvbiBrbm93IHRoYXQgd2UncmUgbmlsIG5vdwotICAgICAgICAgICAgICAgICAgICBzZXRfbmlsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfTklMOwotICAgICAgICAgICAgICAgICAgICBuaWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfTklMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfTklMX0RBVEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW5pbGxlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDsKLQotICAgICAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19DT01QTEVYQ09OVEVOVCkgIT0gMCB8fCAodGV4dCA9IGdldF93c2Nhbm9uX3RleHQoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2Zyb21fY29tcGxleF9jb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KGdldF9zdG9yZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7IHVwZGF0ZV9mcm9tX3dzY2Fub25fdGV4dCh0ZXh0KTsgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1ZBTFVFX0RBVEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBzZXQgb3BlcmF0aW9uIChleGNlcHQgZm9yIHRoZQotICAgICAqIHNwZWNpYWwgY2FzZSBvZiBzZXR0aW5nIGEgc3RyaW5nKSB0bzoKLSAgICAgKiAoMSkgZ2V0IHRoZSBuaWxsYWJsZSwgZml4ZWQsIGV0YyBmbGFncwotICAgICAqICgyKSB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQncyBmaXhlZCAobm90IGZvciBzdHJpbmdzKQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBzZXRfcHJlcGFyZSgpCi0gICAgewotICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGFmdGVyIGV2ZXJ5IHNldCBvcGVyYXRpb24gdG8gaW52YWxpZGF0ZQotICAgICAqIHRoZSBhdHRhY2hlZCByYXcgdGV4dC4gQWxzbywgaWYgd2Ugd2VyZSBkYXRlZCwKLSAgICAgKiB3ZSBtYWtlIGEgbm90ZSB0aGF0IHdlJ3JlIG5vdyBjdXJyZW50LCBzaW5jZSB0aGUKLSAgICAgKiBsYXRlc3Qgc2V0IGJlYXRzIHRoZSBwcmV2aW91cyBpbnZhbGlkYXRlLiBBbHNvLAotICAgICAqIGlmIHdlIHdlcmUgbmlsLCB3ZSdyZSBubyBsb25nZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldF9jb21taXQoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB3YXNOaWxsZWQgPSAoKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwKTsKLSAgICAgICAgICBfZmxhZ3MgJj0gfihGTEFHX05JTCB8IEZMQUdfSVNERUZBVUxUKTsKLQotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdTX0RBVEVEKTsKLSAgICAgICAgICAgIGdldF9zdG9yZSgpLmludmFsaWRhdGVfdGV4dCgpOwotICAgICAgICAgICAgaWYgKHdhc05pbGxlZCkKLSAgICAgICAgICAgICAgICBnZXRfc3RvcmUoKS5pbnZhbGlkYXRlX25pbCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgX3RleHRzb3VyY2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3JhYnMgdGhlIHVuZGVseWluZyBsaXRyYWwgcmVwcmVzZW50YXRpb24sIGFwcGx5aW5nIHRoZQotICAgICAqIGltcGxlbWVudGF0aW9uJ3Mgd3NjYW5vbiBydWxlLgotICAgICAqIE51bGwgaWYgbm90IHNpbXBsZSBjb250ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0X3dzY2Fub25fdGV4dCgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhcHBseV93c2Nhbm9uKChTdHJpbmcpX3RleHRzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgcmV0dXJuIGdldF9zdG9yZSgpLmZldGNoX3RleHQoZ2V0X3dzY2Fub25fcnVsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNob3VsZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIGZyb20gdGV4dCwKLSAgICAgKiBvciB0aHJvdyBhbiBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gaWYgaXQgY2FuJ3QuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHRleHQpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBzaG91bGQgY2xlYXIgdGhlIHZhbHVlLCBhbmQgc2V0IGl0IHRvIHdoYXRldmVyCi0gICAgICogaXMgc3VwcG9zZWQgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgdmFsdWUgaXMgbmlsbGVkLgotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgc2hvdWxkIHJldHVybiB0aGUgY2Fub25pY2FsIHN0cmluZyB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLgotICAgICAqIE9ubHkgY2FsbGVkIHdoZW4gbm9uLW5pbC4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSk7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQotICAgICAgICB7IEJpZ0RlY2ltYWwgYmQgPSBiaWdEZWNpbWFsVmFsdWUoKTsgcmV0dXJuIGJkID09IG51bGwgPyAwLjBmIDogYmQuZmxvYXRWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0gICAgICAgIHsgQmlnRGVjaW1hbCBiZCA9IGJpZ0RlY2ltYWxWYWx1ZSgpOyByZXR1cm4gYmQgPT0gbnVsbCA/IDAuMCA6IGJkLmRvdWJsZVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgLy8gbnVtZXJpY3M6IGludGVncmFsCi0gICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkKLSAgICAgICAgeyBCaWdEZWNpbWFsIGJkID0gYmlnRGVjaW1hbFZhbHVlKCk7IHJldHVybiBiZCA9PSBudWxsID8gbnVsbCA6IGJkLnRvQmlnSW50ZWdlcigpOyB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgbG9uZyBsID0gaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKGwgPiBCeXRlLk1BWF9WQUxVRSkgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICBpZiAobCA8IEJ5dGUuTUlOX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoYnl0ZSlsOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGxvbmcgbCA9IGludFZhbHVlKCk7Ci0gICAgICAgIGlmIChsID4gU2hvcnQuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChsIDwgU2hvcnQuTUlOX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoc2hvcnQpbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGxvbmcgbCA9IGxvbmdWYWx1ZSgpOwotICAgICAgICBpZiAobCA+IEludGVnZXIuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChsIDwgSW50ZWdlci5NSU5fVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChpbnQpbDsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWF4ID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9taW4gPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpOwotCi0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIEJpZ0ludGVnZXIgYiA9IGJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICBpZiAoYiA9PSBudWxsKSByZXR1cm4gMEw7Ci0gICAgICAgIGlmIChiLmNvbXBhcmVUbyhfbWF4KSA+PSAwKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChiLmNvbXBhcmVUbyhfbWluKSA8PSAwKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiBiLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhtbE9wdGlvbnMgX3RvU3RyaW5nT3B0aW9ucyA9Ci0gICAgICAgIGJ1aWxkSW5uZXJQcmV0dHlPcHRpb25zKCk7Ci0KLSAgICBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBidWlsZElubmVyUHJldHR5T3B0aW9ucygpCi0gICAgewotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX0lOTkVSICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfQUdHUkVTU0lWRV9OQU1FU1BBQ0VTICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICk7Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIC8qCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkdW1wU3RhY2sgKCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSggIkM6XFxlZS50eHQiLCB0cnVlICk7Ci0gICAgICAgICAgICBqYXZhLmlvLlByaW50U3RyZWFtIHBzID0gbmV3IGphdmEuaW8uUHJpbnRTdHJlYW0oIGZvcyApOwotICAgICAgICAgICAgcHMucHJpbnRsbiggIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiApOwotICAgICAgICAgICAgcHMucHJpbnRsbiggbXNnICk7Ci0gICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCBwcyApOwotICAgICAgICAgICAgcHMuY2xvc2UoKTsKLSAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlbnN1cmVTdG9yZSgpLnhtbFRleHQoX3RvU3RyaW5nT3B0aW9ucyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHhtbFRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhtbFRleHQobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB4bWxUZXh0IChYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGN1ci54bWxUZXh0KG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVudW1zCi0gICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLQotICAgIC8vIHZhcmlvdXMKLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIC8vIFNpbmNlIGNvbXBsZXgtY29udGVudCB0eXBlcyBkb24ndCBoYXZlIGEgIm5hdHVyYWwiIHN0cmluZyB2YWx1ZSwgd2UKLSAgICAgICAgLy8gZW1pdCB0aGUgZGVlcGx5IGNvbmNhdGVuYXRlZCwgdGFnLXJlbW92ZWQgY29udGVudCBvZiB0aGUgdGFnLgotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9pc0NvbXBsZXhDb250ZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldF9zdG9yZSgpLmZldGNoX3RleHQoVHlwZVN0b3JlLldTX1BSRVNFUlZFKTsKLQotICAgICAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OSUwpICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gY29tcHV0ZV90ZXh0KGhhc19zdG9yZSgpID8gZ2V0X3N0b3JlKCkgOiBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKQotICAgICAgICB7IHJldHVybiBzdHJpbmdWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gYm9vbGVhblZhbHVlKCk7IH0KLSAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlVmFsdWUoKQotICAgICAgICB7IHJldHVybiBieXRlVmFsdWUoKTsgfQotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gc2hvcnRWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGludFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKQotICAgICAgICB7IHJldHVybiBsb25nVmFsdWUoKTsgfQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGJpZ0ludGVnZXJWYWx1ZSgpOyB9Ci0gICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gYmlnRGVjaW1hbFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGZsb2F0VmFsdWUoKTsgfQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoKQotICAgICAgICB7IHJldHVybiBkb3VibGVWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlQXJyYXlWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGJ5dGVBcnJheVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBnZXRFbnVtVmFsdWUoKQotICAgICAgICB7IHJldHVybiBlbnVtVmFsdWUoKTsgfQotICAgIHB1YmxpYyBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gY2FsZW5kYXJWYWx1ZSgpOyB9Ci0gICAgcHVibGljIERhdGUgZ2V0RGF0ZVZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gZGF0ZVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGdEYXRlVmFsdWUoKTsgfQotICAgIHB1YmxpYyBHRHVyYXRpb24gZ2V0R0R1cmF0aW9uVmFsdWUoKQotICAgICAgICB7IHJldHVybiBnRHVyYXRpb25WYWx1ZSgpOyB9Ci0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lVmFsdWUoKQotICAgICAgICB7IHJldHVybiBxTmFtZVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgTGlzdCB4Z2V0TGlzdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4geGxpc3RWYWx1ZSgpOyB9Ci0gICAgcHVibGljIExpc3QgZ2V0TGlzdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gbGlzdFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gb2JqZWN0VmFsdWUoKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nVmFsdWUoU3RyaW5nIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0SW50VmFsdWUoaW50IHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoQmlnSW50ZWdlciBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsVmFsdWUoQmlnRGVjaW1hbCBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlKGZsb2F0IHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0Qnl0ZUFycmF5VmFsdWUoYnl0ZVtdIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEVudW1WYWx1ZShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRHRHVyYXRpb25WYWx1ZShHRHVyYXRpb24gb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0UU5hbWVWYWx1ZShRTmFtZSBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShPYmplY3Qgb2JqKQotICAgICAgICB7IG9iamVjdFNldChvYmopOyB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBHRGF0ZSBnRGF0ZVZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgRGF0ZSBkYXRlVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHVibGljIExpc3QgbGlzdFZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgT2JqZWN0IG9iamVjdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gamF2YV92YWx1ZSh0aGlzKTsgfQotCi0gICAgLy8gc2V0IHRoaXMgdmFsdWUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoYm9vbGVhbiB2KQotICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9ib29sZWFuKHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChieXRlIHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2J5dGUodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KHNob3J0IHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X3Nob3J0KHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChpbnQgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfaW50KHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChsb25nIHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2xvbmcodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGZsb2F0IHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2Zsb2F0KHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChkb3VibGUgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfZG91YmxlKHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChieXRlW10gb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfQnl0ZUFycmF5KG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9lbnVtKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoQmlnSW50ZWdlciBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9CaWdJbnRlZ2VyKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoQmlnRGVjaW1hbCBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9CaWdEZWNpbWFsKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoQ2FsZW5kYXIgb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfQ2FsZW5kYXIob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChEYXRlIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0RhdGUob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfR0RhdGUob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0dEdXJhdGlvbihvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KFFOYW1lIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X1FOYW1lKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoTGlzdCBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9saXN0KG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoU3RyaW5nIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X1N0cmluZyhvYmopOyAvKiBzdHJpbmdzIGFyZSBzcGVjaWFsLCBzbyBzZXRfU3RyaW5nIGRvZXMgaXRzIG93biBjb21taXQuKi8gfSB9IH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdFNldChPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmIChvID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldE5pbCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxPYmplY3QpCi0gICAgICAgICAgICBzZXQoIChYbWxPYmplY3QpIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHNldCggKFN0cmluZykgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nRW51bUFic3RyYWN0QmFzZSkKLSAgICAgICAgICAgIHNldCggKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpCi0gICAgICAgICAgICBzZXQoIChCaWdJbnRlZ2VyKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCaWdEZWNpbWFsKQotICAgICAgICAgICAgc2V0KCAoQmlnRGVjaW1hbCkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQnl0ZSkKLSAgICAgICAgICAgIHNldCggKChCeXRlKW8pLmJ5dGVWYWx1ZSgpICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTaG9ydCkKLSAgICAgICAgICAgIHNldCggKChTaG9ydClvKS5zaG9ydFZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICBzZXQoICgoSW50ZWdlcilvKS5pbnRWYWx1ZSgpICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgc2V0KCAoKExvbmcpbykubG9uZ1ZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJvb2xlYW4pCi0gICAgICAgICAgICBzZXQoICgoQm9vbGVhbilvKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgRmxvYXQpCi0gICAgICAgICAgICBzZXQoICgoRmxvYXQpbykuZmxvYXRWYWx1ZSgpICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICBzZXQoICgoRG91YmxlKW8pLmRvdWJsZVZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIENhbGVuZGFyKQotICAgICAgICAgICAgc2V0KCAoKENhbGVuZGFyKW8pICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBEYXRlKQotICAgICAgICAgICAgc2V0KCAoRGF0ZSkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgR0RhdGVTcGVjaWZpY2F0aW9uKQotICAgICAgICAgICAgc2V0KCAoR0RhdGVTcGVjaWZpY2F0aW9uKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHRHVyYXRpb25TcGVjaWZpY2F0aW9uKQotICAgICAgICAgICAgc2V0KCAoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbikgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgUU5hbWUpCi0gICAgICAgICAgICBzZXQoIChRTmFtZSkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHNldCggKExpc3QpIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIGJ5dGVbXSkKLSAgICAgICAgICAgIHNldCggKGJ5dGVbXSkgbyApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCB1bmlvbiBvYmplY3Qgb2YgY2xhc3MgOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldF9uZXdWYWx1ZShYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iai5pc05pbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXROaWwoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW1pdGl2ZToKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbEFueVNpbXBsZVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgdiA9IChYbWxBbnlTaW1wbGVUeXBlKW9iajsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgaW5zdGFuY2VUeXBlID0gKChTaW1wbGVWYWx1ZSl2KS5pbnN0YW5jZVR5cGUoKTsKLSAgICAgICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUgIT0gbnVsbCkgOiAiTmlsIGNhc2Ugc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkiOwotCi0gICAgICAgICAgICAvLyBoYW5kbGUgbGlzdHMKLSAgICAgICAgICAgIGlmIChpbnN0YW5jZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9saXN0KCgoU2ltcGxlVmFsdWUpdikueGdldExpc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2NvbW1pdCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoYW5kbGUgYXRvbWljIHR5cGVzCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQoaW5zdGFuY2VUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkFUT01JQyk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChpbnN0YW5jZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAiZW5jb3VudGVyZWQgbm9ucHJpbWl0aXZlIHR5cGUuIjsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOiAgVGhpcyBpcyBoYW5kbGVkIGJlbG93Li4uCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBldmVudHVhbGx5IHdhbnQgdG8gaGFuZGxlIGl0IHdpdGggYSB0cmVlY29weSwgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnR1YWxseSB3ZSBzaG91bGQgYnJlYWsgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHByaW1pdGl2ZTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYm9vbCA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0Qm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2Jvb2xlYW4oYm9vbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZUFyciA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfYjY0KGJ5dGVBcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZUFyciA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfaGV4KGJ5dGVBcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0UU5hbWVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9RTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfZmxvYXQoZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQgPSAoKFNpbXBsZVZhbHVlKXYpLmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RvdWJsZShkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnN0YW5jZVR5cGUuZ2V0RGVjaW1hbFNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CWVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBiID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCeXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2J5dGUoYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHMgPSAoKFNpbXBsZVZhbHVlKXYpLmdldFNob3J0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Nob3J0KHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9pbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRMb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2xvbmcobCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgYmkgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfQmlnSW50ZWdlcihiaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJpbnZhbGlkIG51bWVyaWMgYml0IGNvdW50IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIGJkID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X0JpZ0RlY2ltYWwoYmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSB2LmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RleHQodXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdi5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9ub3RhdGlvbihzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdEdXJhdGlvbiBnZCA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0R0R1cmF0aW9uVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfR0R1cmF0aW9uKGdkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdEYXRlIGdkID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRHRGF0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X0dEYXRlKGdkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHYuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfU3RyaW5nKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQodikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF94bWxhbnlzaW1wbGUodik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdXNoZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0X2NvbW1pdCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gcHJpbWl0aXZlIG5vZGUgdHJlZSBjb3B5IGhhbmRsZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb21wbGV4IHR5cGUgdW5leHBlY3RlZCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZVN0b3JlVXNlciBzZXR0ZXJIZWxwZXIgKCBYbWxPYmplY3RCYXNlIHNyYyApCi0gICAgewotICAgICAgICBjaGVja19vcnBoYW5lZCgpOwotCi0gICAgICAgIHNyYy5jaGVja19vcnBoYW5lZCgpOwotCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgZ2V0X3N0b3JlKCkuY29weV9jb250ZW50c19mcm9tKCBzcmMuZ2V0X3N0b3JlKCkgKS4KLSAgICAgICAgICAgICAgICBnZXRfc3RvcmUoKS5jaGFuZ2VfdHlwZSggc3JjLnNjaGVtYVR5cGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBYbWxPYmplY3Qgc2V0KFhtbE9iamVjdCBzcmMpCi0gICAgewotICAgICAgICBpZiAoaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBzZXQgdGhlIHZhbHVlIG9mIGFuIGltbXV0YWJsZSBYbWxPYmplY3QiKTsKLQotICAgICAgICBYbWxPYmplY3RCYXNlIG9iaiA9IHVuZGVybHlpbmcoc3JjKTsKLQotICAgICAgICBUeXBlU3RvcmVVc2VyIG5ld09iaiA9IHRoaXM7Ci0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXROaWwoKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iai5pc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgc2V0KG9iai5zdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobW9uaXRvcigpID09IG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqID0gc2V0dGVySGVscGVyKCBvYmogKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBhYm91dCB0byBncmFiIHR3byBsb2NrczogZG9uJ3QgZGVhZGxvY2sgb3Vyc2VsdmVzCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAob2JqLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqID0gc2V0dGVySGVscGVyKCBvYmogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFhtbE9iamVjdCkgbmV3T2JqOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9saXN0KExpc3QgbGlzdCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYm9vbGVhbihib29sZWFuIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2J5dGUoYnl0ZSB2KQotICAgICAgICB7IHNldF9pbnQoKGludCkgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfc2hvcnQoc2hvcnQgdikKLSAgICAgICAgeyBzZXRfaW50KChpbnQpIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2ludChpbnQgdikKLSAgICAgICAgeyBzZXRfbG9uZygobG9uZykgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIHYpCi0gICAgICAgIHsgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9jaGFyKGNoYXIgdikKLSAgICAgICAgeyBzZXRfU3RyaW5nKENoYXJhY3Rlci50b1N0cmluZyh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikKLSAgICAgICAgeyBzZXRfQmlnRGVjaW1hbChuZXcgQmlnRGVjaW1hbCh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2KQotICAgICAgICB7IHNldF9CaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKHYpKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2VudW0oU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gYikKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYjY0KGJ5dGVbXSBiKQotICAgICAgICB7IHNldF9CeXRlQXJyYXkoYik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaGV4KGJ5dGVbXSBiKQotICAgICAgICB7IHNldF9CeXRlQXJyYXkoYik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCi0gICAgICAgIHsgc2V0KG5ldyBCaWdEZWNpbWFsKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdikKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfRGF0ZShEYXRlIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0NhbGVuZGFyKENhbGVuZGFyIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9Db21wbGV4WG1sKFhtbE9iamVjdCB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25vdGF0aW9uKFN0cmluZyB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGFueXNpbXBsZShYbWxBbnlTaW1wbGVUeXBlIHYpCi0gICAgICAgIHsgc2V0X1N0cmluZyh2LmdldFN0cmluZ1ZhbHVlKCkpOyB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29tcGFyYWJsZV92YWx1ZV9zcGFjZXMoU2NoZW1hVHlwZSB0MSwgU2NoZW1hVHlwZSB0MikKLSAgICB7Ci0gICAgICAgIGFzc2VydCh0MS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTiAmJiB0Mi5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTik7Ci0KLSAgICAgICAgaWYgKCF0MS5pc1NpbXBsZVR5cGUoKSAmJiAhdDIuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gKHQxLmdldENvbnRlbnRUeXBlKCkgPT0gdDIuZ2V0Q29udGVudFR5cGUoKSk7Ci0KLSAgICAgICAgaWYgKCF0MS5pc1NpbXBsZVR5cGUoKSB8fCAhdDIuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHQxLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QgJiYgdDIuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmICh0MS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUIHx8IHQyLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuICh0MS5nZXRQcmltaXRpdmVUeXBlKCkuZXF1YWxzKHQyLmdldFByaW1pdGl2ZVR5cGUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB2YWx1ZUVxdWFsc0ltcGwoWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSB0eXBldGhpcyA9IGluc3RhbmNlVHlwZSgpOwotICAgICAgICBTY2hlbWFUeXBlIHR5cGVvdGhlciA9ICgoU2ltcGxlVmFsdWUpeG1sb2JqKS5pbnN0YW5jZVR5cGUoKTsKLQotICAgICAgICBpZiAodHlwZXRoaXMgPT0gbnVsbCAmJiB0eXBlb3RoZXIgPT0gbnVsbCkgLy8gZGV0ZWN0cyBuaWwKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmICh0eXBldGhpcyA9PSBudWxsIHx8IHR5cGVvdGhlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICghY29tcGFyYWJsZV92YWx1ZV9zcGFjZXModHlwZXRoaXMsIHR5cGVvdGhlcikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHhtbG9iai5zY2hlbWFUeXBlKCkuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgICAgICByZXR1cm4gKHVuZGVybHlpbmcoeG1sb2JqKSkuZXF1YWxfdG8odGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIGVxdWFsX3RvKHhtbG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gdmFsdWVFcXVhbHMoWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4bWxvYmouaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZUVxdWFsc0ltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVFcXVhbHNJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbG9iai5pc0ltbXV0YWJsZSgpIHx8IG1vbml0b3IoKSA9PSB4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZUVxdWFsc0ltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXF1YWxzSW1wbCh4bWxvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyBDb21wYXJhYmxlLiBUaGlzIGNvbXBhcmVUbyBpcyBpbmNvbnNpc3RlbnQgd2l0aAotICAgICAqIGVxdWFscyB1bmxlc3MgaXNJbW11dGFibGUoKSBpcyB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gY29tcGFyZVZhbHVlKChYbWxPYmplY3Qpb2JqKTsgLy8gY2FuIHRocm93IENsYXNzQ2FzdAotICAgICAgICBpZiAocmVzdWx0ID09IDIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb3dlZCB0byByZXR1cm4gMiBmb3IgaW5jb21wYXJhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IGNvbXBhcmVWYWx1ZUltcGwoWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgdHlwZTEsIHR5cGUyOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlMSA9IGluc3RhbmNlVHlwZSgpOwotICAgICAgICAgICAgdHlwZTIgPSAoKFNpbXBsZVZhbHVlKXhtbG9iaikuaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlMSA9PSBudWxsICYmIHR5cGUyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKHR5cGUxID09IG51bGwgfHwgdHlwZTIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIGlmICghdHlwZTEuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZTEuaXNVUlR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIGlmICghdHlwZTIuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZTIuaXNVUlR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIHR5cGUxID0gdHlwZTEuZ2V0UHJpbWl0aXZlVHlwZSgpOwotICAgICAgICB0eXBlMiA9IHR5cGUyLmdldFByaW1pdGl2ZVR5cGUoKTsKLQotICAgICAgICAvLyBEaWZmZXJlbnQgdmFsdWUgc3BhY2VzOiBkaWZmZXJlbnQKLSAgICAgICAgaWYgKHR5cGUxLmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IHR5cGUyLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgICAgLy8gbm93IHdlJ2xsIGRlcGVuZCBvbiBvdXIgaW1wbCBjbGFzcyB0byBkbyB0aGUgd29yawotICAgICAgICByZXR1cm4gY29tcGFyZV90byh4bWxvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVZhbHVlKFhtbE9iamVjdCB4bWxvYmopCi0gICAgewotICAgICAgICBpZiAoeG1sb2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMjsKLQotICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoeG1sb2JqLmlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZVZhbHVlSW1wbCh4bWxvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbG9iai5pc0ltbXV0YWJsZSgpIHx8IG1vbml0b3IoKSA9PSB4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoeG1sb2JqLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBjb21wYXJlX3RvIGlzIGFsbG93ZWQgdG8gZG8gdHdvCi0gICAgICogdW51c3VhbCB0aGluZ3M6Ci0gICAgICogKDEpIGl0IGNhbiBhc3N1bWUgdGhhdCB0aGUgeG1sb2JqIHBhc3NlZCBoYXMgYSBwcmltaXRpdmUKLSAgICAgKiAgICAgdHlwZSB1bmRlcmx5aW5nIHRoZSBpbnN0YW5jZSB0eXBlIHRoYXQgbWF0Y2hlcyB0aGUKLSAgICAgKiAgICAgY3VycmVudCBpbnN0YW5jZSwgYW5kIHRoYXQgbmVpdGhlciBpcyBuaWwuCi0gICAgICogKDIpIGl0IGlzIGFsbG93ZWQgdG8gcmV0dXJuIDIgZm9yICJpbmNvbXBhcmFibGUiOwotICAgICAqICAgICBpdCBzaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChlcXVhbF90byh4bWxvYmopKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCB4bWxvYmopOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCB2YWx1ZV9oYXNoX2NvZGUoKTsKLQotICAgIHB1YmxpYyBpbnQgdmFsdWVIYXNoQ29kZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlX2hhc2hfY29kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlT2YoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBteVR5cGU7Ci0KLSAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAobXlUeXBlID0gaW5zdGFuY2VUeXBlKCk7IG15VHlwZSAhPSBudWxsOyBteVR5cGUgPSBteVR5cGUuZ2V0QmFzZVR5cGUoKSkKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBteVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2V0IGN0eXBlcyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSkpOwotICAgICAgICAgICAgZm9yIChteVR5cGUgPSBpbnN0YW5jZVR5cGUoKTsgbXlUeXBlICE9IG51bGw7IG15VHlwZSA9IG15VHlwZS5nZXRCYXNlVHlwZSgpKQotICAgICAgICAgICAgICAgIGlmIChjdHlwZXMuY29udGFpbnMobXlUeXBlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmICghaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYbWxPYmplY3QpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFhtbE9iamVjdCB4bWxvYmogPSAoWG1sT2JqZWN0KW9iajsKLSAgICAgICAgaWYgKCF4bWxvYmouaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdmFsdWVFcXVhbHMoeG1sb2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmICghaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNOaWwoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlX2hhc2hfY29kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY2FuIHdyaXRlUmVwbGFjZSBlaXRoZXIgYW4gdW53cmFwcGVkIFhtbE9iamVjdEJhc2UKLSAgICAgKiBvciBhbiBYQmVhbiBwcm94eS4gIEEgInRydWUiIGFyZ3VtZW50IG1lYW5zIHVud3JhcHBlZC4KLSAgICAgKgotICAgICAqIFRoZSBzZXJpYWxpemF0aW9uIHN0cmF0ZWd5IGZvciBYbWxPYmplY3RzIGlzIHRoaXM6Ci0gICAgICoKLSAgICAgKiAoMSkgT25seSB0aGUgcm9vdCBYbWxPYmplY3QgZm9yIGEgZG9jdW1lbnQgYWN0dWFsbHkgZ2V0cwotICAgICAqICAgICBmdWxseSBzZXJpYWxpemVkOyBpdCBpcyBzZXJpYWxpemVkIGFzIGEgU2VyaWFsaXplZFJvb3RPYmplY3QsCi0gICAgICogICAgIHdoaWNoIHNpbXBseSBzYXZlcyBpdHNlbGYgYXMgWE1MIHRleHQuCi0gICAgICoKLSAgICAgKiAoMikgSW50ZXJpb3IgWG1sT2JqZWN0cyBnZXQgc2VyaWFsaXplZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUKLSAgICAgKiAgICAgcm9vdCBYbWxPYmplY3QgZm9yIHRoZWlyIGRvY3VtZW50LCBwbHVzIGFuIGludGVnZXIgd2hpY2gKLSAgICAgKiAgICAgaW5kaWNhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgWG1sT2JqZWN0IHdpdGhpbiB0aGUgb3duZXIKLSAgICAgKiAgICAgZG9jdW1lbnQuIFRoaXMgcGFpciBpcyBzdG9yZWQgYXMgYSBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QuCi0gICAgICoKLSAgICAgKiBCb3RoIG9iamVjdHMgY2FuIGJlIG1ha2VkIGFzIHdyYXBwZWQgb3IgdW53cmFwcGVkLiBJZiB3cmFwcGVkLAotICAgICAqIHRoZW4gdGhlIHByb3h5IGlzIHJldHVybmVkIHdoZW4gZGVzZXJpYWxpemluZzsgaWYgdW53cmFwcGVkLCB0aGVuCi0gICAgICogdGhlIHByb3h5IGlzIHN0cmlwcGVkIHdoZW4gZGVzZXJpYWxpemluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzUm9vdFhtbE9iamVjdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplZFJvb3RPYmplY3QodGhpcyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplZEludGVyaW9yT2JqZWN0KHRoaXMsIGdldFJvb3RYbWxPYmplY3QoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYXQgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Jvb3RYbWxPYmplY3QoKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvcigpOwotICAgICAgICBpZiAoY3VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAhY3VyLnRvUGFyZW50KCk7Ci0gICAgICAgIGN1ci5kaXNwb3NlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm9vdCBYbWxPYmplY3QgZm9yIHRoaXMgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgZ2V0Um9vdFhtbE9iamVjdCgpCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yKCk7Ci0gICAgICAgIGlmIChjdXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICBjdXIudG9TdGFydERvYygpOwotICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gY3VyLmdldE9iamVjdCgpOwotICAgICAgICBjdXIuZGlzcG9zZSgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6YWJsZSByZXdyaXRlIG9iamVjdCB0aGF0IGtub3dzIGhvdyB0byByZXNvbHZlCi0gICAgICogdG8gYW4gWG1sT2JqZWN0QmFzZSBvciBhIHByb3h5IGZvciB0aGUgcm9vdCBvYmplY3Qgb2YKLSAgICAgKiBhIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZWRSb290T2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOwotCi0gICAgICAgIHRyYW5zaWVudCBDbGFzcyBfeGJlYW5DbGFzczsKLSAgICAgICAgdHJhbnNpZW50IFhtbE9iamVjdCBfaW1wbDsKLQotICAgICAgICBwcml2YXRlIFNlcmlhbGl6ZWRSb290T2JqZWN0KCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemVkUm9vdE9iamVjdChYbWxPYmplY3QgaW1wbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3hiZWFuQ2xhc3MgPSBpbXBsLnNjaGVtYVR5cGUoKS5nZXRKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIF9pbXBsID0gaW1wbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KF94YmVhbkNsYXNzKTsKLSAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzaG9ydCBpcyB3cml0dGVuIG91dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgIC8vIGl0IHdpbGwgYWx3YXlzIGJlIHplcm8gZm9yIG9iamVjdHMgd3JpdHRlbiB3aXRoCi0gICAgICAgICAgICAvLyB0aGlzIGNvZGUsIGJ1dCBpdCB1c2VkIHRvIGJlIHRoZSBmaXJzdCAyIGJ5dGVzIG9mIHRoZQotICAgICAgICAgICAgLy8gd3JpdGVVVEYoKSBtZXRob2QKLSAgICAgICAgICAgIG91dC53cml0ZVNob3J0KChzaG9ydCkwKTsKLSAgICAgICAgICAgIG91dC53cml0ZVNob3J0KE1BSk9SX1ZFUlNJT05fTlVNQkVSKTsKLSAgICAgICAgICAgIG91dC53cml0ZVNob3J0KE1JTk9SX1ZFUlNJT05fTlVNQkVSKTsKLSAgICAgICAgICAgIC8vIENSMTIyNDAxIC0gbmVlZCB0byB1c2Ugd3JpdGVPYmplY3QgaW5zdGVhZCBvZiB3cml0ZVVURgotICAgICAgICAgICAgLy8gZm9yIHhtbFRleHQgYXMgd3JpdGVVVEYgaGFzIGEgbGVuZ3RoIGxpbWl0YXRpb24gb2YKLSAgICAgICAgICAgIC8vIDY1NTM1IGJ5dGVzCi0gICAgICAgICAgICBTdHJpbmcgeG1sVGV4dCA9IF9pbXBsLnhtbFRleHQoKTsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCh4bWxUZXh0KTsKLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyByZWFkIGNsYXNzIG9iamVjdCBmaXJzdCAtIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBqdXN0IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgLSByZWFsbHkKLSAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSB0aGUgdmVyc2lvbiBudW1iZXJzCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QKLSAgICAgICAgICAgICAgICBfeGJlYW5DbGFzcyA9IChDbGFzcylpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgdXRmQnl0ZXMgPSBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOwotCi0gICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHZlcnNpb24gbnVtYmVycwotICAgICAgICAgICAgICAgIC8vIGlmIHV0ZkJ5dGVzIGlzIG5vbi16ZXJvIHRoZW4gd2UgZGVmYXVsdCB0byAwLjAKLSAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZXhwZWN0IG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMKLSAgICAgICAgICAgICAgICAvLyB0byBiZSBuZXh0IGVudHJpZXMgaW4gc3RyZWFtCi0gICAgICAgICAgICAgICAgaW50IG1ham9yVmVyc2lvbk51bSA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IG1pbm9yVmVyc2lvbk51bSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHV0ZkJ5dGVzID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYWpvclZlcnNpb25OdW0gPSBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBtaW5vclZlcnNpb25OdW0gPSBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyB4bWxUZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbk51bSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gb3JpZ2luYWwsIHVubnVtYmVyZWQgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbm9yVmVyc2lvbk51bSBpcyBhbHdheXMgemVybwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sVGV4dCA9IHJlYWRPYmplY3RWMChpbiwgdXRmQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW4ucmVhZEJvb2xlYW4oKTsgLy8gaWdub3JlZAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtaW5vclZlcnNpb25OdW0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxUZXh0ID0gKFN0cmluZylpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLnJlYWRCb29sZWFuKCk7IC8vIGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlc2VyaWFsaXphdGlvbiBlcnJvcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gbnVtYmVyICIgKyBtYWpvclZlcnNpb25OdW0gKyAiLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yVmVyc2lvbk51bSArICIgbm90IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlc2VyaWFsaXphdGlvbiBlcnJvcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIG51bWJlciAiICsgbWFqb3JWZXJzaW9uTnVtICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlub3JWZXJzaW9uTnVtICsgIiBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0RG9jdW1lbnRUeXBlKFhtbEJlYW5zLnR5cGVGb3JDbGFzcyhfeGJlYW5DbGFzcykpOwotICAgICAgICAgICAgICAgIF9pbXBsID0gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSh4bWxUZXh0LCBudWxsLCBvcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pKG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSkuaW5pdENhdXNlKGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgbWV0aG9kIGlzIGZvciByZWFkaW5nIHRoZSBVVEYtOCBTdHJpbmcgdGhhdCB1c2VkIHRvIGJlCi0gICAgICAgIC8vIHdyaXR0ZW4gb3V0IGZvciBhIHNlcmlhbGl6ZWQgWG1sT2JqZWN0IGFjY29yZGluZyB0byB0aGUKLSAgICAgICAgLy8gb3JpZ2luYWwgZm9ybWF0IGJlZm9yZSB0aGlzIGZpeCwgaS5lLiBpdCBleHBlY3RzIGl0Ci0gICAgICAgIC8vIHRvIGhhdmUgYmVlbiB3cml0dGVuIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgotICAgICAgICAvLwotICAgICAgICAvLyB3cml0ZU9iamVjdChDbGFzcyBvYmplY3QpCi0gICAgICAgIC8vIHdyaXRlVVRGKHhtbFRleHQgb2Ygb2JqZWN0IGFzIFN0cmluZykKLSAgICAgICAgLy8gd3JpdGVCb29sZWFuKCkKLSAgICAgICAgLy8KLSAgICAgICAgLy8gdGhpcyBtZXRob2QgaXMgcGFzc2VkIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0gcG9zaXRpb25lZCBhcyB0aG91Z2gKLSAgICAgICAgLy8gaXQgaGFkIGp1c3QgcmVhZCB0aGUgY2xhc3Mgb2JqZWN0IHBsdXMgdGhlIG5leHQgMiBieXRlcy4gVGhvc2UgMgotICAgICAgICAvLyBieXRlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgc2hvcnQgc2F5aW5nIGhvdyBtYW55IG1vcmUKLSAgICAgICAgLy8gYnl0ZXMgdGhlcmUgYXJlIHJlcHJlc2VudGluZyB0aGUgYnl0ZXMgb2YgdGhlIFVURi04LWZvcm1hdHRlZCBTdHJpbmc7Ci0gICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgcGFzc2VkIGluIGFzIHRoZSBhcmd1bWVudCB1dGZCeXRlcwotICAgICAgICBwcml2YXRlIFN0cmluZyByZWFkT2JqZWN0VjAoT2JqZWN0SW5wdXRTdHJlYW0gaW4sIGludCB1dGZCeXRlcykKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gYWxsb3cgYW4gZXh0cmEgMiBieXRlcyB1cCBmcm9udCBmb3IgdGhlIHVuc2lnbmVkIHNob3J0Ci0gICAgICAgICAgICBieXRlW10gYkFycmF5ID0gbmV3IGJ5dGVbdXRmQnl0ZXMrMl07Ci0KLSAgICAgICAgICAgIC8vIGZvciBmb3JtYXQgb2YgdGhlc2UgZmlyc3QgMiBieXRlcyBzZWUKLSAgICAgICAgICAgIC8vIEphdmEgQVBJIGRvY3MgLSBEYXRhT3V0cHV0U3RyZWFtLndyaXRlU2hvcnQoKQotICAgICAgICAgICAgYkFycmF5WzBdID0gKGJ5dGUpKCAweGZmICYgKHV0ZkJ5dGVzID4+IDgpICk7Ci0gICAgICAgICAgICBiQXJyYXlbMV0gPSAoYnl0ZSkoIDB4ZmYgJiB1dGZCeXRlcyApOwotCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBuZXh0IG51bUJ5dGVzIGJ5dGVzIGZyb20gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgLy8gaW50byB0aGUgYnl0ZSBhcnJheSBzdGFydGluZyBhdCBvZmZzZXQgMjsgdGhpcyBtYXkKLSAgICAgICAgICAgIC8vIHRha2UgbXVsdGlwbGUgY2FsbHMgdG8gcmVhZCgpCi0gICAgICAgICAgICBpbnQgdG90YWxCeXRlc1JlYWQgPSAwOwotICAgICAgICAgICAgaW50IG51bVJlYWQ7Ci0gICAgICAgICAgICB3aGlsZSAodG90YWxCeXRlc1JlYWQgPCB1dGZCeXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBudW1SZWFkID0KLSAgICAgICAgICAgICAgICAgICAgaW4ucmVhZChiQXJyYXksIDIrdG90YWxCeXRlc1JlYWQsIHV0ZkJ5dGVzLXRvdGFsQnl0ZXNSZWFkKTsKLSAgICAgICAgICAgICAgICBpZiAobnVtUmVhZCA9PSAtMSkgLy8gcmVhY2hlZCBlbmQgb2Ygc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgKz0gbnVtUmVhZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkICE9IHV0ZkJ5dGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyBiYWNrd2FyZHMgY29tcGF0aWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJYbWxPYmplY3Q6IG51bWJlciBvZiBieXRlcyByZWFkICgiICsgdG90YWxCeXRlc1JlYWQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIikgIT0gbnVtYmVyIGV4cGVjdGVkICgiICsgdXRmQnl0ZXMgKyAiKSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IHNldCB1cCBhIERhdGFJbnB1dFN0cmVhbSB0byByZWFkIHRob3NlCi0gICAgICAgICAgICAvLyBieXRlcyBhcyBhIFVURi04IFN0cmluZyBpLmUuIGFzIHRob3VnaCB3ZSdkIG5ldmVyCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBmaXJzdCAyIGJ5dGVzIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbQotICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGRpcyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJBcnJheSkpOwotICAgICAgICAgICAgICAgIHN0ciA9IGRpcy5yZWFkVVRGKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXJpYWxpemFibGUgcmV3cml0ZSBvYmplY3QgdGhhdCBrbm93cyBob3cgdG8gcmVzb2x2ZQotICAgICAqIHRvIGFuIFhtbE9iamVjdEJhc2Ugb3IgYSBwcm94eSBmb3IgYW4gaW50ZXJpb3IgcG9zaXRpb24KLSAgICAgKiB3aXRoaW4gYSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLSAgICAgICAgdHJhbnNpZW50IFhtbE9iamVjdCBfaW1wbDsKLSAgICAgICAgdHJhbnNpZW50IFhtbE9iamVjdCBfcm9vdDsKLQotICAgICAgICBwcml2YXRlIFNlcmlhbGl6ZWRJbnRlcmlvck9iamVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU2VyaWFsaXplZEludGVyaW9yT2JqZWN0KFhtbE9iamVjdCBpbXBsLCBYbWxPYmplY3Qgcm9vdCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ltcGwgPSBpbXBsOwotICAgICAgICAgICAgX3Jvb3QgPSByb290OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoX3Jvb3QpOwotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQoZGlzdGFuY2VUb1Jvb3QoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yb290ID0gKFhtbE9iamVjdClpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICAgICAgX2ltcGwgPSBvYmplY3RBdERpc3RhbmNlKGluLnJlYWRJbnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9pbXBsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZGlzdGFuY2VUb1Jvb3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gX2ltcGwubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFjdXIudG9QcmV2VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1ci5jdXJyZW50VG9rZW5UeXBlKCkuaXNOYW1lc3BhY2UoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bnQ6ICIgKyBjb3VudCArICIgIiArIGN1ci5jdXJyZW50VG9rZW5UeXBlKCkudG9TdHJpbmcoKSArICIgIiArIFFOYW1lLnByZXR0eShjdXIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgWG1sT2JqZWN0IG9iamVjdEF0RGlzdGFuY2UoaW50IGNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gX3Jvb3QubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1ci50b05leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGlmICghY3VyLmN1cnJlbnRUb2tlblR5cGUoKS5pc05hbWVzcGFjZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb3VudDogIiArIGNvdW50ICsgIiAiICsgY3VyLmN1cnJlbnRUb2tlblR5cGUoKS50b1N0cmluZygpICsgIiAiICsgUU5hbWUucHJldHR5KGN1ci5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gY3VyLmdldE9iamVjdCgpOwotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBqYXZhX3ZhbHVlKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqLmlzTmlsKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYbWxBbnlTaW1wbGVUeXBlKSkKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUgPSAoKFNpbXBsZVZhbHVlKW9iaikuaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUgIT0gbnVsbCkgOiAiTmlsIGNhc2Ugc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFib3ZlIjsKLQotICAgICAgICAvLyBoYW5kbGUgbGlzdHMKLSAgICAgICAgaWYgKGluc3RhbmNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpb2JqKS5nZXRMaXN0VmFsdWUoKTsKLQotICAgICAgICBTaW1wbGVWYWx1ZSBiYXNlID0gKFNpbXBsZVZhbHVlKW9iajsKLQotICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCb29sZWFuVmFsdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRRTmFtZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChiYXNlLmdldEZsb2F0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKGJhc2UuZ2V0RG91YmxlVmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXREZWNpbWFsU2l6ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQllURToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZShiYXNlLmdldEJ5dGVWYWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQoYmFzZS5nZXRTaG9ydFZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihiYXNlLmdldEludFZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmcoYmFzZS5nZXRMb25nVmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJpbnZhbGlkIG51bWVyaWMgYml0IGNvdW50IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0R0R1cmF0aW9uVmFsdWUoKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAiZW5jb3VudGVyZWQgbm9ucHJpbWl0aXZlIHR5cGUuIjsKLSAgICAgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotCi0gICAgICAgICAgICAvLyBOQjogZm9yIHN0cmluZyBlbnVtcyB3ZSBqdXN0IGRvIGphdmEubGFuZy5TdHJpbmcKLSAgICAgICAgICAgIC8vIHdoZW4gaW4gdGhlIGNvbnRleHQgb2YgdW5pb25zLiBJdCdzIGVhc2llciBvbiB1c2Vycy4KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gYmFzZS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBjb2RlIGdlbmVyYXRlZCBjb2RlIHRvIGdldCB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdmFsdWUKLSAgICAgKiBmb3IgYSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYbWxBbnlTaW1wbGVUeXBlIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV92YWx1ZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNjaGVtYVR5cGUoKTsKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgYU1vZGVsID0gc1R5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKTsKLSAgICAgICAgaWYgKGFNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHNBdHRyID0gYU1vZGVsLmdldEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgaWYgKHNBdHRyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHNBdHRyLmdldERlZmF1bHRWYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFBvc2l0aXZlSW50ZWdlckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFBvc2l0aXZlSW50ZWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiN2YzNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxQb3NpdGl2ZUludGVnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxQb3NpdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxQb3NpdGl2ZUludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sUG9zaXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxQb3NpdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFFOYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTA2MmViLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFFOYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci0KLQotcHVibGljIGNsYXNzIFhtbFFOYW1lSW1wbCBleHRlbmRzIEphdmFRTmFtZUhvbGRlciBpbXBsZW1lbnRzIFhtbFFOYW1lCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjUwZTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOwotCi1wdWJsaWMgY2xhc3MgWG1sUU5hbWVSZXN0cmljdGlvbiBleHRlbmRzIEphdmFRTmFtZUhvbGRlckV4IGltcGxlbWVudHMgWG1sUU5hbWUKLXsKLSAgICBwdWJsaWMgWG1sUU5hbWVSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU2hvcnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTaG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMmI3Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTaG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNob3J0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sU2hvcnRJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sU2hvcnQKLXsKLSAgICBwdWJsaWMgWG1sU2hvcnRJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxTaG9ydC50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sU2hvcnRJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdFbnVtZXJhdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3NmE5OC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKLQotcHVibGljIGNsYXNzIFhtbFN0cmluZ0VudW1lcmF0aW9uIGV4dGVuZHMgSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXggaW1wbGVtZW50cyBYbWxTdHJpbmcKLXsKLSAgICBwdWJsaWMgWG1sU3RyaW5nRW51bWVyYXRpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwYTc4Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmc7Ci0KLQotcHVibGljIGNsYXNzIFhtbFN0cmluZ0ltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyIGltcGxlbWVudHMgWG1sU3RyaW5nCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZjY3MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKLQotcHVibGljIGNsYXNzIFhtbFN0cmluZ1Jlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sU3RyaW5nCi17Ci0gICAgcHVibGljIFhtbFN0cmluZ1Jlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUaW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVGltZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExYzNkYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUaW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbFRpbWVJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxUaW1lCi17Ci0gICAgcHVibGljIFhtbFRpbWVJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxUaW1lLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxUaW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVG9rZW5JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUb2tlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlNzhjOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUb2tlbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxUb2tlbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVG9rZW5JbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sVG9rZW4KLXsKLSAgICBwdWJsaWMgWG1sVG9rZW5JbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxUb2tlbi50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVG9rZW5JbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbmlvbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY0ODA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGVTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHNpbXBsZSB1bmlvbiB0eXBlcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxVbmlvbkltcGwgZXh0ZW5kcyBYbWxPYmplY3RCYXNlIGltcGxlbWVudHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIHB1YmxpYyBYbWxVbmlvbkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5pbnN0YW5jZVR5cGUoKTsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotICAgIHByaXZhdGUgWG1sQW55U2ltcGxlVHlwZSBfdmFsdWU7IC8vIHVuZGVybHlpbmcgdmFsdWUKLSAgICBwcml2YXRlIFN0cmluZyBfdGV4dHZhbHVlID0gIiI7IC8vIHRleHR1YWwgdmFsdWUKLQotCi0KLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgICAgICB7IHJldHVybiBfdGV4dHZhbHVlOyB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc19kZWZhdWx0YWJsZV93cyhTdHJpbmcgdikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSBzYXZlZFZhbHVlID0gX3ZhbHVlOwotICAgICAgICAgICAgc2V0X3RleHQodik7Ci0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHNhdmVkIHZhbHVlCi0gICAgICAgICAgICBfdmFsdWUgPSBzYXZlZFZhbHVlOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgYWdhaW5zdCBhbnkgcGF0dGVybnMuLi4KLSAgICAgICAgaWYgKCFfc2NoZW1hVHlwZS5tYXRjaFBhdHRlcm5GYWNldChzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBzYXZlIHN0YXRlIGZvciByb2xsYmFjawotICAgICAgICBTdHJpbmcgb3JpZ2luYWwgPSBfdGV4dHZhbHVlOwotICAgICAgICBfdGV4dHZhbHVlID0gczsKLQotICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIHR5cGVzLCB0cnlpbmcgdG8gY3JlYXRlIGEgdHlwZQotICAgICAgICBTY2hlbWFUeXBlW10gbWVtYmVycyA9IF9zY2hlbWFUeXBlLmdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpOwotICAgICAgICBhc3NlcnQobWVtYmVycyAhPSBudWxsKTsKLQotICAgICAgICBib29sZWFuIHB1c2hlZCA9IGZhbHNlOwotICAgICAgICAvLyBib29sZWFuIHdhc3N0cmljdCA9IHNldF9zdHJpY3QodHJ1ZSk7IC8vIHRlbGwgdHlwZXMgdG8gY29tcGxhaW4gZmVydmVyZW50bHkgYWJvdXQgZXJyb3JzCi0gICAgICAgIGlmIChoYXNfc3RvcmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KGdldF9zdG9yZSgpKSk7Ci0gICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgZm9sbG93aW5nIGNhbGwsICJ0aGlzIiBpcyBhIGdlbmVyaWMKLSAgICAgICAgICAgICAgICAvLyBYbWxBbnlTaW1wbGVUeXBlIGltcGxlbWVudGF0aW9uLCBmb3Igd2hpY2ggb25seSBnZXRUZXh0IGNhbiBiZSBjYWxsZWQuCi0gICAgICAgICAgICAgICAgLy8gKE5vdGUgdGhhdCAidGhpcyIgaXMgbm90IHdyYXBwZWQgaW4gdGhlIHByb3h5IG9iamVjdC4pCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIG5ld3ZhbCA9ICgoU2NoZW1hVHlwZUltcGwpbWVtYmVyc1tpXSkubmV3VmFsaWRhdGluZ1ZhbHVlKHMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgKGVudWVtcmF0aW9uKSByZXN0cmljdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVjayhuZXd2YWwsIF9zY2hlbWFUeXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSB0aGF0IHdvcmtzIQotICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSBuZXd2YWw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUcm91Ymxlc29tZSB1bmlvbiBleGNlcHRpb24gY2F1c2VkIGJ5IHVuZXhwZWN0ZWQgIiArIGUsIGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnQoZmFsc2UpIDogIlVuZXhwZWN0ZWQgIiArIGU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwdXNoZWQpCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgIC8vIHNldF9zdHJpY3Qod2Fzc3RyaWN0KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gZG9lc24ndCBtYXRjaCBhbnkgb2YgdGhlIG1lbWJlcnM7IHJvbGxiYWNrIGFuZCB0aHJvdwotICAgICAgICBfdGV4dHZhbHVlID0gb3JpZ2luYWw7Ci0gICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IG51bGw7Ci0gICAgICAgIF90ZXh0dmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpIHsgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7IH0KLQotCi0gICAgLy8gbnVtZXJpY3MKLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMC4wZiA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5mbG9hdFZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAuMCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5kb3VibGVWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuYmlnRGVjaW1hbFZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5iaWdJbnRlZ2VyVmFsdWUoKTsgfQotCi0gICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmJ5dGVWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5zaG9ydFZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuaW50VmFsdWUoKTsgfQotCi0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmxvbmdWYWx1ZSgpOyB9Ci0KLQotICAgIC8vIHZhcmlvdXMKLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmJ5dGVBcnJheVZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gZmFsc2UgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuYm9vbGVhblZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmNhbGVuZGFyVmFsdWUoKTsgfQotCi0gICAgcHVibGljIERhdGUgZGF0ZVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmRhdGVWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ0RhdGVWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5nRGF0ZVZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBHRHVyYXRpb24gZ0R1cmF0aW9uVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZ0R1cmF0aW9uVmFsdWUoKTsgfQotCi0gICAgcHVibGljIFFOYW1lIHFOYW1lVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkucU5hbWVWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgTGlzdCBsaXN0VmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkubGlzdFZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBMaXN0IHhsaXN0VmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkueGxpc3RWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZW51bVZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBfdmFsdWUuc3RyaW5nVmFsdWUoKTsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGFjZSBvZiBjYW5vbmljYWwgbGV4aWNhbCBmb3JtcwotICAgICAqIG9mIHRoZSBmaXJzdCAoc291cmNlKSB0eXBlIG92ZXJsYXBzIHdpdGggdGhlIGZ1bGwgbGV4aWNhbCBzcGFjZQotICAgICAqIG9mIHRoZSBzZWNvbmQgKHRhcmdldCkgdHlwZS4gQm90aCB0eXBlcyBtdXN0IGJlIHByaW1pdGl2ZXMuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gbGV4aWNhbF9vdmVybGFwKGludCBzb3VyY2UsIGludCB0YXJnZXQpCi0gICAgewotICAgICAgICAvLyB0eXBlcyBhcmUgdGhlIHNhbWUKLSAgICAgICAgaWYgKHNvdXJjZSA9PSB0YXJnZXQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAvLyBvbmUgb2YgdGhlIHR5cGVzIGhhcyB0aGUgZnVsbCBsZXhpY2FsIHNwYWNlCi0gICAgICAgIGlmIChzb3VyY2UgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSB8fAotICAgICAgICAgICAgdGFyZ2V0ID09IFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEUgfHwKLSAgICAgICAgICAgIHNvdXJjZSA9PSBTY2hlbWFUeXBlLkJUQ19TVFJJTkcgfHwKLSAgICAgICAgICAgIHRhcmdldCA9PSBTY2hlbWFUeXBlLkJUQ19TVFJJTkcgfHwKLSAgICAgICAgICAgIHNvdXJjZSA9PSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJIHx8Ci0gICAgICAgICAgICB0YXJnZXQgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1VSSSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHN3aXRjaCAoc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46IHN3aXRjaCh0YXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRTogICAgICAgLy8gInRydWUiIGlzIHZhbGlkIE5jTmFtZSBhbmQgdGhlcmVmb3JlIFFOYW1lCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjogICAgLy8gInRydWUiIGlzIHZhbGlkIE5DTmFtZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOiBzd2l0Y2godGFyZ2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjogICAgIC8vICIwIiBpcyB2YWxpZCBib29sZWFuCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOiAgLy8gIjAiIGlzIHZhbGlkIGhleAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6ICAgICAgIC8vICJhIiBpcyB2YWxpZCBOY05hbWUgYW5kIHRoZXJlZm9yZSBRTmFtZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046ICAgIC8vICJhIiBpcyB2YWxpZCBOY05hbWUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOiAgICAgICAvLyAiMCIgaXMgdmFsaWQgZmxvYXQKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRTogICAgICAvLyAiMCIgaXMgdmFsaWQgZG91YmxlCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOiAgICAgLy8gIjAiIGlzIHZhbGlkIGRlY2ltYWwKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOiAgICAvLyAiUDFZMk0zRFQxMEgzME0iIGlzIGJvdGggYjY0IGFuZCBkdXJhdGlvbgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOiAgICAgIC8vICIxOTk5IiBpcyB2YWxpZCB5ZWFyCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgIC8vICItIiBhbmQgIjoiIGNhbm5vdCBjb21lIGZyb20gYjY0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6IHN3aXRjaCh0YXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOiAgICAgLy8gIjAiIGlzIHZhbGlkIGJvb2xlYW4KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOiAgLy8gIjAiIGlzIHZhbGlkIGI2NAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6ICAgICAgIC8vICJBIiBpcyB2YWxpZCBOY05hbWUgYW5kIHRoZXJlZm9yZSBRTmFtZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046ICAgIC8vICJBIiBpcyB2YWxpZCBOY05hbWUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOiAgICAgICAvLyAiMCIgaXMgdmFsaWQgZmxvYXQKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRTogICAgICAvLyAiMCIgaXMgdmFsaWQgZG91YmxlCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOiAgICAgLy8gIjAiIGlzIHZhbGlkIGRlY2ltYWwKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjogICAgICAvLyAiMTk5OSIgaXMgdmFsaWQgeWVhcgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAvLyAiLSIgYW5kICI6IiBjYW5ub3QgY29tZSBmcm9tIGI2NAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046IHN3aXRjaCh0YXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOiAgICAgLy8gInRydWUiIGlzIHZhbGlkIGJvb2xlYW4KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOiAgLy8gImEiIGlzIHZhbGlkIGI2NAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWTogIC8vICJhIiBpcyB2YWxpZCBoZXgKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOiAgICAgICAvLyAiQSIgaXMgdmFsaWQgTmNOYW1lIGFuZCB0aGVyZWZvcmUgUU5hbWUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiAgICAvLyAiQSIgaXMgdmFsaWQgTmNOYW1lIGFuZCB0aGVyZWZvcmUgUU5hbWUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOiAgICAvLyAiUDFZMk0zRFQxMEgzME0iIGlzIGJvdGggTmNOYW1lIGFuZCBkdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjogc3dpdGNoKHRhcmdldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOiAvLyAiMCIgaXMgdmFsaWQgYjY0Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOiAgLy8gIjAiIGlzIHZhbGlkIGhleAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6ICAgICAgIC8vICIwIiBpcyB2YWxpZCBmbG9hdAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOiAgICAgIC8vICIwIiBpcyB2YWxpZCBkb3VibGUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6ICAgICAvLyAiMCIgaXMgdmFsaWQgZGVjaW1hbAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOiAgICAgIC8vICIxOTk5IiBpcyB2YWxpZCB5ZWFyCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046IHN3aXRjaCh0YXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gc2NoZW1hIHR5cGUncyBsb2dpY2FsIHR5cGUgaXMgYSBtYXRjaCBmb3IKLSAgICAgKiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgb2YgamF2YSBjb25jZXB0cy4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX05VTUJFUiA9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTiArIDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfREFURSA9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTiArIDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0FMRU5EQVIgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX0JZVEVBUlJBWSA9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTiArIDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfTElTVCA9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTiArIDU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvZ2ljYWxfb3ZlcmxhcChTY2hlbWFUeXBlIHR5cGUsIGludCBqYXZhY29kZSkKLSAgICB7Ci0gICAgICAgIC8vIG5vbi11bmlvbiB0eXBlcyBiZWNhdXNlIGl0J3MgYmVpbmcgYXBwbGllZCBvbiBpcnJlZHVjaWJsZSB1bmlvbiBtZW1iZXJzIQotICAgICAgICBhc3NlcnQodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTik7Ci0KLSAgICAgICAgaWYgKGphdmFjb2RlIDw9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgcmV0dXJuICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBqYXZhY29kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGphdmFjb2RlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgSkFWQV9OVU1CRVI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgSkFWQV9EQVRFOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEpBVkFfQ0FMRU5EQVI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgSkFWQV9CWVRFQVJSQVk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBKQVZBX0xJU1Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJtaXNzaW5nIGNhc2UiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3JhYnMgYSBjaGFpbmVkIHZhbHVlIG9mIHR5cGUgc3QsIGNyZWF0aW5nIGFuZCBhdHRhY2hpbmcKLSAgICAgKiBvbmUgaWYgbm90IHByZXNlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldF9wcmltaXRpdmUoaW50IHR5cGVjb2RlLCBPYmplY3QgdmFsKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlcnMgPSBfc2NoZW1hVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0KG1lbWJlcnMgIT0gbnVsbCk7Ci0KLSAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGhhc19zdG9yZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoZ2V0X3N0b3JlKCkpKTsKLSAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dGVyOiBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY2FuZGlkYXRlcyBtdXN0IGJlIGEgbG9naWNhbCBtYXRjaCBmb3IgdGhlIGRlc2lyZWQgdHlwZWNvZGUKLSAgICAgICAgICAgICAgICBpZiAobG9naWNhbF9vdmVybGFwKG1lbWJlcnNbaV0sIHR5cGVjb2RlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgbmV3dmFsOwotCi0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWwgPSBtZW1iZXJzW2ldLm5ld1ZhbHVlKHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdGNoIHRoaXMgdHlwZSBldmVuIHRob3VnaCBsb2dpY2FsIGNhdGVnb3JpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgdXAgKHByb2JhYmx5IGJlY2F1c2Ugb2YgcmVzdHJpY2l0b24pOyB0cnkgdGhlIG5leHQgdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJVbmV4cGVjdGVkICIgKyBlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiByZXRoaW5rIHRoaXMgLSBkaXNhYmxpbmcgZm9yIG5vdy4KLQotICAgICAgICAgICAgICAgICAgICAvLyBPSywgbm93IHdlJ3ZlIGdvdCBhIG5ld3ZhbC4uLiBXZSBoYXZlIHRvIHZlcmlmeQotICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGxleGljYWxseSBpdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBwcmV2aW91cyB0eXBlcwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXd2YWx0ZXh0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBpbm5lcjogZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJzW2pdLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhpY2FsX292ZXJsYXAobWVtYmVyc1tqXS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbC5zY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIHByZWNlZGluZyB0eXBlIHRoYXQgbWF5IGxleGljYWxseSBvdmVybGFwIHdpdGggb3Vycy4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGxleGljYWxseSBjb250YWlucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG91ciBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wb3NlZCB2YWx1ZSwgdGhlbiBpdCdzIGltcG9zc2libGUgZm9yIHRoZSB1bmlvbiB0byBoYXZlIG91cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWwgdmFsdWUgKGJlY2F1c2UgaXQgd291bGQgaGF2ZSBiZWVuIG1hc2tlZCkgYW5kIHRocm93IGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld3ZhbHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdGV4dCA9IG5ld3ZhbC5zdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzY2FyZCByZXR1cm4gdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyc1tpXS5uZXdWYWx1ZShuZXd2YWx0ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvaCBiYWQsIHdlIHN1Y2NlZWRlZC4gT3VyIGluc3RhbmNlIGxleGljYWxseSBsb29rcyBsaWtlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdHlwZSwgYW5kIHRoaXMgaXNuJ3QgYSB2YWxpZCB2YWx1ZS4gS2VlcCBvbiBodW50aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBnb29kOiB0aGlzIGVycm9yIG1lYW5zIHRoYXQgb3VyIHZhbHVlIGRvZXNuJ3QgbG9vayBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvdGhlciB0eXBlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBpbm5lcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIGxleGljYWwgbWFza2luZzogd2UncmUgT0sKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gbmV3dmFsOwotICAgICAgICAgICAgICAgICAgICBfdGV4dHZhbHVlID0gX3ZhbHVlLnN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHVzaGVkKQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBoZXJlIGFyZSB0aGUgc2V0dGVycwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2Jvb2xlYW4oYm9vbGVhbiB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfQk9PTEVBTiwgbmV3IEJvb2xlYW4odikpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYnl0ZShieXRlIHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgbmV3IEJ5dGUodikpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3Nob3J0KHNob3J0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgbmV3IFNob3J0KHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9pbnQoaW50IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgbmV3IEludGVnZXIodikpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBMb25nKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBGbG9hdCh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBEb3VibGUodikpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQnl0ZUFycmF5KGJ5dGVbXSBiKQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9CWVRFQVJSQVksIGIpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2hleChieXRlW10gYikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfQllURUFSUkFZLCBiKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9iNjQoYnl0ZVtdIGIpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0JZVEVBUlJBWSwgYik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfUU5hbWUoUU5hbWUgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX1FOQU1FLCB2KTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0NhbGVuZGFyKENhbGVuZGFyIGMpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0NBTEVOREFSLCBjKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9EYXRlKERhdGUgZCkKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfREFURSwgZCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGQpCi0gICAgewotICAgICAgICBpbnQgYnRjID0gZC5nZXRCdWlsdGluVHlwZUNvZGUoKTsKLSAgICAgICAgaWYgKGJ0YyA8PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICBzZXRfcHJpbWl0aXZlKGJ0YywgZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGQpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19EVVJBVElPTiwgZCk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9lbnVtKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZSkKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX1NUUklORywgZSk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9saXN0KExpc3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTElTVCwgdik7IH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGZsb2F0KFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfRkxPQVQsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGRvdWJsZShYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RPVUJMRSwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZGVjaW1hbChYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGR1cmF0aW9uKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfRFVSQVRJT04sIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGRhdGV0aW1lKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfREFURV9USU1FLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWx0aW1lKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfVElNRSwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZGF0ZShYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RBVEUsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGd5ZWFybW9udGgoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEgsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGd5ZWFyKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19ZRUFSLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxnbW9udGhkYXkoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWSwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZ2RheShYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0dfREFZLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxnbW9udGgoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19HX01PTlRILCB2KTsgfQotCi0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2soWG1sT2JqZWN0IHYsIFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWxzW2ldLnZhbHVlRXF1YWxzKHYpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCB4bWxvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLnZhbHVlRXF1YWxzKHhtbG9iaik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgY3R4LmludmFsaWQoIlVuaW9uIHZhbHVlICIgKyBsZXhpY2FsICsgIiBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIG1lbWJlciB0eXBlcyBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNjaGVtYVR5cGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY3R4LmludmFsaWQoIlVuaW9uIHZhbHVlICIgKyBsZXhpY2FsICsgIiBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIG1lbWJlciB0eXBlcyBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNjaGVtYVR5cGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAoKFhtbE9iamVjdEJhc2UpX3ZhbHVlKS52YWxpZGF0ZV9zaW1wbGV2YWwobGV4aWNhbCwgIGN0eCk7Ci0gICAgfQotICAgIAotCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkQnl0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkQnl0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ODk1YS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEJ5dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZEJ5dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxVbnNpZ25lZEJ5dGVJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sVW5zaWduZWRCeXRlCi17Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkQnl0ZUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbFVuc2lnbmVkQnl0ZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVW5zaWduZWRCeXRlSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRJbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExMjdkMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkSW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVW5zaWduZWRJbnRJbXBsIGV4dGVuZHMgSmF2YUxvbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFVuc2lnbmVkSW50Ci17Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkSW50SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sVW5zaWduZWRJbnQudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkSW50SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRMb25nSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRMb25nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc4Njc5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkTG9uZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkTG9uZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbFVuc2lnbmVkTG9uZ0ltcGwgZXh0ZW5kcyBKYXZhSW50ZWdlckhvbGRlckV4IGltcGxlbWVudHMgWG1sVW5zaWduZWRMb25nCi17Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkTG9uZ0ltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbFVuc2lnbmVkTG9uZy50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVW5zaWduZWRMb25nSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRTaG9ydEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkU2hvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTZiNDMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRTaG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkU2hvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sVW5zaWduZWRTaG9ydEltcGwgZXh0ZW5kcyBKYXZhSW50SG9sZGVyRXggaW1wbGVtZW50cyBYbWxVbnNpZ25lZFNob3J0Ci17Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkU2hvcnRJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZFNob3J0LnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxVbnNpZ25lZFNob3J0SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTRiM2UuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKLSAgICBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiAoICkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uICggU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UgKTsKLSAgICB9Ci0gICAgCi0gICAgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gKCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCBjYXVzZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1ZTJlYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU5vdE5pbGxhYmxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjFlZTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi17Ci0gICAgcHVibGljIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpIHt9Ci0gICAgcHVibGljIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeyBzdXBlcihtZXNzYWdlKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TT0FQQXJyYXlUeXBlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2ODNkNy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU09BUEFycmF5VHlwZQotewotICAgIC8vIEV4YW1wbGUgZm9vOmJhclssXVtdWywsXVs3LDldCi0gICAgLy8gLT4gX3R5cGUgPSBRTmFtZShmb286YmFyKQotICAgIC8vIC0+IF9yYW5rcyA9IHsyLDEsM30KLSAgICAvLyAtPiBfZGltZW5zaW9ucyA9IHs3LDl9Ci0gICAgcHJpdmF0ZSBRTmFtZSBfdHlwZTsKLSAgICBwcml2YXRlIGludFtdIF9yYW5rczsgLy8gaWYgcmFua3MgaXMgZW1wdHksIGl0IG1lYW5zIHRoZXJlIGFyZSBubyBuZXN0ZWQgYXJyYXlzCi0gICAgcHJpdmF0ZSBpbnRbXSBfZGltZW5zaW9uczsgLy8gQW55IGRpbWVuc2lvbiBjYW4gYmUgLTEgdG8gaW5kaWNhdGUgImFueSIuCi0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSByYW5rcyBmb3IgdGhlIHBhc3NlZCBTT0FQQXJyYXlUeXBlCi0gICAgICogYXJlIGVxdWFsIHRvIHRoaXMgb25lLgotICAgICAqCi0gICAgICogRG9lcyBOT1QgY29tcGFyZSB0aGUgX3R5cGUgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZVJhbmtBcyhTT0FQQXJyYXlUeXBlIG90aGVyVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmIChfcmFua3MubGVuZ3RoICE9IG90aGVyVHlwZS5fcmFua3MubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9yYW5rc1tpXSAhPSBvdGhlclR5cGUuX3JhbmtzW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoX2RpbWVuc2lvbnMubGVuZ3RoICE9IG90aGVyVHlwZS5fZGltZW5zaW9ucy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIFNPQVAgMS4xLWZvcm1hdHRlZCBpbmRleCBzdHJpbmcsIHJldHVybnMgYW4gYXJyYXkKLSAgICAgKiBpbmRleC4gIEZvciBleGFtcGxlLCBnaXZlbiAiWzQsMyw1XSIsIHJldHVybnMgYW4gaW50IGFycmF5Ci0gICAgICogY29udGFpbmluZyA0LCAzLCBhbmQgNS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludFtdIHBhcnNlU29hcDExSW5kZXgoU3RyaW5nIGluYnJhY2VzKQotICAgIHsKLSAgICAgICAgaW5icmFjZXMgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKGluYnJhY2VzLCBYbWxXaGl0ZXNwYWNlLldTX0NPTExBUFNFKTsKLSAgICAgICAgaWYgKCFpbmJyYWNlcy5zdGFydHNXaXRoKCJbIikgfHwgIWluYnJhY2VzLmVuZHNXaXRoKCJdIikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNmb3JtZWQgU09BUCAxLjEgaW5kZXg6IG11c3QgYmUgY29udGFpbmVkIGluIGJyYWNlcyBbXSIpOwotICAgICAgICByZXR1cm4gaW50ZXJuYWxQYXJzZUNvbW1hSW50U3RyaW5nKGluYnJhY2VzLnN1YnN0cmluZygxLCBpbmJyYWNlcy5sZW5ndGgoKSAtIDEpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBpbnRlcm5hbFBhcnNlQ29tbWFJbnRTdHJpbmcoU3RyaW5nIGNzbCkKLSAgICB7Ci0gICAgICAgIExpc3QgZGltU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaiA9IGNzbC5pbmRleE9mKCcsJywgaSk7Ci0gICAgICAgICAgICBpZiAoaiA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGltU3RyaW5ncy5hZGQoY3NsLnN1YnN0cmluZyhpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaW1TdHJpbmdzLmFkZChjc2wuc3Vic3RyaW5nKGksIGopKTsKLSAgICAgICAgICAgIGkgPSBqICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbZGltU3RyaW5ncy5zaXplKCldOwotICAgICAgICBpID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGRpbVN0cmluZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkaW1TdHJpbmcgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKChTdHJpbmcpaXQubmV4dCgpLCBYbWxXaGl0ZXNwYWNlLldTX0NPTExBUFNFKTsKLSAgICAgICAgICAgIGlmIChkaW1TdHJpbmcuZXF1YWxzKCIqIikgfHwgZGltU3RyaW5nLmVxdWFscygiIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBJbnRlZ2VyLnBhcnNlSW50KGRpbVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oIk1hbGZvcm1lZCBpbnRlZ2VyIGluIFNPQVAgYXJyYXkgaW5kZXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBTT0FQIDEuMSBhcnJheSB0eXBlIHN0cmluZy4KLSAgICAgKgotICAgICAqIFNpbmNlIGFuIGFycmF5IHR5cGUgc3RyaW5nIGNvbnRhaW5zIGEgUU5hbWUsIGEgcHJlZml4IHJlc29sdmVyCi0gICAgICogbXVzdCBiZSBwYXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIFNPQVBBcnJheVR5cGUoU3RyaW5nIHMsIFByZWZpeFJlc29sdmVyIG0pCi0gICAgewotICAgICAgICBpbnQgZmlyc3RicmFjZSA9IHMuaW5kZXhPZignWycpOwotICAgICAgICBpZiAoZmlyc3RicmFjZSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gZ3JhYiB0aGUgUU5hbWUKLSAgICAgICAgU3RyaW5nIGZpcnN0cGFydCA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2Uocy5zdWJzdHJpbmcoMCwgZmlyc3RicmFjZSksIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICBpbnQgZmlyc3Rjb2xvbiA9IGZpcnN0cGFydC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgaWYgKGZpcnN0Y29sb24gPj0gMCkKLSAgICAgICAgICAgIHByZWZpeCA9IGZpcnN0cGFydC5zdWJzdHJpbmcoMCwgZmlyc3Rjb2xvbik7Ci0KLSAgICAgICAgU3RyaW5nIHVyaSA9IG0uZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBfdHlwZSA9IFFOYW1lSGVscGVyLmZvckxOUyhmaXJzdHBhcnQuc3Vic3RyaW5nKGZpcnN0Y29sb24gKyAxKSwgdXJpKTsKLQotICAgICAgICBpbml0RGltZW5zaW9ucyhzLCBmaXJzdGJyYWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBFTVBUWV9JTlRfQVJSQVkgPSBuZXcgaW50WzBdOwotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIFNPQVAgMS4xKGFkdmFuY2VkKSBhcnJheSB0eXBlIHN0cmluZ3MuCi0gICAgICoKLSAgICAgKiBTaW5jZSBpbiBTT0FQIDEuMShhZHZhbmNlZCkgdGhlIGRpbWVuc2lvbiBzcGVjaWZpY2F0aW9uIGlzIHNlcGFyYXRlZCBmcm9tIHRoZQotICAgICAqIFFOYW1lIGZvciB0aGUgdW5kZXJseWluZyB0eXBlLCB0aGVzZSBhcmUgcGFzc2VkIGluIHNlcGFyYXRlCi0gICAgICogYXJndW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBkaW1lbnNpb25zKQotICAgIHsKLSAgICAgICAgaW50IGZpcnN0YnJhY2UgPSBkaW1lbnNpb25zLmluZGV4T2YoJ1snKTsKLSAgICAgICAgaWYgKGZpcnN0YnJhY2UgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdHlwZSA9IG5hbWU7Ci0gICAgICAgICAgICBfcmFua3MgPSBFTVBUWV9JTlRfQVJSQVk7Ci0gICAgICAgICAgICBkaW1lbnNpb25zID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShkaW1lbnNpb25zLCBYbWxXaGl0ZXNwYWNlLldTX0NPTExBUFNFKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGRpbVN0cmluZ3MgPSBkaW1lbnNpb25zLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpbVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpbVN0cmluZyA9IGRpbVN0cmluZ3NbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGRpbVN0cmluZy5lcXVhbHMoIioiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9kaW1lbnNpb25zW2ldID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIC8vIF9oYXNJbmRldGVybWluYXRlRGltZW5zaW9ucyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfZGltZW5zaW9uc1tpXSA9IEludGVnZXIucGFyc2VJbnQoZGltU3RyaW5nc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfdHlwZSA9IG5hbWU7Ci0gICAgICAgICAgICBpbml0RGltZW5zaW9ucyhkaW1lbnNpb25zLCBmaXJzdGJyYWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgbmVzdGVkIFNPQVBBcnJheVR5cGUgYW5kIGEgc2V0IG9mIGRpbWVuc2lvbnMgZm9yIHRoZSBvdXRlcm1vc3QKLSAgICAgKiBhcnJheSwgY29tZXMgdXAgd2l0aCB0aGUgcmlnaHQgU09BUEFycmF5VHlwZSBmb3IgdGhlIHdob2xlIHRoaW5nLgotICAgICAqCi0gICAgICogRS5nLiwKLSAgICAgKiBOZXN0ZWQgZm9vOmJhclssXVtdWywsXVsxLDJdCi0gICAgICogRGltZW5zaW9ucyBbNiw3LDhdCi0gICAgICogUmVzdWx0IC0+IGZvbzpiYXJbLF1bXVssLF1bLF1bNiw3LDhdCi0gICAgICovCi0gICAgcHVibGljIFNPQVBBcnJheVR5cGUoU09BUEFycmF5VHlwZSBuZXN0ZWQsIGludFtdIGRpbWVuc2lvbnMpCi0gICAgewotICAgICAgICBfdHlwZSA9IG5lc3RlZC5fdHlwZTsKLQotICAgICAgICBfcmFua3MgPSBuZXcgaW50W25lc3RlZC5fcmFua3MubGVuZ3RoICsgMV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3JhbmtzLCAwLCBuZXN0ZWQuX3JhbmtzLCAwLCBuZXN0ZWQuX3JhbmtzLmxlbmd0aCk7Ci0gICAgICAgIF9yYW5rc1tfcmFua3MubGVuZ3RoIC0gMV0gPSBuZXN0ZWQuX2RpbWVuc2lvbnMubGVuZ3RoOwotCi0gICAgICAgIF9kaW1lbnNpb25zID0gbmV3IGludFtkaW1lbnNpb25zLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGltZW5zaW9ucywgMCwgX2RpbWVuc2lvbnMsIDAsIGRpbWVuc2lvbnMubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGRpbWVuc2lvbnMgYmFzZWQgb24gU09BUDExIHBhcnNlZCBkaW1lbnNpb24gc3Vic3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREaW1lbnNpb25zKFN0cmluZyBzLCBpbnQgZmlyc3RicmFjZSkKLSAgICB7Ci0gICAgICAgIExpc3QgYnJhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnQgbGFzdGJyYWNlID0gLTE7Ci0gICAgICAgIGZvciAoaW50IGkgPSBmaXJzdGJyYWNlOyBpID49IDA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdGJyYWNlID0gcy5pbmRleE9mKCddJywgaSk7Ci0gICAgICAgICAgICBpZiAobGFzdGJyYWNlIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBicmFjZXMuYWRkKHMuc3Vic3RyaW5nKGkgKyAxLCBsYXN0YnJhY2UpKTsKLSAgICAgICAgICAgIGkgPSBzLmluZGV4T2YoJ1snLCBsYXN0YnJhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRyYWlsZXIgPSBzLnN1YnN0cmluZyhsYXN0YnJhY2UgKyAxKTsKLSAgICAgICAgaWYgKCFYbWxXaGl0ZXNwYWNlLmlzQWxsU3BhY2UodHJhaWxlcikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gcmFuayBhcnJheQotICAgICAgICBfcmFua3MgPSBuZXcgaW50W2JyYWNlcy5zaXplKCkgLSAxXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmFua3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21tYXMgPSAoU3RyaW5nKWJyYWNlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpbnQgY29tbWFjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbW1hcy5sZW5ndGgoKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBjb21tYXMuY2hhckF0KGopOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLCcpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1hY291bnQgKz0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghWG1sV2hpdGVzcGFjZS5pc1NwYWNlKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3JhbmtzW2ldID0gY29tbWFjb3VudCArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5hbGx5IGZpbGwgaW4gZGltZW5zaW9uIGFycmF5Ci0gICAgICAgIF9kaW1lbnNpb25zID0gaW50ZXJuYWxQYXJzZUNvbW1hSW50U3RyaW5nKChTdHJpbmcpYnJhY2VzLmdldChicmFjZXMuc2l6ZSgpIC0gMSkpOwotCi0gICAgICAgIC8qCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2RpbWVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfZGltZW5zaW9uc1tpXSA8IDApCi0gICAgICAgICAgICAgICAgX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFFOYW1lIGZvciB0aGUgcmVmZXJlbmNlZCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgcmFua3MgZm9yIGlubmVyIG5lc3RlZCBhcnJheXMuCi0gICAgICogSW4gU09BUCAxLjEtYWR2YW5jZWQsIHRoaXMgaXMgYWx3YXlzIGFuIGFycmF5IG9mIGxlbmd0aCB6ZXJvLgotICAgICAqIEluIFNPQVAgMS4xLCB0aGlzIGFycmF5IHJlZmxlY3RzIHRoZSByYW5rcyBvZiBuZXN0ZWQKLSAgICAgKiBhcnJheXMuIEZvciBleGFtcGxlIGZvbzpiYXJbLF1bLCxdW11bNSw2XSB3aWxsIHByb2R1Y2UKLSAgICAgKiBhIHJhbmtzIHJlc3VsdCBvZiAyLCAzLCAxLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRbXSBnZXRSYW5rcygpCi0gICAgewotICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W19yYW5rcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9yYW5rcywgMCwgcmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBkaW1lbnNpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRbXSBnZXREaW1lbnNpb25zKCkKLSAgICB7Ci0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbX2RpbWVuc2lvbnMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfZGltZW5zaW9ucywgMCwgcmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgYXJyYXkgY29udGFpbnMgbmVzdGVkIGFycmF5cy4gRXF1aXZhbGVudAotICAgICAqIHRvIChnZXRSYW5rcygpLmxlbmd0aCA+IDApLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTmVzdGVkQXJyYXlzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX3JhbmtzLmxlbmd0aCA+IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpbWVuc2lvbnMgYXMgYSBzdHJpbmcsIGUuZy4sIFssXVsyLDMsNF0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNvYXAxMURpbWVuc2lvblN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gc29hcDExRGltZW5zaW9uU3RyaW5nKF9kaW1lbnNpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhbiBhY3R1YWwgc2V0IG9mIGRpbWVuc2lvbnMgdGhhdCBtYXkgZGlmZmVyIGZyb20KLSAgICAgKiB0aGUgZGVmYXVsdCB0aGF0IGlzIHN0b3JlZCwgb3V0cHV0cyB0aGUgc29hcCBhcnJheVR5cGUKLSAgICAgKiBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzb2FwMTFEaW1lbnNpb25TdHJpbmcoaW50W10gYWN0dWFsRGltZW5zaW9ucykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmFua3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBfcmFua3NbaV07IGorKykKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXScpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsRGltZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgaWYgKGFjdHVhbERpbWVuc2lvbnNbaV0gPj0gMCkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYWN0dWFsRGltZW5zaW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgU09BUEFycmF5VHlwZSgpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNPQVAgMS4yCi0gICAgICogQ29uc3RydWN0cyBhIFNPQVBBcnJheVR5cGUgZnJvbSBzb2FwLWVuYzppdGVtVHlwZSBhbmQKLSAgICAgKiBzb2FwLWVuYzphcnJheVNpemUgYXR0cmlidXRlcwotICAgICAqIEBwYXJhbSBpdGVtVHlwZSB0aGUgaXRlbSB0eXBlIFFOYW1lCi0gICAgICogQHBhcmFtIGFycmF5U2l6ZSBhIHN0cmluZyB3aXRoIGRpbWVudGlvbnMgbGlrZTogKiAzIDQKLSAgICAgKiBAcmV0dXJuIGEgU09BUEFycmF5VHlwZSB0byByZXByZXNlbnQgdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU09BUEFycmF5VHlwZSBuZXdTb2FwMTJBcnJheShRTmFtZSBpdGVtVHlwZSwgU3RyaW5nIGFycmF5U2l6ZSkKLSAgICB7Ci0gICAgICAgIGludCBbXSByYW5rcyA9IEVNUFRZX0lOVF9BUlJBWTsKLSAgICAgICAgYXJyYXlTaXplID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShhcnJheVNpemUsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICBTdHJpbmdbXSBkaW1TdHJpbmdzID0gYXJyYXlTaXplLnNwbGl0KCIgIik7Ci0gICAgICAgIGludFtdIGRpbWVuc2lvbnMgPSBuZXcgaW50W2RpbVN0cmluZ3MubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1TdHJpbmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZGltU3RyaW5nID0gZGltU3RyaW5nc1tpXTsKLSAgICAgICAgICAgIGlmIChpPT0wICYmIGRpbVN0cmluZy5lcXVhbHMoIioiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaW1lbnNpb25zW2ldID0gLTE7Ci0gICAgICAgICAgICAgICAgLy8gX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnNbaV0gPSBJbnRlZ2VyLnBhcnNlSW50KGRpbVN0cmluZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFNPQVBBcnJheVR5cGUgc290ID0gbmV3IFNPQVBBcnJheVR5cGUoKTsKLSAgICAgICAgc290Ll9yYW5rcyA9IHJhbmtzOwotICAgICAgICBzb3QuX3R5cGUgPSBpdGVtVHlwZTsKLSAgICAgICAgc290Ll9kaW1lbnNpb25zID0gZGltZW5zaW9uczsKLSAgICAgICAgcmV0dXJuIHNvdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTT0FQIDEuMgotICAgICAqIEdpdmVuIGFuIGFjdHVhbCBzZXQgb2YgZGltZW5zaW9ucyB0aGF0IG1heSBkaWZmZXIgZnJvbQotICAgICAqIHRoZSBkZWZhdWx0IHRoYXQgaXMgc3RvcmVkLCBvdXRwdXRzIHRoZSBzb2FwIGFycmF5U2l6ZQotICAgICAqIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNvYXAxMkRpbWVuc2lvblN0cmluZyhpbnRbXSBhY3R1YWxEaW1lbnNpb25zKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsRGltZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgaWYgKGFjdHVhbERpbWVuc2lvbnNbaV0gPj0gMCkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYWN0dWFsRGltZW5zaW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFNPQVBBcnJheVR5cGUgcmVmbGVjdGluZyB0aGUgZGltZW5zaW9ucwotICAgICAqIG9mIHRoZSBuZXh0IG5lc3RlZCBhcnJheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEFycmF5VHlwZSBuZXN0ZWRBcnJheVR5cGUoKQotICAgIHsKLSAgICAgICAgaWYgKCFjb250YWluc05lc3RlZEFycmF5cygpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNPQVBBcnJheVR5cGUgcmVzdWx0ID0gbmV3IFNPQVBBcnJheVR5cGUoKTsKLQotICAgICAgICByZXN1bHQuX3R5cGUgPSBfdHlwZTsKLQotICAgICAgICByZXN1bHQuX3JhbmtzID0gbmV3IGludFtfcmFua3MubGVuZ3RoIC0gMV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3JhbmtzLCAwLCByZXN1bHQuX3JhbmtzLCAwLCByZXN1bHQuX3JhbmtzLmxlbmd0aCk7Ci0KLSAgICAgICAgcmVzdWx0Ll9kaW1lbnNpb25zID0gbmV3IGludFtfcmFua3NbX3JhbmtzLmxlbmd0aCAtIDFdXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuX2RpbWVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQuX2RpbWVuc2lvbnNbaV0gPSAtMTsKLQotICAgICAgICAvLyByZXN1bHQuX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gKHJlc3VsdC5fZGltZW5zaW9ucy5sZW5ndGggPiAwKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChfdHlwZS5oYXNoQ29kZSgpICsgX2RpbWVuc2lvbnMubGVuZ3RoICsgX3JhbmtzLmxlbmd0aCArIChfZGltZW5zaW9ucy5sZW5ndGggPT0gMCA/IDAgOiBfZGltZW5zaW9uc1swXSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKCFvYmouZ2V0Q2xhc3MoKS5lcXVhbHMoZ2V0Q2xhc3MoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgU09BUEFycmF5VHlwZSBzYXQgPSAoU09BUEFycmF5VHlwZSlvYmo7Ci0KLSAgICAgICAgaWYgKCFfdHlwZS5lcXVhbHMoc2F0Ll90eXBlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoX3JhbmtzLmxlbmd0aCAhPSBzYXQuX3JhbmtzLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoX2RpbWVuc2lvbnMubGVuZ3RoICE9IHNhdC5fZGltZW5zaW9ucy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmFua3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoX3JhbmtzW2ldICE9IHNhdC5fcmFua3NbaV0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2RpbWVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoX2RpbWVuc2lvbnNbaV0gIT0gc2F0Ll9kaW1lbnNpb25zW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NjaGVtYVdTRExBcnJheVR5cGUuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU2NoZW1hV1NETEFycmF5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjY2MjQzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU2NoZW1hV1NETEFycmF5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwOwotCi0vKioKLSAqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBzY2hlbWEgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKLSAqIGNhbiBiZSBjb2VyY2VkIHRvIHRoaXMgaW50ZXJmYWNlIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSB2YWx1ZQotICogb2YgdGhlIHdzZGw6YXJyYXlUeXBlIGF0dHJpYnV0ZXMgb24gYXR0cmlidXRlcyBhbmQgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hV1NETEFycmF5VHlwZQotewotICAgIFNPQVBBcnJheVR5cGUgZ2V0V1NETEFycmF5VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZU1hbmFnZXIuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYTlmM2QuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZU1hbmFnZXIgZXh0ZW5kcyBQcmVmaXhSZXNvbHZlcgotewotICAgIC8qKgotICAgICAqIENhbGVkIHdoZW4gdGhlIHVzZXIgbmVlZHMgYSBwcmVmaXggYnkgd2hpY2ggdG8gcmVmZXJlbmNlIGEgZ2l2ZW4KLSAgICAgKiBYbWwgbmFtZXNwYWNlLiBBIHN1Z2dlc3RlZCBwcmVmaXggaXMgcGFzc2VkLCB3aGljaCBtYXkgYmUgbnVsbDsKLSAgICAgKiB0aGUgc3VnZ2VzdGlvbiBtYXkgYmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICggU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCApOwotfQotICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNhYmUwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLQotcHVibGljIGludGVyZmFjZSBUeXBlU3RvcmUgZXh0ZW5kcyBOYW1lc3BhY2VNYW5hZ2VyCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBqdXN0IGJlZm9yZSB0aGUgcGFydCBvZiB0aGUgdHJlZQotICAgICAqIHdoZXJlIHRoaXMgVHlwZVN0b3JlIGlzIGxvY2F0ZWQuCi0gICAgICovCi0gICAgWG1sQ3Vyc29yIG5ld19jdXJzb3IoKTsKLQotICAgIC8qKgotICAgICAqLwotICAgIHZvaWQgdmFsaWRhdGUgKCBWYWxpZGF0b3JMaXN0ZW5lciB2RXZlbnRTaW5rICk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNjaGVtYVR5cGVMb2FkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9yZSBjb250aWFuaW5nIHRoaXMKLSAgICAgKiBUeXBlU3RvcmUuCi0gICAgICovCi0gICAgU2NoZW1hVHlwZUxvYWRlciBnZXRfc2NoZW1hdHlwZWxvYWRlciAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2UgdGhlIHR5cGUgb2YgdGhpcyBzdG9yZSAocGVyaGFwcyBieSBhcHBseWluZyB4c2k6dHlwZSkgYW5kCi0gICAgICogcmV0dXJuIHRoZSBuZXcgVHlwZVN0b3JlVXNlciAob3Igb2xkIG9uZSBpZiB0aGUgbmV3IHR5cGUgaXMgbm90Ci0gICAgICogZGlmZmVyZW50KS4KLSAgICAgKi8KLSAgICBUeXBlU3RvcmVVc2VyIGNoYW5nZV90eXBlICggU2NoZW1hVHlwZSBzVHlwZSApOwotCi0gICAgLyoqCi0gICAgICogVGVsbHMgaWYgdGhpcyBzdG9yZSBpcyBhbiBhdHRyaWJ1dGUgb3Igbm90Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc19hdHRyaWJ1dGUgKCApOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB4c2k6dHlwZS4gIFJldHVybiBudWxsIGlmIG5vbmUgb3IgdGhpcyBpcyBhbiBhdHRyaWJ1dGUKLSAgICAgKiBzdG9yZS4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXRfeHNpX3R5cGUgKCApOwotCi0gICAgLyoqCi0gICAgICogQSB1c2VyIG9mIGEgVHlwZVN0b3JlIGNhbGxzIGludmFsaWRhdGVfdGV4dCB3aGVuIHRoZSB1bmRlcmx5aW5nCi0gICAgICogdmFsdWUgaGFzIGNoYW5nZWQgYW5kIGhlIHdhbnRzIHRoZSB0ZXh0c3RvcmUgdG8gY2FsbCBoaW0gYmFjayB3aXRoCi0gICAgICogYSBmZXRjaF90ZXh0IChUeXBlU3RvcmUvVHlwZVN0b3JlVXNlcnMgd29yayBpbiBwYWlycykuCi0gICAgICovCi0gICAgdm9pZCBpbnZhbGlkYXRlX3RleHQoKTsKLQotICAgIC8qKgotICAgICAqIEEgdXNlciBvZiBhIFR5cGVTdG9yZSBjYWxscyBmZXRjaF90ZXh0IHdoZW4gaGUga25vd3MgaGlzIHZpZXcKLSAgICAgKiBvZiB0aGUgdGV4dCBpcyBpbnZhbGlkIGFuZCBoZSB3YW50cyB0byBzZWUgd2hhdCB0aGUgYWN0dWFsIHRleHQKLSAgICAgKiB2YWx1ZSBpcy4KLSAgICAgKi8KLSAgICAvLyBCVUdCVUcgKGVyaWN2YXMpIDEyMTExCi0gICAgU3RyaW5nIGZldGNoX3RleHQoaW50IHdoaXRlc3BhY2VSdWxlKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IFdTX1VOU1BFQ0lGSUVEID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBXU19QUkVTRVJWRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgV1NfUkVQTEFDRSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgV1NfQ09MTEFQU0UgPSAzOwotCi0gICAgLyoqCi0gICAgICogQSB1c2VyIG9mIGEgVHlwZVN0b3JlIGNhbGxzIHN0b3JlX3RleHQgd2hlbiBoZSB3YW50cyB0aGUgVHlwZVN0b3JlCi0gICAgICogdG8gcmVtZW1iZXIgdGhlIGdpdmVuIHRleHQgaW1tZWRpYXRlbHkuIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbgotICAgICAqIHRoZSB1c2VyIGhhcyBhIG5vbmNhbm9uaWNhbCAoYnV0IHZhbGlkKSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdG8gc2F2ZSwKLSAgICAgKiBidXQgZG9lc24ndCBoYXZlIHRoZSBzdG9yYWdlIGluIHdoaWNoIHRvIHNhdmUgaXQuCi0gICAgICovCi0gICAgdm9pZCBzdG9yZV90ZXh0KFN0cmluZyB0ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEhlcmUgdGhlIFR5cGVTdG9yZSBpcyByZXNwb25zaWJsZSBmb3IgbG9jYXRpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogVGhpcyBpcyBkb25lIGFzIGZvbGxvd3MKLSAgICAgKiAoMSkgZ28gdG8gdGhlIHBhcmVudCBUeXBlU3RvcmVVc2VyCi0gICAgICogKDIpIGFzayBpdCB0byBnZXRfZGVmYXVsdF9lbGVtZW50X3RleHQocW5hbWUpIChvciBfYXR0cmlidXRlXyksIGFuZCByZXR1cm4gaXQgaWYgbm90IG51bGwuCi0gICAgICogKDIpIG90aGVyd2lzZSwgZ3JhYiBhIG5ldyBUeXBlU3RvcmVVc2VyVmlzaXRvciB2aWEgdiA9IHBhcmVudHVzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgKiAoMykgY2FsbCB2LnZpc2l0KG5hbWUpIG9uIF9ldmVyeV8gZWxlbWVudCBxbmFtZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgb25lIGluIG9yZGVyCi0gICAgICogKDQpIHJldHVybiB0aGUgcmVzdWx0IG9mIHYuZ2V0X2RlZmF1bHRfdGV4dCgpLgotICAgICAqLwotICAgIFN0cmluZyBjb21wdXRlX2RlZmF1bHRfdGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogSGVyZSB0aGUgVHlwZVN0b3JlIGlzIHJlc3BvbnNpYmxlIGZvciBmaWd1cmluZyBpZiB0aGlzIHZhbHVlIGlzCi0gICAgICogbmlsbGFibGUgYW5kL29yIGZpeGVkLiBUaGlzIGlzIGRvbmUgYnkKLSAgICAgKiAoMSkgZ28gdG8gdGhlIHBhcmVudCBUeXBlU3RvcmVVc2VyCi0gICAgICogKDIpIGFzayBpdCB0byBnZXRfZWxlbWVudGZsYWdzKHFuYW1lKSwgYW5kIHJldHVybiBpdCBpZiBub3QgLTEuCi0gICAgICogKDIpIG90aGVyd2lzZSwgZ3JhYiBhIG5ldyBUeXBlU3RvcmVVc2VyVmlzaXRvciB2aWEgdiA9IHBhcmVudHVzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgKiAoMykgY2FsbCB2LnZpc2l0KG5hbWUpIG9uIF9ldmVyeV8gZWxlbWVudCBxbmFtZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgb25lIGluIG9yZGVyCi0gICAgICogKDQpIHJldHVybiB0aGUgcmVzdWx0IG9mIHYuZ2V0X2VsZW1lbnRmbGFncygpLgotICAgICAqLwotICAgIGludCBjb21wdXRlX2ZsYWdzKCk7Ci0KLQotICAgIC8qKgotICAgICAqIFRlbGxzIGlmIHRoaXMgc3RvcmUgd2FzIGNyZWF0ZWQgd2l0aCB0aGlzIG9wdGlvbiB3aGljaCB0ZWxscyB0aGUgc3Ryb25nbHkgdHlwZWQKLSAgICAgKiBvYmplY3RzIHRvIHBlcmZvcm0gbGV4aWNhbCBhbmQgdmFsdWUgdmFsaWRhdGlvbiBhZnRlciBhIHNldHRlciBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiB2YWxpZGF0ZV9vbl9zZXQoKTsKLQotICAgIC8qKgotICAgICAqIEhlcmUgdGhlIHR5cGVzdG9yZSBpcyByZXNwb3NpYmxlIGZvciBmaW5kaW5nIHRoZSBzY2hlbWEgZmllbGQgZm9yCi0gICAgICogdGhpcyBvYmplY3QuIFRoaXMgaXMgZG9uZSBieQotICAgICAqICgxKSBvdGhlcndpc2UsIGdyYWIgYSBuZXcgVHlwZVN0b3JlVXNlclZpc2l0b3IgdmlhIHYgPSBwYXJlbnR1c2VyLm5ld192aXNpdG9yKCk7Ci0gICAgICogKDIpIGNhbGwgdi52aXNpdChuYW1lKSBvbiBfZXZlcnlfIGVsZW1lbnQgcW5hbWUgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIG9uZSBpbiBvcmRlcgotICAgICAqICgzKSByZXR1cm4gdGhlIHJlc3VsdCBvZiB2LmdldF9zY2hlbWFfZmllbGQoKS4KLSAgICAgKi8KLSAgICBTY2hlbWFGaWVsZCBnZXRfc2NoZW1hX2ZpZWxkKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOSUxMQUJMRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTREVGQVVMVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYRUQgPSA0OyAvLyBhbHdheXMgc2V0IHdpdGggSEFTREVGQVVMVAotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIG5pbGxlZCBvciB1bm5pbGxlZCwgc28gdGhlIHRleHRzdG9yZQotICAgICAqIGtub3dzIGl0IG5lZWRzIHRvIHVwZGF0ZSB0aGUgeHNpOm5pbCBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgdm9pZCBpbnZhbGlkYXRlX25pbCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFR5cGVTdG9yZSBpcyByZXBvbnNpYmxlIGZvciBkaXNjb3ZlcmluZyBpZiB0aGlzIHZhbHVlIGlzIG5pbC4KLSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgKDEpIGdvaW5nIHRvIHRoZSBlbGVtZW50IGFuZCAoMikgZmluZGluZyB0aGUKLSAgICAgKiB4c2k6bmlsIGF0dHJpYnV0ZSBpZiBwcmVzZW50IGFuZCAoMykgcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxhcHNlZAotICAgICAqIHRleHR1YWwgdmFsdWUgaXMgZWl0aGVyIGV4YWN0bHkgdGhlIHN0cmluZyAidHJ1ZSIgb3IgIjEiLgotICAgICAqLwotICAgIGJvb2xlYW4gZmluZF9uaWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIG5hbWUgb3duZWQgYnkgdGhpcwotICAgICAqIHRleHRzdG9yZS4KLSAgICAgKi8KLSAgICBpbnQgY291bnRfZWxlbWVudHMoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIG9mIHRoZSBuYW1lcy4KLSAgICAgKi8KLSAgICBpbnQgY291bnRfZWxlbWVudHMoUU5hbWVTZXQgbmFtZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVHlwZVN0b3JlVXNlciB1bmRlcm5lYXRoIHRoZSBpdGggZWxlbWVudCB3aXRoIHRoZSBnaXZlbgotICAgICAqIG5hbWUgb3duZWQgYnkgdGhpcyB0ZXh0c3RvcmUsIG9yIG51bGwgaWYgbm9uZSB3YXMgZm91bmQuCi0gICAgICoKLSAgICAgKiBEbyBub3QgdGhyb3cgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpIGlzIGJhZCAtCi0gICAgICogcmV0dXJuIG51bGwgaW5zdGVhZC4gVGhlIHJlYXNvbiBpcyB0byBhbGxvdyB1cyB0byBmYWlsCi0gICAgICogYW5kIHRoZW4gZm9sbG93IHdpdGggYW4gYWRkX2VsZW1lbnRfZXRjIGlmIHdlIGNob29zZSB0bywKLSAgICAgKiB3aXRob3V0IHJhbmRvbWx5IGNhdGNoaW5nIGV4Y2VwdGlvbnMuCi0gICAgICovCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0gICAgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlcihRTmFtZSBuYW1lLCBpbnQgaSk7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIGZpbmRfZWxlbWVudF91c2VyIGJ1dCBhY2NlcHRzIGEgc2V0IG9mIG5hbWVzIHRvIHNlYXJjaCBmb3IuCi0gICAgICovCi0gICAgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlcihRTmFtZVNldCBuYW1lcywgaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIFR5cGVTdG9yZVVzZXJzIGNvcnJlc3BvbmRpbmcgdG8gZWxlbWVudHMgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lIG93bmVkIGJ5IHRoaXMgdHlwZXN0b3JlLCBvciB0aGUgZW1wdHkgYXJyYXkgb2YKLSAgICAgKiBUeXBlU3RvcmVVc2VycyBpZiBub25lIHdhcyBmb3VuZC4KLSAgICAgKi8KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2FsbF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hbGxfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYWxsX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2FsbF9lbGVtZW50Ci0gICAgdm9pZCBmaW5kX2FsbF9lbGVtZW50X3VzZXJzKFFOYW1lIG5hbWUsIExpc3QgZmlsbE1lVXApOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBUeXBlU3RvcmVVc2VycyBjb3JyZXNwb25kaW5nIHRvIGVsZW1lbnRzIHdpdGggb25lCi0gICAgICogb2YgdGhlIG5hbWVzIGlzIHRoZSBRTmFtZVNldC4KLSAgICAgKi8KLSAgICB2b2lkIGZpbmRfYWxsX2VsZW1lbnRfdXNlcnMoUU5hbWVTZXQgbmFtZSwgTGlzdCBmaWxsTWVVcCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIHBvc2l0aW9uIHRoYXQgd2lsbCBtYWtlIGl0Ci0gICAgICogdGhlIGl0aCBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgb3duZWQgYnkgdGhpcyB0ZXh0c3RvcmUsCi0gICAgICogYW5kIHJldHVybnMgYSBUeXBlU3RvcmVVc2VyIGZvciB0aGF0IGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGVsZW1lbnRzIG9mIHRoZSBnaXZlbgotICAgICAqIG5hbWUsIHlvdSBtYXkgbmVlZCB0byBjYWxsIGJhY2sgdG8gZGlzY292ZXIgdGhlIHByb3BlcgotICAgICAqIG9yZGVyaW5nIHRvIHVzZSB0byBpbnNlcnQgdGhlIGZpcnN0IG9uZS4gT3RoZXJ3aXNlLAotICAgICAqIGl0IHNob3VsZCBiZSBpbnNlcnRlZCBhZGphY2VudCB0byBleGlzdGluZyBlbGVtZW50cyB3aXRoCi0gICAgICogdGhlIHNhbWUgbmFtZS4KLSAgICAgKgotICAgICAqIFNob3VsZCB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGkgPCAwCi0gICAgICogb3IgaWYgaSA+ICMgb2YgZWx0cwotICAgICAqLwotCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zZXJ0X2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNlcnRfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGluc2VydF9lbGVtZW50Ci0gICAgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyKFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIExpa2UgdGhlIGFib3ZlIG1ldGhvZCwgZXhjZXB0IHRoYXQgaXQgaW5zZXJ0cyBhbiBlbGVtZW50IG5hbWVkCi0gICAgICogbmFtZSwgYWZ0ZXIgdGhlIGl0aCBtZW1iZXIgb2Ygc2V0LgotICAgICAqLwotICAgIFR5cGVTdG9yZVVzZXIgaW5zZXJ0X2VsZW1lbnRfdXNlcihRTmFtZVNldCBzZXQsIFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCBhdCB0aGUgbGFzdCBwb3NpdGlvbiBhZGphY2VudCB0byBleGlzdGluZwotICAgICAqIGVsZW1lbnRzIG9mIHRoZSBzYW1lIG5hbWUuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGVsZW1lbnRzIG9mIHRoZSBnaXZlbgotICAgICAqIG5hbWUsIHRoZSBzYW1lIGNvbW1lbnQgYXBwbGllcyBhcyB3aXRoIGluc2VydF9lbGVtZW50X3VzZXIuCi0gICAgICovCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2VsZW1lbnQKLSAgICBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBpdGggZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqCi0gICAgICogU2hvdWxkIHRocm93IGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaSA8IDAKLSAgICAgKiBvciBpZiBpID4gIyBvZiBlbHRzLTEuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVfZWxlbWVudChRTmFtZSBuYW1lLCBpbnQgaSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBpdGggZWxlbWVudCB0aGF0IG1hdGNoZXMgbmFtZXMuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVfZWxlbWVudChRTmFtZVNldCBuYW1lcywgaW50IGkpOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBUeXBlU3RvcmVVc2VyIHVuZGVybmVhdGggdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbgotICAgICAqIG5hbWUsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBhdHRyaWJ1dGUuCi0gICAgICovCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hdHRyaWJ1dGUKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2F0dHJpYnV0ZQotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYXR0cmlidXRlCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hdHRyaWJ1dGUKLSAgICBUeXBlU3RvcmVVc2VyIGZpbmRfYXR0cmlidXRlX3VzZXIoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCByZXR1cm5zIGEgVHlwZVN0b3JlVXNlcgotICAgICAqIHVuZGVybmVhdGggaXQuIFNob3VsZCB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZXJlCi0gICAgICogaXMgYWxyZWFkeSBhbiBleGlzdGluZyBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfYXR0cmlidXRlCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2F0dHJpYnV0ZQotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9hdHRyaWJ1dGUKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfYXR0cmlidXRlCi0gICAgVHlwZVN0b3JlVXNlciBhZGRfYXR0cmlidXRlX3VzZXIoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBUeXBlU3RvcmUgKGluY2x1ZGluZyBhdHRyaWJ1dGVzLAotICAgICAqIGVsZW1lbnRzLCBhbmQgbWl4ZWQgY29udGVudCksIHRvIHRoZSB0YXJnZXQgdHlwZSBzdG9yZS4KLSAgICAgKgotICAgICAqIFNQRUNJQUwgTk9URTogVGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbQotICAgICAqIHRoZSB0YXJnZXQgb3IgY29waWVkIGZyb20gdGhlIHNvcnVjZSwgYW5kIHRoZSBUeXBlU3RvcmVVc2VyIGF0dGFjaGVkCi0gICAgICogdG8gdGhpcyBUeXBlU3RvcmUgc2hvdWxkIG5vdCBiZSBkaXNjb25uZWN0ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcgb2JqLnNldChmb28pLgotICAgICAqLwotICAgIFR5cGVTdG9yZVVzZXIgY29weV9jb250ZW50c19mcm9tKFR5cGVTdG9yZSBzb3VyY2UpOwotICAgIAotLy8gQlVHQlVHIC0gTmVlZCB0byB1c2UgdGhpcyBpbiB0aGUgZnV0dXJlCi0vLyAgICAvKioKLS8vICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFR5cGVTdG9yZSAoaW5jbHVkaW5nIGF0dHJpYnV0ZXMsCi0vLyAgICAgKiBlbGVtZXRzLCBtaXhlZCBjb250ZW50KSwgdG8gdGhlIGNoaWxkIGVsZW1lbnQgZ2l2ZW4gYnkgdGhlIGdpdmVuCi0vLyAgICAgKiBuYW1lIGFuZCBpbmRleC4gQW55IFR5cGVTdG9yZVVzZXIgdGhhdCBtaWdodCBiZSBjdXJyZW50bHkgYXR0YWNoZWQKLS8vICAgICAqIHRvIHRoYXQgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQuICBUaGUgeHNpOnR5cGUgYXR0cmlidXRlIG9mIHRoZQotLy8gICAgICogZWxlbWVudCBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gUU5hbWUgKG9yIGRlbGV0ZWQgaWYKLS8vICAgICAqIHRoZSB4c2l0eXBlIGFyZ3VtZW50IGlzIG51bGwpCi0vLyAgICAgKi8KLS8vICAgIHZvaWQgY29weV90b19lbGVtZW50KAotLy8gICAgICAgIFR5cGVTdG9yZSBzb3VyY2UsIFFOYW1lIHhzaXR5cGUsIFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5IG9mIFhtbE9iamVjdCAoaW5jbHVkaW5nCi0gICAgICogYXR0cmlidXRlcywgZWxlbWVudHMsIG1peGVkIGNvbnRlbnQpLCBvdmVyIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlCi0gICAgICogZ2l2ZW4gbmFtZSB1bmRlciB0aGUgY3VycmVudCB0eXBlc3RvcmUuCi0gICAgICoKLSAgICAgKiBUaGUgbGVuZ3RocyBvZiB0aGUgdHdvIGFycmF5cyB0aGF0IGFyZSBwYXNzZWQgc2hvdWxkIGJlIHRoZSBzYW1lLgotICAgICAqCi0gICAgICogSWYgdGhlcmUgYXJlIG4gY3VycmVudCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbmFtZSBhbmQgbSBlbGVtZW50cwotICAgICAqIGluIHRoZSBzb3VyY2UgYXJyYXksIHRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIGZvciBpbmRpdmlkdWFsIGVsZW1lbnRzOgotICAgICAqCi0gICAgICogMS4gSWYgaSA8IG4gYW5kIGkgPCBtLCB0aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgaXRoIHNvdXJjZSBhcmUgY29waWVkCi0gICAgICogICAgdW5kZXJuZWF0aCB0aGUgaXRoIGVsZW1lbnQ7IHRoZSBpdGggZWxlbWVudCBpcyBub3QgbW92ZWQsIGJ1dCBpdHMKLSAgICAgKiAgICBUeXBlU3RvcmVVc2VyIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgKiAyLiBpZiBpID49IG4gYW5kIGkgPCBtLCB0aGVuIGZpcnN0IGVub3VnaCBuZXcgZWxlbWVudHMgYXJlIGFwcGVuZGVkCi0gICAgICogICAgc28gdGhhdCB0aGVyZSBpcyBhbiBlbGVtZW50IHdpdGggdGhlIG5hbWUgaSwgdGhlbiBydWxlICMxIGlzIGZvbGxvd2VkLgotICAgICAqIDMuIGlmIGkgPj0gbSBhbmQgaSA8IG4sIHRoZW4gdGhlIGVsZW1lbnQgI2kgYW5kIGFsbCBpdHMgY29udGVudHMKLSAgICAgKiAgICBhcmUgcmVtb3ZlZC4KLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGFycmF5X3NldHRlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1lbnROYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBWaXNpdHMgYWxsIHRoZSBlbGVtZW50cyBpbW1lZGlhdGVseSwgdXNpbmcgdGhlIGdpdmVuIHZpc2l0b3IuCi0gICAgICogQSBUeXBlU3RvcmVVc2VyIGNhbGxzIHRoaXMgd2hlbiBzb21lYm9keSBoYXMgcmVxdWVzdGVkIHZhbGlkYXRpb24uCi0gICAgICovCi0gICAgdm9pZCB2aXNpdF9lbGVtZW50cyhUeXBlU3RvcmVWaXNpdG9yIHZpc2l0b3IpOwotCi0gICAgWG1sT2JqZWN0W10gZXhlY19xdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb25pdG9yIG9iamVjdCwgdXNlZCBmb3Igc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIGRvYy4KLSAgICAgKi8gCi0gICAgT2JqZWN0IGdldF9yb290X29iamVjdCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZUZhY3RvcnkuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTdkMGUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBUaGlzIGdpdmVzIHRoZSBub24gZGVmYXVsdCBiaW5kaW5ncyB0byB0YWtlIGNvbnRyb2wgb2YgVHlwZVN0b3JlVXNlcgotICogY3JlYXRpb24uIEl0IGlzIHNldCBvbmNlIHBlciBkb2N1bWVudCBhbmQgY2FsbGVkIGVhY2ggdGltZSBpbnN0ZWFkIG9mCi0gKiBUeXBlU3RvcmVVc2VyLmNyZWF0ZUVsZW1lbnRVc2VyKCkgYW5kIGNyZWF0ZUF0dHJpYnV0ZVVzZXIoKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZUZhY3RvcnkKLXsKLSAgICAvKiogQSBrZXkgdG8gcGFzcyBpbiBmb3IgdGhlIFhtbE9wdGlvbnMgdG8gc2V0IHRoZSBmYWN0b3J5ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gIlR5cGVTdG9yZUZhY3RvcnkiOwotCi0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVFbGVtZW50VXNlcihTY2hlbWFUeXBlIHBhcmVudFR5cGUsIFFOYW1lIG5hbWUsIFFOYW1lIHhzaVR5cGUpOwotCi0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVBdHRyaWJ1dGVVc2VyKFNjaGVtYVR5cGUgcGFyZW50VHlwZSwgUU5hbWUgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVXNlci5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyODRiNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgc3Ryb25nbHktdHlwZWQgdXNlciBvZiBhIHR5cGVzdG9yZS4KLSAqIEEgdHlwZXN0b3JlIGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgdGhlIGxleGljYWwgYXNwZWN0cyBvZiBYTUwsIGFuZAotICogYSB0eXBlc3RvcmUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsIHN0cm9uZ2x5LXR5cGVkIGFzcGVjdHMuCi0gKiBXaGVyZSB0aGVyZSBpcyBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSB0d28gbW9kZWxzLCBpdCBpcyByZXByZXNlbnRlZAotICogYnkgdGhlIFR5cGVTdG9yZSBhbmQgVHlwZVN0b3JlVXNlciBpbnRlcmZhY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZVVzZXIKLXsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gYXR0YWNoIHRvIHRoZSBnaXZlbiB0ZXh0U3RvcmUuIFdoZW4gYSBUeXBlU3RvcmVVc2VyIGlzCi0gICAgICogYXR0YWNoZWQsIGl0IGlzIHB1dCBpbnRvIGEgY29tcGxldGVseSBpbnZhbGlkYXRlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICB2b2lkIGF0dGFjaF9zdG9yZShUeXBlU3RvcmUgc3RvcmUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1hIHR5cGUgb2YgdGhpcyB1c2VyCi0gICAgICovCi0gICAgU2NoZW1hVHlwZSBnZXRfc2NoZW1hX3R5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0b3JlIHRvIHdoaWNoIHRoaXMgdHlwZXN0b3JldXNlciBpcyBhdHRhY2hlZCwgb3IKLSAgICAgKiBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgVHlwZVN0b3JlIGdldF9zdG9yZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBpbnZhbGlkYXRlX3ZhbHVlIHdoZW4gaXRzIHRleHQgaGFzCi0gICAgICogY2hhbmdlZCBhbmQgaXQgdGhlcmVmb3JlIGtub3dzIHRoYXQgYW55IGNhY2hlZCB0eXBlIHZhbHVlIGlzCi0gICAgICogaW52YWxpZC4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsdHkgb2YgdGhlIHR5cGUgdG8gY2FsbCBmZXRjaF90ZXh0Ci0gICAgICogYW5kIHJlcGFyc2UgbmV4dCB0aW1lIHRoZSB1c2VyIGRvZXMgYSBzdHJvbmdseS10eXBlZCBnZXQuCi0gICAgICovCi0gICAgdm9pZCBpbnZhbGlkYXRlX3ZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIGNhbiBjYWxsIHVzZXNfaW52YWxpZGF0ZV92YWx1ZSB0byBrbm93IGlmIGNhbGxzIHRvCi0gICAgICogaW52YWxpZGF0ZV92YWx1ZSB3aWxsIGJlIGZydWl0ZnVsLiAgSWYgdXNlc19pbnZhbGlkYXRlX3ZhbHVlCi0gICAgICogcmV0dXJucyBmYWxzZSwgaW52YWxpZGF0ZV92YWx1ZSBuZWVkIG5ldmVyIGJlIGNhbGxlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBidWlsZF90ZXh0IHdoZW4gaXQga25vd3MgaXRzIG93biB0ZXh0Ci0gICAgICogaXMgaW52YWxpZCBhbmQgbmVlZHMgdG8gZmlsbCBpdCBpbi4gIElmIGZvckV4dGVybmFsIGlzIHRydWUsIHRoZW4KLSAgICAgKiB0aGUgdmFsdWUgcmV0dXJuZWQgd2lsbCBiZSB1c2VkIHRvIHJlcGxlbmlzaCB0aGUgc3RvcmUncyBjYWNoZSBvZgotICAgICAqIHRoZSB2YWx1ZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIGlzIGJlaW5nIGNvbXB1dGVkIGZvciBwdXJwb3NlcwotICAgICAqIG90aGVyIHRoYW4gdmFsaWRhdGlvbiwgbGlrZSBwZXJzaXN0ZW5jZS4KLSAgICAgKgotICAgICAqIEFsc28sIHRoZSBvbmx5IG1lbWJlciBvbiBUeXBlU3RvcmUgd2hpY2ggbWF5IGJlIGNhbGxlZCB3aGlsZSBidWlsZF90ZXh0Ci0gICAgICogaXMgb24gdGhlIHN0YWNrIGlzIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSB3aGljaCBtdXN0IGhhdmUgdGhlCi0gICAgICogZm9yRXh0ZXJuYWwgc3RhdGUgcGFzc2VkIHRvIGl0IGFzIGl0IGlzIHBhc3NlZCBoZXJlLgotICAgICAqLwotICAgIFN0cmluZyBidWlsZF90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgd2lsbCBjYWxsIGJhY2sgb24gYnVpbGRfbmlsIGFmdGVyIHlvdSd2ZSBjYWxsZWQgaW52YWxpZGF0ZV9uaWwKLSAgICAgKiBhbmQgaXQgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBuaWwgdmFsdWUgaXMuCi0gICAgICovCi0gICAgYm9vbGVhbiBidWlsZF9uaWwoKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgY2FsbHMgYmFjayBvbiBpbnZhbGlkYXRlX25pbHZhbHVlIHdoZW4gdGhlIHZhbHVlIG9mCi0gICAgICogdGhlIHhzaTpuaWwgdGFnIGhhcyBjaGFuZ2VkLgotICAgICAqLwotICAgIHZvaWQgaW52YWxpZGF0ZV9uaWx2YWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSBjYWxscyBiYWNrIG9uIGludmFsaWRhdGVfZWxlbWVudF9vcmRlciB3aGVuIGEgcmVhcnJhbmdtZW50Ci0gICAgICogb2Ygc2libGluZyBlbGVtZW50cyB0byB0aGUgbGVmdCBvZiB0aGlzIGVsZW1lbnQgbWVhbnMgdGhhdCB0aGUKLSAgICAgKiBuaWxsYWJsZSB2YWx1ZSBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkLgotICAgICAqLwotICAgIHZvaWQgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIHdpbGwgY2FsbCBiYWNrIG9uIHZhbGlkYXRlX25vdyB0byBmb3JjZSB1cyB0byBsb29rIGF0Ci0gICAgICogdGhlIHRleHQgaWYgd2UncmUgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiBpcyBhbGxvd2VkCi0gICAgICogYW5kIGV4cGVjdGVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdGV4dCBpc24ndCB2YWxpZCBmb3IKLSAgICAgKiBvdXIgdHlwZS4KLSAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlX25vdygpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSBjYWxscyBiYWNrIG9uIHRoaXMgY2FsbCBpbiBvcmRlciB0byBmb3JjZSBhIGRpc2Nvbm5lY3QuCi0gICAgICogQWZ0ZXIgdGhpcyBpcyBkb25lLCB0aGUgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGludmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBkaXNjb25uZWN0X3N0b3JlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKLSAgICAgKiBhIGdpdmVuIGVsZW1lbnQgY2hpbGQgbmFtZSBhcyBsb25nIGFzIHlvdSBhbHNvIHBhc3MgdGhlCi0gICAgICogcW5hbWUgY29udGFpbmVkIGJ5IHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUsIGlmIGFueS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB3ZSB3aWxsIGlnbm9yZSB0aGUgeHNpVHlwZSBpZiBpdCB0dXJucyBvdXQgdG8gYmUgaW52YWxpZC4KLSAgICAgKi8KLSAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9lbGVtZW50X3VzZXIoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKLSAgICAgKiBhIGdpdmVuIGF0dHJpYnV0ZSBjaGlsZCwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqLwotICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlX2F0dHJpYnV0ZV91c2VyKFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU2NoZW1hVHlwZSB3aGljaCBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBuYW1lIGFuZCB4c2k6dHlwZQotICAgICAqIHdvdWxkIGJlLgotICAgICAqLwotCi0gICAgU2NoZW1hVHlwZSBnZXRfZWxlbWVudF90eXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU2NoZW1hVHlwZSB3aGljaCBhbiBhdHRyaWJ1dGUgb2YgdGhpcyBuYW1lIHdvdWxkIGJlLgotICAgICAqLwotCi0gICAgU2NoZW1hVHlwZSBnZXRfYXR0cmlidXRlX3R5cGUoUU5hbWUgYXR0ck5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBlbGVtZW50IHRleHQsIGlmIGl0J3MgY29uc2lzdGVudC4gSWYgaXQncwotICAgICAqIG5vdCBjb25zaXN0ZW50LCByZXR1cm5zIG51bGwsIGFuZCByZXF1aXJlcyBhIHZpc2l0b3Igd2Fsay4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KFFOYW1lIGVsdE5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGF0dHJpYnV0ZSB3aXRoCi0gICAgICogdGhlIGdpdmVuIG5hbWUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRmbGFncywgaWYgdGhleSdyZSBjb25zaXN0ZW50LiBJZiB0aGV5J3JlCi0gICAgICogbm90LCByZXR1cm5zIC0xLCBhbmQgcmVxdWlyZXMgYSB2aXN0b3Igd2Fsay4KLSAgICAgKi8KLSAgICBpbnQgZ2V0X2VsZW1lbnRmbGFncyhRTmFtZSBlbHROYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZsYWdzIGZvciBhbiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgaW50IGdldF9hdHRyaWJ1dGVmbGFncyhRTmFtZSBhdHRyTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgZmllbGQgZm9yIGFuIGF0dHJpYnV0ZQotICAgICAqLwotICAgIFNjaGVtYUZpZWxkIGdldF9hdHRyaWJ1dGVfZmllbGQoUU5hbWUgYXR0ck5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBmYWxzZSBpZiBjaGlsZCBlbGVtZW50cyBhcmUgaW5zZW5zaXRpdmUgdG8gb3JkZXI7Ci0gICAgICogaWYgaXQgcmV0dXJucyB0cnVlLCB5b3UncmUgcmVxdWlyZWQgdG8gY2FsbCBpbnZhbGlkYXRlX2VsZW1lbnRfb3JkZXIKLSAgICAgKiBvbiBjaGlsZHJlbiB0byB0aGUgcmlnaHQgb2YgYW55IGNoaWxkIG9yZGVyIHJlYXJyYW5nZW1lbnQuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gcmV0dXJuIHRoZSBlbGVtZW50IHNvcnQgb3JkZXIgdG8gdXNlIGZvcgotICAgICAqIGluc2VydGlvbiBvcGVyYXRpb25zIGlmIG5lZWRlZC4gU2V0dGFibGUgZWxlbWVudHMgc2hvdWxkCi0gICAgICogYmUgc3RvcmVkIGluIHRoaXMgb3JkZXIgaWYgcG9zc2libGUuCi0gICAgICovCi0gICAgUU5hbWVTZXQgZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoUU5hbWUgZWx0bmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiByZXR1cm4gYSB2aXNpdG9yIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlCi0gICAgICogZGVmYXVsdCB0ZXh0IGFuZCBlbGVtZW50ZmxhZ3MgZm9yIGFuIGFyYml0cmFyeSBlbGVtZW50LgotICAgICAqLwotICAgIFR5cGVTdG9yZVZpc2l0b3IgbmV3X3Zpc2l0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyRmFjdG9yeS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzU4MjEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi0vKioKLSAqIEV2ZXJ5IFNjaGVtYVR5cGVMb2FkZXIgaXMgYWN0dWFsbHkgYSBUeXBlU3RvcmVVc2VyRmFjdG9yeS4KLSAqCi0gKiBUbyBnZXQgYW5kIHVzZSB0aGUgZGVmYXVsdCBUeXBlU3RvcmVVc2VyRmFjdG9yeSwgZG8gdGhlIGZvbGxvd2luZzoKLSAqCi0gKiBUeXBlU3RvcmVVc2VyIHVzZXIgPSAoKFR5cGVTdG9yZVVzZXJGYWN0b3J5KVNjaGVtYVR5cGVMb2FkZXIuZ2xvYmFsKCkpLmNyZWF0ZVR5cGVTdG9yZVVzZXIoc3RvcmUpOwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZVVzZXJGYWN0b3J5Ci17Ci0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVUeXBlU3RvcmVVc2VyKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVmlzaXRvci5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwYjdiYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSBUeXBlU3RvcmUgdG8gdmlzaXQgZXZlcnkgZWxlbWVudCBpbiBvcmRlcgotICogdG8gY29tcHV0ZSBuaWxsYWJsZSBmbGFncyBhbmQgZGVmYXVsdCB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZVN0b3JlVmlzaXRvcgotewotICAgIC8qKgotICAgICAqIFdoZW4gdXNpbmcgYSB2aXNpdG9yLCB5b3UgbXVzdCBjYWxsICJ2aXNpdCIgb24gZXZlcnkgcW5hbWUgb2YKLSAgICAgKiBldmVyeSBlbGVtZW50IGluIG9yZGVyIHVwIHRvIHRoZSBvbmUgeW91J3JlIGludGVyZXN0ZWQgaW4uCi0gICAgICoKLSAgICAgKiBJZiB5b3UncmUgdXNpbmcgaXQgZm9yIHZhbGlkYXRpb24sIGNhbGwgdmlzaXQobnVsbCkgYXQgdGhlIGVuZAotICAgICAqIG9mIHRoZSBzZXF1ZW5jZSBvZiBjaGlsZHJlbi4gSWYgeW91J3JlIG5vdCB2YWxpZGF0aW5nLCB5b3UgY2FuCi0gICAgICoganVzdCB3YWxrIGF3YXkgb25jZSB5b3UgZ2V0IHRoZSBpbmZvIHlvdSBuZWVkLgotICAgICAqLwotICAgIGJvb2xlYW4gdmlzaXQoUU5hbWUgZWx0TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50ZmxhZ3MgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBpbnQgZ2V0X2VsZW1lbnRmbGFncygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldF9kZWZhdWx0X3RleHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNjaGVtYSBmaWVsZCBmb3IgdGhpcyBmaWVsZC4KLSAgICAgKi8KLSAgICBTY2hlbWFGaWVsZCBnZXRfc2NoZW1hX2ZpZWxkKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RvcmUuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2FlNzhmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFN0b3JlCi17Ci0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBYbWxPYmplY3QgbG9hZFhtbCAoIFN0cmluZyBzLCAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotICAgIFhtbE9iamVjdCBsb2FkWG1sICggSW5wdXRTdHJlYW0gaW4sICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotICAgIFhtbE9iamVjdCBsb2FkWG1sICggUmVhZGVyIHIsICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotICAgIFhtbE9iamVjdCBsb2FkWG1sICggWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgICBYbWxPYmplY3QgbG9hZFhtbCAoIE5vZGUgbm9kZSwgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotICAgIAotICAgIFhtbFNheEhhbmRsZXIgbmV3U2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0KLSAgICBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjUxYTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQmFzZVNjaGVtYVJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi54c2Rvd25sb2FkLkRvd25sb2FkZWRTY2hlbWFzRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhtbGJlYW4ueHNkb3dubG9hZC5Eb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50LkRvd25sb2FkZWRTY2hlbWFzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54bWxiZWFuLnhzZG93bmxvYWQuRG93bmxvYWRlZFNjaGVtYUVudHJ5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBTY2hlbWFJbXBvcnRSZXNvbHZlcgotewotICAgIHByaXZhdGUgU3RyaW5nIF9kZWZhdWx0Q29weURpcmVjdG9yeTsKLSAgICBwcml2YXRlIERvd25sb2FkZWRTY2hlbWFzRG9jdW1lbnQgX2ltcG9ydHNEb2M7Ci0gICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlRm9yRmlsZW5hbWUgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9yZXNvdXJjZUZvclVSTCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlRm9yTmFtZXNwYWNlID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVzb3VyY2VGb3JEaWdlc3QgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9yZXNvdXJjZUZvckNhY2hlRW50cnkgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU2V0IF9yZWRvd25sb2FkU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIHByb3RlY3RlZCBCYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIC8vIGNvbmNyZXRlIHN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgaW5pdCBpbiB0aGVpciBjb25zdHJ1Y3RvcnMKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmIChmaWxlRXhpc3RzKGdldEluZGV4RmlsZW5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pbXBvcnRzRG9jID0gRG93bmxvYWRlZFNjaGVtYXNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCBpbnB1dFN0cmVhbUZvckZpbGUoIGdldEluZGV4RmlsZW5hbWUoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaW1wb3J0c0RvYyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvYmxlbSByZWFkaW5nIHhzZG93bmxvYWQueG1sOiBwbGVhc2UgZml4IG9yIGRlbGV0ZSB0aGlzIGZpbGUiKSkuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChfaW1wb3J0c0RvYyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaW1wb3J0c0RvYyA9IERvd25sb2FkZWRTY2hlbWFzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgIjxkbHM6ZG93bmxvYWRlZC1zY2hlbWFzIHhtbG5zOmRscz0naHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveG1sYmVhbi94c2Rvd25sb2FkJyBkZWZhdWx0RGlyZWN0b3J5PSciICsgZ2V0RGVmYXVsdFNjaGVtYURpcigpICsgIicvPiIKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSkuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGRlZmF1bHREaXIgPSBfaW1wb3J0c0RvYy5nZXREb3dubG9hZGVkU2NoZW1hcygpLmdldERlZmF1bHREaXJlY3RvcnkoKTsKLSAgICAgICAgaWYgKGRlZmF1bHREaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGRlZmF1bHREaXIgPSBnZXREZWZhdWx0U2NoZW1hRGlyKCk7OwotICAgICAgICBfZGVmYXVsdENvcHlEaXJlY3RvcnkgPSBkZWZhdWx0RGlyOwotCi0gICAgICAgIC8vIG5vdyBpbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcwotICAgICAgICBEb3dubG9hZGVkU2NoZW1hRW50cnlbXSBlbnRyaWVzID0gX2ltcG9ydHNEb2MuZ2V0RG93bmxvYWRlZFNjaGVtYXMoKS5nZXRFbnRyeUFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlUmVzb3VyY2UoZW50cmllc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUNhY2hlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IF9pbXBvcnRzRG9jLm5ld0lucHV0U3RyZWFtKG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkpOwotICAgICAgICB3cml0ZUlucHV0U3RyZWFtVG9GaWxlKGlucHV0LCBnZXRJbmRleEZpbGVuYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NBbGwoYm9vbGVhbiBzeW5jLCBib29sZWFuIHJlZnJlc2gsIGJvb2xlYW4gaW1wb3J0cykKLSAgICB7Ci0gICAgICAgIGlmIChyZWZyZXNoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcmVkb3dubG9hZFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfcmVkb3dubG9hZFNldCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBhbGxGaWxlbmFtZXMgPSBnZXRBbGxYU0RGaWxlbmFtZXMoKTsKLQotICAgICAgICBpZiAoc3luYykKLSAgICAgICAgICAgIHN5bmNDYWNoZVdpdGhMb2NhbFhzZEZpbGVzKGFsbEZpbGVuYW1lcywgZmFsc2UpOwotCi0gICAgICAgIFNjaGVtYVJlc291cmNlW10gc3RhcnRlcnMgPSAoU2NoZW1hUmVzb3VyY2VbXSkKLSAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JGaWxlbmFtZS52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFSZXNvdXJjZVswXSk7Ci0KLSAgICAgICAgaWYgKHJlZnJlc2gpCi0gICAgICAgICAgICByZWRvd25sb2FkRW50cmllcyhzdGFydGVycyk7Ci0KLSAgICAgICAgaWYgKGltcG9ydHMpCi0gICAgICAgICAgICByZXNvbHZlSW1wb3J0cyhzdGFydGVycyk7Ci0KLSAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3MoU3RyaW5nW10gdXJpcywgU3RyaW5nW10gZmlsZW5hbWVzLCBib29sZWFuIHN5bmMsIGJvb2xlYW4gcmVmcmVzaCwgYm9vbGVhbiBpbXBvcnRzKQotICAgIHsKLSAgICAgICAgaWYgKHJlZnJlc2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWxlbmFtZXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHN5bmNDYWNoZVdpdGhMb2NhbFhzZEZpbGVzKGZpbGVuYW1lcywgdHJ1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKHN5bmMpCi0gICAgICAgICAgICBzeW5jQ2FjaGVXaXRoTG9jYWxYc2RGaWxlcyhnZXRBbGxYU0RGaWxlbmFtZXMoKSwgZmFsc2UpOwotCi0gICAgICAgIFNldCBzdGFydGVyc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVJlc291cmNlIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKWxvb2t1cFJlc291cmNlKG51bGwsIHVyaXNbaV0pOwotICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhcnRlcnNldC5hZGQocmVzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlbmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVJlc291cmNlIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvckZpbGVuYW1lLmdldChmaWxlbmFtZXMpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhcnRlcnNldC5hZGQocmVzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hUmVzb3VyY2VbXSBzdGFydGVycyA9IChTY2hlbWFSZXNvdXJjZVtdKQotICAgICAgICAgICAgICAgc3RhcnRlcnNldC50b0FycmF5KG5ldyBTY2hlbWFSZXNvdXJjZVswXSk7Ci0KLSAgICAgICAgaWYgKHJlZnJlc2gpCi0gICAgICAgICAgICByZWRvd25sb2FkRW50cmllcyhzdGFydGVycyk7Ci0KLSAgICAgICAgaWYgKGltcG9ydHMpCi0gICAgICAgICAgICByZXNvbHZlSW1wb3J0cyhzdGFydGVycyk7Ci0KLSAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgaXRlbXMgdG8gdGhlIGNhY2hlIHRoYXQgcG9pbnQgdG8gbmV3IGZpbGVzIHRoYXQgYXJlbid0Ci0gICAgICogZGVzY3JpYmVkIGluIHRoZSBjYWNoZSwgYW5kIG9wdGlvbmFsbHkgZGVsZXRlcyBvbGQgZW50cmllcy4KLSAgICAgKgotICAgICAqIElmIGFuIG9sZCBmaWxlIGlzIGdvbmUgYW5kIGEgbmV3IGZpbGUgaXMKLSAgICAgKiBmb3VuZCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgY29udGVudHMsIHRoZSBjYWNoZSBlbnRyeSBpcyBtb3ZlZAotICAgICAqIHRvIHBvaW50IHRvIHRoZSBuZXcgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5jQ2FjaGVXaXRoTG9jYWxYc2RGaWxlcyhTdHJpbmdbXSBmaWxlbmFtZXMsIGJvb2xlYW4gZGVsZXRlT25seU1lbnRpb25lZCkKLSAgICB7Ci0gICAgICAgIFNldCBzZWVuUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IHZhbmlzaGVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZW5hbWVzW2ldOwotCi0gICAgICAgICAgICAvLyBmaXJzdCwgaWYgdGhlIGZpbGVuYW1lIG1hdGNoZXMgZXhhY3RseSwgdHJ1c3QgdGhlIGZpbGVuYW1lCi0gICAgICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JGaWxlbmFtZS5nZXQoZmlsZW5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdHMoZmlsZW5hbWUpKQotICAgICAgICAgICAgICAgICAgICBzZWVuUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB2YW5pc2hlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBuZXcgZmlsZSB0aGF0IGlzIG5vdCBpbiB0aGUgaW5kZXg/Ci0gICAgICAgICAgICAvLyBub3QgaWYgdGhlIGRpZ2VzdCBpcyBrbm93biB0byB0aGUgaW5kZXggYW5kIHRoZSBvcmlnaW5hbCBmaWxlIGlzIGdvbmUgLSB0aGF0J3MgYSByZW5hbWUhCi0gICAgICAgICAgICBTdHJpbmcgZGlnZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpZ2VzdCA9IHNoYURpZ2VzdEZvckZpbGUoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvckRpZ2VzdC5nZXQoZGlnZXN0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbGRGaWxlbmFtZSA9IHJlc291cmNlLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUV4aXN0cyhvbGRGaWxlbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkZpbGUgIiArIGZpbGVuYW1lICsgIiBpcyBhIHJlbmFtZSBvZiAiICsgb2xkRmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0RmlsZW5hbWUoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VlblJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXNvdXJjZUZvckZpbGVuYW1lLmdldChvbGRGaWxlbmFtZSkgPT0gcmVzb3VyY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUucmVtb3ZlKG9sZEZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzb3VyY2VGb3JGaWxlbmFtZS5jb250YWluc0tleShmaWxlbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUucHV0KGZpbGVuYW1lLCByZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHVuYWJsZSB0byByZWFkIGRpZ2VzdC4uLiBubyBwcm9ibGVtLCBpZ25vcmUgdGhlbgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBvaywgdGhpcyByZWFsbHkgaXMgYSBuZXcgWFNEIGZpbGUgdGhlbiwgb2YgdW5rbm93biBVUkwgb3JpZ2luCi0gICAgICAgICAgICBEb3dubG9hZGVkU2NoZW1hRW50cnkgbmV3RW50cnkgPSBhZGROZXdFbnRyeSgpOwotICAgICAgICAgICAgbmV3RW50cnkuc2V0RmlsZW5hbWUoZmlsZW5hbWUpOwotICAgICAgICAgICAgd2FybmluZygiQ2FjaGluZyBpbmZvcm1hdGlvbiBvbiBuZXcgbG9jYWwgZmlsZSAiICsgZmlsZW5hbWUpOwotICAgICAgICAgICAgaWYgKGRpZ2VzdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIG5ld0VudHJ5LnNldFNoYTEoZGlnZXN0KTsKLQotICAgICAgICAgICAgc2VlblJlc291cmNlcy5hZGQodXBkYXRlUmVzb3VyY2UobmV3RW50cnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZWxldGVPbmx5TWVudGlvbmVkKQotICAgICAgICAgICAgZGVsZXRlUmVzb3VyY2VzSW5TZXQodmFuaXNoZWRSZXNvdXJjZXMsIHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZWxldGVSZXNvdXJjZXNJblNldChzZWVuUmVzb3VyY2VzLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXRlcmF0ZXMgdGhyb3VnaCBldmVyeSBlbnRyeSBhbmQgcmVmZXRjaGVzIGl0IGZyb20gaXRzIHByaW1hcnkgVVJMLAotICAgICAqIGlmIGtub3duLiAgUmVwbGFjZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGlmIHRoZSBkYXRhIGlzIGRpZmZlcmVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVkb3dubG9hZEVudHJpZXMoU2NoZW1hUmVzb3VyY2VbXSByZXNvdXJjZXMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcmVkb3dubG9hZFJlc291cmNlKHJlc291cmNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3VyY2VzSW5TZXQoU2V0IHNlZW5SZXNvdXJjZXMsIGJvb2xlYW4gc2V0VG9EZWxldGUpCi0gICAgewotICAgICAgICBTZXQgc2VlbkNhY2hlRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlZW5SZXNvdXJjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpaS5uZXh0KCk7Ci0gICAgICAgICAgICBzZWVuQ2FjaGVFbnRyaWVzLmFkZChyZXNvdXJjZS5fY2FjaGVFbnRyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBEb3dubG9hZGVkU2NoZW1hcyBkb3dubG9hZGVkU2NoZW1hcyA9IF9pbXBvcnRzRG9jLmdldERvd25sb2FkZWRTY2hlbWFzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG93bmxvYWRlZFNjaGVtYXMuc2l6ZU9mRW50cnlBcnJheSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeSBjYWNoZUVudHJ5ID0gZG93bmxvYWRlZFNjaGVtYXMuZ2V0RW50cnlBcnJheShpKTsKLQotICAgICAgICAgICAgaWYgKHNlZW5DYWNoZUVudHJpZXMuY29udGFpbnMoY2FjaGVFbnRyeSkgPT0gc2V0VG9EZWxldGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yQ2FjaGVFbnRyeS5nZXQoY2FjaGVFbnRyeSk7Ci0gICAgICAgICAgICAgICAgd2FybmluZygiUmVtb3Zpbmcgb2Jzb2xldGUgY2FjaGUgZW50cnkgZm9yICIgKyByZXNvdXJjZS5nZXRGaWxlbmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yQ2FjaGVFbnRyeS5yZW1vdmUoY2FjaGVFbnRyeSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IF9yZXNvdXJjZUZvckZpbGVuYW1lLmdldChyZXNvdXJjZS5nZXRGaWxlbmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckZpbGVuYW1lLnJlbW92ZShyZXNvdXJjZS5nZXRGaWxlbmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gX3Jlc291cmNlRm9yRGlnZXN0LmdldChyZXNvdXJjZS5nZXRTaGExKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRGlnZXN0LnJlbW92ZShyZXNvdXJjZS5nZXRTaGExKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBfcmVzb3VyY2VGb3JOYW1lc3BhY2UuZ2V0KHJlc291cmNlLmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvck5hbWVzcGFjZS5yZW1vdmUocmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEZpbmFsbHksIGFueSBvciBhbGwgVVJJcwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB1cmxzID0gcmVzb3VyY2UuZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHVybHMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBfcmVzb3VyY2VGb3JVUkwuZ2V0KHVybHNbal0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvclVSTC5yZW1vdmUodXJsc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkb3dubG9hZGVkU2NoZW1hcy5yZW1vdmVFbnRyeShpKTsKLSAgICAgICAgICAgICAgICBpIC09IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVJlc291cmNlIHVwZGF0ZVJlc291cmNlKERvd25sb2FkZWRTY2hlbWFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIC8vIFRoZSBmaWxlCi0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGVudHJ5LmdldEZpbGVuYW1lKCk7Ci0gICAgICAgIGlmIChmaWxlbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgU2NoZW1hUmVzb3VyY2UoZW50cnkpOwotICAgICAgICBfcmVzb3VyY2VGb3JDYWNoZUVudHJ5LnB1dChlbnRyeSwgcmVzb3VyY2UpOwotCi0gICAgICAgIGlmICghX3Jlc291cmNlRm9yRmlsZW5hbWUuY29udGFpbnNLZXkoZmlsZW5hbWUpKQotICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUucHV0KGZpbGVuYW1lLCByZXNvdXJjZSk7Ci0KLSAgICAgICAgLy8gVGhlIGRpZ2VzdAotICAgICAgICBTdHJpbmcgZGlnZXN0ID0gcmVzb3VyY2UuZ2V0U2hhMSgpOwotICAgICAgICBpZiAoZGlnZXN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3Jlc291cmNlRm9yRGlnZXN0LmNvbnRhaW5zS2V5KGRpZ2VzdCkpCi0gICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRGlnZXN0LnB1dChkaWdlc3QsIHJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5leHQsIHRoZSBuYW1lc3BhY2UKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlc291cmNlLmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3Jlc291cmNlRm9yTmFtZXNwYWNlLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSkpCi0gICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yTmFtZXNwYWNlLnB1dChuYW1lc3BhY2UsIHJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmFsbHksIGFueSBvciBhbGwgVVJJcwotICAgICAgICBTdHJpbmdbXSB1cmxzID0gcmVzb3VyY2UuZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHVybHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3Jlc291cmNlRm9yVVJMLmNvbnRhaW5zS2V5KHVybHNbal0pKQotICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvclVSTC5wdXQodXJsc1tqXSwgcmVzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIERpZ2VzdElucHV0U3RyZWFtIGRpZ2VzdElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KQotICAgIHsKLSAgICAgICAgTWVzc2FnZURpZ2VzdCBzaGE7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzaGEgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gc3RyID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKGlucHV0LCBzaGEpOwotCi0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEb3dubG9hZGVkU2NoZW1hRW50cnkgYWRkTmV3RW50cnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbXBvcnRzRG9jLmdldERvd25sb2FkZWRTY2hlbWFzKCkuYWRkTmV3RW50cnkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNjaGVtYVJlc291cmNlIGltcGxlbWVudHMgU2NoZW1hSW1wb3J0UmVzb2x2ZXIuU2NoZW1hUmVzb3VyY2UKLSAgICB7Ci0gICAgICAgIFNjaGVtYVJlc291cmNlKERvd25sb2FkZWRTY2hlbWFFbnRyeSBlbnRyeSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NhY2hlRW50cnkgPSBlbnRyeTsKLSAgICAgICAgfQotCi0gICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeSBfY2FjaGVFbnRyeTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jYWNoZUVudHJ5LnNldEZpbGVuYW1lKGZpbGVuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NhY2hlRW50cnkuZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3RzKGdldEZpbGVuYW1lKCkpKQotICAgICAgICAgICAgICAgIHJlZG93bmxvYWRSZXNvdXJjZSh0aGlzKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoaW5wdXRTdHJlYW1Gb3JGaWxlKGdldEZpbGVuYW1lKCkpKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gcmV0dXJuIG51bGwgaWYgX2FueV8gcHJvYmxlbXMgcmVhZGluZyBzY2hlbWEgZmlsZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaGExKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUVudHJ5LmdldFNoYTEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUVudHJ5LmdldE5hbWVzcGFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jYWNoZUVudHJ5LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY2FjaGVFbnRyeS5zaXplT2ZTY2hlbWFMb2NhdGlvbkFycmF5KCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBfY2FjaGVFbnRyeS5nZXRTY2hlbWFMb2NhdGlvbkFycmF5KDApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY2FjaGVFbnRyeS5nZXRTY2hlbWFMb2NhdGlvbkFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldEZpbGVuYW1lKCkuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBvYmogfHwgZ2V0RmlsZW5hbWUoKS5lcXVhbHMoKChTY2hlbWFSZXNvdXJjZSlvYmopLmdldEZpbGVuYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkU2NoZW1hTG9jYXRpb24oU3RyaW5nIHNjaGVtYUxvY2F0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY2FjaGVFbnRyeS5hZGRTY2hlbWFMb2NhdGlvbihzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgSW1wb3J0TG9hZGVyIHdpc2hlcyB0byByZXNvbHZlIHRoZQotICAgICAqIGdpdmVuIGltcG9ydC4gIFNob3VsZCByZXR1cm4gYSBTY2hlbWFSZXNvdXJjZSB3aG9zZQotICAgICAqICJlcXVhbHMiIHJlbGF0aW9uc2hpcCByZXZlYWxzIHdoZW4gYSBTY2hlbWFSZXNvdXJjZSBpcwotICAgICAqIGR1cGxpY2F0ZWQgYW5kIHNob3VsZG4ndCBiZSBleGFtaW5lZCBhZ2Fpbi4KLSAgICAgKgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHNob3VsZCBiZSBpZ25vcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFJbXBvcnRSZXNvbHZlci5TY2hlbWFSZXNvdXJjZSBsb29rdXBSZXNvdXJjZShTdHJpbmcgbnNVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIFNjaGVtYVJlc291cmNlIHJlc3VsdCA9IGZldGNoRnJvbUNhY2hlKG5zVVJJLCBzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9yZWRvd25sb2FkU2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVkb3dubG9hZFJlc291cmNlKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIk5vIGNhY2hlZCBzY2hlbWEgZm9yIG5hbWVzcGFjZSAnIiArIG5zVVJJICsgIicsIGFuZCBubyB1cmwgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IGNvcHlPcklkZW50aWZ5RHVwbGljYXRlVVJMKHNjaGVtYUxvY2F0aW9uLCBuc1VSSSk7Ci0gICAgICAgIGlmIChfcmVkb3dubG9hZFNldCAhPSBudWxsKQotICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQuYWRkKHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFSZXNvdXJjZSBmZXRjaEZyb21DYWNoZShTdHJpbmcgbnNVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIFNjaGVtYVJlc291cmNlIHJlc3VsdDsKLQotICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvclVSTC5nZXQoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnNVUkkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvck5hbWVzcGFjZS5nZXQobnNVUkkpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1bmlxdWVGaWxlbmFtZUZvclVSSShTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgbG9jYWxGaWxlbmFtZSA9IG5ldyBVUkkoIHNjaGVtYUxvY2F0aW9uICkuZ2V0UmF3UGF0aCgpOwotICAgICAgICBpbnQgaSA9IGxvY2FsRmlsZW5hbWUubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgaWYgKGkgPj0gMCkKLSAgICAgICAgICAgIGxvY2FsRmlsZW5hbWUgPSBsb2NhbEZpbGVuYW1lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgIGlmIChsb2NhbEZpbGVuYW1lLmVuZHNXaXRoKCIueHNkIikpCi0gICAgICAgICAgICBsb2NhbEZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZS5zdWJzdHJpbmcoMCwgbG9jYWxGaWxlbmFtZS5sZW5ndGgoKSAtIDQpOwotICAgICAgICBpZiAobG9jYWxGaWxlbmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgbG9jYWxGaWxlbmFtZSA9ICJzY2hlbWEiOwotCi0gICAgICAgIC8vIFRPRE86IHJlbW92ZSBvdGhlciB1bnNhZmUgY2hhcmFjdGVycyBmb3IgZmlsZW5hbWVzPwotCi0gICAgICAgIFN0cmluZyBjYW5kaWRhdGVGaWxlbmFtZSA9IGxvY2FsRmlsZW5hbWU7Ci0gICAgICAgIGludCBzdWZmaXggPSAxOwotICAgICAgICB3aGlsZSAoc3VmZml4IDwgMTAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZSA9IF9kZWZhdWx0Q29weURpcmVjdG9yeSArICIvIiArIGNhbmRpZGF0ZUZpbGVuYW1lICsgIi54c2QiOwotICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3RzKGNhbmRpZGF0ZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZTsKLSAgICAgICAgICAgIHN1ZmZpeCArPSAxOwotICAgICAgICAgICAgY2FuZGlkYXRlRmlsZW5hbWUgPSBsb2NhbEZpbGVuYW1lICsgc3VmZml4OwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJQcm9ibGVtIHdpdGggZmlsZW5hbWUgIiArIGxvY2FsRmlsZW5hbWUgKyAiLnhzZCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWRvd25sb2FkUmVzb3VyY2UoU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UpCi0gICAgewotICAgICAgICBpZiAoX3JlZG93bmxvYWRTZXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9yZWRvd25sb2FkU2V0LmNvbnRhaW5zKHJlc291cmNlKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBfcmVkb3dubG9hZFNldC5hZGQocmVzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gcmVzb3VyY2UuZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGRpZ2VzdCA9IG51bGw7Ci0KLSAgICAgICAgLy8gbm90aGluZyB0byBkbz8KLSAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwgfHwgZmlsZW5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCggc2NoZW1hTG9jYXRpb24gKTsKLSAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCAiQXBhY2hlIFhNTEJlYW5zLzEuMC4yIik7Ci0gICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiIpOwotICAgICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gaW5wdXQgPSBkaWdlc3RJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGlucHV0LCBidWZmZXIpOwotICAgICAgICAgICAgZGlnZXN0ID0gSGV4QmluLmJ5dGVzVG9TdHJpbmcoaW5wdXQuZ2V0TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjb3B5IHJlbW90ZSByZXNvdXJjZSAiICsgc2NoZW1hTG9jYXRpb24gKyAiOiIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlnZXN0LmVxdWFscyhyZXNvdXJjZS5nZXRTaGExKCkpICYmIGZpbGVFeGlzdHMoZmlsZW5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJSZXNvdXJjZSAiICsgZmlsZW5hbWUgKyAiIGlzIHVuY2hhbmdlZCBmcm9tICIgKyBzY2hlbWFMb2NhdGlvbiArICIuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc291cmNlID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoc291cmNlLCBmaWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICIgKyBmaWxlbmFtZSArICIgZm9yICIgKyBzY2hlbWFMb2NhdGlvbiArICI6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdhcm5pbmcoIlJlZnJlc2hlZCAiICsgZmlsZW5hbWUgKyAiIGZyb20gIiArIHNjaGVtYUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVJlc291cmNlIGNvcHlPcklkZW50aWZ5RHVwbGljYXRlVVJMKFN0cmluZyBzY2hlbWFMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRGaWxlbmFtZTsKLSAgICAgICAgU3RyaW5nIGRpZ2VzdDsKLSAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzdWx0OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlbmFtZSA9IHVuaXF1ZUZpbGVuYW1lRm9yVVJJKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkludmFsaWQgVVJJICciICsgc2NoZW1hTG9jYXRpb24gKyAiJzoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgbG9jYWwgZmlsZSBmb3IgIiArIHNjaGVtYUxvY2F0aW9uICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoIHNjaGVtYUxvY2F0aW9uICk7Ci0gICAgICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBpbnB1dCA9IGRpZ2VzdElucHV0U3RyZWFtKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgICAgd3JpdGVJbnB1dFN0cmVhbVRvRmlsZShpbnB1dCwgdGFyZ2V0RmlsZW5hbWUpOwotICAgICAgICAgICAgZGlnZXN0ID0gSGV4QmluLmJ5dGVzVG9TdHJpbmcoaW5wdXQuZ2V0TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjb3B5IHJlbW90ZSByZXNvdXJjZSAiICsgc2NoZW1hTG9jYXRpb24gKyAiOiIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JEaWdlc3QuZ2V0KGRpZ2VzdCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlRmlsZSh0YXJnZXRGaWxlbmFtZSk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkU2NoZW1hTG9jYXRpb24oc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKCFfcmVzb3VyY2VGb3JVUkwuY29udGFpbnNLZXkoc2NoZW1hTG9jYXRpb24pKQotICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvclVSTC5wdXQoc2NoZW1hTG9jYXRpb24sIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgd2FybmluZygiRG93bmxvYWRlZCAiICsgc2NoZW1hTG9jYXRpb24gKyAiIHRvICIgKyB0YXJnZXRGaWxlbmFtZSk7Ci0KLSAgICAgICAgRG93bmxvYWRlZFNjaGVtYUVudHJ5IG5ld0VudHJ5ID0gYWRkTmV3RW50cnkoKTsKLSAgICAgICAgbmV3RW50cnkuc2V0RmlsZW5hbWUodGFyZ2V0RmlsZW5hbWUpOwotICAgICAgICBuZXdFbnRyeS5zZXRTaGExKGRpZ2VzdCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIG5ld0VudHJ5LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBuZXdFbnRyeS5hZGRTY2hlbWFMb2NhdGlvbihzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIHJldHVybiB1cGRhdGVSZXNvdXJjZShuZXdFbnRyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhY3R1YWwgbmFtZXNwYWNlIGluIHRoZSB0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXBvcnRBY3R1YWxOYW1lc3BhY2UoU2NoZW1hSW1wb3J0UmVzb2x2ZXIuU2NoZW1hUmVzb3VyY2UgcnJlc291cmNlLCBTdHJpbmcgYWN0dWFsTmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpcnJlc291cmNlOwotICAgICAgICBTdHJpbmcgb2xkTmFtZXNwYWNlID0gcmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChvbGROYW1lc3BhY2UgIT0gbnVsbCAmJiBfcmVzb3VyY2VGb3JOYW1lc3BhY2UuZ2V0KG9sZE5hbWVzcGFjZSkgPT0gcmVzb3VyY2UpCi0gICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucmVtb3ZlKG9sZE5hbWVzcGFjZSk7Ci0gICAgICAgIGlmICghX3Jlc291cmNlRm9yTmFtZXNwYWNlLmNvbnRhaW5zS2V5KGFjdHVhbE5hbWVzcGFjZSkpCi0gICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucHV0KGFjdHVhbE5hbWVzcGFjZSwgcmVzb3VyY2UpOwotICAgICAgICByZXNvdXJjZS5zZXROYW1lc3BhY2UoYWN0dWFsTmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzaGFEaWdlc3RGb3JGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBzdHIgPSBkaWdlc3RJbnB1dFN0cmVhbShpbnB1dFN0cmVhbUZvckZpbGUoZmlsZW5hbWUpKTsKLQotICAgICAgICBieXRlW10gZHVtbXkgPSBuZXcgYnl0ZVs0MDk2XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPiAwOyBpID0gc3RyLnJlYWQoZHVtbXkpKTsKLQotICAgICAgICBzdHIuY2xvc2UoKTsKLQotICAgICAgICByZXR1cm4gSGV4QmluLmJ5dGVzVG9TdHJpbmcoc3RyLmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7Ci0gICAgfQotCi0gICAgLy8gU09NRSBNRVRIT0RTIFRPIE9WRVJSSURFID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5kZXhGaWxlbmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gIi4veHNkb3dubG9hZC54bWwiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYURpcigpCi0gICAgewotICAgICAgICByZXR1cm4gIi4vc2NoZW1hIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9kdWNlcyBkaWFnbm9zdGljIG1lc3NhZ2VzIHN1Y2ggYXMgImRvd25sb2FkaW5nIFggdG8gZmlsZSBZIi4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3YXJuaW5nKFN0cmluZyBtc2cpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWxlbmFtZSBleGlzdHMuICBUaGUgZmlsZW5hbWVzCi0gICAgICogYXJlIG9mIHRoZSBmb3JtICIvZm9vL2Jhci96ZWUueHNkIiBhbmQgc2hvdWxkIGJlIGNvbnN0cnVlZAotICAgICAqIGFzIHJvb3RlZCBhdCB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlRXhpc3RzKFN0cmluZyBmaWxlbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBmaWxlbmFtZSBhcyBhbiBJbnB1dFN0cmVhbS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGVudGlyZSBmaWxlIGluIG9uZSBzdGVwLiAgQW4gSW5wdXRTdHJlYW0gaXMgcGFzc2VkIGFuZAotICAgICAqIGNvcGllZCB0byB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3cml0ZUlucHV0U3RyZWFtVG9GaWxlKElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBmaWxlLiAgU29tZXRpbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHdyaXRpbmcgYSBuZXcgZmlsZQotICAgICAqIHdlIG5vdGljZSB0aGF0IGl0J3MgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiBleGlzdGluZyBmaWxlIGFuZAotICAgICAqIHdlIGRlbGV0ZSBpdC4gV2UgbmV2ZXIgZGVsZXRlIGEgZmlsZSB0aGF0IHdhcyBnaXZlbiB0byB1cwotICAgICAqIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgWFNEIGZpbGVzbmFtZXMgaW4gdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFsbFhTREZpbGVuYW1lcygpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29kZUdlblV0aWwuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvZGVHZW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZmRhODguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29kZUdlblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29kZUdlblV0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX01FTV9TVEFSVCA9ICI4bSI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9NRU1fTUFYID0gIjI1Nm0iOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09NUElMRVIgPSAiamF2YWMiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfSkFSID0gImphciI7Ci0KLSAgICAvL3dvcmthcm91bmQgZm9yIFN1biBidWcgIyA0NzIzNzI2Ci0gICAgcHVibGljIHN0YXRpYyBVUkkgcmVzb2x2ZShVUkkgYmFzZSwgVVJJIGNoaWxkKQotICAgIHsKLSAgICAgICAgVVJJIHJ1cmkgPSBiYXNlLnJlc29sdmUoY2hpbGQpOwotICAgICAgICAKLSAgICAgICAgLy9maXggdXAgbm9ybWFsaXphdGlvbiBidWcKLSAgICAgICAgaWYgKCJmaWxlIi5lcXVhbHMocnVyaS5nZXRTY2hlbWUoKSkgJiYgISBjaGlsZC5lcXVhbHMocnVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiYXNlLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvLyIpICYmICFydXJpLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvLyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gIi8vLyIuY29uY2F0KHJ1cmkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1cmkgPSBuZXcgVVJJKCJmaWxlIiwgbnVsbCwgcGF0aCwgcnVyaS5nZXRRdWVyeSgpLCBydXJpLmdldEZyYWdtZW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChVUklTeW50YXhFeGNlcHRpb24gdXJpcykKLSAgICAgICAgICAgICAgICB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydXJpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBhZGRBbGxKYXZhRmlsZXMoTGlzdCBzcmNGaWxlcywgTGlzdCBhcmdzKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3JjRmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWYuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmdzLmFkZChxdW90ZUFuZEVzY2FwZUZpbGVuYW1lKGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IGluc2lkZSA9IChBcnJheXMuYXNMaXN0KGYubGlzdEZpbGVzKAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHx8IGZpbGUuaXNEaXJlY3RvcnkoKTsgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKSkpOwotICAgICAgICAgICAgICAgIGFkZEFsbEphdmFGaWxlcyhpbnNpZGUsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIHF1b3RlQW5kRXNjYXBlRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgLy8gZG9uJ3QgcXVvdGUgaWYgdGhlcmUncyBubyBzcGFjZQotICAgICAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZigiICIpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZTsKLQotICAgICAgICAvLyBiaXphcnJlLiAgamF2YWMgZXhwZWN0cyBiYWNrc2xhc2ggZXNjYXBpbmcgaWYgd2UgcXVvdGUgdGhlIGNsYXNzcGF0aAotICAgICAgICAvLyBiaXphcnJlIGFsc28uICByZXBsYWNlQWxsIGV4cGVjdHMgcmVwbGFjZW1lbnQgYmFja3NsYXNoZXMgdG8gYmUgZG91YmxlIGVzY2FwZWQuCi0gICAgICAgIHJldHVybiAiXCIiICsgZmlsZW5hbWUucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcXFxcXCIpICsgIlwiIjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgcXVvdGVOb0VzY2FwZUZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIGRvbid0IHF1b3RlIGlmIHRoZXJlJ3Mgbm8gc3BhY2UsIGFuZCBkb24ndCBxdW90ZSBvbiBsaW51eAotICAgICAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZigiICIpIDwgMCB8fCBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJy8nKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lOwotCi0gICAgICAgIHJldHVybiAiXCIiICsgZmlsZW5hbWUgKyAiXCIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgamF2YWMgb24gdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgaW4gb3JkZXIgdG8gdHVybiB0aGVtCi0gICAgICogaW50byBiaW5hcnkgZmlsZXMgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkuICBUaGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBvZgotICAgICAqIDxjb2RlPkdlbkZpbGU8L2NvZGU+cyBmb3IgYWxsIG9mIHRoZSBjbGFzc2VzIHByb2R1Y2VkIG9yIG51bGwgaWYgYW4KLSAgICAgKiBlcnJvciBvY2N1cnJlZC4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGV4dGVybmFsQ29tcGlsZShMaXN0IHNyY0ZpbGVzLCBGaWxlIG91dGRpciwgRmlsZVtdIGNwLCBib29sZWFuIGRlYnVnKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dGVybmFsQ29tcGlsZShzcmNGaWxlcywgb3V0ZGlyLCBjcCwgZGVidWcsIERFRkFVTFRfQ09NUElMRVIsIERFRkFVTFRfTUVNX1NUQVJULCBERUZBVUxUX01FTV9NQVgsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBqYXZhYyBvbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBpbiBvcmRlciB0byB0dXJuIHRoZW0KLSAgICAgKiBpbnRvIGJpbmFyeSBmaWxlcyBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCByZXR1cm4gYSBsaXN0IG9mCi0gICAgICogPGNvZGU+R2VuRmlsZTwvY29kZT5zIGZvciBhbGwgb2YgdGhlIGNsYXNzZXMgcHJvZHVjZWQgb3IgbnVsbCBpZiBhbgotICAgICAqIGVycm9yIG9jY3VycmVkLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBleHRlcm5hbENvbXBpbGUoTGlzdCBzcmNGaWxlcywgRmlsZSBvdXRkaXIsIEZpbGVbXSBjcCwgYm9vbGVhbiBkZWJ1ZywgU3RyaW5nIGphdmFjUGF0aCwgU3RyaW5nIG1lbVN0YXJ0LCBTdHJpbmcgbWVtTWF4LCAgYm9vbGVhbiBxdWlldCwgYm9vbGVhbiB2ZXJib3NlKQotICAgIHsKLSAgICAgICAgTGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIEZpbGUgamF2YWMgPSBmaW5kSmF2YVRvb2woamF2YWNQYXRoID09IG51bGwgPyBERUZBVUxUX0NPTVBJTEVSIDogamF2YWNQYXRoKTsKLSAgICAgICAgYXNzZXJ0IChqYXZhYy5leGlzdHMoKSkgOiAiY29tcGlsZXIgbm90IGZvdW5kICIgKyBqYXZhYzsKLSAgICAgICAgYXJncy5hZGQoamF2YWMuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgIGlmIChvdXRkaXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0ZGlyID0gbmV3IEZpbGUoIi4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyZ3MuYWRkKCItZCIpOwotICAgICAgICAgICAgYXJncy5hZGQocXVvdGVBbmRFc2NhcGVGaWxlbmFtZShvdXRkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjcCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcCA9IHN5c3RlbUNsYXNzcGF0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNwLmxlbmd0aCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjbGFzc1BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAvLyBBZGQgdGhlIG91dHB1dCBkaXJlY3RvcnkgdG8gdGhlIGNsYXNzcGF0aC4gIFdlIGRvIHRoaXMgc28gdGhhdAotICAgICAgICAgICAgLy8gamF2YWMgd2lsbCBiZSBhYmxlIHRvIGZpbmQgY2xhc3NlcyB0aGF0IHdlcmUgY29tcGlsZWQKLSAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgYnV0IGFyZSBub3QgaW4gdGhlIGxpc3Qgb2Ygc291cmNlcyB0aGlzIHRpbWUuCi0gICAgICAgICAgICBjbGFzc1BhdGguYXBwZW5kKG91dGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBldmVyeXRoaW5nIG9uIG91ciBjbGFzc3BhdGguCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsYXNzUGF0aC5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICBjbGFzc1BhdGguYXBwZW5kKGNwW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXJncy5hZGQoIi1jbGFzc3BhdGgiKTsKLQotICAgICAgICAgICAgLy8gYml6YXJyZS4gIGphdmFjIGV4cGVjdHMgYmFja3NsYXNoIGVzY2FwaW5nIGlmIHdlIHF1b3RlIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgICAgIGFyZ3MuYWRkKHF1b3RlQW5kRXNjYXBlRmlsZW5hbWUoY2xhc3NQYXRoLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFyZ3MuYWRkKCItc291cmNlIik7Ci0gICAgICAgIGFyZ3MuYWRkKCIxLjQiKTsKLQotICAgICAgICBhcmdzLmFkZChkZWJ1ZyA/ICItZyIgOiAiLWc6bm9uZSIpOwotCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgYXJncy5hZGQoIi12ZXJib3NlIik7Ci0KLSAgICAgICAgYWRkQWxsSmF2YUZpbGVzKHNyY0ZpbGVzLCBhcmdzKTsKLQotICAgICAgICBGaWxlIGNsRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjbEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJqYXZhYyIsICIiKTsKLSAgICAgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihjbEZpbGUpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGFyZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGZvciAoaS5uZXh0KCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmdy53cml0ZShhcmcpOwotICAgICAgICAgICAgICAgIGZ3LndyaXRlKCdcbicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZncuY2xvc2UoKTsKLSAgICAgICAgICAgIExpc3QgbmV3YXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG5ld2FyZ3MuYWRkKGFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1lbVN0YXJ0ICE9IG51bGwgJiYgbWVtU3RhcnQubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAgICAgICBuZXdhcmdzLmFkZCgiLUotWG1zIiArIG1lbVN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChtZW1NYXggIT0gbnVsbCAmJiBtZW1NYXgubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAgICAgICBuZXdhcmdzLmFkZCgiLUotWG14IiArIG1lbU1heCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5ld2FyZ3MuYWRkKCJAIiArIGNsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBhcmdzID0gbmV3YXJnczsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGNyZWF0ZSBjb21tYW5kLWxpbmUgZmlsZSBmb3IgamF2YWMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcmdzID0gKFN0cmluZ1tdKSBhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1thcmdzLnNpemUoKV0pOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJjb21waWxlIGNvbW1hbmQ6Iik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJBcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIiArIHN0ckFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBQcm9jZXNzIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKHN0ckFyZ3MpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyb3JCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBUaHJlYWRlZFJlYWRlciBvdXQgPSBuZXcgVGhyZWFkZWRSZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBvdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgVGhyZWFkZWRSZWFkZXIgZXJyID0gbmV3IFRocmVhZGVkUmVhZGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSwgZXJyb3JCdWZmZXIpOwotCi0gICAgICAgICAgICBwcm9jLndhaXRGb3IoKTsKLQotICAgICAgICAgICAgaWYgKHZlcmJvc2UgfHwgcHJvYy5leGl0VmFsdWUoKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvdXRwdXRCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVycm9yQnVmZmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHByb2MuZXhpdFZhbHVlKCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24gKQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiJ2phdmFjJyBpcyByZXF1aXJlZCBvbiB0aGUgcGF0aC4iKTsKLQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgY2xGaWxlLmRlbGV0ZSgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZVtdIHN5c3RlbUNsYXNzcGF0aCgpCi0gICAgewotICAgICAgICBMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBzeXN0ZW1jcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeXN0ZW1jcC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY3AuYWRkKG5ldyBGaWxlKHN5c3RlbWNwW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGaWxlW10pY3AudG9BcnJheShuZXcgRmlsZVtjcC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGJvb2xlYW4gZXh0ZXJuYWxKYXIoRmlsZSBzcmNkaXIsIEZpbGUgb3V0ZmlsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRlcm5hbEphcihzcmNkaXIsIG91dGZpbGUsIERFRkFVTFRfSkFSLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBleHRlcm5hbEphcihGaWxlIHNyY2RpciwgRmlsZSBvdXRmaWxlLCBTdHJpbmcgamFyUGF0aCwgYm9vbGVhbiBxdWlldCwgYm9vbGVhbiB2ZXJib3NlKQotICAgIHsKLSAgICAgICAgTGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIEZpbGUgamFyID0gZmluZEphdmFUb29sKGphclBhdGggPT0gbnVsbCA/IERFRkFVTFRfSkFSIDogamFyUGF0aCk7Ci0gICAgICAgIGFzc2VydCAoamFyLmV4aXN0cygpKSA6ICJqYXIgbm90IGZvdW5kICIgKyBqYXI7Ci0gICAgICAgIGFyZ3MuYWRkKGphci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgYXJncy5hZGQoImNmIiArICh2ZXJib3NlID8gInYiIDogIiIpKTsKLSAgICAgICAgYXJncy5hZGQocXVvdGVOb0VzY2FwZUZpbGVuYW1lKG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotICAgICAgICBhcmdzLmFkZCgiLUMiKTsKLSAgICAgICAgYXJncy5hZGQocXVvdGVOb0VzY2FwZUZpbGVuYW1lKHNyY2Rpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCi0gICAgICAgIGFyZ3MuYWRkKCIuIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFyZ3MgPSAoU3RyaW5nW10pIGFyZ3MudG9BcnJheShuZXcgU3RyaW5nW2FyZ3Muc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoImphciBjb21tYW5kOiIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJncy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIgKyBzdHJBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgUHJvY2VzcyBwcm9jID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhzdHJBcmdzKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVycm9yQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgVGhyZWFkZWRSZWFkZXIgb3V0ID0gbmV3IFRocmVhZGVkUmVhZGVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgb3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgIFRocmVhZGVkUmVhZGVyIGVyciA9IG5ldyBUaHJlYWRlZFJlYWRlcihwcm9jLmdldEVycm9yU3RyZWFtKCksIGVycm9yQnVmZmVyKTsKLQotICAgICAgICAgICAgcHJvYy53YWl0Rm9yKCk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlIHx8IHByb2MuZXhpdFZhbHVlKCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnJvckJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGVycm9yQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByb2MuZXhpdFZhbHVlKCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9vayBmb3IgdG9vbCBpbiBjdXJyZW50IGRpcmVjdG9yeSBhbmQgJHtKQVZBX0hPTUV9Ly4uL2JpbiBhbmQKLSAgICAgKiB0cnkgd2l0aCAuZXhlIGZpbGUgZXh0ZW5zaW9uLgotICAgICAqLyAKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGZpbmRKYXZhVG9vbChTdHJpbmcgdG9vbCkKLSAgICB7Ci0gICAgICAgIEZpbGUgdG9vbEZpbGUgPSBuZXcgRmlsZSh0b29sKTsKLSAgICAgICAgaWYgKHRvb2xGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdG9vbEZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKHRvb2wgKyAiLmV4ZSIpOwotICAgICAgICBpZiAocmVzdWx0LmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0KLSAgICAgICAgU3RyaW5nIHNlcCAgPSBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGUoaG9tZSArIHNlcCArICIuLiIgKyBzZXAgKyAiYmluIiwgdG9vbCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0LmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBuZXcgRmlsZShyZXN1bHQuZ2V0UGF0aCgpICsgIi5leGUiKTsKLSAgICAgICAgaWYgKHJlc3VsdC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKGhvbWUgKyBzZXAgKyAiYmluIiwgdG9vbCk7Ci0gICAgICAgIGlmIChyZXN1bHQuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBuZXcgRmlsZShyZXN1bHQuZ2V0UGF0aCgpICsgIi5leGUiKTsKLSAgICAgICAgaWYgKHJlc3VsdC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCB0b29sRmlsZSBhbmQgaG9wZSB0aGF0IGl0IGlzIG9uIHRoZSBQQVRILgotICAgICAgICByZXR1cm4gdG9vbEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBpbnRvIHRoZSBnaXZlbiBidWZmZXIgdW50aWwgdGhlcmUgaXMKLSAgICAgKiBub3RoaW5nIGxlZnQgdG8gcmVhZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUaHJlYWRlZFJlYWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIFRocmVhZGVkUmVhZGVyKElucHV0U3RyZWFtIHN0cmVhbSwgZmluYWwgU3RyaW5nQnVmZmVyIG91dHB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCi0gICAgICAgICAgICBUaHJlYWQgcmVhZGVyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChzICsgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmVhZGVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db21tYW5kTGluZS5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29tbWFuZExpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZWEwNC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db21tYW5kTGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lCi17Ci0gICAgcHVibGljIENvbW1hbmRMaW5lKFN0cmluZ1tdIGFyZ3MsIENvbGxlY3Rpb24gc2NoZW1lKQotICAgIHsKLSAgICAgICAgX29wdGlvbnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBBcnJheUxpc3QgZW5kYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmluZGV4T2YoJy0nKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBvcHQgPSBhcmdzW2ldLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgc2NoZW1lLmNvbnRhaW5zKG9wdCkgJiYgaSA8IGFyZ3MubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKLQotICAgICAgICAgICAgICAgIF9vcHRpb25zLnB1dChvcHQsIHZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5kYXJncy5hZGQoYXJnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBfYXJncyA9IChTdHJpbmdbXSllbmRhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1tlbmRhcmdzLnNpemUoKV0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRMaWNlbnNlKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoQ29tbWFuZExpbmUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJsaWNlbnNlLnR4dCIpLCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGljZW5zZSBhdmFpbGFibGUgaW4gdGhpcyBKQVIgaW4gbGljZW5zZS50eHQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIF9vcHRpb25zOwotICAgIHByaXZhdGUgU3RyaW5nW10gX2FyZ3M7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gYXJncygpCi0gICAgewotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW19hcmdzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2FyZ3MsIDAsIHJlc3VsdCwgMCwgX2FyZ3MubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wdChTdHJpbmcgb3B0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpX29wdGlvbnMuZ2V0KG9wdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBjb2xsZWN0RmlsZXMoRmlsZVtdIGRpcnMpCi0gICAgewotICAgICAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IGRpcnNbaV07Ci0gICAgICAgICAgICBpZiAoIWYuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGQoZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZXMuYWRkQWxsKGNvbGxlY3RGaWxlcyhmLmxpc3RGaWxlcygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBfZmlsZXM7Ci0gICAgcHJpdmF0ZSBGaWxlIF9iYXNlRGlyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVbXSBFTVBUWV9GSUxFQVJSQVkgPSBuZXcgRmlsZVswXTsKLQotICAgIHByaXZhdGUgTGlzdCBnZXRGaWxlTGlzdCgpCi0gICAgewotICAgICAgICBpZiAoX2ZpbGVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBhcmdzKCk7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVthcmdzLmxlbmd0aF07Ci0gICAgICAgICAgICBib29sZWFuIG5vQmFzZURpciA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVzW2ldID0gbmV3IEZpbGUoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFub0Jhc2VEaXIgJiYgKF9iYXNlRGlyID09IG51bGwpKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgX2Jhc2VEaXIgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgX2Jhc2VEaXIgPSBmaWxlc1tpXS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSBjdXJyVXJpID0gZmlsZXNbaV0udG9VUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgb24gdGhlIGJhc2VkaXIuIFRoZXJlIG1heSBiZSBub25lCi0gICAgICAgICAgICAgICAgICAgIGlmIChfYmFzZURpciAhPSBudWxsICYmIF9iYXNlRGlyLnRvVVJJKCkucmVsYXRpdml6ZShjdXJyVXJpKS5lcXVhbHMoY3VyclVyaSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9iYXNlRGlyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vQmFzZURpciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZmlsZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNvbGxlY3RGaWxlcyhmaWxlcykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfZmlsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGVbXSBnZXRGaWxlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEZpbGVbXSlnZXRGaWxlTGlzdCgpLnRvQXJyYXkoRU1QVFlfRklMRUFSUkFZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRCYXNlRGlyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmFzZURpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZVtdIGZpbGVzRW5kaW5nV2l0aChTdHJpbmcgZXh0KQotICAgIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEZpbGVMaXN0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoZXh0KSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGYpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRmlsZVtdKXJlc3VsdC50b0FycmF5KEVNUFRZX0ZJTEVBUlJBWSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRXh0ZW5zaW9uLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkN2I4ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotCi0gLyoqCi0gICogQW4gZXh0ZW5zaW9uIGlzIGEgamF2YWJlYW4gdGhhdCByZXByZXNlbnRzIGEgU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24gdG8gYmUgcGFzc2VkIGZvciBjYWxsYmFjayBpbnRvIHRoZQotICAqICBYbWxCZWFucyBTY2hlbWEgQ29tcGlsZXIuCi0gICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uIHsKLSAgICAgICAgcHJpdmF0ZSBDbGFzcyBjbGFzc05hbWU7Ci0gICAgICAgIHByaXZhdGUgTGlzdCBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHVibGljIENsYXNzIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoQ2xhc3MgY2xhc3NOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgTGlzdCBnZXRQYXJhbXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBhcmFtIGNyZWF0ZVBhcmFtKCkgewotICAgICAgICAgICAgUGFyYW0gcCA9IG5ldyBQYXJhbSgpOwotICAgICAgICAgICAgcGFyYW1zLmFkZChwKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgUGFyYW0gaXMganVzdCBhIG5hbWUgdmFsdWUgcGFpciBhcHBsaWNhYmxlIHRvIHRoZSBleHRlbnNpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgY2xhc3MgUGFyYW0gewotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0ZhY3RvckltcG9ydHMuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0ZhY3RvckltcG9ydHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwOTA1Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9GYWN0b3JJbXBvcnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuVG9wTGV2ZWxDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsRWxlbWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsQXR0cmlidXRlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuTmFtZWRHcm91cDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLk5hbWVkQXR0cmlidXRlR3JvdXA7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Gb3JtQ2hvaWNlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuSW5jbHVkZURvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgcHJvZ3JhbSB0YWtlcyBhIGNvbGxlY3Rpb24gb2YgLnhzZCBmaWxlcyBhcyBpbnB1dCwgZmluZHMgYWxsIGR1cGxpY2F0ZQotICogbmFtZSBkZWZpbml0aW9ucywgYW5kIGZhY3RvcnMgb3V0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBlYWNoIG9mIHRob3NlIGludG8KLSAqIGEgY29tbW9uLnhzZCBmaWxlLCBhZGRpbmcgYW4gYXBwcm9wcmlhdGUgPGltcG9ydD4gc3RhdGVtZW50IGluIHRoZSBvcmlnaW5hbAotICogeHNkIGZpbGUuCi0gKi8gCi1wdWJsaWMgY2xhc3MgRmFjdG9ySW1wb3J0cwotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsiaW1wb3J0IiwgIm91dCJ9KSk7Ci0gICAgICAgIGlmIChjbC5nZXRPcHQoImxpY2Vuc2UiKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kTGluZS5wcmludExpY2Vuc2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJncyA9IGNsLmFyZ3MoKTsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVmYWN0b3JzIGEgZGlyZWN0b3J5IG9mIC54c2QgZmlsZXMgdG8gcmVtb3ZlIG5hbWUgY29uZmxpY3RzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZmFjdG9yIFstaW1wb3J0IGNvbW1vbi54c2RdIFstb3V0IG91dHB1dGRpcl0gaW5wdXRkaXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIHdoZXJlIGlucHV0ZGlyIGlzIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgLnhzZCBmaWxlcyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgYW5kIG91dHB1dGRpciBpcyBhIGRpcmVjdG9yeSBpbnRvIHdoaWNoIG5ldyB4c2QgZmlsZXMsIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBwbHVzIGEgY29tbW9ubHkgaW1wb3J0ZWQgY29tbW9uLnhzZCwgaXMgcGxhY2VkLiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLWxpY2Vuc2UgcHJpbnRzIGxpY2Vuc2UgaW5mb3JtYXRpb24iKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgY29tbW9uTmFtZSA9IGNsLmdldE9wdCgiaW1wb3J0Iik7Ci0gICAgICAgIGlmIChjb21tb25OYW1lID09IG51bGwpCi0gICAgICAgICAgICBjb21tb25OYW1lID0gImNvbW1vbi54c2QiOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG91dCA9IGNsLmdldE9wdCgib3V0Iik7Ci0gICAgICAgIGlmIChvdXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBvdXRwdXQgZGlyZWN0b3J5ICdvdXQnIik7Ci0gICAgICAgICAgICBvdXQgPSAib3V0IjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIG91dGRpciA9IG5ldyBGaWxlKG91dCk7Ci0gICAgICAgIEZpbGUgYmFzZWRpciA9IG5ldyBGaWxlKGFyZ3NbMF0pOwotICAgICAgICAKLSAgICAgICAgLy8gZmlyc3QsIHBhcnNlIGFsbCB0aGUgc2NoZW1hIGZpbGVzCi0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGNsLmdldEZpbGVzKCk7Ci0gICAgICAgIE1hcCBzY2hlbWFEb2NzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgU2V0IGVsZW1lbnROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBhdHRyaWJ1dGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCB0eXBlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgbW9kZWxHcm91cE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGF0dHJHcm91cE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCi0gICAgICAgIFNldCBkdXBlRWxlbWVudE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGR1cGVBdHRyaWJ1dGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBkdXBlVHlwZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGR1cGVNb2RlbEdyb3VwTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgZHVwZUF0dHJHcm91cE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGR1cGVOYW1lc3BhY2VzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGxvYWQgc2NoZW1hCi0gICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgZG9jID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgc2NoZW1hRG9jcy5wdXQoZG9jLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gd2FybiBhYm91dCBmb3IgaW1wb3J0cywgaW5jbHVkZXMKLSAgICAgICAgICAgICAgICBpZiAoZG9jLmdldFNjaGVtYSgpLnNpemVPZkltcG9ydEFycmF5KCkgPiAwIHx8IGRvYy5nZXRTY2hlbWEoKS5zaXplT2ZJbmNsdWRlQXJyYXkoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid2FybmluZzogIiArIGZpbGVzW2ldICsgIiBjb250YWlucyBpbXBvcnRzIG9yIGluY2x1ZGVzIHRoYXQgYXJlIGJlaW5nIGlnbm9yZWQuIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gY29sbGVjdCB0b2dldGhlciBuYW1lcwotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUb3BMZXZlbENvbXBsZXhUeXBlIGN0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0Q29tcGxleFR5cGVBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY3QubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKGN0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCB0eXBlTmFtZXMsIGR1cGVUeXBlTmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKLQotICAgICAgICAgICAgICAgIFRvcExldmVsU2ltcGxlVHlwZSBzdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldFNpbXBsZVR5cGVBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3QubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKHN0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCB0eXBlTmFtZXMsIGR1cGVUeXBlTmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKLQotICAgICAgICAgICAgICAgIFRvcExldmVsRWxlbWVudCBlbFtdID0gZG9jLmdldFNjaGVtYSgpLmdldEVsZW1lbnRBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZWwubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKGVsW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBlbGVtZW50TmFtZXMsIGR1cGVFbGVtZW50TmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKLQotICAgICAgICAgICAgICAgIFRvcExldmVsQXR0cmlidXRlIGF0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGF0Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShhdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZXMsIGR1cGVBdHRyaWJ1dGVOYW1lcywgZHVwZU5hbWVzcGFjZXMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE5hbWVkR3JvdXAgZ3JbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRHcm91cEFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBnci5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgbm90ZU5hbWUoZ3Jbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIG1vZGVsR3JvdXBOYW1lcywgZHVwZU1vZGVsR3JvdXBOYW1lcywgZHVwZU5hbWVzcGFjZXMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXAgYWdbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRBdHRyaWJ1dGVHcm91cEFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhZy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgbm90ZU5hbWUoYWdbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGF0dHJHcm91cE5hbWVzLCBkdXBlQXR0ckdyb3VwTmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIndhcm5pbmc6ICIgKyBmaWxlc1tpXSArICIgaXMgbm90IGEgc2NoZW1hIGZpbGUgLSAiICsgZS5nZXRFcnJvcigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gbG9hZCAiICsgZmlsZXNbaV0gKyAiIC0gIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzY2hlbWFEb2NzLnNpemUoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHNjaGVtYSBmaWxlcyBmb3VuZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZHVwZVR5cGVOYW1lcy5zaXplKCkgKyBkdXBlRWxlbWVudE5hbWVzLnNpemUoKSArIGR1cGVBdHRyaWJ1dGVOYW1lcy5zaXplKCkgKwotICAgICAgICAgICAgICAgIGR1cGVNb2RlbEdyb3VwTmFtZXMuc2l6ZSgpICsgZHVwZUF0dHJHcm91cE5hbWVzLnNpemUoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGR1cGxpY2F0ZSBuYW1lcyBmb3VuZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjcmVhdGUgYSBzY2hlbWEgZG9jIGZvciBlYWNoIG5hbWVzcGFjZSB0byBiZSBpbXBvcnRlZAotICAgICAgICBNYXAgY29tbW9uRG9jcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1hcCBjb21tb25GaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGludCBjb3VudCA9IGR1cGVOYW1lc3BhY2VzLnNpemUoKSA9PSAxID8gMCA6IDE7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGR1cGVOYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgY29tbW9uRG9jID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IgotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5zZXRUYXJnZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5zZXRFbGVtZW50Rm9ybURlZmF1bHQoRm9ybUNob2ljZS5RVUFMSUZJRUQpOwotICAgICAgICAgICAgY29tbW9uRG9jcy5wdXQobmFtZXNwYWNlLCBjb21tb25Eb2MpOwotICAgICAgICAgICAgY29tbW9uRmlsZXMucHV0KGNvbW1vbkRvYywgY29tbW9uRmlsZUZvcihjb21tb25OYW1lLCBuYW1lc3BhY2UsIGNvdW50KyssIG91dGRpcikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBwdWxsIG91dCBhbGwgdGhlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBhbmQgZHJvcCB0aGVtIGludG8gdGhlIGZpbGUKLSAgICAgICAgLy8gd2UgcmV1c2UgdGhlIGVsZW1lbnROYW1lcyAoZXRjKSBzZXRzIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggZGVmaW5pdGlvbnMKLSAgICAgICAgLy8gd2UgaGF2ZSBhbHJlYWR5IGluc2VydGVkLgotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWFEb2NzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGRvYyA9IChTY2hlbWFEb2N1bWVudClpLm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY29sbGVjdCB0b2dldGhlciBuYW1lcwotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgY29tbW9uRG9jID0gKFNjaGVtYURvY3VtZW50KWNvbW1vbkRvY3MuZ2V0KHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gbmVlZEltcG9ydCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgVG9wTGV2ZWxDb21wbGV4VHlwZSBjdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldENvbXBsZXhUeXBlQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBjdC5sZW5ndGggLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRHVwbGljYXRlKGN0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBkdXBlVHlwZU5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoY3Rbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIHR5cGVOYW1lcywgZHVwZVR5cGVOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5hZGROZXdDb21wbGV4VHlwZSgpLnNldChjdFtqXSk7Ci0gICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUNvbXBsZXhUeXBlKGopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUb3BMZXZlbFNpbXBsZVR5cGUgc3RbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3QubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShzdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZVR5cGVOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKHN0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCB0eXBlTmFtZXMsIGR1cGVUeXBlTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3U2ltcGxlVHlwZSgpLnNldChzdFtqXSk7Ci0gICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZVNpbXBsZVR5cGUoaik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRvcExldmVsRWxlbWVudCBlbFtdID0gZG9jLmdldFNjaGVtYSgpLmdldEVsZW1lbnRBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRHVwbGljYXRlKGVsW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBkdXBlRWxlbWVudE5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoZWxbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGVsZW1lbnROYW1lcywgZHVwZUVsZW1lbnROYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5hZGROZXdFbGVtZW50KCkuc2V0KGVsW2pdKTsKLSAgICAgICAgICAgICAgICBuZWVkSW1wb3J0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0U2NoZW1hKCkucmVtb3ZlRWxlbWVudChqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVG9wTGV2ZWxBdHRyaWJ1dGUgYXRbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRBdHRyaWJ1dGVBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRHVwbGljYXRlKGF0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBkdXBlQXR0cmlidXRlTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShhdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZXMsIGR1cGVBdHRyaWJ1dGVOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5hZGROZXdFbGVtZW50KCkuc2V0KGF0W2pdKTsKLSAgICAgICAgICAgICAgICBuZWVkSW1wb3J0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0U2NoZW1hKCkucmVtb3ZlRWxlbWVudChqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTmFtZWRHcm91cCBncltdID0gZG9jLmdldFNjaGVtYSgpLmdldEdyb3VwQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3IubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShncltqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZU1vZGVsR3JvdXBOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKGdyW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBtb2RlbEdyb3VwTmFtZXMsIGR1cGVNb2RlbEdyb3VwTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldChncltqXSk7Ci0gICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUVsZW1lbnQoaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBOYW1lZEF0dHJpYnV0ZUdyb3VwIGFnW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhZy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRHVwbGljYXRlKGFnW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBkdXBlQXR0ckdyb3VwTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShhZ1tqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgYXR0ckdyb3VwTmFtZXMsIGR1cGVBdHRyR3JvdXBOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5hZGROZXdFbGVtZW50KCkuc2V0KGFnW2pdKTsKLSAgICAgICAgICAgICAgICBuZWVkSW1wb3J0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0U2NoZW1hKCkucmVtb3ZlRWxlbWVudChqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG5lZWRJbXBvcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5jbHVkZURvY3VtZW50LkluY2x1ZGUgbmV3SW5jbHVkZSA9IGRvYy5nZXRTY2hlbWEoKS5hZGROZXdJbmNsdWRlKCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSAoRmlsZSlzY2hlbWFEb2NzLmdldChkb2MpOwotICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG91dHB1dEZpbGVGb3IoaW5wdXRGaWxlLCBiYXNlZGlyLCBvdXRkaXIpOwotICAgICAgICAgICAgICAgIEZpbGUgY29tbW9uRmlsZSA9IChGaWxlKWNvbW1vbkZpbGVzLmdldChjb21tb25Eb2MpOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbmV3SW5jbHVkZS5zZXRTY2hlbWFMb2NhdGlvbihyZWxhdGl2ZVVSSUZvcihvdXRwdXRGaWxlLCBjb21tb25GaWxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG1ha2UgdGhlIGRpcmVjdG9yeSBmb3Igb3V0cHV0Ci0gICAgICAgIGlmICghb3V0ZGlyLmlzRGlyZWN0b3J5KCkgJiYgIW91dGRpci5ta2RpcnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gbWFrZWRpciAiICsgb3V0ZGlyKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgd3JpdGUgYWxsIHRob3NlIGRvY3MgYmFjayBvdXQuCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYURvY3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgZG9jID0gKFNjaGVtYURvY3VtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSAoRmlsZSlzY2hlbWFEb2NzLmdldChkb2MpOwotICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gb3V0cHV0RmlsZUZvcihpbnB1dEZpbGUsIGJhc2VkaXIsIG91dGRpcik7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RmlsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IGNvcHkgIiArIGlucHV0RmlsZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZG9jLnNhdmUob3V0cHV0RmlsZSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKS5zZXRTYXZlQWdncmVzaXZlTmFtZXNwYWNlcygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29tbW9uRmlsZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgZG9jID0gKFNjaGVtYURvY3VtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gKEZpbGUpY29tbW9uRmlsZXMuZ2V0KGRvYyk7Ci0gICAgICAgICAgICBkb2Muc2F2ZShvdXRwdXRGaWxlLCBuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVQcmV0dHlQcmludCgpLnNldFNhdmVBZ2dyZXNpdmVOYW1lc3BhY2VzKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG91dHB1dEZpbGVGb3IoRmlsZSBmaWxlLCBGaWxlIGJhc2VEaXIsIEZpbGUgb3V0ZGlyKQotICAgIHsKLSAgICAgICAgVVJJIGJhc2UgPSBiYXNlRGlyLmdldEFic29sdXRlRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgIFVSSSBhYnMgPSBmaWxlLmdldEFic29sdXRlRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgIFVSSSByZWwgPSBiYXNlLnJlbGF0aXZpemUoYWJzKTsKLSAgICAgICAgaWYgKHJlbC5pc0Fic29sdXRlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IHJlbGF0aXZpemUgIiArIGZpbGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFVSSSBvdXRiYXNlID0gb3V0ZGlyLnRvVVJJKCk7Ci0gICAgICAgIFVSSSBvdXQgPSBDb2RlR2VuVXRpbC5yZXNvbHZlKG91dGJhc2UsIHJlbCk7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShvdXQpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBVUkkgY29tbW9uQW5jZXN0b3IoVVJJIGZpcnN0LCBVUkkgc2Vjb25kKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGZpcnN0U3RyID0gZmlyc3QudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIHNlY29uZFN0ciA9IHNlY29uZC50b1N0cmluZygpOwotICAgICAgICBpbnQgbGVuID0gZmlyc3RTdHIubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChzZWNvbmRTdHIubGVuZ3RoKCkgPCBsZW4pCi0gICAgICAgICAgICBsZW4gPSBzZWNvbmRTdHIubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmaXJzdFN0ci5jaGFyQXQoaSkgIT0gc2Vjb25kU3RyLmNoYXJBdChpKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpIC09IDE7Ci0gICAgICAgIGlmIChpID49IDApCi0gICAgICAgICAgICBpID0gZmlyc3RTdHIubGFzdEluZGV4T2YoJy8nLCBpKTsKLSAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSSShmaXJzdFN0ci5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbGF0aXZlVVJJRm9yKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFVSSSBiYXNlID0gc291cmNlLmdldEFic29sdXRlRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgIFVSSSBhYnMgPSB0YXJnZXQuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgLy8gZmluZCBjb21tb24gc3Vic3RyaW5nLi4uCi0gICAgICAgIFVSSSBjb21tb25CYXNlID0gY29tbW9uQW5jZXN0b3IoYmFzZSwgYWJzKTsKLSAgICAgICAgaWYgKGNvbW1vbkJhc2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBhYnMudG9TdHJpbmcoKTsKLSAgICAgICAgCi0gICAgICAgIFVSSSBiYXNlcmVsID0gY29tbW9uQmFzZS5yZWxhdGl2aXplKGJhc2UpOwotICAgICAgICBVUkkgdGFyZ2V0cmVsID0gY29tbW9uQmFzZS5yZWxhdGl2aXplKGFicyk7Ci0gICAgICAgIGlmIChiYXNlcmVsLmlzQWJzb2x1dGUoKSB8fCB0YXJnZXRyZWwuaXNBYnNvbHV0ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGFicy50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VSZWwgPSBiYXNlcmVsLnRvU3RyaW5nKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUmVsLmxlbmd0aCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IHNvdXJjZVJlbC5pbmRleE9mKCcvJywgaSk7Ci0gICAgICAgICAgICBpZiAoaSA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBwcmVmaXggKz0gIi4uLyI7Ci0gICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZWZpeCArIHRhcmdldHJlbC50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGNvbW1vbkZpbGVGb3IoU3RyaW5nIGNvbW1vbk5hbWUsIFN0cmluZyBuYW1lc3BhY2UsIGludCBpLCBGaWxlIG91dGRpcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gY29tbW9uTmFtZTsKLSAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBjb21tb25OYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgICAgIGluZGV4ID0gY29tbW9uTmFtZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIG5hbWUgPSBjb21tb25OYW1lLnN1YnN0cmluZygwLCBpbmRleCkgKyBpICsgY29tbW9uTmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShvdXRkaXIsIG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG5vdGVOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTZXQgc2VlbiwgU2V0IGR1cGVzLCBTZXQgZHVwZU5hbWVzcGFjZXMpCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG5hbWUpOwotICAgICAgICBpZiAoc2Vlbi5jb250YWlucyhxTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGR1cGVzLmFkZChxTmFtZSk7Ci0gICAgICAgICAgICBkdXBlTmFtZXNwYWNlcy5hZGQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZWVuLmFkZChxTmFtZSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZpcnN0RHVwbGljYXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTZXQgbm90c2VlbiwgU2V0IGR1cGVzKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKLSAgICAgICAgaWYgKGR1cGVzLmNvbnRhaW5zKHFOYW1lKSAmJiBub3RzZWVuLmNvbnRhaW5zKHFOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgbm90c2Vlbi5yZW1vdmUocU5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHVwbGljYXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTZXQgZHVwZXMpCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG5hbWUpOwotICAgICAgICByZXR1cm4gKGR1cGVzLmNvbnRhaW5zKHFOYW1lKSk7Ci0gICAgfQotICAgICAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0luc3RhbmNlVmFsaWRhdG9yLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9JbnN0YW5jZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjNkOGJmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0luc3RhbmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFuY2VWYWxpZGF0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsLmFyZ3MoKS5sZW5ndGggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWxpZGF0ZXMgYSBzY2hlbWEgZGVmaW50aW9uIGFuZCBpbnN0YW5jZXMgd2l0aGluIHRoZSBzY2hlbWEuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiB2YWxpZGF0ZSBbc3dpdGNoZXNdIHNjaGVtYS54c2QgaW5zdGFuY2UueG1sIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaGVzOiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWRsICAgIGVuYWJsZSBuZXR3b3JrIGRvd25sb2FkcyBmb3IgaW1wb3J0cyBhbmQgaW5jbHVkZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1ub3B2ciBkaXNhYmxlIHBhcnRpY2xlIHZhbGlkIChyZXN0cmljdGlvbikgcnVsZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW5vdXBhIGRpYWJsZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRlaW9uIHJ1bGUiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gZGwgPSAoY2wuZ2V0T3B0KCJkbCIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIG5vcHZyID0gKGNsLmdldE9wdCgibm9wdnIiKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub3VwYSA9IChjbC5nZXRPcHQoIm5vdXBhIikgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBGaWxlW10gc2NoZW1hRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54c2QiKTsKLSAgICAgICAgRmlsZVtdIGluc3RhbmNlRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54bWwiKTsKLSAgICAgICAgCi0gICAgICAgIExpc3Qgc2RvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2RvY3MuYWRkKAotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUZpbGVzW2ldLCAobmV3IFhtbE9wdGlvbnMoKSkuc2V0TG9hZExpbmVOdW1iZXJzKCkuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggc2NoZW1hRmlsZXNbaV0gKyAiIG5vdCBsb2FkYWJsZTogIiArIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdFtdIHNjaGVtYXMgPSAoWG1sT2JqZWN0W10pc2RvY3MudG9BcnJheShuZXcgWG1sT2JqZWN0WzBdKTsKLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHNMb2FkZXI7Ci0gICAgICAgIENvbGxlY3Rpb24gY29tcEVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgWG1sT3B0aW9ucyBzY2hlbWFPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGNvbXBFcnJvcnMpOwotICAgICAgICBpZiAoZGwpCi0gICAgICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVEb3dubG9hZFVybHMoKTsKLSAgICAgICAgaWYgKG5vcHZyKQotICAgICAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlTm9QdnJSdWxlKCk7Ci0gICAgICAgIGlmIChub3VwYSkKLSAgICAgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZU5vVXBhUnVsZSgpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNMb2FkZXIgPSBYbWxCZWFucy5sb2FkWHNkKHNjaGVtYXMsIHNjaGVtYU9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBFcnJvcnMuaXNFbXB0eSgpIHx8ICEoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNjaGVtYSBpbnZhbGlkIik7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb21wRXJyb3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkubmV4dCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG9iajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeG9iaiA9Ci0gICAgICAgICAgICAgICAgICAgIHNMb2FkZXIucGFyc2UoIGluc3RhbmNlRmlsZXNbaV0sIG51bGwsIChuZXcgWG1sT3B0aW9ucygpKS5zZXRMb2FkTGluZU51bWJlcnMoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihpbnN0YW5jZUZpbGVzW2ldICsgIiBub3QgbG9hZGFibGU6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIGlmICh4b2JqLnNjaGVtYVR5cGUoKSA9PSBYbWxPYmplY3QudHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgTk9UIHZhbGlkLiAgIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIERvY3VtZW50IHR5cGUgbm90IGZvdW5kLiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHhvYmoudmFsaWRhdGUobmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9ycykpKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbnN0YW5jZUZpbGVzW2ldICsgIiB2YWxpZC4iKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgTk9UIHZhbGlkLiIpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXQubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9QcmV0dHlQcmludGVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9QcmV0dHlQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2M4ZDMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUHJldHR5UHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBQcmV0dHlQcmludGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIENvbGxlY3Rpb25zLnNpbmdsZXRvbigiaW5kZW50IikpOwotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGNsLmFyZ3MoKS5sZW5ndGggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmV0dHkgcHJpbnRzIFhNTCBmaWxlcy4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHhwcmV0dHkgW3N3aXRjaGVzXSBmaWxlLnhtbCIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hlczoiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1pbmRlbnQgIyAgIHVzZSB0aGUgZ2l2ZW4gaW5kZW50Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbGljZW5zZSBwcmludHMgbGljZW5zZSBpbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgaW5kZW50U3RyID0gY2wuZ2V0T3B0KCJpbmRlbnQiKTsKLSAgICAgICAgaW50IGluZGVudDsKLSAgICAgICAgaWYgKGluZGVudFN0ciA9PSBudWxsKQotICAgICAgICAgICAgaW5kZW50ID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5kZW50ID0gSW50ZWdlci5wYXJzZUludChpbmRlbnRTdHIpOwotICAgICAgICAKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCBkb2M7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShmaWxlc1tpXSwgKG5ldyBYbWxPcHRpb25zKCkpLnNldExvYWRMaW5lTnVtYmVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZmlsZXNbaV0gKyAiIG5vdCBsb2FkYWJsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jLnNhdmUoU3lzdGVtLm91dCwgbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKS5zZXRTYXZlUHJldHR5UHJpbnRJbmRlbnQoaW5kZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuYWJsZSB0byBwcmV0dHkgcHJpbnQgIiArIGZpbGVzW2ldICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1J1blhRdWVyeS5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUnVuWFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODUwZTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUnVuWFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy4qOwotCi1wdWJsaWMgY2xhc3MgUnVuWFF1ZXJ5Ci17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPQotICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lKAotICAgICAgICAgICAgICAgIGFyZ3MsCi0gICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCggbmV3IFN0cmluZ1tdIHsgInEiLCAicWYiIH0gKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBhcmdzID0gY2wuYXJncygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUnVuIGFuIFhRdWVyeSBhZ2FpbnN0IGFuIFhNTCBpbnN0YW5jZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZToiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigieHF1ZXJ5IFstdmVyYm9zZV0gWy1wcmV0dHldIFstcSA8cXVlcnk+IHwgLXFmIHF1ZXJ5LnhxXSBbZmlsZS54bWxdKiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLXEgPHF1ZXJ5PiB0byBzcGVjaWZ5IGEgcXVlcnkgb24gdGhlIGNvbW1hbmQtbGluZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLXFmIDxxdWVyeT4gdG8gc3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhIHF1ZXJ5Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAtcHJldHR5IHByZXR0eS1wcmludHMgdGhlIHJlc3VsdHMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiB0aGUgcXVlcnkgaXMgcnVuIG9uIGVhY2ggWE1MIGZpbGUgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHZlcmJvc2UgPSBjbC5nZXRPcHQoICJ2ZXJib3NlIiApICE9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gcHJldHR5ID0gY2wuZ2V0T3B0KCAicHJldHR5IiApICE9IG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gR2V0IGFuZCBjb21waWxlIHRoZSBxdWVyeQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gY2wuZ2V0T3B0KCAicSIgKTsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ZmlsZSA9IGNsLmdldE9wdCggInFmIiApOwotCi0gICAgICAgIGlmIChxdWVyeSA9PSBudWxsICYmIHF1ZXJ5ZmlsZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJObyBxdWVyeSBzcGVjaWZpZWQiICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwgJiYgcXVlcnlmaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlNwZWNpZnkgLXFmIG9yIC1xLCBub3QgYm90aC4iICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChxdWVyeWZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIHF1ZXJ5RmlsZSA9IG5ldyBGaWxlKCBxdWVyeWZpbGUgKTsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBxdWVyeUZpbGUgKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpcyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSByLnJlYWQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAoY2hhcikgY2ggKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIHF1ZXJ5ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiQ2Fubm90IHJlYWQgcXVlcnkgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDb21waWxlIFF1ZXJ5OiIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggcXVlcnkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5PSBYbWxCZWFucy5jb21waWxlUXVlcnkoIHF1ZXJ5ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yIGNvbXBpbGluZyBxdWVyeTogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEdldCB0aGUgaW5zdGFuY2UKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGNsLmdldEZpbGVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlc1tpXSApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCA9IGlzLnJlYWQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZSggY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBmaWxlc1tpXSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3IgcGFyc2luZyBpbnN0YW5jZTogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFeGVjdXRpbmcgUXVlcnkuLi4iICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBYbWxPYmplY3RbXSByZXN1bHQgPSBudWxsOwotICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0geC5leGVjUXVlcnkoIHF1ZXJ5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvciBleGVjdXRpbmcgcXVlcnk6ICIgKyBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlF1ZXJ5IFJlc3VsdDoiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRzLnNldFNhdmVPdXRlcigpOwotICAgICAgICAgICAgaWYgKHByZXR0eSkKLSAgICAgICAgICAgICAgICBvcHRzLnNldFNhdmVQcmV0dHlQcmludCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbal0uc2F2ZSggU3lzdGVtLm91dCwgb3B0cyApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvZGVHZW5lcmF0b3IuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvZGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2Mzc0YS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb2RlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUNvZGVQcmludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOwotCi1pbXBvcnQgcmVwYWNrYWdlLlJlcGFja2FnZXI7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFDb2RlR2VuZXJhdG9yCi17Ci0gICAgLy8gaW5wdXQgZGlyZWN0b3J5LCBvdXRwdXQgZGlyIGZpbGVuYW1lCi0gICAgLy8gdG9kbzogb3V0cHV0IGphcgotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlVHlwZVN5c3RlbShTY2hlbWFUeXBlU3lzdGVtIHNhdmVyLCBGaWxlIHNvdXJjZWRpciwgRmlsZVtdIGphdmFzcmMsIE1hcCBzb3VyY2VzVG9Db3B5TWFwLCBGaWxlW10gY2xhc3NwYXRoLCBGaWxlIGNsYXNzZXNkaXIsIEZpbGUgb3V0cHV0SmFyLCBib29sZWFuIG5vamF2YWMsIGJvb2xlYW4gamF4YiwgWG1sRXJyb3JXYXRjaGVyIGVycm9ycywgU3RyaW5nIHJlcGFja2FnZSwgYm9vbGVhbiB2ZXJib3NlLCBMaXN0IHNvdXJjZWZpbGVzICkKLSAgICB7Ci0KLSAgICAgICAgaWYgKHNvdXJjZWRpciA9PSBudWxsIHx8IGNsYXNzZXNkaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNvdXJjZSBhbmQgY2xhc3MgZ2VuIGRpciBtdXN0IG5vdCBiZSBudWxsLiIpOwotCi0gICAgICAgIGJvb2xlYW4gZmFpbHVyZSA9IGZhbHNlOwotCi0gICAgICAgIHNhdmVyLnNhdmVUb0RpcmVjdG9yeShjbGFzc2VzZGlyKTsKLQotICAgICAgICAvLyBTYXZlIHRoZSBzY2hlbWEgc291cmNlcyB0byB0aGUgY2xhc3NlcyBkaXJlY3RvcnkKLSAgICAgICAgaWYgKChzb3VyY2VzVG9Db3B5TWFwICE9IG51bGwpICYmIChzb3VyY2VzVG9Db3B5TWFwLnNpemUoKSA+IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIHNjaGVtYXNkaXIgPSBjcmVhdGVEaXIoY2xhc3Nlc2RpciwgInNjaGVtYS9zcmMiKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlc1RvQ29weU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWFsb2NhdGlvbiA9IChTdHJpbmcpc291cmNlc1RvQ29weU1hcC5nZXQoa2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShzY2hlbWFzZGlyLCBzY2hlbWFsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgcGFyZW50RGlyID0gbmV3IEZpbGUodGFyZ2V0RmlsZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURpcihwYXJlbnREaXIsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIGZpbGUgZnJvbSBmaWxlcGF0aCB0byBzY2hlbWEvc3JjLzxzY2hlbWFGaWxlPgotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoc2NoZW1hc2Rpciwgc2NoZW1hbG9jYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGluLCBvdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlID0gdHJ1ZTsgLSBub3QgY2F1c2UgZm9yIGZhaWx1cmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBhY2thZ2VyIHJlcGFja2FnZXIgPSByZXBhY2thZ2UgPT0gbnVsbCA/IG51bGwgOiBuZXcgUmVwYWNrYWdlciggcmVwYWNrYWdlICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFNjaGVtYVR5cGVDb2RlUHJpbnRlci5pbmRleENsYXNzRm9yU3lzdGVtKHNhdmVyKS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSI7Ci0gICAgICAgICAgICBGaWxlIHNvdXJjZWZpbGUgPSBuZXcgRmlsZShzb3VyY2VkaXIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBXcml0ZXIgd3JpdGVyID0KLSAgICAgICAgICAgICAgICByZXBhY2thZ2VyID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyAoV3JpdGVyKSBuZXcgRmlsZVdyaXRlciggc291cmNlZmlsZSApCi0gICAgICAgICAgICAgICAgICAgIDogKFdyaXRlcikgbmV3IFJlcGFja2FnaW5nV3JpdGVyKCBzb3VyY2VmaWxlLCByZXBhY2thZ2VyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTY2hlbWFUeXBlQ29kZVByaW50ZXIucHJpbnRMb2FkZXIod3JpdGVyLCBzYXZlcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGQoc291cmNlZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOwotICAgICAgICAgICAgZmFpbHVyZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISBqYXhiKQotICAgICAgICAgICAgZmFpbHVyZSAmPSBnZW5UeXBlcyhzYXZlciwgc291cmNlZmlsZXMsIHNvdXJjZWRpciwgcmVwYWNrYWdlciwgdmVyYm9zZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhaWx1cmUgJj0gamF4YkNvZGVHZW5lcmF0b3Ioc2F2ZXIsIHNvdXJjZWZpbGVzLCBzb3VyY2VkaXIsIGNsYXNzZXNkaXIsIGVycm9ycyk7Ci0KLSAgICAgICAgaWYgKGZhaWx1cmUpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZW5UeXBlcyhTY2hlbWFUeXBlU3lzdGVtIHNhdmVyLCBMaXN0IHNvdXJjZWZpbGVzLCBGaWxlIHNvdXJjZWRpciwgUmVwYWNrYWdlciByZXBhY2thZ2VyLCBib29sZWFuIHZlcmJvc2UpCi0gICAgewotICAgICAgICBib29sZWFuIGZhaWx1cmUgPSBmYWxzZTsKLQotICAgICAgICBMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0eXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzYXZlci5nbG9iYWxUeXBlcygpKSk7Ci0gICAgICAgIHR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNhdmVyLmRvY3VtZW50VHlwZXMoKSkpOwotICAgICAgICB0eXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzYXZlci5hdHRyaWJ1dGVUeXBlcygpKSk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gKFNjaGVtYVR5cGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvbXBpbGluZyB0eXBlICIgKyB0eXBlKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzQnVpbHRpblR5cGUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldEZ1bGxKYXZhTmFtZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBmam4gPSB0eXBlLmdldEZ1bGxKYXZhTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoZmpuLmluZGV4T2YoJyQnKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmpuID0KLSAgICAgICAgICAgICAgICAgICAgZmpuLnN1YnN0cmluZyggMCwgZmpuLmxhc3RJbmRleE9mKCAnLicgKSApICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZqbi5zdWJzdHJpbmcoIGZqbi5pbmRleE9mKCAnJCcgKSArIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmpuLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUgc291cmNlZmlsZSA9IG5ldyBGaWxlKHNvdXJjZWRpciwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNyZWF0ZWQgIiArIHNvdXJjZWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFja2FnZXIgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyAoV3JpdGVyKSBuZXcgRmlsZVdyaXRlciggc291cmNlZmlsZSApCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChXcml0ZXIpIG5ldyBSZXBhY2thZ2luZ1dyaXRlciggc291cmNlZmlsZSwgcmVwYWNrYWdlciApOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZUNvZGVQcmludGVyLnByaW50VHlwZSh3cml0ZXIsIHR5cGUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVzLmFkZChzb3VyY2VmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOwotICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgSW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHR5cGUuZ2V0RnVsbEphdmFJbXBsTmFtZSgpLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIjsKLSAgICAgICAgICAgICAgICBGaWxlIGltcGxGaWxlID0gbmV3IEZpbGUoc291cmNlZGlyLCAgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNyZWF0ZWQgIiArIGltcGxGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBpbXBsRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3cml0ZXIgPQotICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VyID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gKFdyaXRlcikgbmV3IEZpbGVXcml0ZXIoIGltcGxGaWxlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogKFdyaXRlcikgbmV3IFJlcGFja2FnaW5nV3JpdGVyKCBpbXBsRmlsZSwgcmVwYWNrYWdlciApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVDb2RlUHJpbnRlci5wcmludFR5cGVJbXBsKHdyaXRlciwgdHlwZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc291cmNlZmlsZXMuYWRkKGltcGxGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOwotICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpheGJDb2RlR2VuZXJhdG9ySG9sZGVyCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX2pheGJDb2RlR2VuZXJhdG9yTWV0aG9kID0gYnVpbGRKYXhiQ29kZUdlbmVyYXRvck1ldGhvZCgpOwotICAgIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgYnVpbGRKYXhiQ29kZUdlbmVyYXRvck1ldGhvZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlci5KYXhiQ29kZUdlbmVyYXRvciIsIGZhbHNlLCBTY2hlbWFDb2RlR2VuZXJhdG9yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoImNvbXBpbGUiLCBuZXcgQ2xhc3NbXSB7U2NoZW1hVHlwZVN5c3RlbS5jbGFzcywgTGlzdC5jbGFzcywgRmlsZS5jbGFzcywgRmlsZS5jbGFzcywgWG1sRXJyb3JXYXRjaGVyLmNsYXNzIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9ICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBKYXhiQ29kZUdlbmVyYXRvcjogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgICAgICBlMi5pbml0Q2F1c2UoZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGpheGJDb2RlR2VuZXJhdG9yKFNjaGVtYVR5cGVTeXN0ZW0gc2F2ZXIsIExpc3Qgc291cmNlZmlsZXMsIEZpbGUgc291cmNlZGlyLCBGaWxlIGNsYXNzZXNkaXIsIFhtbEVycm9yV2F0Y2hlciBlcnJvcnMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbilKYXhiQ29kZUdlbmVyYXRvckhvbGRlci5famF4YkNvZGVHZW5lcmF0b3JNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IHNhdmVyLCBzb3VyY2VmaWxlcywgc291cmNlZGlyLCBjbGFzc2VzZGlyLCBlcnJvcnMgfSkpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZTIuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgdGhyb3cgZTI7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlMi5pbml0Q2F1c2UoZSk7Ci0gICAgICAgICAgICB0aHJvdyBlMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgRmlsZSBjcmVhdGVEaXIoRmlsZSByb290ZGlyLCBTdHJpbmcgc3ViZGlyKQotICAgIHsKLSAgICAgICAgRmlsZSBuZXdkaXIgPSAoc3ViZGlyID09IG51bGwpID8gcm9vdGRpciA6IG5ldyBGaWxlKHJvb3RkaXIsIHN1YmRpcik7Ci0gICAgICAgIGJvb2xlYW4gY3JlYXRlZCA9IChuZXdkaXIuZXhpc3RzKCkgJiYgbmV3ZGlyLmlzRGlyZWN0b3J5KCkpIHx8IG5ld2Rpci5ta2RpcnMoKTsKLSAgICAgICAgYXNzZXJ0KGNyZWF0ZWQpIDogIkNvdWxkIG5vdCBjcmVhdGUgIiArIG5ld2Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgcmV0dXJuIG5ld2RpcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZpbGUgY3JlYXRlVGVtcERpcigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgieGJlYW4iLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSB0bXBGaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoIi50bXAiKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3I6IGNyZWF0ZVRlbXBGaWxlIGRpZCBub3QgY3JlYXRlIGEgZmlsZSBlbmRpbmcgd2l0aCAudG1wIik7Ci0gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7Ci0gICAgICAgIEZpbGUgdG1wU3JjRGlyID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhdGggKyAiLmQiICsgKGNvdW50ID09IDAgPyAiIiA6IEludGVnZXIudG9TdHJpbmcoY291bnQrKykpOwotCi0gICAgICAgICAgICB0bXBTcmNEaXIgPSBuZXcgRmlsZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKCF0bXBTcmNEaXIuZXhpc3RzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVkID0gdG1wU3JjRGlyLm1rZGlycygpOwotICAgICAgICAgICAgICAgIGFzc2VydCBjcmVhdGVkIDogIkNvdWxkIG5vdCBjcmVhdGUgIiArIHRtcFNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0bXBGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCi0gICAgICAgIHJldHVybiB0bXBTcmNEaXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRyeUhhcmRUb0RlbGV0ZShGaWxlIGRpcikKLSAgICB7Ci0gICAgICAgIHRyeVRvRGVsZXRlKGRpcik7Ci0gICAgICAgIGlmIChkaXIuZXhpc3RzKCkpCi0gICAgICAgICAgICB0cnlUb0RlbGV0ZUxhdGVyKGRpcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0RlbGV0ZShGaWxlIGRpcikKLSAgICB7Ci0gICAgICAgIGlmIChkaXIuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBsaXN0ID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHRyeVRvRGVsZXRlKG5ldyBGaWxlKGRpciwgbGlzdFtpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaXIuZGVsZXRlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCB0cnkgdmVyeSBoYXJkLCBiZWNhdXNlIHdlJ3JlIGp1c3QgZGVsZXRpbmcgdG1wCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGRlbGV0ZUZpbGVRdWV1ZSA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRyaWVzUmVtYWluaW5nID0gMDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRyeU5vd1RoYXRJdHNMYXRlcigpCi0gICAgewotICAgICAgICBMaXN0IGZpbGVzOwotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkIChkZWxldGVGaWxlUXVldWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVzID0gbmV3IEFycmF5TGlzdChkZWxldGVGaWxlUXVldWUpOwotICAgICAgICAgICAgZGVsZXRlRmlsZVF1ZXVlLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0cnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSlpLm5leHQoKTsKLSAgICAgICAgICAgIHRyeVRvRGVsZXRlKGZpbGUpOwotICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgcmV0cnkuYWRkKGZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKGRlbGV0ZUZpbGVRdWV1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRyaWVzUmVtYWluaW5nID4gMCkKLSAgICAgICAgICAgICAgICB0cmllc1JlbWFpbmluZyAtPSAxOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRyaWVzUmVtYWluaW5nIDw9IDAgfHwgcmV0cnkuc2l6ZSgpID09IDApIC8vIGRvbmU/Ci0gICAgICAgICAgICAgICAgdHJpZXNSZW1haW5pbmcgPSAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGVRdWV1ZS5hZGRBbGwocmV0cnkpOyAvLyB0cnkgYWdhaW4/Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAodHJpZXNSZW1haW5pbmcgPD0gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnaXZlVXAoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChkZWxldGVGaWxlUXVldWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZUZpbGVRdWV1ZS5jbGVhcigpOwotICAgICAgICAgICAgdHJpZXNSZW1haW5pbmcgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9EZWxldGVMYXRlcihGaWxlIGRpcikKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoZGVsZXRlRmlsZVF1ZXVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGVGaWxlUXVldWUuYWRkKGRpcik7Ci0gICAgICAgICAgICBpZiAodHJpZXNSZW1haW5pbmcgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGVhdHMgdHJ5Tm93IHVudGlsIHRyaWVzUmVtYWluaW5nID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5Tm93VGhhdEl0c0xhdGVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2NlZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCAqIDMpOyAvLyB3YWl0IHRocmVlIHNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlVXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0cmllc1JlbWFpbmluZyA8IDEwKQotICAgICAgICAgICAgICAgIHRyaWVzUmVtYWluaW5nID0gMTA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGNsYXNzIFJlcGFja2FnaW5nV3JpdGVyIGV4dGVuZHMgU3RyaW5nV3JpdGVyCi0gICAgewotICAgICAgICBwdWJsaWMgUmVwYWNrYWdpbmdXcml0ZXIgKCBGaWxlIGZpbGUsIFJlcGFja2FnZXIgcmVwYWNrYWdlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9maWxlID0gZmlsZTsKLSAgICAgICAgICAgIF9yZXBhY2thZ2VyID0gcmVwYWNrYWdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlICggKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gZ2V0QnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIF9yZXBhY2thZ2VyLnJlcGFja2FnZSggc2IgKTsKLQotICAgICAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKCBfZmlsZSApOwotICAgICAgICAgICAgZncud3JpdGUoIHNiLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEZpbGUgX2ZpbGU7Ci0gICAgICAgIHByaXZhdGUgUmVwYWNrYWdlciBfcmVwYWNrYWdlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkYzEwMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5QYXRoUmVzb3VyY2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5SZXNvdXJjZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlN0c2NTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVMb2FkZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JQcmludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUNvbXBpbGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGVzIGEgc2NoZW1hIGludG8gWE1MIEJlYW4gY2xhc3NlcyBhbmQgbWV0YWRhdGEuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBzY29tcCBbb3B0c10gW2RpcnNdKiBbc2NoZW1hLnhzZF0qIFtzZXJ2aWNlLndzZGxdKiBbY29uZmlnLnhzZGNvbmZpZ10qIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9wdGlvbnMgaW5jbHVkZToiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1jcCBbYTtiO2NdIC0gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtZCBbZGlyXSAtIHRhcmdldCBiaW5hcnkgZGlyZWN0b3J5IGZvciAuY2xhc3MgYW5kIC54c2IgZmlsZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1zcmMgW2Rpcl0gLSB0YXJnZXQgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgLmphdmEgZmlsZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1zcmNvbmx5IC0gZG8gbm90IGNvbXBpbGUgLmphdmEgZmlsZXMgb3IgamFyIHRoZSBvdXRwdXQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtb3V0IFtyZXN1bHQuamFyXSAtIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgamFyIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtZGwgLSBwZXJtaXQgbmV0d29yayBkb3dubG9hZHMgZm9yIGltcG9ydHMgYW5kIGluY2x1ZGVzIChkZWZhdWx0IGlzIG9mZikiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1ub3VwYSAtIGRvIG5vdCBlbmZvcmNlIHRoZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gcnVsZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW5vcHZyIC0gZG8gbm90IGVuZm9yY2UgdGhlIHBhcnRpY2xlIHZhbGlkIChyZXN0cmljdGlvbikgcnVsZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWNvbXBpbGVyIC0gcGF0aCB0byBleHRlcm5hbCBqYXZhIGNvbXBpbGVyIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtamFyIC0gcGF0aCB0byBqYXIgdXRpbGl0eSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW1zIC0gaW5pdGlhbCBtZW1vcnkgZm9yIGV4dGVybmFsIGphdmEgY29tcGlsZXIgKGRlZmF1bHQgJyIgKyBDb2RlR2VuVXRpbC5ERUZBVUxUX01FTV9TVEFSVCArICInKSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW14IC0gbWF4aW11bSBtZW1vcnkgZm9yIGV4dGVybmFsIGphdmEgY29tcGlsZXIgKGRlZmF1bHQgJyIgKyBDb2RlR2VuVXRpbC5ERUZBVUxUX01FTV9NQVggKyAiJykiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1kZWJ1ZyAtIGNvbXBpbGUgd2l0aCBkZWJ1ZyBzeW1ib2xzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtcXVpZXQgLSBwcmludCBmZXdlciBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtdmVyYm9zZSAtIHByaW50IG1vcmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWxpY2Vuc2UgLSBwcmludHMgbGljZW5zZSBpbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWFsbG93bWRlZiBcIltuc10gW25zXSBbbnNdXCIgLSBpZ25vcmVzIG11bHRpcGxlIGRlZnMgaW4gZ2l2ZW4gbmFtZXNwYWNlcyIpOwotICAgICAgICAgICAgLyogVW5kb2N1bWVudGVkIGZlYXR1cmUgLSBwYXNzIGluIG9uZSBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1yZXBhY2thZ2UgLSByZXBhY2thZ2Ugc3BlY2lmaWNhdGlvbiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWV4dGVuc2lvbiAtIHJlZ2lzdGVycyBhIHNjaGVtYSBjb21waWxlciBleHRlbnNpb24iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1leHRlbnNpb25QYXJtcyAtIHNwZWNpZnkgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBpbGVyIGV4dGVuc2lvbiIpOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZiB5b3UgcmVxdWlyZSBhIGRpZmZlcmVudCBqYXZhIGNvbXBpbGVyLCB1c2UgdGhlIFhNTEJlYW4gQW50IHRhc2sgaW5zdGVhZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0IG9wdHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBvcHRzLmFkZCgib3V0Iik7Ci0gICAgICAgIG9wdHMuYWRkKCJuYW1lIik7Ci0gICAgICAgIG9wdHMuYWRkKCJzcmMiKTsKLSAgICAgICAgb3B0cy5hZGQoImQiKTsKLSAgICAgICAgb3B0cy5hZGQoImNwIik7Ci0gICAgICAgIG9wdHMuYWRkKCJjb21waWxlciIpOwotICAgICAgICBvcHRzLmFkZCgiamFyIik7Ci0gICAgICAgIG9wdHMuYWRkKCJtcyIpOwotICAgICAgICBvcHRzLmFkZCgibXgiKTsKLSAgICAgICAgb3B0cy5hZGQoInJlcGFja2FnZSIpOwotICAgICAgICBvcHRzLmFkZCgiZXh0ZW5zaW9uIik7Ci0gICAgICAgIG9wdHMuYWRkKCJleHRlbnNpb25QYXJtcyIpOwotICAgICAgICBvcHRzLmFkZCgiYWxsb3dtZGVmIik7Ci0gICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIG9wdHMpOwotCi0gICAgICAgIGlmIChjbC5nZXRPcHQoImxpY2Vuc2UiKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kTGluZS5wcmludExpY2Vuc2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJncyA9IGNsLmFyZ3MoKTsKLSAgICAgICAgYm9vbGVhbiB2ZXJib3NlID0gKGNsLmdldE9wdCgidmVyYm9zZSIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIHF1aWV0ID0gKGNsLmdldE9wdCgicXVpZXQiKSAhPSBudWxsKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBxdWlldCA9IGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXRmaWxlbmFtZSA9IGNsLmdldE9wdCgib3V0Iik7Ci0KLSAgICAgICAgU3RyaW5nIHJlcGFja2FnZSA9IGNsLmdldE9wdCgicmVwYWNrYWdlIik7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjbC5nZXRPcHQoIm5hbWUiKTsKLQotICAgICAgICBib29sZWFuIGRvd25sb2FkID0gKGNsLmdldE9wdCgiZGwiKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub1VwYSA9IChjbC5nZXRPcHQoIm5vdXBhIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gbm9QdnIgPSAoY2wuZ2V0T3B0KCJub3B2ciIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIG5vamF2YWMgPSAoY2wuZ2V0T3B0KCJzcmNvbmx5IikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSAoY2wuZ2V0T3B0KCJkZWJ1ZyIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIGpheGIgPSAoY2wuZ2V0T3B0KCJqYXhiIikgIT0gbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIGFsbG93bWRlZiA9IGNsLmdldE9wdCgiYWxsb3dtZGVmIik7Ci0gICAgICAgIFNldCBtZGVmTmFtZXNwYWNlcyA9IChhbGxvd21kZWYgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChYbWxMaXN0SW1wbC5zcGxpdF9saXN0KGFsbG93bWRlZikpKSk7Ci0KLSAgICAgICAgTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJleHRlbnNpb24iKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlID0gbmV3IEV4dGVuc2lvbigpOwotICAgICAgICAgICAgICAgIGUuc2V0Q2xhc3NOYW1lKENsYXNzLmZvck5hbWUoY2wuZ2V0T3B0KCJleHRlbnNpb24iKSwgZmFsc2UsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpKTsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFkZChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGZpbmQgZXh0ZW5zaW9uIGNsYXNzOiAiICsgY2wuZ2V0T3B0KCJleHRlbnNpb24iKSArICIgIElzIGl0IG9uIHlvdXIgY2xhc3NwYXRoPyIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dGVuc2lvbnMuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZXhhbXBsZTogLWV4dGVuc2lvblBhcm1zIHR5cGVNYXBwaW5nRmlsZUxvY2F0aW9uPWQ6XHR5cGVzCi0gICAgICAgICAgICBpZiAoY2wuZ2V0T3B0KCJleHRlbnNpb25QYXJtcyIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZSA9IChFeHRlbnNpb24pIGV4dGVuc2lvbnMuZ2V0KDApOwotICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvblBhcm1zIGFyZSBkZWxpbWl0ZWQgYnkgJzsnCi0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcm1Ub2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsLmdldE9wdCgiZXh0ZW5zaW9uUGFybXMiKSwgIjsiKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocGFybVRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG5hbWUgdmFsdWUgcGFpciBmb3IgZWFjaCBleHRlbnNpb24gcGFybXMgYW5kIHN0aWNrIGludG8gZXh0ZW5zaW9uIHBhcm1zCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBudlBhaXIgPSBwYXJtVG9rZW5zLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBudlBhaXIuaW5kZXhPZignPScpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImV4dGVuc2lvblBhcm1zIHNob3VsZCBiZSBuYW1lPXZhbHVlO25hbWU9dmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuID0gbnZQYWlyLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gbnZQYWlyLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb24uUGFyYW0gcGFyYW0gPSBlLmNyZWF0ZVBhcmFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldE5hbWUobik7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFZhbHVlKHYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjbGFzc2VzZGlyID0gY2wuZ2V0T3B0KCJkIik7Ci0gICAgICAgIEZpbGUgY2xhc3NlcyA9IG51bGw7Ci0gICAgICAgIGlmIChjbGFzc2VzZGlyICE9IG51bGwpCi0gICAgICAgICAgICBjbGFzc2VzID0gbmV3IEZpbGUoY2xhc3Nlc2Rpcik7Ci0KLSAgICAgICAgU3RyaW5nIHNyY2RpciA9IGNsLmdldE9wdCgic3JjIik7Ci0gICAgICAgIEZpbGUgc3JjID0gbnVsbDsKLSAgICAgICAgaWYgKHNyY2RpciAhPSBudWxsKQotICAgICAgICAgICAgc3JjID0gbmV3IEZpbGUoc3JjZGlyKTsKLSAgICAgICAgaWYgKG5vamF2YWMgJiYgc3JjZGlyID09IG51bGwgJiYgY2xhc3NlcyAhPSBudWxsKQotICAgICAgICAgICAgc3JjID0gY2xhc3NlczsKLQotICAgICAgICAvLyBjcmVhdGUgdGVtcCBkaXJlY3RvcnkKLSAgICAgICAgRmlsZSB0ZW1wZGlyID0gbnVsbDsKLSAgICAgICAgaWYgKHNyYyA9PSBudWxsIHx8IGNsYXNzZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcGRpciA9IFNjaGVtYUNvZGVHZW5lcmF0b3IuY3JlYXRlVGVtcERpcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIGNyZWF0aW5nIHRlbXAgZGlyICIgKyBlKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgamFyZmlsZSA9IG51bGw7Ci0gICAgICAgIGlmIChvdXRwdXRmaWxlbmFtZSA9PSBudWxsICYmIGNsYXNzZXMgPT0gbnVsbCAmJiAhbm9qYXZhYykKLSAgICAgICAgICAgIG91dHB1dGZpbGVuYW1lID0gInhtbHR5cGVzLmphciI7Ci0gICAgICAgIGlmIChvdXRwdXRmaWxlbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgamFyZmlsZSA9IG5ldyBGaWxlKG91dHB1dGZpbGVuYW1lKTsKLQotICAgICAgICBpZiAoc3JjID09IG51bGwpCi0gICAgICAgICAgICBzcmMgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZURpcih0ZW1wZGlyLCAic3JjIik7Ci0gICAgICAgIGlmIChjbGFzc2VzID09IG51bGwpCi0gICAgICAgICAgICBjbGFzc2VzID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVEaXIodGVtcGRpciwgImNsYXNzZXMiKTsKLQotICAgICAgICBGaWxlW10gY2xhc3NwYXRoID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNwU3RyaW5nID0gY2wuZ2V0T3B0KCJjcCIpOwotICAgICAgICBpZiAoY3BTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gY3BwYXJ0cyA9IGNwU3RyaW5nLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7Ci0gICAgICAgICAgICBMaXN0IGNwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3BwYXJ0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBjcExpc3QuYWRkKG5ldyBGaWxlKGNwcGFydHNbaV0pKTsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IChGaWxlW10pY3BMaXN0LnRvQXJyYXkobmV3IEZpbGVbY3BMaXN0LnNpemUoKV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gQ29kZUdlblV0aWwuc3lzdGVtQ2xhc3NwYXRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY29tcGlsZXIgPSBjbC5nZXRPcHQoImNvbXBpbGVyIik7Ci0gICAgICAgIFN0cmluZyBqYXIgPSBjbC5nZXRPcHQoImphciIpOwotCi0gICAgICAgIFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZSA9IGNsLmdldE9wdCgibXMiKTsKLSAgICAgICAgU3RyaW5nIG1lbW9yeU1heGltdW1TaXplID0gY2wuZ2V0T3B0KCJteCIpOwotCi0gICAgICAgIEZpbGVbXSB4c2RGaWxlcyA9IGNsLmZpbGVzRW5kaW5nV2l0aCgiLnhzZCIpOwotICAgICAgICBGaWxlW10gd3NkbEZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIud3NkbCIpOwotICAgICAgICBGaWxlW10gamF2YUZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIuamF2YSIpOwotICAgICAgICBGaWxlW10gY29uZmlnRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54c2Rjb25maWciKTsKLQotICAgICAgICBpZiAoeHNkRmlsZXMubGVuZ3RoICsgd3NkbEZpbGVzLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBmaW5kIGFueSB4c2Qgb3Igd3NkbCBmaWxlcyB0byBwcm9jZXNzLiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZSBiYXNlRGlyID0gY2wuZ2V0QmFzZURpcigpOwotICAgICAgICBVUkkgYmFzZVVSSSA9IGJhc2VEaXIgPT0gbnVsbCA/IG51bGwgOiBiYXNlRGlyLnRvVVJJKCk7Ci0KLSAgICAgICAgWG1sRXJyb3JQcmludGVyIGVyciA9IG5ldyBYbWxFcnJvclByaW50ZXIodmVyYm9zZSwgYmFzZVVSSSk7Ci0KLSAgICAgICAgUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0QmFzZURpcihiYXNlRGlyKTsKLSAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKHhzZEZpbGVzKTsKLSAgICAgICAgcGFyYW1zLnNldFdzZGxGaWxlcyh3c2RsRmlsZXMpOwotICAgICAgICBwYXJhbXMuc2V0SmF2YUZpbGVzKGphdmFGaWxlcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRDb25maWdGaWxlcyhjb25maWdGaWxlcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihqYXJmaWxlKTsKLSAgICAgICAgcGFyYW1zLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjKTsKLSAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRDb21waWxlcihjb21waWxlcik7Ci0gICAgICAgIHBhcmFtcy5zZXRKYXIoamFyKTsKLSAgICAgICAgcGFyYW1zLnNldE1lbW9yeUluaXRpYWxTaXplKG1lbW9yeUluaXRpYWxTaXplKTsKLSAgICAgICAgcGFyYW1zLnNldE1lbW9yeU1heGltdW1TaXplKG1lbW9yeU1heGltdW1TaXplKTsKLSAgICAgICAgcGFyYW1zLnNldE5vamF2YWMobm9qYXZhYyk7Ci0gICAgICAgIHBhcmFtcy5zZXRRdWlldChxdWlldCk7Ci0gICAgICAgIHBhcmFtcy5zZXRWZXJib3NlKHZlcmJvc2UpOwotICAgICAgICBwYXJhbXMuc2V0RG93bmxvYWQoZG93bmxvYWQpOwotICAgICAgICBwYXJhbXMuc2V0Tm9VcGEobm9VcGEpOwotICAgICAgICBwYXJhbXMuc2V0Tm9QdnIobm9QdnIpOwotICAgICAgICBwYXJhbXMuc2V0RGVidWcoZGVidWcpOwotICAgICAgICBwYXJhbXMuc2V0RXJyb3JMaXN0ZW5lcihlcnIpOwotICAgICAgICBwYXJhbXMuc2V0UmVwYWNrYWdlKHJlcGFja2FnZSk7Ci0gICAgICAgIHBhcmFtcy5zZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotICAgICAgICBwYXJhbXMuc2V0SmF4YihqYXhiKTsKLSAgICAgICAgcGFyYW1zLnNldE1kZWZOYW1lc3BhY2VzKG1kZWZOYW1lc3BhY2VzKTsKLQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGNvbXBpbGUocGFyYW1zKTsKLQotICAgICAgICBpZiAodGVtcGRpciAhPSBudWxsKQotICAgICAgICAgICAgU2NoZW1hQ29kZUdlbmVyYXRvci50cnlIYXJkVG9EZWxldGUodGVtcGRpcik7Ci0KLSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLQotICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcnMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyOwotICAgICAgICBwcml2YXRlIEZpbGVbXSB4c2RGaWxlczsKLSAgICAgICAgcHJpdmF0ZSBGaWxlW10gd3NkbEZpbGVzOwotICAgICAgICBwcml2YXRlIEZpbGVbXSBqYXZhRmlsZXM7Ci0gICAgICAgIHByaXZhdGUgRmlsZVtdIGNvbmZpZ0ZpbGVzOwotICAgICAgICBwcml2YXRlIEZpbGVbXSBjbGFzc3BhdGg7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBvdXRwdXRKYXI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBzcmNEaXI7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBjbGFzc2VzRGlyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVtb3J5TWF4aW11bVNpemU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBqYXI7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBub2phdmFjOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcXVpZXQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZG93bmxvYWQ7Ci0gICAgICAgIHByaXZhdGUgQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbm9VcGE7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBub1B2cjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnOwotICAgICAgICBwcml2YXRlIFN0cmluZyByZXBhY2thZ2U7Ci0gICAgICAgIHByaXZhdGUgTGlzdCBleHRlbnNpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGpheGI7Ci0gICAgICAgIHByaXZhdGUgU2V0IG1kZWZOYW1lc3BhY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEJhc2VEaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZURpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2VEaXIoRmlsZSBiYXNlRGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmJhc2VEaXIgPSBiYXNlRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRYc2RGaWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB4c2RGaWxlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFhzZEZpbGVzKEZpbGVbXSB4c2RGaWxlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy54c2RGaWxlcyA9IHhzZEZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRXc2RsRmlsZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbEZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0V3NkbEZpbGVzKEZpbGVbXSB3c2RsRmlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMud3NkbEZpbGVzID0gd3NkbEZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRKYXZhRmlsZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YUZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SmF2YUZpbGVzKEZpbGVbXSBqYXZhRmlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuamF2YUZpbGVzID0gamF2YUZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRDb25maWdGaWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb25maWdGaWxlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGVzKEZpbGVbXSBjb25maWdGaWxlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb25maWdGaWxlcyA9IGNvbmZpZ0ZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRDbGFzc3BhdGgoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NwYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKEZpbGVbXSBjbGFzc3BhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0SmFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG91dHB1dEphcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEphcihGaWxlIG91dHB1dEphcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5vdXRwdXRKYXIgPSBvdXRwdXRKYXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZSBnZXRTcmNEaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3JjRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3JjRGlyKEZpbGUgc3JjRGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNyY0RpciA9IHNyY0RpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldENsYXNzZXNEaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3Nlc0RpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzZXNEaXIoRmlsZSBjbGFzc2VzRGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzZXNEaXIgPSBjbGFzc2VzRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOb2phdmFjKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5vamF2YWM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb2phdmFjKGJvb2xlYW4gbm9qYXZhYykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ub2phdmFjID0gbm9qYXZhYzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUXVpZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcXVpZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWlldChib29sZWFuIHF1aWV0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdmVyYm9zZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEb3dubG9hZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkb3dubG9hZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvd25sb2FkKGJvb2xlYW4gZG93bmxvYWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZG93bmxvYWQgPSBkb3dubG9hZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTm9VcGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbm9VcGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb1VwYShib29sZWFuIG5vVXBhKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5vVXBhID0gbm9VcGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vUHZyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5vUHZyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9QdnIoYm9vbGVhbiBub1B2cikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ub1B2ciA9IG5vUHZyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWJ1ZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5SW5pdGlhbFNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWVtb3J5SW5pdGlhbFNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlJbml0aWFsU2l6ZShTdHJpbmcgbWVtb3J5SW5pdGlhbFNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWVtb3J5SW5pdGlhbFNpemUgPSBtZW1vcnlJbml0aWFsU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5TWF4aW11bVNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWVtb3J5TWF4aW11bVNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlNYXhpbXVtU2l6ZShTdHJpbmcgbWVtb3J5TWF4aW11bVNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWVtb3J5TWF4aW11bVNpemUgPSBtZW1vcnlNYXhpbXVtU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGlsZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGlsZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb21waWxlcihTdHJpbmcgY29tcGlsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29tcGlsZXIgPSBjb21waWxlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGphcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEphcihTdHJpbmcgamFyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmphciA9IGphcjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SmF4Yihib29sZWFuIGpheGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuamF4YiA9IGpheGI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRKYXhiKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuamF4YjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVycm9yTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3JMaXN0ZW5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTGlzdGVuZXIoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmVycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXBhY2thZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwYWNrYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVwYWNrYWdlKFN0cmluZyBuZXdSZXBhY2thZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcGFja2FnZSA9IG5ld1JlcGFja2FnZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbnMoTGlzdCBleHRlbnNpb25zKSB7Ci0gICAgICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldCBnZXRNZGVmTmFtZXNwYWNlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZGVmTmFtZXNwYWNlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1kZWZOYW1lc3BhY2VzKFNldCBtZGVmTmFtZXNwYWNlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tZGVmTmFtZXNwYWNlcyA9IG1kZWZOYW1lc3BhY2VzOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGxvYWRUeXBlU3lzdGVtKAotICAgICAgICBTdHJpbmcgbmFtZSwgRmlsZVtdIHhzZEZpbGVzLAotICAgICAgICBGaWxlW10gd3NkbEZpbGVzLCBGaWxlW10gY29uZmlnRmlsZXMsIFJlc291cmNlTG9hZGVyIGNwUmVzb3VyY2VMb2FkZXIsCi0gICAgICAgIGJvb2xlYW4gZG93bmxvYWQsIGJvb2xlYW4gbm9VcGEsIGJvb2xlYW4gbm9QdnIsIFNldCBtZGVmTmFtZXNwYWNlcywKLSAgICAgICAgRmlsZSBiYXNlRGlyLCBNYXAgc291cmNlc1RvQ29weU1hcCwgQ29sbGVjdGlvbiBvdXRlckVycm9yTGlzdGVuZXIpCi0gICAgewotICAgICAgICBYbWxFcnJvcldhdGNoZXIgZXJyb3JMaXN0ZW5lciA9IG5ldyBYbWxFcnJvcldhdGNoZXIob3V0ZXJFcnJvckxpc3RlbmVyKTsKLQotICAgICAgICAvLyBGb3IgcGFyc2luZyBYU0QgYW5kIFdTREwgZmlsZXMsIHdlIHNob3VsZCB1c2UgdGhlIFNjaGVtYURvY3VtZW50Ci0gICAgICAgIC8vIGNsYXNzbG9hZGVyIHJhdGhlciB0aGFuIHRoZSB0aHJlYWQgY29udGV4dCBjbGFzc2xvYWRlci4gIFRoaXMgaXMKLSAgICAgICAgLy8gYmVjYXVzZSBpbiBzb21lIHNpdHVhdGlvbnMgKHN1Y2ggYXMgd2hlbiBiZWluZyBpbnZva2VkIGJ5IGFudAotICAgICAgICAvLyB1bmRlcm5lYXRoIHRoZSBpZGUpIHRoZSBjb250ZXh0IGNsYXNzbG9hZGVyIGlzIHBvdGVudGlhbGx5IHdlaXJkCi0gICAgICAgIC8vIChiZWNhdXNlIG9mIHRoZSBkZXNpZ24gb2YgYW50KS4KLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciA9IFhtbEJlYW5zLnR5cGVMb2FkZXJGb3JDbGFzc0xvYWRlcihTY2hlbWFEb2N1bWVudC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICAvLyBzdGVwIDEsIHBhcnNlIGFsbCB0aGUgWFNEIGZpbGVzLgotICAgICAgICBBcnJheUxpc3Qgc2NvbnRlbnRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoeHNkRmlsZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkU3Vic3RpdHV0ZU5hbWVzcGFjZXMoTUFQX0NPTVBBVElCSUxJVFlfQ09ORklHX1VSSVMpOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBzY2hlbWFkb2MgPSBsb2FkZXIucGFyc2UoeHNkRmlsZXNbaV0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShzY2hlbWFkb2MgaW5zdGFuY2VvZiBTY2hlbWFEb2N1bWVudCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiRG9jdW1lbnQgIiArIHhzZEZpbGVzW2ldICsgIiBpcyBub3QgYSBzY2hlbWEgZmlsZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgc2NoZW1hZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRJbmZvKGVycm9yTGlzdGVuZXIsICJMb2FkaW5nIHNjaGVtYSBmaWxlICIgKyB4c2RGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdHMgPSBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hZG9jLnZhbGlkYXRlKG9wdHMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb250ZW50bGlzdC5hZGQoKChTY2hlbWFEb2N1bWVudClzY2hlbWFkb2MpLmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlLmdldEVycm9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkNhbm5vdCBsb2FkIGZpbGUgIiArIHhzZEZpbGVzW2ldICsgIjogIiArIGUsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgeHNkRmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0ZXAgMiwgcGFyc2UgYWxsIFdTREwgZmlsZXMKLSAgICAgICAgaWYgKHdzZGxGaWxlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLCAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2ludGVybmFsL3htbGJlYW5zL3dzZGxzdWJzdCIKLSAgICAgICAgICAgICAgICAgICAgKSk7Ci0KLQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3Qgd3NkbGRvYyA9IGxvYWRlci5wYXJzZSh3c2RsRmlsZXNbaV0sIG51bGwsIG9wdGlvbnMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghKHdzZGxkb2MgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmludGVybmFsLnhtbGJlYW5zLndzZGxzdWJzdC5EZWZpbml0aW9uc0RvY3VtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiRG9jdW1lbnQgIiArIHdzZGxGaWxlc1tpXSArICIgaXMgbm90IGEgd3NkbCBmaWxlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCB3c2RsZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NkbENvbnRhaW5zRW5jb2RlZCh3c2RsZG9jKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkV2FybmluZyhlcnJvckxpc3RlbmVyLCAiVGhlIFdTREwgIiArIHdzZGxGaWxlc1tpXSArICIgdXNlcyBTT0FQIGVuY29kaW5nLiBTT0FQIGVuY29kaW5nIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggbGl0ZXJhbCBYTUwgU2NoZW1hLiIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgd3NkbGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkSW5mbyhlcnJvckxpc3RlbmVyLCAiTG9hZGluZyB3c2RsIGZpbGUgIiArIHdzZGxGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3RbXSB0eXBlcyA9ICgob3JnLmFwYWNoZS5pbnRlcm5hbC54bWxiZWFucy53c2Rsc3Vic3QuRGVmaW5pdGlvbnNEb2N1bWVudCl3c2RsZG9jKS5nZXREZWZpbml0aW9ucygpLmdldFR5cGVzQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNhc3QgZm9yIHBhcmFub2lhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2NoZW1hcyA9IChTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSl0eXBlc1tqXS5zZWxlY3RQYXRoKCJkZWNsYXJlIG5hbWVzcGFjZSB4cz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeHM6c2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzY2hlbWFzLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYXNba10udmFsaWRhdGUobmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdGVuZXIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb250ZW50bGlzdC5hZGQoc2NoZW1hc1trXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHNjaGVtYXMubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEluZm8oZXJyb3JMaXN0ZW5lciwgIlByb2Nlc3NpbmcgIiArIGNvdW50ICsgIiBzY2hlbWEocykgaW4gIiArIHdzZGxGaWxlc1tpXS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlLmdldEVycm9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkNhbm5vdCBsb2FkIGZpbGUgIiArIHdzZGxGaWxlc1tpXSArICI6ICIgKyBlLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIHdzZGxGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2RvY3MgPSAoU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10pc2NvbnRlbnRsaXN0LnRvQXJyYXkobmV3IFNjaGVtYURvY3VtZW50LlNjaGVtYVtzY29udGVudGxpc3Quc2l6ZSgpXSk7Ci0KLSAgICAgICAgLy8gbm93IHRoZSBjb25maWcgZmlsZXMuCi0gICAgICAgIEFycmF5TGlzdCBjZG9jbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGNvbmZpZ0ZpbGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5MT0FEX0xJTkVfTlVNQkVSUyApOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyhNQVBfQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IGNvbmZpZ2RvYyA9IGxvYWRlci5wYXJzZShjb25maWdGaWxlc1tpXSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZ2RvYyBpbnN0YW5jZW9mIENvbmZpZ0RvY3VtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiRG9jdW1lbnQgIiArIGNvbmZpZ0ZpbGVzW2ldICsgIiBpcyBub3QgYW4geHNkIGNvbmZpZyBmaWxlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCBjb25maWdkb2MpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRJbmZvKGVycm9yTGlzdGVuZXIsICJMb2FkaW5nIGNvbmZpZyBmaWxlICIgKyBjb25maWdGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnZG9jLnZhbGlkYXRlKG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3RlbmVyKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RvY2xpc3QuYWRkKCgoQ29uZmlnRG9jdW1lbnQpY29uZmlnZG9jKS5nZXRDb25maWcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZS5nZXRFcnJvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEVycm9yKGVycm9yTGlzdGVuZXIsICJDYW5ub3QgbG9hZCB4c2QgY29uZmlnIGZpbGUgIiArIGNvbmZpZ0ZpbGVzW2ldICsgIjogIiArIGUsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfQ09ORklHX0ZJTEUsIGNvbmZpZ0ZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ29uZmlnRG9jdW1lbnQuQ29uZmlnW10gY2RvY3MgPSAoQ29uZmlnRG9jdW1lbnQuQ29uZmlnW10pY2RvY2xpc3QudG9BcnJheShuZXcgQ29uZmlnRG9jdW1lbnQuQ29uZmlnW2Nkb2NsaXN0LnNpemUoKV0pOwotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbGlua1RvID0gU2NoZW1hVHlwZUxvYWRlckltcGwuYnVpbGQobnVsbCwgY3BSZXNvdXJjZUxvYWRlciwgbnVsbCk7Ci0KLSAgICAgICAgVVJJIGJhc2VVUkkgPSBudWxsOwotICAgICAgICBpZiAoYmFzZURpciAhPSBudWxsKQotICAgICAgICAgICAgYmFzZVVSSSA9IGJhc2VEaXIudG9VUkkoKTsKLQotICAgICAgICBYbWxPcHRpb25zIG9wdHMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBpZiAoZG93bmxvYWQpCi0gICAgICAgICAgICBvcHRzLnNldENvbXBpbGVEb3dubG9hZFVybHMoKTsKLSAgICAgICAgaWYgKG5vVXBhKQotICAgICAgICAgICAgb3B0cy5zZXRDb21waWxlTm9VcGFSdWxlKCk7Ci0gICAgICAgIGlmIChub1B2cikKLSAgICAgICAgICAgIG9wdHMuc2V0Q29tcGlsZU5vUHZyUnVsZSgpOwotICAgICAgICBpZiAobWRlZk5hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIG9wdHMuc2V0Q29tcGlsZU1kZWZOYW1lc3BhY2VzKG1kZWZOYW1lc3BhY2VzKTsKLSAgICAgICAgb3B0cy5zZXRDb21waWxlTm9WYWxpZGF0aW9uKCk7IC8vIGFscmVhZHkgdmFsaWRhdGVkIGhlcmUKLQotICAgICAgICAvLyBub3cgcGFzcyBpdCB0byB0aGUgbWFpbiBjb21waWxlIGZ1bmN0aW9uCi0gICAgICAgIFNjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgcGFyYW1zLnNldFNjaGVtYXMoc2RvY3MpOwotICAgICAgICBwYXJhbXMuc2V0Q29uZmlncyhjZG9jcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRMaW5rVG8obGlua1RvKTsKLSAgICAgICAgcGFyYW1zLnNldE9wdGlvbnMob3B0cyk7Ci0gICAgICAgIHBhcmFtcy5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdGVuZXIpOwotICAgICAgICBwYXJhbXMuc2V0SmF2YWl6ZSh0cnVlKTsKLSAgICAgICAgcGFyYW1zLnNldEJhc2VVUkkoYmFzZVVSSSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTb3VyY2VzVG9Db3B5TWFwKHNvdXJjZXNUb0NvcHlNYXApOwotICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZShQYXJhbWV0ZXJzIHBhcmFtcykKLSAgICB7Ci0gICAgICAgIEZpbGUgYmFzZURpciA9IHBhcmFtcy5nZXRCYXNlRGlyKCk7Ci0gICAgICAgIEZpbGVbXSB4c2RGaWxlcyA9IHBhcmFtcy5nZXRYc2RGaWxlcygpOwotICAgICAgICBGaWxlW10gd3NkbEZpbGVzID0gcGFyYW1zLmdldFdzZGxGaWxlcygpOwotICAgICAgICBGaWxlW10gamF2YUZpbGVzID0gcGFyYW1zLmdldEphdmFGaWxlcygpOwotICAgICAgICBGaWxlW10gY29uZmlnRmlsZXMgPSBwYXJhbXMuZ2V0Q29uZmlnRmlsZXMoKTsKLSAgICAgICAgRmlsZVtdIGNsYXNzcGF0aCA9IHBhcmFtcy5nZXRDbGFzc3BhdGgoKTsKLSAgICAgICAgRmlsZSBvdXRwdXRKYXIgPSBwYXJhbXMuZ2V0T3V0cHV0SmFyKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldE5hbWUoKTsKLSAgICAgICAgRmlsZSBzcmNEaXIgPSBwYXJhbXMuZ2V0U3JjRGlyKCk7Ci0gICAgICAgIEZpbGUgY2xhc3Nlc0RpciA9IHBhcmFtcy5nZXRDbGFzc2VzRGlyKCk7Ci0gICAgICAgIFN0cmluZyBjb21waWxlciA9IHBhcmFtcy5nZXRDb21waWxlcigpOwotICAgICAgICBTdHJpbmcgamFyID0gcGFyYW1zLmdldEphcigpOwotICAgICAgICBTdHJpbmcgbWVtb3J5SW5pdGlhbFNpemUgPSBwYXJhbXMuZ2V0TWVtb3J5SW5pdGlhbFNpemUoKTsKLSAgICAgICAgU3RyaW5nIG1lbW9yeU1heGltdW1TaXplID0gcGFyYW1zLmdldE1lbW9yeU1heGltdW1TaXplKCk7Ci0gICAgICAgIGJvb2xlYW4gbm9qYXZhYyA9IHBhcmFtcy5pc05vamF2YWMoKTsKLSAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IHBhcmFtcy5pc0RlYnVnKCk7Ci0gICAgICAgIGJvb2xlYW4gdmVyYm9zZSA9IHBhcmFtcy5pc1ZlcmJvc2UoKTsKLSAgICAgICAgYm9vbGVhbiBxdWlldCA9IHBhcmFtcy5pc1F1aWV0KCk7Ci0gICAgICAgIGJvb2xlYW4gZG93bmxvYWQgPSBwYXJhbXMuaXNEb3dubG9hZCgpOwotICAgICAgICBib29sZWFuIG5vVXBhID0gcGFyYW1zLmlzTm9VcGEoKTsKLSAgICAgICAgYm9vbGVhbiBub1B2ciA9IHBhcmFtcy5pc05vUHZyKCk7Ci0gICAgICAgIENvbGxlY3Rpb24gb3V0ZXJFcnJvckxpc3RlbmVyID0gcGFyYW1zLmdldEVycm9yTGlzdGVuZXIoKTsKLSAgICAgICAgU3RyaW5nIHJlcGFja2FnZSA9IHBhcmFtcy5nZXRSZXBhY2thZ2UoKTsKLSAgICAgICAgTGlzdCBleHRlbnNpb25zID0gcGFyYW1zLmdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgYm9vbGVhbiBqYXhiID0gcGFyYW1zLmdldEpheGIoKTsKLSAgICAgICAgU2V0IG1kZWZOYW1lc3BhY2VzID0gcGFyYW1zLmdldE1kZWZOYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsIHx8IGNsYXNzZXNEaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNyYyBhbmQgY2xhc3MgZ2VuIGRpcmVjdG9yaWVzIG1heSBub3QgYmUgbnVsbC4iKTsKLQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB1c2VuYW1lcyBiYXNlZCBvbiB0aGUgcmVsYXRpdml6ZWQgZmlsZW5hbWVzIG9uIHRoZSBmaWxlc3lzdGVtCi0gICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpCi0gICAgICAgICAgICBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKLQotICAgICAgICBSZXNvdXJjZUxvYWRlciBjcFJlc291cmNlTG9hZGVyID0gbnVsbDsKLQotICAgICAgICBNYXAgc291cmNlc1RvQ29weU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKQotICAgICAgICAgICAgY3BSZXNvdXJjZUxvYWRlciA9IG5ldyBQYXRoUmVzb3VyY2VMb2FkZXIoY2xhc3NwYXRoKTsKLQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLSAgICAgICAgLy8gYnVpbGQgdGhlIGluLW1lbW9yeSB0eXBlIHN5c3RlbQotICAgICAgICBYbWxFcnJvcldhdGNoZXIgZXJyb3JMaXN0ZW5lciA9IG5ldyBYbWxFcnJvcldhdGNoZXIob3V0ZXJFcnJvckxpc3RlbmVyKTsKLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0gPSBsb2FkVHlwZVN5c3RlbShuYW1lLCB4c2RGaWxlcywgd3NkbEZpbGVzLCBjb25maWdGaWxlcywgY3BSZXNvdXJjZUxvYWRlciwgZG93bmxvYWQsIG5vVXBhLCBub1B2ciwgbWRlZk5hbWVzcGFjZXMsIGJhc2VEaXIsIHNvdXJjZXNUb0NvcHlNYXAsIGVycm9yTGlzdGVuZXIpOwotICAgICAgICBpZiAoZXJyb3JMaXN0ZW5lci5oYXNFcnJvcigpKQotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmICghcXVpZXQpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gYnVpbGQgc2NoZW1hIHR5cGUgc3lzdGVtOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiICk7Ci0KLSAgICAgICAgLy8gbm93IGNvZGUgZ2VuZXJhdGUgYW5kIGNvbXBpbGUgdGhlIEpBUgotICAgICAgICBpZiAocmVzdWx0ICYmIHN5c3RlbSAhPSBudWxsKSAvLyB0b2RvOiBkb24ndCBjaGVjayAicmVzdWx0IiBoZXJlIGlmIHdlIHdhbnQgdG8gY29tcGlsZSBhbnl3YXksIGlnbm9yaW5nIGludmFsaWQgc2NoZW1hcwotICAgICAgICB7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICAvLyBnZW5lcmF0ZSBzb3VyY2UgYW5kIC54c2IKLSAgICAgICAgICAgIExpc3Qgc291cmNlZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICByZXN1bHQgJj0gU2NoZW1hQ29kZUdlbmVyYXRvci5jb21waWxlVHlwZVN5c3RlbShzeXN0ZW0sIHNyY0RpciwgamF2YUZpbGVzLCBzb3VyY2VzVG9Db3B5TWFwLCBjbGFzc3BhdGgsIGNsYXNzZXNEaXIsIG91dHB1dEphciwgbm9qYXZhYywgamF4YiwgZXJyb3JMaXN0ZW5lciwgcmVwYWNrYWdlLCB2ZXJib3NlLCBzb3VyY2VmaWxlcyk7Ci0gICAgICAgICAgICByZXN1bHQgJj0gIWVycm9yTGlzdGVuZXIuaGFzRXJyb3IoKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gZ2VuZXJhdGUgY29kZTogIiArICgoZG91YmxlKShmaW5pc2ggLSBzdGFydCkgLyAxMDAwLjApICsgIiBzZWNvbmRzIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb21waWxlIHNvdXJjZQotICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhbm9qYXZhYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGphdmFGaWxlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGRBbGwoamF2YS51dGlsLkFycmF5cy5hc0xpc3QoamF2YUZpbGVzKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFDb2RlR2VuVXRpbC5leHRlcm5hbENvbXBpbGUoc291cmNlZmlsZXMsIGNsYXNzZXNEaXIsIGNsYXNzcGF0aCwgZGVidWcsIGNvbXBpbGVyLCBtZW1vcnlJbml0aWFsU2l6ZSwgbWVtb3J5TWF4aW11bVNpemUsIHF1aWV0LCB2ZXJib3NlKSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmICFwYXJhbXMuaXNRdWlldCgpKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gY29tcGlsZSBjb2RlOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBqYXIgY2xhc3NlcyBhbmQgLnhzYgotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgb3V0cHV0SmFyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIUNvZGVHZW5VdGlsLmV4dGVybmFsSmFyKGNsYXNzZXNEaXIsIG91dHB1dEphciwgamFyLCBxdWlldCwgdmVyYm9zZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmICFwYXJhbXMuaXNRdWlldCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlZCB0eXBlcyB0bzogIiArIG91dHB1dEphcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXN1bHQgJiYgIXF1aWV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJVSUxEIEZBSUxFRCIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gY2FsbCBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uIGlmIHJlZ2lzdGVyZWQKLSAgICAgICAgICAgIHJ1bkV4dGVuc2lvbnMoZXh0ZW5zaW9ucywgc3lzdGVtLCBjbGFzc2VzRGlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjcFJlc291cmNlTG9hZGVyICE9IG51bGwpCi0gICAgICAgICAgICBjcFJlc291cmNlTG9hZGVyLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5FeHRlbnNpb25zKExpc3QgZXh0ZW5zaW9ucywgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIEZpbGUgY2xhc3Nlc0RpcikKLSAgICB7Ci0gICAgICAgIGlmIChleHRlbnNpb25zICE9IG51bGwgJiYgZXh0ZW5zaW9ucy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFDb21waWxlckV4dGVuc2lvbiBzY2UgPSBudWxsOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIE1hcCBleHRlbnNpb25QYXJtcyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3Nlc0Rpck5hbWUgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xhc3Nlc0Rpck5hbWUgPSBjbGFzc2VzRGlyLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldBUk5JTkc6IFVuYWJsZSB0byBnZXQgdGhlIHBhdGggZm9yIHNjaGVtYSBqYXIgZmlsZSIpOwotICAgICAgICAgICAgICAgIGNsYXNzZXNEaXJOYW1lID0gY2xhc3Nlc0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24gPSAoRXh0ZW5zaW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNjZSA9IChTY2hlbWFDb21waWxlckV4dGVuc2lvbikgZXh0ZW5zaW9uLmdldENsYXNzTmFtZSgpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVOQUJMRSB0byBpbnN0YW50aWF0ZSBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uOiIgKyBleHRlbnNpb24uZ2V0Q2xhc3NOYW1lKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFWFRFTlNJT04gQ2xhc3Mgd2FzIG5vdCBydW4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklMTEVHQUwgQUNDRVNTIEV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gaW5zdGFudGlhdGUgc2NoZW1hIGNvbXBpbGVyIGV4dGVuc2lvbjogIiArIGV4dGVuc2lvbi5nZXRDbGFzc05hbWUoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVYVEVOU0lPTiBDbGFzcyB3YXMgbm90IHJ1biIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgRXh0ZW5zaW9uOiAiICsgc2NlLmdldEV4dGVuc2lvbk5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uUGFybXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcm1zaSA9IGV4dGVuc2lvbi5nZXRQYXJhbXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwYXJtc2kuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uLlBhcmFtIHAgPSAoRXh0ZW5zaW9uLlBhcmFtKSBwYXJtc2kubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25QYXJtcy5wdXQocC5nZXROYW1lKCksIHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4dGVuc2lvblBhcm1zLnB1dCgiY2xhc3Nlc0RpciIsIGNsYXNzZXNEaXJOYW1lKTsKLSAgICAgICAgICAgICAgICBzY2Uuc2NoZW1hQ29tcGlsZXJFeHRlbnNpb24oc3lzdGVtLCBleHRlbnNpb25QYXJtcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gd3NkbENvbnRhaW5zRW5jb2RlZChYbWxPYmplY3Qgd3NkbGRvYykKLSAgICB7Ci0gICAgICAgIC8vIHNlYXJjaCBmb3IgYW55IDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIi8+IGV0Yy4KLSAgICAgICAgWG1sT2JqZWN0W10gdXNlQXR0cnMgPSB3c2RsZG9jLnNlbGVjdFBhdGgoCi0gICAgICAgICAgICAgICAgImRlY2xhcmUgbmFtZXNwYWNlIHNvYXA9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8nICIgKwotICAgICAgICAgICAgICAgICIuLy9zb2FwOmJvZHkvQHVzZXwuLy9zb2FwOmhlYWRlci9AdXNlfC4vL3NvYXA6ZmF1bHQvQHVzZSIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVzZUF0dHJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoImVuY29kZWQiLmVxdWFscygoKFNpbXBsZVZhbHVlKXVzZUF0dHJzW2ldKS5nZXRTdHJpbmdWYWx1ZSgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19VUkkgPSAiaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveGJlYW4vY29uZmlnIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJID0gImh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1BUF9DT01QQVRJQklMSVRZX0NPTkZJR19VUklTOwotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgTUFQX0NPTVBBVElCSUxJVFlfQ09ORklHX1VSSVMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBNQVBfQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJUy5wdXQoQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJLCBDT05GSUdfVVJJKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlckV4dGVuc2lvbi5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MTU3Ni4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgU2NoZW1hIENvbXBpbGVyIEV4dGVuc2lvbnMuICBCeSBpbXBsZW1lbnRpbmcgdGhpcyBjbGFzcwotICogIHlvdSBjYW4gdGhlbiBwYXNzIHRoaXMgY2xhc3MgdmlhIHRoZSBjb21tYW5kIGxpbmUgcGFyYW0gPGk+ZXh0ZW5zaW9uPC9pPiB0byB0aGUgU2NoZW1hQ29tcGlsZXIgY2xhc3MKLSAqICB3aGljaCB3aWxsIHRoZW4gaW4gdHVybiBjYWxsIHRoaXMgY2xhc3MgYmFjayBvbmNlIHRoZSBjb21waWxhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHRpbmcKLSAqICBTY2hlbWFUeXBlU3lzdGVtLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uIHsKLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayBieSB0aGUgWG1sQmVhbnMgU2NoZW1hIENvbXBpbGVyIHdpdGgKLSAgICAgKiAgdGhlIFNjaGVtYSBUeXBlIFN5c3RlbSB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNvbXBpbGUuCi0gICAgICogQHBhcmFtIHNjaGVtYVR5cGVTeXN0ZW0gLSBUaGUgc2NoZW1hIHR5cGUgc3lzdGVtcyB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGp1c3QgcHJpb3IgdG8gY2FsbGluZwotICAgICAqICAgdGhpcyBleHRlbnNpb24gY2xhc3MuCi0gICAgICogQHBhcmFtIHBhcm1zIC0gbmFtZSB2YWx1ZSBwYWlycyBvZiBvcHRpb25zIHRvIHRoaXMgc2NoZW1hIGNvbXBpbGVyIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uKFNjaGVtYVR5cGVTeXN0ZW0gc2NoZW1hVHlwZVN5c3RlbSwgTWFwIHBhcm1zKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbk5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvcHkuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4Y2JjZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pbnRlcm5hbC54bWxiZWFucy53c2Rsc3Vic3QuRGVmaW5pdGlvbnNEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmludGVybmFsLnhtbGJlYW5zLndzZGxzdWJzdC5USW1wb3J0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbXBvcnREb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkluY2x1ZGVEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUNvcHkKLXsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAxIHx8IGFyZ3MubGVuZ3RoID4gMikKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogc2NoZW1hY29weSBzb3VyY2V1cmwgW3RhcmdldGZpbGVdIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBVUkkgc291cmNlID0gbnVsbDsKLSAgICAgICAgVVJJIHRhcmdldCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBVUkkoYXJnc1swXSk7Ci0gICAgICAgICAgICBzb3VyY2UudG9VUkwoKTsgLy8gdG8gdHJpZ2dlciBleGNlcHRpb24KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQmFkbHkgZm9ybWVkIFVSTCAiICsgc291cmNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVSSSBkaXIgPSBuZXcgRmlsZSgiLiIpLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0UGFydCA9IHNvdXJjZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgbGFzdFBhcnQgPSBsYXN0UGFydC5zdWJzdHJpbmcobGFzdFBhcnQubGFzdEluZGV4T2YoJy8nKSArIDEpOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IENvZGVHZW5VdGlsLnJlc29sdmUoZGlyLCBVUkkuY3JlYXRlKGxhc3RQYXJ0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgY2Fub25pY2FsaXplIGN1cnJlbnQgZGlyZWN0b3J5Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFVSSShhcmdzWzFdKTsKLSAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5pc0Fic29sdXRlKCkpCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRhcmdldC5nZXRTY2hlbWUoKS5lcXVhbHMoImZpbGUiKSkKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgRmlsZSh0YXJnZXQpLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBjYW5vbmljYWxpemUgY3VycmVudCBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE1hcCB0aGluZ3NUb0NvcHkgPSBmaW5kQWxsUmVsYXRpdmUoc291cmNlLCB0YXJnZXQpOwotICAgICAgICBjb3B5QWxsKHRoaW5nc1RvQ29weSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5QWxsKE1hcCB1cmlNYXAsIGJvb2xlYW4gc3Rkb3V0KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdXJpTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVSSSBzb3VyY2UgPSAoVVJJKWkubmV4dCgpOwotICAgICAgICAgICAgVVJJIHRhcmdldCA9IChVUkkpdXJpTWFwLmdldChzb3VyY2UpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KHNvdXJjZSwgdGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3Rkb3V0KQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBjb3B5ICIgKyBzb3VyY2UgKyAiIC0+ICIgKyB0YXJnZXQpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0ZG91dCkKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29waWVkICIgKyBzb3VyY2UgKyAiIC0+ICIgKyB0YXJnZXQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIHNjaGVtYSBvciB3c2RsIGF0IHRoZSBzb3VyY2UgVVJJIHRvIHRoZSB0YXJnZXQgVVJJLCBhbG9uZwotICAgICAqIHdpdGggYW55IHJlbGF0aXZlIHJlZmVyZW5jZXMuICBUaGUgdGFyZ2V0IFVSSSBzaG91bGQgYmUgYSBmaWxlIFVSSS4KLSAgICAgKiBJZiBkb0NvcHkgaXMgZmFsc2UsIHRoZSBmaWxlIGNvcGllcyBhcmUgbm90IGFjdHVhbGx5IGRvbmU7IHRoZSBtYXAKLSAgICAgKiByZXR1cm5lZCBqdXN0IGRlc2NyaWJlcyB0aGUgY29waWVzIHRoYXQgd291bGQgaGF2ZSBiZWVuIGRvbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlIGFuIGFyYml0cmFyeSBVUkkgZGVzY3JpYmluZyBhIHNvdXJjZSBTY2hlbWEgb3IgV1NETAotICAgICAqIEBwYXJhbSB0YXJnZXQgYSBmaWxlIFVSSSBkZXNjcmliaW5nIGEgdGFyZ2V0IGZpbGVuYW1lCi0gICAgICogQHJldHVybiBhIG1hcCBvZiBhbGwgdGhlIHNvdXJjZS90YXJnZXQgVVJJcyBuZWVkZWQgdG8gY29weQotICAgICAqIHRoZSBmaWxlIGFsb25nIHdpdGggYWxsIGl0cyByZWxhdGl2ZSByZWZlcmVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZmluZEFsbFJlbGF0aXZlKFVSSSBzb3VyY2UsIFVSSSB0YXJnZXQpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgcmVzdWx0LnB1dChzb3VyY2UsIHRhcmdldCk7Ci0KLSAgICAgICAgTGlua2VkTGlzdCBwcm9jZXNzID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgcHJvY2Vzcy5hZGQoc291cmNlKTsKLQotICAgICAgICB3aGlsZSAoIXByb2Nlc3MuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBVUkkgbmV4dFNvdXJjZSA9IChVUkkpcHJvY2Vzcy5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgVVJJIG5leHRUYXJnZXQgPSAoVVJJKXJlc3VsdC5nZXQobmV4dFNvdXJjZSk7Ci0gICAgICAgICAgICBNYXAgbmV4dFJlc3VsdHMgPSBmaW5kUmVsYXRpdmVJbk9uZShuZXh0U291cmNlLCBuZXh0VGFyZ2V0KTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5leHRSZXN1bHRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVVJJIG5ld1NvdXJjZSA9IChVUkkpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb250YWluc0tleShuZXdTb3VyY2UpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KG5ld1NvdXJjZSwgbmV4dFJlc3VsdHMuZ2V0KG5ld1NvdXJjZSkpOwotICAgICAgICAgICAgICAgIHByb2Nlc3MuYWRkKG5ld1NvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIGxvYWRPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKS4KLSAgICAgICAgICAgIHNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIsICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW50ZXJuYWwveG1sYmVhbnMvd3NkbHN1YnN0IiAKLSAgICAgICAgICAgICkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGZpbmRSZWxhdGl2ZUluT25lKFVSSSBzb3VyY2UsIFVSSSB0YXJnZXQpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJMIHNvdXJjZVVSTCA9IHNvdXJjZS50b1VSTCgpOwotICAgICAgICAgICAgWG1sT2JqZWN0IHhvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShzb3VyY2VVUkwsIGxvYWRPcHRpb25zKTsKLSAgICAgICAgICAgIFhtbEN1cnNvciB4Y3VyID0geG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgIHhjdXIudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0gICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIFNjaGVtYURvY3VtZW50KQotICAgICAgICAgICAgICAgIHB1dE1hcHBpbmdzRnJvbVNjaGVtYShyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCAoKFNjaGVtYURvY3VtZW50KXhvYmopLmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHhvYmogaW5zdGFuY2VvZiBEZWZpbml0aW9uc0RvY3VtZW50KQotICAgICAgICAgICAgICAgIHB1dE1hcHBpbmdzRnJvbVdzZGwocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgKChEZWZpbml0aW9uc0RvY3VtZW50KXhvYmopLmdldERlZmluaXRpb25zKCkpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFueSBleGNlcHRpb25zIHBhcnNpbmcgdGhlIGdpdmVuIFVSTD8gIFRoZW4gc2tpcCB0aGlzIGZpbGUgc2lsZW50bHkKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0TmV3TWFwcGluZyhNYXAgcmVzdWx0LCBVUkkgb3JpZ1NvdXJjZSwgVVJJIG9yaWdUYXJnZXQsIFN0cmluZyBsaXRlcmFsVVJJKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsaXRlcmFsVVJJID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgVVJJIG5ld1JlbGF0aXZlID0gbmV3IFVSSShsaXRlcmFsVVJJKTsKLSAgICAgICAgICAgIGlmIChuZXdSZWxhdGl2ZS5pc0Fic29sdXRlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgVVJJIG5ld1NvdXJjZSA9IENvZGVHZW5VdGlsLnJlc29sdmUob3JpZ1NvdXJjZSwgbmV3UmVsYXRpdmUpOwotICAgICAgICAgICAgVVJJIG5ld1RhcmdldCA9IENvZGVHZW5VdGlsLnJlc29sdmUob3JpZ1RhcmdldCwgbmV3UmVsYXRpdmUpOwotICAgICAgICAgICAgcmVzdWx0LnB1dChuZXdTb3VyY2UsIG5ld1RhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB1cmkgc3ludGF4IHByb2JsZW0/IGRvIG5vdGhpbmcgc2lsZW50bHkuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE1hcHBpbmdzRnJvbVNjaGVtYShNYXAgcmVzdWx0LCBVUkkgc291cmNlLCBVUkkgdGFyZ2V0LCBTY2hlbWFEb2N1bWVudC5TY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgICAgSW1wb3J0RG9jdW1lbnQuSW1wb3J0W10gaW1wb3J0cyA9IHNjaGVtYS5nZXRJbXBvcnRBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBwdXROZXdNYXBwaW5nKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsIGltcG9ydHNbaV0uZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0KLSAgICAgICAgSW5jbHVkZURvY3VtZW50LkluY2x1ZGVbXSBpbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHB1dE5ld01hcHBpbmcocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgaW5jbHVkZXNbaV0uZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRNYXBwaW5nc0Zyb21Xc2RsKE1hcCByZXN1bHQsIFVSSSBzb3VyY2UsIFVSSSB0YXJnZXQsIERlZmluaXRpb25zRG9jdW1lbnQuRGVmaW5pdGlvbnMgd2RvYykKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdFtdIHR5cGVzID0gd2RvYy5nZXRUeXBlc0FycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYURvY3VtZW50LlNjaGVtYVtdIHNjaGVtYXMgPSAoU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10pdHlwZXNbaV0uc2VsZWN0UGF0aCgiZGVjbGFyZSBuYW1lc3BhY2UgeHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyB4czpzY2hlbWEiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2NoZW1hcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICBwdXRNYXBwaW5nc0Zyb21TY2hlbWEocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgc2NoZW1hc1tqXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUSW1wb3J0W10gaW1wb3J0cyA9IHdkb2MuZ2V0SW1wb3J0QXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcHV0TmV3TWFwcGluZyhyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCBpbXBvcnRzW2ldLmdldExvY2F0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUltcG9ydFJlc29sdmVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFJbXBvcnRSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjhlMGMyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUltcG9ydFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkltcG9ydERvY3VtZW50LkltcG9ydDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkluY2x1ZGVEb2N1bWVudC5JbmNsdWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hSW1wb3J0UmVzb2x2ZXIKLXsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgSW1wb3J0TG9hZGVyIHdpc2hlcyB0byByZXNvbHZlIHRoZQotICAgICAqIGdpdmVuIGltcG9ydC4gIFNob3VsZCByZXR1cm4gYSBTY2hlbWFSZXNvdXJjZSB3aG9zZQotICAgICAqICJlcXVhbHMiIHJlbGF0aW9uc2hpcCByZXZlYWxzIHdoZW4gYSBTY2hlbWFSZXNvdXJjZSBpcwotICAgICAqIGR1cGxpY2F0ZWQgYW5kIHNob3VsZG4ndCBiZSBleGFtaW5lZCBhZ2Fpbi4KLSAgICAgKgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHNob3VsZCBiZSBpZ25vcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFSZXNvdXJjZSBsb29rdXBSZXNvdXJjZShTdHJpbmcgbnNVUkksIFN0cmluZyBVUkwpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIG5vdGlmeSB0aGF0IHRoZSBleHBlY3RlZCBuYW1lc3BhY2UgaXMgZGlmZmVyZW50IGZyb20gdGhlCi0gICAgICogYWN0dWFsIG5hbWVzcGFjZSwgb3IgaWYgbm8gbmFtZXNwYWNlIGlzIGtub3duLCB0byByZXBvcnQgdGhlCi0gICAgICogZGlzY292ZXJlZCBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0QWN0dWFsTmFtZXNwYWNlKFNjaGVtYVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgYWN0dWFsTmFtZXNwYWNlKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc3VwcGx5IGEgc2NoZW1hIHJlc291cmNlIHdpdGggYW4gb3B0aW9uYWwgYXNzb2NpYXRlZAotICAgICAqIGV4cGVjdGVkLW5hbWVzcGFjZS1VUkkgYW5kIG9yaWdpbmFsLWxvY2F0aW9uLVVSTC4KLSAgICAgKgotICAgICAqIFRoZSBlcXVhbHMgKGFuZCBoYXNoQ29kZSkgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTY2hlbWFSZXNvdXJjZQotICAgICAqIG9iamVjdHMgd2lsbCBiZSB1c2VkIHRvIGF2b2lkIGV4YW1pbmluZyB0aGUgc2FtZSByZXNvdXJjZSB0d2ljZTsKLSAgICAgKiB0aGVzZSBtdXN0IGJlIGltcGxlbWVudGVkIGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBydWxlcyBmb3IKLSAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHR3byByZXNvdXJjZXMgYXJlIHRoZSBzYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hUmVzb3VyY2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGEgcGFyc2VkIHNjaGVtYSBvYmplY3QuCi0gICAgICAgICAqLwotCi0gICAgICAgIHB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlc29sdmVJbXBvcnRzKFNjaGVtYVJlc291cmNlW10gcmVzb3VyY2VzKQotICAgIHsKLSAgICAgICAgTGlua2VkTGlzdCBxdWV1ZU9mUmVzb3VyY2VzID0gbmV3IExpbmtlZExpc3QoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKLSAgICAgICAgTGlua2VkTGlzdCBxdWV1ZU9mTG9jYXRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgICBTZXQgc2VlblJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgbmV4dFJlc291cmNlOwotCi0gICAgICAgICAgICAvLyBmZXRjaCBuZXh0IHJlc291cmNlLgotICAgICAgICAgICAgaWYgKCFxdWV1ZU9mUmVzb3VyY2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBlaXRoZXIgb2ZmIHRoZSBpbml0aWFsIHF1ZXVlCi0gICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKXF1ZXVlT2ZSZXNvdXJjZXMucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFxdWV1ZU9mTG9jYXRvcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG9yIG9mZiB0aGUgbGlzdCBvZiBsb2NhdG9ycwotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2F0b3IgbG9jYXRvciA9IChTY2hlbWFMb2NhdG9yKXF1ZXVlT2ZMb2NhdG9ycy5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IGxvb2t1cFJlc291cmNlKGxvY2F0b3IubmFtZXNwYWNlLCBsb2NhdG9yLnNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dFJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vcmUsIHRoZW4gdGVybWluYXRlIGxvb3AKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdHJhY2sgYW5kIHNraXAgZHVwbGljYXRlcwotICAgICAgICAgICAgaWYgKHNlZW5SZXNvdXJjZXMuY29udGFpbnMobmV4dFJlc291cmNlKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHNlZW5SZXNvdXJjZXMuYWRkKG5leHRSZXNvdXJjZSk7Ci0KLSAgICAgICAgICAgIC8vIGdldCByZXNvdXJjZSBjb250ZW50cwotICAgICAgICAgICAgU2NoZW1hIHNjaGVtYSA9IG5leHRSZXNvdXJjZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgYWN0dWFsIG5hbWVzcGFjZQotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBhY3R1YWxUYXJnZXROYW1lc3BhY2UgPSAiIjsKLQotICAgICAgICAgICAgLy8gcmVwb3J0IGFjdHVhbCBuYW1lc3BhY2UKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFRhcmdldE5hbWVzcGFjZSA9IG5leHRSZXNvdXJjZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChleHBlY3RlZFRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICFhY3R1YWxUYXJnZXROYW1lc3BhY2UuZXF1YWxzKGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXBvcnRBY3R1YWxOYW1lc3BhY2UobmV4dFJlc291cmNlLCBhY3R1YWxUYXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgZ28gdGhyb3VnaCBhbmQgcmVjb3JkIGFsbCB0aGUgaW1wb3J0cwotICAgICAgICAgICAgSW1wb3J0W10gc2NoZW1hSW1wb3J0cyA9IHNjaGVtYS5nZXRJbXBvcnRBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFJbXBvcnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHF1ZXVlT2ZMb2NhdG9ycy5hZGQobmV3IFNjaGVtYUxvY2F0b3Ioc2NoZW1hSW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSA9PSBudWxsID8gIiIgOiBzY2hlbWFJbXBvcnRzW2ldLmdldE5hbWVzcGFjZSgpLCBzY2hlbWFJbXBvcnRzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYW5kIHJlY29yZCBhbGwgdGhlIGluY2x1ZGVzIHRvbwotICAgICAgICAgICAgSW5jbHVkZVtdIHNjaGVtYUluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFJbmNsdWRlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBxdWV1ZU9mTG9jYXRvcnMuYWRkKG5ldyBTY2hlbWFMb2NhdG9yKG51bGwsIHNjaGVtYUluY2x1ZGVzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjaGVtYUxvY2F0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTY2hlbWFMb2NhdG9yKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYUxvY2F0aW9uID0gc2NoZW1hTG9jYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzY2hlbWFMb2NhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYVJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzljYjMyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYVJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFNjaGVtYVJlc291cmNlTWFuYWdlciBleHRlbmRzIEJhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1haW50YWlucyBcInhzZG93bmxvYWQueG1sXCIsIGFuIGluZGV4IG9mIGxvY2FsbHkgZG93bmxvYWRlZCAueHNkIGZpbGVzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBzZG93bmxvYWQgWy1kaXIgZGlyZWN0b3J5XSBbLXJlZnJlc2hdIFstcmVjdXJzZV0gWy1zeW5jXSBbdXJsL2ZpbGUuLi5dIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVUkxzIHRoYXQgYXJlIHNwZWNpZmllZCBhcmUgZG93bmxvYWRlZCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IGNhY2hlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW4gYWRkaXRpb246Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWRpciBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIHhzZG93bmxvYWQueG1sIGZpbGUgKGRlZmF1bHQgLikuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXN5bmMgc3luY2hyb25pemVzIHRoZSBpbmRleCB0byBhbnkgbG9jYWwgLnhzZCBmaWxlcyBpbiB0aGUgdHJlZS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtcmVjdXJzZSByZWN1cnNpdmVseSBkb3dubG9hZHMgaW1wb3J0ZWQgYW5kIGluY2x1ZGVkIC54c2QgZmlsZXMuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXJlZnJlc2ggcmVkb3dubG9hZHMgYWxsIGluZGV4ZWQgLnhzZCBmaWxlcy4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWYgbm8gZmlsZXMgb3IgVVJMcyBhcmUgc3BlY2lmaWVkLCBhbGwgaW5kZXhlZCBmaWxlcyBhcmUgcmVsZXZhbnQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFNldCBvcHRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgb3B0cy5hZGQoImRpciIpOwotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBvcHRzKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzeW5jID0gKGNsLmdldE9wdCgic3luYyIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIHJlZnJlc2ggPSAoY2wuZ2V0T3B0KCJyZWZyZXNoIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gaW1wb3J0cyA9IChjbC5nZXRPcHQoInJlY3Vyc2UiKSAhPSBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRpciA9IGNsLmdldE9wdCgiZGlyIik7Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGRpciA9ICIuIjsKLSAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShkaXIpOwotCi0gICAgICAgIFNjaGVtYVJlc291cmNlTWFuYWdlciBtZ3I7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtZ3IgPSBuZXcgU2NoZW1hUmVzb3VyY2VNYW5hZ2VyKGRpcmVjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgdXJpTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobG9va3NMaWtlVVJMKGFyZ3NbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVyaUxpc3QuYWRkKGFyZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgRmlsZShkaXJlY3RvcnksIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCBmaWxlcyB0aGF0IGFyZSBub3QgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmlsZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWlzSW5EaXJlY3RvcnkoZmlsZSwgZGlyZWN0b3J5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbGUgbm90IHdpdGhpbiBkaXJlY3Rvcnk6ICIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGRpcmVjdG9yaWVzCi0gICAgICAgIGZpbGVMaXN0ID0gY29sbGVjdFhTREZpbGVzKChGaWxlW10pZmlsZUxpc3QudG9BcnJheShuZXcgRmlsZVswXSkpOwotCi0gICAgICAgIFN0cmluZ1tdIHVyaXMgPSAoU3RyaW5nW10pdXJpTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBGaWxlW10gZmlsZXMgPSAoRmlsZVtdKWZpbGVMaXN0LnRvQXJyYXkobmV3IEZpbGVbMF0pOwotICAgICAgICBTdHJpbmdbXSBmaWxlbmFtZXMgPSByZWxhdGl2ZUZpbGVuYW1lcyhmaWxlcywgZGlyZWN0b3J5KTsKLQotICAgICAgICBpZiAodXJpcy5sZW5ndGggKyBmaWxlbmFtZXMubGVuZ3RoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbWdyLnByb2Nlc3ModXJpcywgZmlsZW5hbWVzLCBzeW5jLCByZWZyZXNoLCBpbXBvcnRzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1nci5wcm9jZXNzQWxsKHN5bmMsIHJlZnJlc2gsIGltcG9ydHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWdyLndyaXRlQ2FjaGUoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb29rc0xpa2VVUkwoU3RyaW5nIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdHIuc3RhcnRzV2l0aCgiaHR0cDoiKSB8fCBzdHIuc3RhcnRzV2l0aCgiaHR0cHM6IikgfHwgc3RyLnN0YXJ0c1dpdGgoImZ0cDoiKSB8fCBzdHIuc3RhcnRzV2l0aCgiZmlsZToiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVsYXRpdmVGaWxlbmFtZShGaWxlIGZpbGUsIEZpbGUgZGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmVxdWFscyhkaXJlY3RvcnkpKQotICAgICAgICAgICAgcmV0dXJuICIuIjsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlRmlsZW5hbWUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIGRpcmVjdG9yeSkgKyAiLyIgKyBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSByZWxhdGl2ZUZpbGVuYW1lcyhGaWxlW10gZmlsZXMsIEZpbGUgZGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tmaWxlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSByZWxhdGl2ZUZpbGVuYW1lKGZpbGVzW2ldLCBkaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luRGlyZWN0b3J5KEZpbGUgZmlsZSwgRmlsZSBkaXIpCi0gICAgewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoZmlsZS5lcXVhbHMoZGlyKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gaXNJbkRpcmVjdG9yeShmaWxlLmdldFBhcmVudEZpbGUoKSwgZGlyKTsKLSAgICB9Ci0KLQotCi0KLQotICAgIHB1YmxpYyBTY2hlbWFSZXNvdXJjZU1hbmFnZXIoRmlsZSBkaXJlY3RvcnkpCi0gICAgewotICAgICAgICBfZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIF9kaXJlY3Rvcnk7Ci0KLQotICAgIC8vIFNPTUUgTUVUSE9EUyBUTyBPVkVSUklERSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBtZXNzYWdlcyB0byBTeXN0ZW0ub3V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdhcm5pbmcoU3RyaW5nIG1zZykKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXhpc3RzLiAgVGhlIGZpbGVuYW1lcwotICAgICAqIGFyZSBvZiB0aGUgZm9ybSAiL2Zvby9iYXIvemVlLnhzZCIgYW5kIHNob3VsZCBiZSBjb25zdHJ1ZWQKLSAgICAgKiBhcyByb290ZWQgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKG5ldyBGaWxlKF9kaXJlY3RvcnksIGZpbGVuYW1lKSkuZXhpc3RzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gZmlsZW5hbWUgYXMgYW4gSW5wdXRTdHJlYW0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGlucHV0U3RyZWFtRm9yRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoX2RpcmVjdG9yeSwgZmlsZW5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gZW50aXJlIGZpbGUgaW4gb25lIHN0ZXAuICBBbiBJbnB1dFN0cmVhbSBpcyBwYXNzZWQgYW5kCi0gICAgICogY29waWVkIHRvIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoSW5wdXRTdHJlYW0gaW5wdXQsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShfZGlyZWN0b3J5LCBmaWxlbmFtZSk7Ci0KLSAgICAgICAgRmlsZSBwYXJlbnQgPSB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpCi0gICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGlucHV0LCBvdXRwdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBmaWxlLiAgU29tZXRpbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHdyaXRpbmcgYSBuZXcgZmlsZQotICAgICAqIHdlIG5vdGljZSB0aGF0IGl0J3MgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiBleGlzdGluZyBmaWxlIGFuZAotICAgICAqIHdlIGRlbGV0ZSBpdC4gV2UgbmV2ZXIgZGVsZXRlIGEgZmlsZSB0aGF0IHdhcyBnaXZlbiB0byB1cwotICAgICAqIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgbmV3IEZpbGUoX2RpcmVjdG9yeSwgZmlsZW5hbWUpLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgWFNEIGZpbGVzbmFtZXMgaW4gdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFsbFhTREZpbGVuYW1lcygpCi0gICAgewotICAgICAgICBGaWxlW10gYWxsRmlsZXMgPSAoRmlsZVtdKWNvbGxlY3RYU0RGaWxlcyhuZXcgRmlsZVtdIHsgX2RpcmVjdG9yeSB9KS50b0FycmF5KG5ldyBGaWxlWzBdKTsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlRmlsZW5hbWVzKGFsbEZpbGVzLCBfZGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgcmVjdXJzaXZlIGZpbGUgZmlsdGVyIHRvIGRvIHRoZSBhYm92ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGNvbGxlY3RYU0RGaWxlcyhGaWxlW10gZGlycykKLSAgICB7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gZGlyc1tpXTsKLSAgICAgICAgICAgIGlmICghZi5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGRBbGwoY29sbGVjdFhTREZpbGVzKAotICAgICAgICAgICAgICAgICAgICBmLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmlzRmlsZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhzZCIpOyB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1R5cGVIaWVyYXJjaHlQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjI1MTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFR5cGVIaWVyYXJjaHlQcmludGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsLmFyZ3MoKS5sZW5ndGggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmludHMgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG9mIHR5cGVzIGRlZmluZWQgaW4gYSBzY2hlbWEuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiB4c2R0cmVlIFstbm9hbm9uXSBbLW5vcHZyXSBbLW5vdXBhXSBbLWxpY2Vuc2VdIGZpbGUxLnhzZCBmaWxlMi54c2QgLi4uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gbm9hbm9uID0gKGNsLmdldE9wdCgibm9hbm9uIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gbm9wdnIgPSAoY2wuZ2V0T3B0KCJub3B2ciIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIG5vdXBhID0gKGNsLmdldE9wdCgibm91cGEiKSAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIEZpbGVbXSBzY2hlbWFGaWxlcyA9IGNsLmdldEZpbGVzKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBzdGVwIDE6IGxvYWQgYWxsIHRoZSBmaWxlcwotICAgICAgICBMaXN0IHNkb2NzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYUZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZG9jcy5hZGQoCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFGaWxlc1tpXSwgKG5ldyBYbWxPcHRpb25zKCkpLnNldExvYWRMaW5lTnVtYmVycygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCBzY2hlbWFGaWxlc1tpXSArICIgbm90IGxvYWRhYmxlOiAiICsgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotCi0gICAgICAgIFhtbE9iamVjdFtdIHNjaGVtYXMgPSAoWG1sT2JqZWN0W10pc2RvY3MudG9BcnJheShuZXcgWG1sT2JqZWN0WzBdKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHN0ZXAgMjogY29tcGlsZSBhbGwgdGhlIHNjaGVtYXMKLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtOwotICAgICAgICBDb2xsZWN0aW9uIGNvbXBFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFhtbE9wdGlvbnMgc2NoZW1hT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihjb21wRXJyb3JzKTsKLSAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlRG93bmxvYWRVcmxzKCk7Ci0gICAgICAgIGlmIChub3B2cikKLSAgICAgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZU5vUHZyUnVsZSgpOwotICAgICAgICBpZiAobm91cGEpCi0gICAgICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVOb1VwYVJ1bGUoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlU3lzdGVtID0gWG1sQmVhbnMuY29tcGlsZVhzZChzY2hlbWFzLCBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLCBzY2hlbWFPcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2NoZW1hIGludmFsaWQiKTsKLSAgICAgICAgICAgIGlmIChjb21wRXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZWxzZSBmb3IgKEl0ZXJhdG9yIGkgPSBjb21wRXJyb3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkubmV4dCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc3RlcCAzOiBnbyB0aHJvdWdoIGFsbCB0aGUgdHlwZXMsIGFuZCBub3RlIHRoZWlyIGJhc2UgdHlwZXMgYW5kIG5hbWVzcGFjZXMKLSAgICAgICAgTWFwIHByZWZpeGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJlZml4ZXMucHV0KCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCAieG1sIik7Ci0gICAgICAgIHByZWZpeGVzLnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAieHMiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4bWxuczp4cz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgd2lsbCBiZSBhIG1hcCBvZiAoYmFzZSBTY2hlbWFUeXBlIC0+IENvbGxlY3Rpb24gb2YgZGlyZWN0bHkgZGVydmllZCB0eXBlcykKLSAgICAgICAgTWFwIGNoaWxkVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAKLSAgICAgICAgLy8gYnJlYWR0aGZpcnN0IHRyYXZlcnNhbCBvZiB0aGUgdHlwZSBjb250YWlubWVudCB0cmVlCi0gICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHR5cGVTeXN0ZW0uYXR0cmlidXRlVHlwZXMoKSkpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyByZWN1cnNlIHRocm91Z2ggbmVzdGVkIGFub255bW91cyB0eXBlcyBhcyB3ZWxsCi0gICAgICAgICAgICBpZiAoIW5vYW5vbikKLSAgICAgICAgICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB3ZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBkb2N1bWVudCB0eXBlcywgYXR0cmlidXRlIHR5cGVzLCBvciBjaGFzaW5nIHRoZSBiYXNlIHR5cGUgb2YgYW55VHlwZQotICAgICAgICAgICAgaWYgKHNUeXBlLmlzRG9jdW1lbnRUeXBlKCkgfHwgc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkgfHwgc1R5cGUgPT0gWG1sT2JqZWN0LnR5cGUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFzc2lnbiBhIHByZWZpeCB0byB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgdHlwZSBpZiBuZWVkZWQKLSAgICAgICAgICAgIG5vdGVOYW1lc3BhY2UocHJlZml4ZXMsIHNUeXBlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZW50ZXIgdGhpcyB0eXBlIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIGl0cyBiYXNlIHR5cGUKLSAgICAgICAgICAgIENvbGxlY3Rpb24gY2hpbGRyZW4gPSAoQ29sbGVjdGlvbiljaGlsZFR5cGVzLmdldChzVHlwZS5nZXRCYXNlVHlwZSgpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGNoaWxkVHlwZXMucHV0KHNUeXBlLmdldEJhc2VUeXBlKCksIGNoaWxkcmVuKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSBhIGJ1aWx0aW4gdHlwZSBpcyBzZWVuLCBhZGQgaXQgdG9vICh0byBnZXQgYSBjb21wbGV0ZSB0cmVlIHVwIHRvIGFueVR5cGUpCi0gICAgICAgICAgICAgICAgaWYgKHNUeXBlLmdldEJhc2VUeXBlKCkuaXNCdWlsdGluVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICBhbGxTZWVuVHlwZXMuYWRkKHNUeXBlLmdldEJhc2VUeXBlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHNUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc3RlcCA0OiBwcmludCB0aGUgdHJlZSwgc3RhcnRpbmcgZnJvbSB4czphbnlUeXBlIChpLmUuLCBYbWxPYmplY3QudHlwZSkKLSAgICAgICAgTGlzdCB0eXBlc1RvUHJpbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHR5cGVzVG9QcmludC5hZGQoWG1sT2JqZWN0LnR5cGUpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3BhY2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAoIXR5cGVzVG9QcmludC5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSAoU2NoZW1hVHlwZSl0eXBlc1RvUHJpbnQucmVtb3ZlKHR5cGVzVG9QcmludC5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNwYWNlcy5zZXRMZW5ndGgoTWF0aC5tYXgoMCwgc3BhY2VzLmxlbmd0aCgpIC0gMikpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzcGFjZXMgKyAiKy0iICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUsIHByZWZpeGVzKSArIG5vdGVzKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjaGlsZHJlbiA9IChDb2xsZWN0aW9uKWNoaWxkVHlwZXMuZ2V0KHNUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3BhY2VzLmFwcGVuZCh0eXBlc1RvUHJpbnQuc2l6ZSgpID09IDAgfHwgdHlwZXNUb1ByaW50LmdldCh0eXBlc1RvUHJpbnQuc2l6ZSgpIC0gMSkgPT0gbnVsbCA/ICIgICIgOiAifCAiKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXNUb1ByaW50LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXNUb1ByaW50LmFkZEFsbChjaGlsZHJlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBub3RlcyhTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKHNUeXBlLmlzQnVpbHRpblR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAiIChidWlsdGluKSI7Ci0gICAgICAgIAotICAgICAgICBpZiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiAobGlzdCkiOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIgKHVuaW9uKSI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIChlbnVtZXJhdGlvbikiOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0Q29udGVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIgKG1peGVkKSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIgKGNvbXBsZXgpIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbm90ZU5hbWVzcGFjZShNYXAgcHJlZml4ZXMsIFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gUU5hbWVIZWxwZXIubmFtZXNwYWNlKHNUeXBlKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpIHx8IHByZWZpeGVzLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmFzZSA9IFFOYW1lSGVscGVyLnN1Z2dlc3RQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGJhc2U7Ci0gICAgICAgIGZvciAoaW50IG4gPSAwOyBwcmVmaXhlcy5jb250YWluc1ZhbHVlKHJlc3VsdCk7IG4gKz0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gYmFzZSArIG47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByZWZpeGVzLnB1dChuYW1lc3BhY2UsIHJlc3VsdCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigieG1sbnM6IiArIHJlc3VsdCArICI9XCIiICsgbmFtZXNwYWNlICsgIlwiIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhbi5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGE1ZTA3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5GaWxlU2Nhbm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKLQotLyoqCi0gKiBNb2RlbGVkIGFmdGVyIEFudCdzIGphdmFjIGFuZCB6aXAgdGFza3MuCi0gKgotICogU2NoZW1hIGZpbGVzIHRvIHByb2Nlc3MsIG9yIGRpcmVjdG9yaWVzIG9mIHNjaGVtYSBmaWxlcywgYXJlIHNldCB3aXRoIHRoZSAnc2NoZW1hJwotICogYXR0cmlidXRlLCBhbmQgY2FuIGJlIGZpbHRlcmVkIHdpdGggJ2luY2x1ZGVzJyBhbmQgJ2V4Y2x1ZGVzJy4KLSAqIEFsdGVybmF0aXZlbHksIG9uZSBvciBtb3JlIG5lc3RlZCAmbHQ7ZmlsZXNldCZndDsgZWxlbWVudHMgY2FuIHNwZWNpZnkgdGhlIAotICogZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBYTUxCZWFuLgotICogVGhlIGluY2x1ZGUgc2V0IGNhbiBhbHNvIGRlZmluZSAuamF2YSBmaWxlcyB0aGF0IHNob3VsZCBiZSBidWlsdCBhcyB3ZWxsLiAgCi0gKiBTZWUgdGhlIEZpbGVTZXQgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudC9tYW51YWwvaW5kZXguaHRtbAotICogZm9yIGluc3RydWN0aW9ucyBvbiBGaWxlU2V0cyBpZiB5b3UgYXJlIHVuZmFtaWxpYXIgd2l0aCB0aGVpciB1c2FnZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MQmVhbiBleHRlbmRzIE1hdGNoaW5nVGFzawotewotICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgU2V0ICAgICAgICAgbWRlZm5hbWVzcGFjZXM7Ci0KLSAgICBwcml2YXRlIFBhdGggICAgICAgIGNsYXNzcGF0aDsKLSAgICAKLSAgICBwcml2YXRlIEZpbGUgICAgICAgIGRlc3RmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjZ2VuZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NnZW5kaXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuICAgICBxdWlldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNvbmx5LAotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3IgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yayA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQW50UnVudGltZSA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlSmF2YVJ1bnRpbWUgPSBmYWxzZTsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyAgICAgIHR5cGVzeXN0ZW1uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUluaXRpYWxTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5TWF4aW11bVNpemU7Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0ICAgICAgICBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBIYXNoTWFwICAgICBfZXh0Um91dGVyID0gbmV3IEhhc2hNYXAoNSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEID0gIi54c2QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMID0gIi53c2RsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFWQSA9ICIuamF2YSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTRENPTkZJRyA9ICIueHNkY29uZmlnIjsKLQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLyogVkFMSURBVElPTiAqLwotICAgICAgICAvL3JlcXVpcmVkCi0gICAgICAgIGlmIChzY2hlbWFzLnNpemUoKSA9PSAwCi0gICAgICAgICAgICAmJiBzY2hlbWEgPT0gbnVsbAotICAgICAgICAgICAgJiYgZmlsZXNldC5nZXREaXIocHJvamVjdCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgJ3NjaGVtYScgb3IgJ2RpcicgYXR0cmlidXRlIG9yIGEgbmVzdGVkIGZpbGVzZXQgaXMgcmVxdWlyZWQuIjsKLSAgICAgICAgICAgIGlmIChmYWlsb25lcnJvcikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgX2V4dFJvdXRlci5wdXQoWFNELCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgX2V4dFJvdXRlci5wdXQoV1NETCwgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgIF9leHRSb3V0ZXIucHV0KEpBVkEsIG5ldyBIYXNoU2V0KCkpOwotICAgICAgICBfZXh0Um91dGVyLnB1dChYU0RDT05GSUcsIG5ldyBIYXNoU2V0KCkpOwotCi0gICAgICAgIEZpbGUgdGhlQmFzZWRpciA9IHNjaGVtYTsKLQotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzY2hlbWEuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlU2Nhbm5lciBzY2FubmVyID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihzY2hlbWEpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhdGhzKHBhdGhzLCBzY2FubmVyLmdldEJhc2VkaXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlQmFzZWRpciA9IHNjaGVtYS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhdGhzKG5ldyBTdHJpbmdbXSB7IHNjaGVtYS5nZXROYW1lKCkgfSwgdGhlQmFzZWRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChmaWxlc2V0LmdldERpcihwcm9qZWN0KSAhPSBudWxsKQotICAgICAgICAgICAgc2NoZW1hcy5hZGQoZmlsZXNldCk7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBzaSA9IHNjaGVtYXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHNpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBzaS5uZXh0KCk7Ci0gICAgICAgICAgICBGaWxlU2Nhbm5lciBzY2FubmVyID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLSAgICAgICAgICAgIEZpbGUgYmFzZWRpciA9IHNjYW5uZXIuZ2V0QmFzZWRpcigpOwotICAgICAgICAgICAgU3RyaW5nW10gcGF0aHMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICAgICAgcHJvY2Vzc1BhdGhzKHBhdGhzLCBiYXNlZGlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldCB4c2RMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoWFNEKTsKLSAgICAgICAgU2V0IHdzZGxMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoV1NETCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoeHNkTGlzdC5zaXplKCkgKyB3c2RsTGlzdC5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgZmluZCBhbnkgeHNkIG9yIHdzZGwgZmlsZXMgdG8gcHJvY2Vzcy4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3B0aW9uYWwKLSAgICAgICAgU2V0IGphdmFMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoSkFWQSk7Ci0gICAgICAgIFNldCB4c2Rjb25maWdMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoWFNEQ09ORklHKTsKLQotICAgICAgICBpZiAoc3JjZ2VuZGlyID09IG51bGwgJiYgc3Jjb25seSkKLSAgICAgICAgICAgIHNyY2dlbmRpciA9IGNsYXNzZ2VuZGlyOwotCi0gICAgICAgIGlmIChkZXN0ZmlsZSA9PSBudWxsICYmIGNsYXNzZ2VuZGlyID09IG51bGwgJiYgISBzcmNvbmx5KQotICAgICAgICAgICAgZGVzdGZpbGUgPSBuZXcgRmlsZSgieG1sdHlwZXMuamFyIik7Ci0KLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBxdWlldCA9IGZhbHNlOwotCi0gICAgICAgIC8qIEVYRUNVVElPTiAqLwotCi0gICAgICAgIEZpbGVbXSB4c2RBcnJheSA9IChGaWxlW10pIHhzZExpc3QudG9BcnJheShuZXcgRmlsZVt4c2RMaXN0LnNpemUoKV0pOwotICAgICAgICBGaWxlW10gd3NkbEFycmF5ID0gKEZpbGVbXSkgd3NkbExpc3QudG9BcnJheShuZXcgRmlsZVt3c2RsTGlzdC5zaXplKCldKTsKLSAgICAgICAgRmlsZVtdIGphdmFBcnJheSA9IChGaWxlW10pIGphdmFMaXN0LnRvQXJyYXkobmV3IEZpbGVbamF2YUxpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIEZpbGVbXSB4c2Rjb25maWdBcnJheSA9IChGaWxlW10pIHhzZGNvbmZpZ0xpc3QudG9BcnJheShuZXcgRmlsZVt4c2Rjb25maWdMaXN0LnNpemUoKV0pOwotICAgICAgICBFcnJvckxvZ2dlciBlcnIgPSBuZXcgRXJyb3JMb2dnZXIodmVyYm9zZSk7Ci0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHRlbXAgZGlyZWN0b3J5Ci0gICAgICAgICAgICBGaWxlIHRtcGRpciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoc3JjZ2VuZGlyID09IG51bGwgfHwgY2xhc3NnZW5kaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXBkaXIgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZVRlbXBEaXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNnZW5kaXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzcmNnZW5kaXIgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZURpcih0bXBkaXIsICJzcmMiKTsKLSAgICAgICAgICAgIGlmIChjbGFzc2dlbmRpciA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNsYXNzZ2VuZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVEaXIodG1wZGlyLCAiY2xhc3NlcyIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB1c2UgdGhlIHN5c3RlbSBjbGFzc3BhdGggaWYgdXNlciBkaWRuJ3QgcHJvdmlkZSBhbnkKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gcHJlcGVuZCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvbiB0aGUgY2xhc3NwYXRoCi0gICAgICAgICAgICBQYXRoLlBhdGhFbGVtZW50IHBhdGhFbGVtZW50ID0gY2xhc3NwYXRoLmNyZWF0ZVBhdGhFbGVtZW50KCk7Ci0gICAgICAgICAgICBwYXRoRWxlbWVudC5zZXRMb2NhdGlvbihjbGFzc2dlbmRpcik7Ci0gICAgICAgIAotICAgICAgICAgICAgU3RyaW5nW10gcGF0aHMgPSBjbGFzc3BhdGgubGlzdCgpOwotICAgICAgICAgICAgRmlsZVtdIGNwID0gbmV3IEZpbGVbcGF0aHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgY3BbaV0gPSBuZXcgRmlsZShwYXRoc1tpXSk7Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIHNvdXJjZQotICAgICAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICAgICAgcGFyYW1zLnNldEJhc2VEaXIodGhlQmFzZWRpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMoeHNkQXJyYXkpOwotICAgICAgICAgICAgcGFyYW1zLnNldFdzZGxGaWxlcyh3c2RsQXJyYXkpOwotICAgICAgICAgICAgcGFyYW1zLnNldEphdmFGaWxlcyhqYXZhQXJyYXkpOwotICAgICAgICAgICAgcGFyYW1zLnNldENvbmZpZ0ZpbGVzKHhzZGNvbmZpZ0FycmF5KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc3BhdGgoY3ApOwotICAgICAgICAgICAgLy9wYXJhbXMuc2V0T3V0cHV0SmFyKGRlc3RmaWxlKTsgLy8gYWx3YXlzIHVzZSB0aGUgamFyIHRhc2sgYmVsb3cKLSAgICAgICAgICAgIHBhcmFtcy5zZXROYW1lKHR5cGVzeXN0ZW1uYW1lKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZ2VuZGlyKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZ2VuZGlyKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXROb2phdmFjKHRydWUpOyAvLyBhbHdheXMgY29tcGlsZSB1c2luZyBqYXZhYyB0YXNrIGJlbG93Ci0gICAgICAgICAgICBwYXJhbXMuc2V0RGVidWcoZGVidWcpOwotICAgICAgICAgICAgcGFyYW1zLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0UXVpZXQocXVpZXQpOwotICAgICAgICAgICAgcGFyYW1zLnNldERvd25sb2FkKGRvd25sb2FkKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotICAgICAgICAgICAgcGFyYW1zLnNldEVycm9yTGlzdGVuZXIoZXJyKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRNZGVmTmFtZXNwYWNlcyhtZGVmbmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICBzdWNjZXNzID0gU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiAhc3Jjb25seSkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHNvdXJjZQotICAgICAgICAgICAgICAgIEphdmFjIGphdmFjID0gbmV3IEphdmFjKCk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBqYXZhYy5zZXRUYXNrTmFtZShnZXRUYXNrTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBqYXZhYy5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGlsZXIgIT0gbnVsbCkgamF2YWMuc2V0Q29tcGlsZXIoY29tcGlsZXIpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldERlYnVnKGRlYnVnKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVidWdMZXZlbCAhPSBudWxsKSBqYXZhYy5zZXREZWJ1Z0xldmVsKGRlYnVnTGV2ZWwpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldERlc3RkaXIoY2xhc3NnZW5kaXIpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEV4ZWN1dGFibGUoZm9ya2VkRXhlY3V0YWJsZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0RmFpbG9uZXJyb3IoZmFpbG9uZXJyb3IpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEZvcmsoZm9yayk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0SW5jbHVkZWFudHJ1bnRpbWUoaW5jbHVkZUFudFJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEluY2x1ZGVqYXZhcnVudGltZShpbmNsdWRlSmF2YVJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldFNyY2RpcihuZXcgUGF0aChwcm9qZWN0LCBzcmNnZW5kaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICBpZiAobWVtb3J5SW5pdGlhbFNpemUgIT0gbnVsbCkgamF2YWMuc2V0TWVtb3J5SW5pdGlhbFNpemUobWVtb3J5SW5pdGlhbFNpemUpOwotICAgICAgICAgICAgICAgIGlmIChtZW1vcnlNYXhpbXVtU2l6ZSAhPSBudWxsKSBqYXZhYy5zZXRNZW1vcnlNYXhpbXVtU2l6ZShtZW1vcnlNYXhpbXVtU2l6ZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0T3B0aW1pemUob3B0aW1pemUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQotICAgICAgICAgICAgICAgICAgICBsb2coIlRpbWUgdG8gY29tcGlsZSBjb2RlOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXN0ZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gamFyIHRoZSBjb21waWxlZCBjbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgIEphciBqYXIgPSBuZXcgSmFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGphci5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBqYXIuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGphci5zZXRCYXNlZGlyKGNsYXNzZ2VuZGlyKTsKLSAgICAgICAgICAgICAgICAgICAgamFyLnNldERlc3RGaWxlKGRlc3RmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgamFyLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0bXBkaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNjaGVtYUNvZGVHZW5lcmF0b3IudHJ5SGFyZFRvRGVsZXRlKHRtcGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2ludGVycnVwdGVkIG1lYW5zIGNhbmNlbAotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxvZygiRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nIHNjaGVtYXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOwotICAgICAgICAgICAgbG9nKHN3LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdWNjZXNzICYmIGZhaWxvbmVycm9yKQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCk7IC8vc3RvcCB0aGUgYnVpbGQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhdGhzKFN0cmluZ1tdIHBhdGhzLCBGaWxlIGJhc2VEaXIpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZG90ID0gcGF0aHNbaV0ubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChkb3QgPiAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHBhdGhzW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyBwb3NzRXh0ID0gcGF0aC5zdWJzdHJpbmcoZG90KS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgIFNldCBzZXQgPSAoU2V0KSBfZXh0Um91dGVyLmdldChwb3NzRXh0KTsKLQotICAgICAgICAgICAgICAgIGlmIChzZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChuZXcgRmlsZShiYXNlRGlyLCBwYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgZmlsZXNldCkKLSAgICB7Ci0gICAgICAgIHNjaGVtYXMuYWRkKGZpbGVzZXQpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy9HZXR0ZXIvU2V0dGVycwotICAgIHB1YmxpYyBGaWxlIGdldFNjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgZmlsZSB0aGF0IHBvaW50cyB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzY2hlbWEgZmlsZSBvciBhIGRpcmVjdG9yeSBvZiBmaWxlcy4KLSAgICAgKiBJdCBpcyBvcHRpb25hbCBvbmx5IGlmIG9uZSBvciBtb3JlICZsdDtmaWxlc2V0Jmd0OyBlbGVtZW50cyBhcmUgbmVzdGVkIGluIHRoaXMKLSAgICAgKiB0YXNrLgotICAgICAqIEBwYXJhbSBzY2hlbWEgUmVxdWlyZWQsIHVubGVzcyBhIGZpbGVzZXQgZWxlbWVudCBpcyBuZXN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKEZpbGUgc2NoZW1hKQotICAgIHsKLSAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzcGF0aCB0byB1c2UgaWYgc2NoZW1hcyBpbiB0aGUgZmlsZXNldCBpbXBvcnQgZGVmaW5pdGlvbnMgdGhhdCBhcmUKLSAgICAgKiBzdXBwbGllZCBieSBvdGhlciBjb21waWxlZCB4bWwgYmVhbnMgSkFSIGZpbGVzLCBvciBpZiAuamF2YSBmaWxlcyBhcmUgaW4gdGhlCi0gICAgICogc2NoZW1hIGZpbGVzZXQuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoICE9IG51bGwpCi0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aHJlZiBPcHRpb25hbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIGNsYXNzcGF0aHJlZikKLSAgICB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICAKLSAgICAgICAgY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKS5zZXRSZWZpZChjbGFzc3BhdGhyZWYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0ZmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzdGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSBjcmVhdGVkLiAgRm9yIGluc3RhbmNlLCAibXlYTUxCZWFuLmphciIKLSAgICAgKiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGlzIHRhc2sgaW50byBhIGphciB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICogT3B0aW9uYWwsIGRlZmF1bHRzIHRvICJ4bWx0eXBlcy5qYXIiLgotICAgICAqIEBwYXJhbSBkZXN0ZmlsZSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGZpbGUoRmlsZSBkZXN0ZmlsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzdGZpbGUgPSBkZXN0ZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRTcmNnZW5kaXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNyY2dlbmRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSAuamF2YSBmaWxlcyBpbnRvLiAgT3B0aW9uYWwsIGRlZmF1bHRzIHRvCi0gICAgICogYSB0ZW1wIGRpci4KLSAgICAgKiBAcGFyYW0gc3JjZ2VuZGlyIE9wdGlvbmFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRTcmNnZW5kaXIoRmlsZSBzcmNnZW5kaXIpCi0gICAgewotICAgICAgICB0aGlzLnNyY2dlbmRpciA9IHNyY2dlbmRpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRDbGFzc2dlbmRpcigpCi0gICAgewotICAgICAgICByZXR1cm4gY2xhc3NnZW5kaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgLmNsYXNzIGZpbGVzIGludG8uICBPcHRpb25hbCwgZGVmYXVsdHMgdG8KLSAgICAgKiBhIHRlbXAgZGlyLgotICAgICAqIEBwYXJhbSBjbGFzc2dlbmRpciBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NnZW5kaXIoRmlsZSBjbGFzc2dlbmRpcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xhc3NnZW5kaXIgPSBjbGFzc2dlbmRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KLSAgICAgKgotICAgICAqIEBzaW5jZSBBbnQgMS41Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb3dubG9hZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIFVSTHMgZm9yIGltcG9ydHMKLSAgICAgKiBhbmQgaW5jbHVkZXMuICBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBhbGwgaW1wb3J0cyBhbmQgaW5jbHVkZXMKLSAgICAgKiBtdXN0IGJlIGNvcGllZCBsb2NhbGx5LgotICAgICAqIEBwYXJhbSBkb3dubG9hZCBPcHRpb25hbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZChib29sZWFuIGRvd25sb2FkKQotICAgIHsKLSAgICAgICAgdGhpcy5kb3dubG9hZCA9IGRvd25sb2FkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRydWUsIGNvbXBpbGVzIHdpdGggb3B0aW1pemF0aW9uIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemUoYm9vbGVhbiBvcHRpbWl6ZSkgewotICAgICAgICB0aGlzLm9wdGltaXplID0gb3B0aW1pemU7Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIG9wdGltaXplIGZsYWcuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemUoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpbWl6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byB0cnVlLgotICAgICAqIEBwYXJhbSB2ZXJib3NlIE9wdGlvbmFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWlldCgpCi0gICAgewotICAgICAgICByZXR1cm4gcXVpZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgKiBAcGFyYW0gcXVpZXQgT3B0aW9uYWwuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcXVpZXQpCi0gICAgewotICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVidWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBkZWJ1Z0xldmVsLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgZGVidWdMZXZlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlYnVnTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiBkZWJ1Z0xldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEtleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgLWcgY29tbWFuZC1saW5lIHN3aXRjaC4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IG1vZGVybgotICAgICAqIGFuZCBjbGFzc2ljKHZlciA+PSAxLjIpLiBMZWdhbCB2YWx1ZXMgYXJlIG5vbmUgb3IgYQotICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IGxpbmVzLCB2YXJzLAotICAgICAqIGFuZCBzb3VyY2UuIElmIGRlYnVnbGV2ZWwgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwgOm5vbmUKLSAgICAgKiB3aWxsIGJlIGFwcGVuZGVkIHRvIC1nLiBJZiBkZWJ1ZyBpcyBub3QgdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZQotICAgICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gZGVidWdMZXZlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0xldmVsKFN0cmluZyAgdikgewotICAgICAgICB0aGlzLmRlYnVnTGV2ZWwgPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIGRlYnVnZ2luZyBzeW1ib2xzLgotICAgICAqIEBwYXJhbSBkZWJ1ZyBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlLCBmb3JrcyB0aGUgamF2YWMgY29tcGlsZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZiAidHJ1ZXxmYWxzZXxvbnxvZmZ8eWVzfG5vIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiBmKSB7Ci0gICAgICAgIGZvcmsgPSBmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRoZSBuYW1lIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlLgotICAgICAqCi0gICAgICogPHA+SWdub3JlZCB1bmxlc3MgZm9yayBpcyB0cnVlIG9yIGV4dEphdmFjIGhhcyBiZWVuIHNwZWNpZmllZAotICAgICAqIGFzIHRoZSBjb21waWxlci48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZm9ya0V4ZWMpIHsKLSAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSA9IGZvcmtFeGVjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZvcmtlZEV4ZWN1dGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTcmNvbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzcmNvbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyB0aGF0IG9ubHkgc291cmNlIHdpbGwgYmUgZ2VuZXJhdGVkLiAgT3B0aW9uYWwsCi0gICAgICogZGVmYXVsdCBpcyBmYWxzZS4KLSAgICAgKiBAcGFyYW0gc3Jjb25seSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0U3Jjb25seShib29sZWFuIHNyY29ubHkpCi0gICAgewotICAgICAgICB0aGlzLnNyY29ubHkgPSBzcmNvbmx5OwotICAgIH0KLSAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVzeXN0ZW1uYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlc3lzdGVtbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmUgb3IgbW9yZSBTY2hlbWFDb21waWxlciBleHRlbnNpb25zIGNhbiBiZSBwYXNzZWQgaW4gdmlhIHRoZSAmbHQ7ZXh0ZW5zaW9uPiBzdWJlbGVtZW50LgotICAgICAqICBTY2hlbWEgQ29tcGlsZXIgZXh0ZW5zaW9ucyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGNvbS54YmVhbi50b28uU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZW5zaW9uIGNyZWF0ZUV4dGVuc2lvbigpIHsKLSAgICAgICAgRXh0ZW5zaW9uIGUgPSBuZXcgRXh0ZW5zaW9uKCk7Ci0gICAgICAgIGV4dGVuc2lvbnMuYWRkKGUpOwotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmUgb3IgbW9yZSBuYW1lc3BhY2VzIGluIHdoaWNoIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBhcmUgdG8gYmUgaWdub3JlZAotICAgICAqIGNhbiBiZSBwYXNzZWQgaW4gdmlhIHRoZSAmbHQ7aWdub3JlRHVwbGljYXRlc0luTmFtZXNwYWNlcz4gc3ViZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVEdXBsaWNhdGVzSW5OYW1lc3BhY2VzKFN0cmluZyBuYW1lc3BhY2VzKSB7Ci0gICAgICAgIG1kZWZuYW1lc3BhY2VzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lc3BhY2VzLCAiLCIpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICBtZGVmbmFtZXNwYWNlcy5hZGQobmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWdub3JlRHVwbGljYXRlc0luTmFtZXNwYWNlcygpIHsKLSAgICAgICAgaWYgKG1kZWZuYW1lc3BhY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBtZGVmbmFtZXNwYWNlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKFN0cmluZylpLm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgdGhlIFR5cGVTeXN0ZW1Ib2xkZXIgY2xhc3Mgc2hvdWxkIGJlIAotICAgICAqIGdlbmVyYXRlZCBpbi4gTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgbGVmdCB1bnNwZWNpZmllZC4gIE5vbmUgb2YKLSAgICAgKiB0aGUgeG1sIGJlYW5zIGFyZSBnZW5lcmF0ZWQgaW4gdGhpcyBwYWNrYWdlLgotICAgICAqIDxCUj48QlI+VXNlIC54c2Rjb25maWcgZmlsZXMgdG8gbW9kaWZ5IHhtbCBiZWFuIHBhY2thZ2Ugb3IgY2xhc3MgbmFtZXMuCi0gICAgICogQHBhcmFtIHR5cGVzeXN0ZW1uYW1lIE9wdGlvbmFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlc3lzdGVtbmFtZShTdHJpbmcgdHlwZXN5c3RlbW5hbWUpCi0gICAgewotICAgICAgICB0aGlzLnR5cGVzeXN0ZW1uYW1lID0gdHlwZXN5c3RlbW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWlsb25lcnJvcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmFpbG9uZXJyb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYW50IHRhcmdldCB3aWxsIGNvbnRpbnVlIGlmIHRoZSBYTUxCZWFuCi0gICAgICogY3JlYXRpb24gZW5jb3VudGVycyBhIGJ1aWxkIGVycm9yLiAgRGVmYXVsdHMgdG8gdHJ1ZS4gIE9wdGlvbmFsLgotICAgICAqIEBwYXJhbSBmYWlsb25lcnJvciBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsb25lcnJvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuZmFpbG9uZXJyb3IgPSBmYWlsb25lcnJvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVBbnRSdW50aW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlQW50UnVudGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQW50UnVudGltZShib29sZWFuIGluY2x1ZGVBbnRSdW50aW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlQW50UnVudGltZSA9IGluY2x1ZGVBbnRSdW50aW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZUphdmFSdW50aW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlSmF2YVJ1bnRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUphdmFSdW50aW1lKGJvb2xlYW4gaW5jbHVkZUphdmFSdW50aW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlSmF2YVJ1bnRpbWUgPSBpbmNsdWRlSmF2YVJ1bnRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbml0aWFsIG1lbW9yeSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGphdmFjIHByb2Nlc3MuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZW1vcnlJbml0aWFsU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbWVtb3J5SW5pdGlhbFNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVtb3J5SW5pdGlhbFNpemUoU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplKQotICAgIHsKLSAgICAgICAgdGhpcy5tZW1vcnlJbml0aWFsU2l6ZSA9IG1lbW9yeUluaXRpYWxTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBqYXZhYyBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5TWF4aW11bVNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1lbW9yeU1heGltdW1TaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeU1heGltdW1TaXplKFN0cmluZyBtZW1vcnlNYXhpbXVtU2l6ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubWVtb3J5TWF4aW11bVNpemUgPSBtZW1vcnlNYXhpbXVtU2l6ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBVUkkgdXJpRnJvbUZpbGUoRmlsZSBmKQotICAgIHsKLSAgICAgICAgaWYgKGYgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZi5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIERvbid0IHNwaXQgb3V0IGFuIGV4Y2VwdGlvbiBoZXJlIGJlY2F1c2Ugb24gV2luZG93cyB5b3UnbGwgZ2V0IG9uZQotICAgICAgICAgICAgLy8gaWYgdGhlIGZpbGVuYW1lIGlzICJhdXgiLCAibHB0MSIsIGV0Yy4gSXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkKLSAgICAgICAgICAgIC8vIHRvIGRlYWwgd2l0aCB0aG9zZSBjYXNlcyBjb3JyZWN0bHksIHVzdWFsbHkgYnkgY2FsbGluZyBGaWxlU3ZjLmludmFsaWRQYXRoQ2hlY2soKQotICAgICAgICAgICAgLy8gTWVzc2FnZVN2Yy5nZXQoKS5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICByZXR1cm4gZi5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEVycm9yTG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX25vaXN5OwotICAgICAgICBwcml2YXRlIFVSSSBfYmFzZVVSSTsKLQotICAgICAgICBwdWJsaWMgRXJyb3JMb2dnZXIoYm9vbGVhbiBub2lzeSkKLSAgICAgICAgewotICAgICAgICAgICAgX25vaXN5ID0gbm9pc3k7Ci0gICAgICAgICAgICBfYmFzZVVSSSA9IHVyaUZyb21GaWxlKHByb2plY3QuZ2V0QmFzZURpcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxFcnJvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxFcnJvciBlcnIgPSAoWG1sRXJyb3IpbzsKLSAgICAgICAgICAgICAgICBpZiAoZXJyLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIGxvZyhlcnIudG9TdHJpbmcoX2Jhc2VVUkkpLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX1dBUk5JTkcpCi0gICAgICAgICAgICAgICAgICAgIGxvZyhlcnIudG9TdHJpbmcoX2Jhc2VVUkkpLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChfbm9pc3kpCi0gICAgICAgICAgICAgICAgICAgIGxvZyhlcnIudG9TdHJpbmcoX2Jhc2VVUkkpLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW5YU1RDSGFybmVzcy5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhblhTVENIYXJuZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODdjNzIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhblhTVENIYXJuZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotcHVibGljIGNsYXNzIFhNTEJlYW5YU1RDSGFybmVzcyBpbXBsZW1lbnRzIFhTVENUZXN0ZXIuSGFybmVzcwotewotICAgIHB1YmxpYyB2b2lkIHJ1blRlc3RDYXNlKFhTVENUZXN0ZXIuVGVzdENhc2VSZXN1bHQgcmVzdWx0KQotICAgIHsKLSAgICAgICAgWFNUQ1Rlc3Rlci5UZXN0Q2FzZSB0ZXN0Q2FzZSA9IHJlc3VsdC5nZXRUZXN0Q2FzZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIGNhc2UgIiArIHRlc3RDYXNlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYm9vbGVhbiBzY2hlbWFWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGluc3RhbmNlVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzdGVwIDEsIGxvYWQgc2NoZW1hIGZpbGUgZXRjLgotICAgICAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IHNjaGVtYSA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9ycykuc2V0TG9hZExpbmVOdW1iZXJzKCkpOwotICAgICAgICAgICAgICAgIFhtbE9iamVjdCBzY2hlbWEyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0UmVzb3VyY2VGaWxlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hMiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHRlc3RDYXNlLmdldFJlc291cmNlRmlsZSgpLCBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hcyA9IHNjaGVtYTIgPT0gbnVsbCA/IG5ldyBYbWxPYmplY3RbXSB7IHNjaGVtYSB9IDogbmV3IFhtbE9iamVjdFtdIHsgc2NoZW1hLCBzY2hlbWEyIH07Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0gPSBYbWxCZWFucy5jb21waWxlWHNkKHNjaGVtYXMsIFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCksIG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpKTsKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBYbWxCZWFucy50eXBlTG9hZGVyVW5pb24obmV3IFNjaGVtYVR5cGVMb2FkZXJbXSB7IHN5c3RlbSwgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBYbWxFeGNlcHRpb24pIHx8IGVycm9ycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0Q3Jhc2godHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN3KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRTdk1lc3NhZ2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdy50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQuYWRkU3ZNZXNzYWdlcyhlcnJvcnMpOwotICAgICAgICAgICAgcmVzdWx0LnNldFN2QWN0dWFsKHNjaGVtYVZhbGlkKTsKLSAgICAgICAgICAgIGVycm9ycy5jbGVhcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHN0ZXAgMiwgbG9hZCBpbnN0YW5jZSBmaWxlIGFuZCB2YWxpZGF0ZQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IGluc3RhbmNlID0gbG9hZGVyLnBhcnNlKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpLCBudWxsLCBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS52YWxpZGF0ZShuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKSkpCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikgfHwgZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRDcmFzaCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEl2TWVzc2FnZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN3LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYWRkSXZNZXNzYWdlcyhlcnJvcnMpOwotICAgICAgICAgICAgcmVzdWx0LnNldEl2QWN0dWFsKGluc3RhbmNlVmFsaWQpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQuc3VjY2VlZGVkKCkgPyAiU3VjY2Vzcy4iOiAiRmFpbHVyZS4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hTVENUZXN0ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hTVENUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkY2U5Yi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YU1RDVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54bWxiZWFuLmx0Z2ZtdC5UZXN0c0RvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54bWxiZWFuLmx0Z2ZtdC5GaWxlRGVzYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLXB1YmxpYyBjbGFzcyBYU1RDVGVzdGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIAotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotICAgICAgICBib29sZWFuIHNob3dwYXNzID0gKGNsLmdldE9wdCgic2hvd3Bhc3MiKSAhPSBudWxsKTsKLSAgICAgICAgRmlsZVtdIGFsbEZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBsdGdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSGFybmVzcyBoYXJuZXNzID0gbmV3IFhNTEJlYW5YU1RDSGFybmVzcygpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFsbEZpbGVzW2ldLmdldE5hbWUoKS5pbmRleE9mKCJMVEciKSA+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+PC90ZD4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3RDYXNlW10gcGFyc2VMVEdGaWxlKEZpbGUgbHRnRmlsZSwgQ29sbGVjdGlvbiBvdXRlckVycm9ycykKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT3B0aW9ucyBsdGdPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIGx0Z09wdGlvbnMuc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgiIiwgImh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3htbGJlYW4vbHRnZm10IikpOwotICAgICAgICAgICAgbHRnT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGVycm9ycyk7Ci0gICAgICAgICAgICBsdGdPcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgVGVzdHNEb2N1bWVudCBkb2MgPSBUZXN0c0RvY3VtZW50LkZhY3RvcnkucGFyc2UobHRnRmlsZSwgbHRnT3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoIWRvYy52YWxpZGF0ZShsdGdPcHRpb25zKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJEb2N1bWVudCAiICsgbHRnRmlsZSArICIgbm90IHZhbGlkLiIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi5sdGdmbXQuVGVzdENhc2VbXSB0ZXN0Q2FzZXMgPSBkb2MuZ2V0VGVzdHMoKS5nZXRUZXN0QXJyYXkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RDYXNlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZSBuZXdDYXNlID0gbmV3IFRlc3RDYXNlKCk7Ci0gICAgICAgICAgICAgICAgbmV3Q2FzZS5sdGdGaWxlID0gbHRnRmlsZTsKLSAgICAgICAgICAgICAgICBuZXdDYXNlLmlkID0gdGVzdENhc2VzW2ldLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgbmV3Q2FzZS5vcmlnaW4gPSB0ZXN0Q2FzZXNbaV0uZ2V0T3JpZ2luKCk7Ci0gICAgICAgICAgICAgICAgbmV3Q2FzZS5kZXNjcmlwdGlvbiA9IHRlc3RDYXNlc1tpXS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIEZpbGVEZXNjW10gZmlsZWRlc2NzID0gdGVzdENhc2VzW2ldLmdldEZpbGVzKCkuZ2V0RmlsZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgdGVzdENhc2VzW2ldLmdldE9yaWdpbigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZWRlc2NzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9IGZpbGVkZXNjc1tqXS5nZXRGb2xkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZWRlc2NzW2pdLmdldEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgdGhlRmlsZSA9IG5ldyBGaWxlKGx0Z0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCBkaXIgKyAiLyIgKyBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGhlRmlsZS5leGlzdHMoKSB8fCAhdGhlRmlsZS5pc0ZpbGUoKSB8fCAhdGhlRmlsZS5jYW5SZWFkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIkNhbid0IHJlYWQgZmlsZSAiICsgdGhlRmlsZSwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpbGVkZXNjc1tqXS5nZXRSb2xlKCkuaW50VmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWxlRGVzYy5Sb2xlLklOVF9JTlNUQU5DRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FzZS5pbnN0YW5jZUZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBmaWxlIHNwZWljaWZlZCAtIGlnbm9yaW5nIGFsbCBidXQgbGFzdCIsIGZpbGVkZXNjc1tqXSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5pbnN0YW5jZUZpbGUgPSB0aGVGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2UuaXZFeHBlY3RlZCA9IGZpbGVkZXNjc1tqXS5nZXRWYWxpZGl0eSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWxlRGVzYy5Sb2xlLklOVF9TQ0hFTUE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Nhc2Uuc2NoZW1hRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJNb3JlIHRoYW4gb25lIHNjaGVtYSBmaWxlIHNwZWljaWZlZCAtIGlnbm9yaW5nIGFsbCBidXQgbGFzdCIsIGZpbGVkZXNjc1tqXSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5zY2hlbWFGaWxlID0gdGhlRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLnN2RXhwZWN0ZWQgPSBmaWxlZGVzY3Nbal0uZ2V0VmFsaWRpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmlsZURlc2MuUm9sZS5JTlRfUkVTT1VSQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Nhc2UucmVzb3VyY2VGaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIk1vcmUgdGhhbiBvbmUgcmVzb3VyY2UgZmlsZSBzcGVpY2lmZWQgLSBpZ25vcmluZyBhbGwgYnV0IGxhc3QiLCBmaWxlZGVzY3Nbal0pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2UucmVzb3VyY2VGaWxlID0gdGhlRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLnJ2RXhwZWN0ZWQgPSBmaWxlZGVzY3Nbal0uZ2V0VmFsaWRpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKFhtbEVycm9yLmZvck9iamVjdCgiVW5leHBlY3RlZCBmaWxlIHJvbGUiLCBmaWxlZGVzY3Nbal0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ld0Nhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChUZXN0Q2FzZVtdKXJlc3VsdC50b0FycmF5KG5ldyBUZXN0Q2FzZVtyZXN1bHQuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZWxzZSBmb3IgKEl0ZXJhdG9yIGkgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoaS5uZXh0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hzYkR1bXBlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWHNiRHVtcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOGQ1Y2EuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWHNiRHVtcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFhzYkR1bXBlcgotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGR1bXAobmV3IEZpbGUoYXJnc1tpXSksIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wKEZpbGUgZmlsZSwgYm9vbGVhbiBmb3JjZSkKLSAgICB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKAotICAgICAgICAgICAgICAgIG5ldyBGaWxlRmlsdGVyKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCkgfHwgZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhzYiIpOyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHVtcChmaWxlc1tpXSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikgfHwgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSkKLSAgICAgICAgewotICAgICAgICAgICAgZHVtcFppcChmaWxlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmb3JjZSB8fCBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhzYiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBkdW1wKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksICIgICIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBaaXAoRmlsZSBmaWxlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOwotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHppcEZpbGUuZW50cmllcygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi54c2IiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyeS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBkdW1wKHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpLCAiICAiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKElucHV0U3RyZWFtIGlucHV0KQotICAgIHsKLSAgICAgICAgZHVtcChpbnB1dCwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgaW5kZW50KQotICAgIHsKLSAgICAgICAgWHNiRHVtcGVyIGR1bXBlciA9IG5ldyBYc2JEdW1wZXIoaW5wdXQsIGluZGVudCk7Ci0gICAgICAgIGR1bXBlci5kdW1wQWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYc2JEdW1wZXIoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgaW5kZW50KQotICAgIHsKLSAgICAgICAgX2lucHV0ID0gbmV3IERhdGFJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICBfaW5kZW50ID0gaW5kZW50OwotICAgIH0KLQotICAgIHZvaWQgZmx1c2goKSB7IFN5c3RlbS5vdXQuZmx1c2goKTsgfQotICAgIHZvaWQgZW1pdChTdHJpbmcgc3RyKSB7IFN5c3RlbS5vdXQucHJpbnRsbihfaW5kZW50ICsgc3RyKTsgZmx1c2goKTsgfQotICAgIHZvaWQgZW1pdCgpIHsgU3lzdGVtLm91dC5wcmludGxuKCk7IGZsdXNoKCk7IH0KLSAgICB2b2lkIGVycm9yKEV4Y2VwdGlvbiBlKSB7IFN5c3RlbS5vdXQucHJpbnRsbihlLnRvU3RyaW5nKCkpOyBmbHVzaCgpOyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSApOyBlMi5pbml0Q2F1c2UoIGUgKTsgdGhyb3cgZTI7IH0KLSAgICB2b2lkIGVycm9yKFN0cmluZyBzdHIpIHsgU3lzdGVtLm91dC5wcmludGxuKHN0cik7IGZsdXNoKCk7IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIHN0ciApOyB0aHJvdyBlMjsgfQotICAgIHByaXZhdGUgU3RyaW5nIF9pbmRlbnQ7Ci0gICAgdm9pZCBpbmRlbnQoKSB7IF9pbmRlbnQgKz0gIiAgIjsgfQotICAgIHZvaWQgb3V0ZGVudCgpIHsgX2luZGVudCA9IF9pbmRlbnQuc3Vic3RyaW5nKDAsIF9pbmRlbnQubGVuZ3RoKCkgLSAyKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9CQUJFID0gMHhEQTdBQkFCRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9WRVJTSU9OID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9WRVJTSU9OID0gMTg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFJTkRFWCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BVFlQRSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BRUxFTUVOVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFQT0lOVEVSID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUCA9IDc7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGZpbGV0eXBlU3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUlOREVYOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQUlOREVYIjsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BVFlQRTogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFUWVBFIjsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BRUxFTUVOVDogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UIjsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVBPSU5URVI6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BUE9JTlRFUiI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIEZJTEVUWVBFICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9TS0lQUEFCTEUgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSVhFRCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX05JTExBQkxFID0gODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQkxPQ0tFWFQgPSAxNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQkxPQ0tSRVNUID0gMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLU1VCU1QgPSA2NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQUJTVFJBQ1QgPSAxMjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0ZJTkFMRVhUID0gMjU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSU5BTFJFU1QgPSA1MTI7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBhcnRpY2xlZmxhZ3NTdHJpbmcoaW50IGZsYWdzKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9TS0lQUEFCTEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9TS0lQUEFCTEUgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9GSVhFRCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0ZJWEVEIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfTklMTEFCTEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9OSUxMQUJMRSB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX0JMT0NLRVhUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQkxPQ0tFWFQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9CTE9DS1JFU1QpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9CTE9DS1JFU1QgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9CTE9DS1NVQlNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQkxPQ0tTVUJTVCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX0FCU1RSQUNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQUJTVFJBQ1QgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9GSU5BTEVYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0ZJTkFMRVhUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfRklOQUxSRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfRklOQUxSRVNUIHwgIik7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkgcmVzdWx0LmFwcGVuZCgiMCB8ICIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGVuZ3RoKCkgLSAzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSVNBVFRSID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSkFWQVNJTkdMRVRPTiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFPUFRJT05BTCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFBUlJBWSA9IDg7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHByb3BlcnR5ZmxhZ3NTdHJpbmcoaW50IGZsYWdzKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9JU0FUVFIpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUFJPUF9JU0FUVFIgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9KQVZBU0lOR0xFVE9OKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BST1BfSkFWQVNJTkdMRVRPTiB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QUk9QX0pBVkFPUFRJT05BTCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QUk9QX0pBVkFPUFRJT05BTCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QUk9QX0pBVkFBUlJBWSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QUk9QX0pBVkFBUlJBWSB8ICIpOwotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApIHJlc3VsdC5hcHBlbmQoIjAgfCAiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTk9ORSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfR0xPQkFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9MT0NBTEFUVFIgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0xPQ0FMRUxUID0gMzsKLQotICAgIHN0YXRpYyBTdHJpbmcgY29udGFpbmVyZmllbGRUeXBlU3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX05PTkU6IHJldHVybiAiRklFTERfTk9ORSI7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0dMT0JBTDogcmV0dXJuICJGSUVMRF9HTE9CQUwiOwotICAgICAgICAgICAgY2FzZSBGSUVMRF9MT0NBTEFUVFI6IHJldHVybiAiRklFTERfTE9DQUxBVFRSIjsKLSAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxFTFQ6IHJldHVybiAiRklFTERfTE9DQUxFTFQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gY29udGFpbmVyIGZpZWxkIHR5cGUgKCIgKyBjb2RlICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdHlwZSBmbGFncwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TSU1QTEVfVFlQRSAgICAgPSAweDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0RPQ1VNRU5UX1RZUEUgICA9IDB4MjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JERVJFRCAgICAgICAgID0gMHg0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CT1VOREVEICAgICAgICAgPSAweDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTklURSAgICAgICAgICA9IDB4MTA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX05VTUVSSUMgICAgICAgICA9IDB4MjA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1NUUklOR0VOVU0gICAgICA9IDB4NDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1VOSU9OX09GX0xJU1RTICA9IDB4ODA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBU19QQVRURVJOICAgICA9IDB4MTAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19PUkRFUl9TRU5TSVRJVkUgPSAweDIwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfVE9UQUxfT1JERVIgICAgID0gMHg0MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0NPTVBJTEVEICAgICAgICA9IDB4ODAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CTE9DS19FWFQgICAgICAgPSAweDEwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0JMT0NLX1JFU1QgICAgICA9IDB4MjAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfRVhUICAgICAgID0gMHg0MDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9SRVNUICAgICAgPSAweDgwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX1VOSU9OICAgICA9IDB4MTAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX0xJU1QgICAgICA9IDB4MjAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0FCU1RSQUNUICAgICAgICA9IDB4NDAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0FUVFJJQlVURV9UWVBFICA9IDB4ODAwMDA7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHR5cGVmbGFnc1N0cmluZyhpbnQgZmxhZ3MpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19TSU1QTEVfVFlQRSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19TSU1QTEVfVFlQRSB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19ET0NVTUVOVF9UWVBFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0RPQ1VNRU5UX1RZUEUgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQVRUUklCVVRFX1RZUEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfQVRUUklCVVRFX1RZUEUgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfT1JERVJFRCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19PUkRFUkVEIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0JPVU5ERUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfQk9VTkRFRCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19GSU5JVEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfRklOSVRFIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX05VTUVSSUMpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfTlVNRVJJQyB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19TVFJJTkdFTlVNKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1NUUklOR0VOVU0gfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfVU5JT05fT0ZfTElTVFMpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfVU5JT05fT0ZfTElTVFMgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfSEFTX1BBVFRFUk4pICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfSEFTX1BBVFRFUk4gfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfVE9UQUxfT1JERVIpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfVE9UQUxfT1JERVIgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ09NUElMRUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfQ09NUElMRUQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQkxPQ0tfRVhUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0JMT0NLX0VYVCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19CTE9DS19SRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0JMT0NLX1JFU1QgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfRVhUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTkFMX0VYVCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19GSU5BTF9SRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTkFMX1JFU1QgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfVU5JT04pICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfRklOQUxfVU5JT04gfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfTElTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19GSU5BTF9MSVNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FCU1RSQUNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0FCU1RSQUNUIHwgIik7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkgcmVzdWx0LmFwcGVuZCgiMCB8ICIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGVuZ3RoKCkgLSAzKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBBbGwoKQotICAgIHsKLSAgICAgICAgaW50IGZpbGV0eXBlID0gZHVtcEhlYWRlcigpOwotICAgICAgICBzd2l0Y2ggKGZpbGV0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUlOREVYOgotICAgICAgICAgICAgICAgIGR1bXBJbmRleERhdGEoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVRZUEU6Ci0gICAgICAgICAgICAgICAgZHVtcFR5cGVGaWxlRGF0YSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UOgotICAgICAgICAgICAgICAgIGR1bXBQYXJ0aWNsZURhdGEodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURToKLSAgICAgICAgICAgICAgICBkdW1wQXR0cmlidXRlRGF0YSh0cnVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BUE9JTlRFUjoKLSAgICAgICAgICAgICAgICBkdW1wUG9pbnRlckRhdGEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUDoKLSAgICAgICAgICAgICAgICBkdW1wTW9kZWxHcm91cERhdGEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVA6Ci0gICAgICAgICAgICAgICAgZHVtcEF0dHJpYnV0ZUdyb3VwRGF0YSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJlYWRFbmQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGhleDMyU3RyaW5nKGludCBpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBkdW1wSGVhZGVyKCkKLSAgICB7Ci0gICAgICAgIGludCBtYWdpYyA9IHJlYWRJbnQoKTsKLSAgICAgICAgZW1pdCgiTWFnaWMgY29va2llOiAiICsgaGV4MzJTdHJpbmcobWFnaWMpKTsKLQotICAgICAgICBpZiAobWFnaWMgIT0gREFUQV9CQUJFKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCJXcm9uZyBtYWdpYyBjb29raWUuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIF9tYWpvcnZlciA9IHJlYWRTaG9ydCgpOwotICAgICAgICBfbWlub3J2ZXIgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTgsIDApKQotICAgICAgICAgICAgX3JlbGVhc2VubyA9IHJlYWRTaG9ydCgpOwotCi0gICAgICAgIGVtaXQoIk1ham9yIHZlcnNpb246ICIgKyBfbWFqb3J2ZXIpOwotICAgICAgICBlbWl0KCJNaW5vciB2ZXJzaW9uOiAiICsgX21pbm9ydmVyKTsKLSAgICAgICAgZW1pdCgiUmVsZWFzZSBudW1iZXI6ICIgKyBfcmVsZWFzZW5vKTsKLQotICAgICAgICBpZiAoX21ham9ydmVyICE9IE1BSk9SX1ZFUlNJT04gfHwgX21pbm9ydmVyID4gTUlOT1JfVkVSU0lPTikKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiSW5jb21wYXRpYmxlIHZlcnNpb24uIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBhY3R1YWxmaWxldHlwZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KCJGaWxldHlwZTogIiArIGZpbGV0eXBlU3RyaW5nKGFjdHVhbGZpbGV0eXBlKSk7Ci0KLSAgICAgICAgX3N0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nUG9vbCgpOwotICAgICAgICBfc3RyaW5nUG9vbC5yZWFkRnJvbShfaW5wdXQpOwotCi0gICAgICAgIHJldHVybiBhY3R1YWxmaWxldHlwZTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBQb2ludGVyRGF0YSgpCi0gICAgewotICAgICAgICBlbWl0KCJUeXBlIHN5c3RlbTogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHVtcEluZGV4RGF0YSgpCi0gICAgewotICAgICAgICAvLyBoYXMgYSBoYW5kbGUgcG9vbCAoY291bnQsIGhhbmRsZS90eXBlLCBoYW5kbGUvdHlwZS4uLikKLSAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdCgiSGFuZGxlIHBvb2wgKCIgKyBzaXplICsgIik6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIHNob3J0IGNvZGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoaGFuZGxlICsgIiAoIiArIGZpbGV0eXBlU3RyaW5nKGNvZGUpICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgZHVtcFFOYW1lTWFwKCJHbG9iYWwgZWxlbWVudHMiKTsKLQotICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIGF0dHJpYnV0ZXMKLSAgICAgICAgZHVtcFFOYW1lTWFwKCJHbG9iYWwgYXR0cmlidXRlcyIpOwotCi0gICAgICAgIC8vIGF0dHIgZ3JvdXBzIGFuZCBtb2RlbCBncm91cHMKLSAgICAgICAgZHVtcFFOYW1lTWFwKCJNb2RlbCBncm91cHMiKTsKLSAgICAgICAgZHVtcFFOYW1lTWFwKCJBdHRyaWJ1dGUgZ3JvdXBzIik7Ci0KLSAgICAgICAgZHVtcFFOYW1lTWFwKCJJZGVudGl0eSBjb25zdHJhaW50cyIpOwotCi0gICAgICAgIC8vIHFuYW1lIG1hcCBvZiBnbG9iYWwgdHlwZXMKLSAgICAgICAgZHVtcFFOYW1lTWFwKCJHbG9iYWwgdHlwZXMiKTsKLQotICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZG9jdW1lbnQgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGVsZW1lbnQKLSAgICAgICAgZHVtcFFOYW1lTWFwKCJEb2N1bWVudCB0eXBlcyIpOwotICAgICAgICAKLSAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGF0dHJpYnV0ZSB0eXBlcywgYnkgdGhlIHFuYW1lIG9mIHRoZSBjb250YWluZWQgYXR0cmlidXRlCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiQXR0cmlidXRlIHR5cGVzIik7Ci0KLSAgICAgICAgLy8gYWxsIHRoZSB0eXBlcyBpbmRleGVkIGJ5IGNsYXNzbmFtZQotICAgICAgICBkdW1wQ2xhc3NuYW1lSW5kZXgoIkFsbCB0eXBlcyBieSBjbGFzc25hbWUiKTsKLQotICAgICAgICAvLyBhbGwgdGhlIG5hbWVzcGFjZXMKLSAgICAgICAgZHVtcFN0cmluZ0FycmF5KCJEZWZpbmVkIG5hbWVzcGFjZXMiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHZlcnNpb24gMTUgc3R1ZmYgZm9yIHJlZGVmaW5lcwotICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNSwgMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGR1bXBRTmFtZU1hcCgiUmVkZWZpbmVkIGdsb2JhbCB0eXBlcyIpOwotICAgICAgICAgICAgZHVtcFFOYW1lTWFwKCJSZWRmaW5lZCBtb2RlbCBncm91cHMiKTsKLSAgICAgICAgICAgIGR1bXBRTmFtZU1hcCgiUmVkZmluZWQgYXR0cmlidXRlIGdyb3VwcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZEVuZCgpOwotICAgIH0KLQotCi0gICAgY2xhc3MgU3RyaW5nUG9vbAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IGludHNUb1N0cmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByaXZhdGUgTWFwIHN0cmluZ3NUb0ludHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIFN0cmluZ1Bvb2woKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRzVG9TdHJpbmdzLmFkZChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzdHJpbmdGb3JDb2RlKGludCBjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpaW50c1RvU3RyaW5ncy5nZXQoY29kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY29kZUZvclN0cmluZyhTdHJpbmcgc3RyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKXN0cmluZ3NUb0ludHMuZ2V0KHN0cik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEludGVnZXIoaW50c1RvU3RyaW5ncy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGludHNUb1N0cmluZ3MuYWRkKHN0cik7Ci0gICAgICAgICAgICAgICAgc3RyaW5nc1RvSW50cy5wdXQoc3RyLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWFkRnJvbShEYXRhSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnRzVG9TdHJpbmdzLnNpemUoKSAhPSAxIHx8IHN0cmluZ3NUb0ludHMuc2l6ZSgpICE9IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGlucHV0LnJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIGVtaXQoIlN0cmluZyBwb29sICgiICsgc2l6ZSArICIpOiIpOwotICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGlucHV0LnJlYWRVVEYoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBjb2RlRm9yU3RyaW5nKHN0cik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IGkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoY29kZSArICIgPSBcIiIgKyBzdHIgKyAiXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdChlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWN0aXZlIHdoaWxlIGxvYWRpbmcgb25lIHR5cGUuCi0gICAgRGF0YUlucHV0U3RyZWFtIF9pbnB1dDsKLSAgICBTdHJpbmdQb29sIF9zdHJpbmdQb29sOwotCi0gICAgc2hvcnQgcmVhZFNob3J0KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWRTaG9ydCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvcihlKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHJlYWRJbnQoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZEludCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvcihlKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlYWRTdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdHJpbmdQb29sLnN0cmluZ0ZvckNvZGUocmVhZFNob3J0KCkpOwotICAgIH0KLQotICAgIFFOYW1lIHJlYWRRTmFtZSgpCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcmVhZFN0cmluZygpOwotICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gcmVhZFN0cmluZygpOwotICAgICAgICBpZiAobG9jYWxuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsbmFtZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlYWRIYW5kbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcmVhZFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWRIYW5kbGUoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHFuYW1lU3RyaW5nKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHFuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIihudWxsKSI7Ci0gICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHFuYW1lLmdldExvY2FsUGFydCgpICsgIkAiICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHFuYW1lU2V0U3RyaW5nKFFOYW1lU2V0IHNldCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBRTmFtZU1hcChTdHJpbmcgZmllbGRuYW1lKQotICAgIHsKLSAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdChmaWVsZG5hbWUgKyAiICgiICsgc2l6ZSArICIpOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQocW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpICsgIiA9ICIgKyByZWFkSGFuZGxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBUeXBlQXJyYXkoU3RyaW5nIGZpZWxkbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KGkgKyAiID0gIiArIHJlYWRUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBDbGFzc25hbWVJbmRleChTdHJpbmcgZmllbGRuYW1lKQotICAgIHsKLSAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdChmaWVsZG5hbWUgKyAiICgiICsgc2l6ZSArICIpOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQocmVhZFN0cmluZygpICsgIiA9ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXRkZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wU3RyaW5nQXJyYXkoU3RyaW5nIGZpZWxkbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0ZGVudCgpOwotICAgIH0KLQotICAgIHZvaWQgcmVhZEVuZCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgX2lucHV0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIG9oLCB3ZWxsLgotICAgICAgICB9Ci0gICAgICAgIF9pbnB1dCA9IG51bGw7Ci0gICAgICAgIF9zdHJpbmdQb29sID0gbnVsbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBhcnRpY2xlVHlwZVN0cmluZyhpbnQgc3B0KQotICAgIHsKLSAgICAgICAgc3dpdGNoIChzcHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOiByZXR1cm4gIkFMTCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRTogcmV0dXJuICJDSE9JQ0UiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOiByZXR1cm4gIkVMRU1FTlQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRTogcmV0dXJuICJTRVFVRU5DRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOiByZXR1cm4gIldJTERDQVJEIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHBhcnRpY2xlIHR5cGUgKCIgKyBzcHQgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGJpZ0ludGVnZXJTdHJpbmcoQmlnSW50ZWdlciBiaWdpbnQpCi0gICAgewotICAgICAgICBpZiAoYmlnaW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIihudWxsKSI7Ci0gICAgICAgIHJldHVybiBiaWdpbnQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHdjcHJvY2Vzc1N0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TVFJJQ1Q6IHJldHVybiAiU1RSSUNUIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0tJUDogcmV0dXJuICJTS0lQIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuTEFYOiByZXR1cm4gIkxBWCI7Ci0gICAgICAgICAgICBjYXNlIDA6IHJldHVybiAiTk9UX1dJTERDQVJEIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHByb2Nlc3MgdHlwZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBQYXJ0aWNsZURhdGEoYm9vbGVhbiBnbG9iYWwpCi0gICAgewotICAgICAgICBzaG9ydCBwYXJ0aWNsZVR5cGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdChwYXJ0aWNsZVR5cGVTdHJpbmcocGFydGljbGVUeXBlKSArICI6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBzaG9ydCBwYXJ0aWNsZUZsYWdzID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoIkZsYWdzOiAiICsgcGFydGljbGVmbGFnc1N0cmluZyhwYXJ0aWNsZUZsYWdzKSk7Ci0KLSAgICAgICAgZW1pdCgiTWluT2NjdXJzOiAiICsgYmlnSW50ZWdlclN0cmluZyhyZWFkQmlnSW50ZWdlcigpKSk7Ci0gICAgICAgIGVtaXQoIk1heE9jY3VyczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOwotCi0gICAgICAgIGVtaXQoIlRyYW5zaXRpb246ICIgKyBxbmFtZVNldFN0cmluZyhyZWFkUU5hbWVTZXQoKSkpOwotCi0gICAgICAgIHN3aXRjaCAocGFydGljbGVUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHNldDogIiArIHFuYW1lU2V0U3RyaW5nKHJlYWRRTmFtZVNldCgpKSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiV2lsZGNhcmQgcHJvY2VzczogIiArIHdjcHJvY2Vzc1N0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiVHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICAgICAgICAgIGVtaXQoIkRlZmF1bHQ6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiRGVmYXVsdCB2YWx1ZTogIiArIHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJXc2RsQXJyYXlUeXBlOiAiICsgU09BUEFycmF5VHlwZVN0cmluZyhyZWFkU09BUEFycmF5VHlwZSgpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGdsb2JhbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE3LCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoIlN1YnN0aXR1dGlvbiBncm91cCBoZWFkICIgKyByZWFkSGFuZGxlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHNob3J0IHN1YnN0R3JvdXBDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJTdWJzdGl0dXRpb24gZ3JvdXAgbWVtYmVycyAoIiArIHN1YnN0R3JvdXBDb3VudCArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0R3JvdXBDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJJZGVudGl0eSBjb25zdHJhaW50cyAoIiArIGNvdW50ICsgIik6Iik7Ci0gICAgICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdChyZWFkSGFuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdsb2JhbCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiRmlsZW5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICBkdW1wUGFydGljbGVBcnJheSgiUGFydGljbGUgY2hpbGRyZW4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBlcnJvcigiVW5yZWNvZ25pemVkIHNjaGVtYSBwYXJ0aWNsZSB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0ZGVudCgpOwotICAgIH0KLQotICAgIHZvaWQgZHVtcFBhcnRpY2xlQXJyYXkoU3RyaW5nIGZpZWxkbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KGZpZWxkbmFtZSArICIoIiArIGNvdW50ICsgIik6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICBkdW1wUGFydGljbGVEYXRhKGZhbHNlKTsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgY29tcGxleFZhcmlldHlTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UOiByZXR1cm4gIkVNUFRZX0NPTlRFTlQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOiByZXR1cm4gIlNJTVBMRV9DT05URU5UIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQ6IHJldHVybiAiRUxFTUVOVF9DT05URU5UIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UOiByZXR1cm4gIk1JWEVEX0NPTlRFTlQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gY29tcGxleCB2YXJpZXR5ICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgc2ltcGxlVmFyaWV0eVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzogcmV0dXJuICJBVE9NSUMiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6IHJldHVybiAiTElTVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046IHJldHVybiAiVU5JT04iOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gc2ltcGxlIHZhcmlldHkgKCIgKyBjb2RlICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIGZhY2V0Q29kZVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSDogcmV0dXJuICJGQUNFVF9MRU5HVEgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEg6IHJldHVybiAiRkFDRVRfTUlOX0xFTkdUSCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSDogcmV0dXJuICJGQUNFVF9NQVhfTEVOR1RIIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOiByZXR1cm4gIkZBQ0VUX01JTl9FWENMVVNJVkUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU6IHJldHVybiAiRkFDRVRfTUlOX0lOQ0xVU0lWRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRTogcmV0dXJuICJGQUNFVF9NQVhfSU5DTFVTSVZFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOiByZXR1cm4gIkZBQ0VUX01BWF9FWENMVVNJVkUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUzogcmV0dXJuICJGQUNFVF9UT1RBTF9ESUdJVFMiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUzogcmV0dXJuICJGQUNFVF9GUkFDVElPTl9ESUdJVFMiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gZmFjZXQgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgd2hpdGVzcGFjZUNvZGVTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19DT0xMQVBTRTogcmV0dXJuICJXU19DT0xMQVBTRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU6IHJldHVybiAiV1NfUFJFU0VSVkUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1JFUExBQ0U6IHJldHVybiAiV1NfUkVQTEFDRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ6IHJldHVybiAiV1NfVU5TUEVDSUZJRUQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gd2hpdGVzcGFjZSBjb2RlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBkZXJpdmF0aW9uVHlwZVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkRUX05PVF9ERVJJVkVEOiByZXR1cm4gIkRUX05PVF9ERVJJVkVEIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTjogcmV0dXJuICJEVF9SRVNUUklDVElPTiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OOiByZXR1cm4gIkRUX0VYVEVOU0lPTiI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBkZXJpdmF0aW9uIGNvZGUgKCIgKyBjb2RlICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wVHlwZUZpbGVEYXRhKCkKLSAgICB7Ci0gICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICBlbWl0KCJPdXRlciB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIGVtaXQoIkRlcHRoOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBlbWl0KCJCYXNlIHR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgZW1pdCgiRGVyaXZhdGlvbiB0eXBlOiAiICsgZGVyaXZhdGlvblR5cGVTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgCi0gICAgICAgIGVtaXQoIkNvbnRhaW5lciBmaWVsZDoiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGludCBjb250YWluZXJmaWVsZHR5cGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdCgiUmVmdHlwZTogIiArIGNvbnRhaW5lcmZpZWxkVHlwZVN0cmluZyhjb250YWluZXJmaWVsZHR5cGUpKTsKLSAgICAgICAgc3dpdGNoIChjb250YWluZXJmaWVsZHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgRklFTERfR0xPQkFMOgotICAgICAgICAgICAgICAgIGVtaXQoIkhhbmRsZTogIiArIHJlYWRIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMQVRUUjoKLSAgICAgICAgICAgICAgICBlbWl0KCJJbmRleDogIiArIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxFTFQ6Ci0gICAgICAgICAgICAgICAgZW1pdCgiSW5kZXg6ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJKYXZhIGNsYXNzIG5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgICAgICBlbWl0KCJKYXZhIGltcGwgY2xhc3MgbmFtZTogIiArIHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgZHVtcFR5cGVBcnJheSgiQW5vbnltb3VzIHR5cGVzIik7Ci0KLSAgICAgICAgZW1pdCgiQW5vbnltb3VzIHVuaW9uIG1lbWJlciBvcmRpbmFsOiAiICsgcmVhZFNob3J0KCkpOwotCi0gICAgICAgIGludCBmbGFnczsKLSAgICAgICAgZmxhZ3MgPSByZWFkSW50KCk7Ci0gICAgICAgIGVtaXQoIkZsYWdzOiAiICsgdHlwZWZsYWdzU3RyaW5nKGZsYWdzKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNDb21wbGV4VHlwZSA9ICgoZmxhZ3MgJiBGTEFHX1NJTVBMRV9UWVBFKSA9PSAwKTsKLQotICAgICAgICBzaG9ydCBjb21wbGV4VmFyaWV0eSA9IFNjaGVtYVR5cGUuTk9UX0NPTVBMRVhfVFlQRTsKLSAgICAgICAgaWYgKGlzQ29tcGxleFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXhWYXJpZXR5ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBlbWl0KCJDb21wbGV4IHZhcmlldHk6ICIgKyBjb21wbGV4VmFyaWV0eVN0cmluZyhjb21wbGV4VmFyaWV0eSkpOwotCi0gICAgICAgICAgICBzaG9ydCBhdHRyQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIkF0dHJpYnV0ZSBtb2RlbCAoIiArIGF0dHJDb3VudCArICIpOiIpOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIGR1bXBBdHRyaWJ1dGVEYXRhKGZhbHNlKTsKLQotICAgICAgICAgICAgZW1pdCgiV2lsZGNhcmQgc2V0OiAiICsgcW5hbWVTZXRTdHJpbmcocmVhZFFOYW1lU2V0KCkpKTsKLSAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHByb2Nlc3M6ICIgKyB3Y3Byb2Nlc3NTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgICAgIG91dGRlbnQoKTsKLQotICAgICAgICAgICAgLy8gQXR0cmlidXRlIFByb3BlcnR5IFRhYmxlCi0gICAgICAgICAgICBzaG9ydCBhdHRyUHJvcENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBlbWl0KCJBdHRyaWJ1dGUgcHJvcGVydGllcyAoIiArIGF0dHJQcm9wQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyUHJvcENvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHVtcFByb3BlcnR5RGF0YSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBpZiAoY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQgfHwgY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoIklzQWxsOiAiICsgcmVhZFNob3J0KCkpOwotCi0gICAgICAgICAgICAgICAgLy8gQ29udGVudCBtb2RlbCB0cmVlCi0gICAgICAgICAgICAgICAgZHVtcFBhcnRpY2xlQXJyYXkoIkNvbnRlbnQgbW9kZWwiKTsKLQotICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgUHJvcGVydHkgVGFibGUKLSAgICAgICAgICAgICAgICBzaG9ydCBlbGVtUHJvcENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiRWxlbWVudCBwcm9wZXJ0aWVzICgiICsgZWxlbVByb3BDb3VudCArICIpOiIpOwotICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbVByb3BDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZHVtcFByb3BlcnR5RGF0YSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzQ29tcGxleFR5cGUgfHwgY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvcnQgc2ltcGxlVmFyaWV0eSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiU2ltcGxlIHR5cGUgdmFyaWV0eTogIiArIHNpbXBsZVZhcmlldHlTdHJpbmcoc2ltcGxlVmFyaWV0eSkpOwotCi0gICAgICAgICAgICBib29sZWFuIGlzU3RyaW5nRW51bSA9ICgoZmxhZ3MgJiBGTEFHX1NUUklOR0VOVU0pICE9IDApOwotCi0gICAgICAgICAgICBzaG9ydCBmYWNldENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBlbWl0KCJGYWNldHMgKCIgKyBmYWNldENvdW50ICsgIik6Iik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmFjZXRDb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoZmFjZXRDb2RlU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiVmFsdWU6ICIgKyByZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiRml4ZWQ6ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgICAgIGVtaXQoIldoaXRlc3BhY2UgcnVsZTogIiArIHdoaXRlc3BhY2VDb2RlU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0KLSAgICAgICAgICAgIHNob3J0IHBhdHRlcm5Db3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiUGF0dGVybnMgKCIgKyBwYXR0ZXJuQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuQ291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgICAgIHNob3J0IGVudW1Db3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiRW51bWVyYXRpb24gdmFsdWVzICgiICsgZW51bUNvdW50ICsgIik6Iik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bUNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdChyZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgICAgIGVtaXQoIkJhc2UgZW51bSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAoaXNTdHJpbmdFbnVtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNob3J0IHNlQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJTdHJpbmcgZW51bSBlbnRyaWVzICgiICsgc2VDb3VudCArICIpOiIpOwotICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiXCIiICsgcmVhZFN0cmluZygpICsgIlwiIC0+ICIgKyByZWFkU2hvcnQoKSArICIgPSAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKHNpbXBsZVZhcmlldHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiUHJpbWl0aXZlIHR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiRGVjaW1hbCBzaXplOiAiICsgcmVhZEludCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiTGlzdCBpdGVtIHR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBUeXBlQXJyYXkoIlVuaW9uIG1lbWJlcnMiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5rbm93biBzaW1wbGUgdHlwZSB2YXJpZXR5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCJGaWxlbmFtZTogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBhdHRydXNlQ29kZVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTDogcmV0dXJuICJPUFRJT05BTCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYUxvY2FsQXR0cmlidXRlLlJFUVVJUkVEOiByZXR1cm4gIlJFUVVJUkVEIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRDogcmV0dXJuICJQUk9ISUJJVEVEIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHVzZSBjb2RlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcEF0dHJpYnV0ZURhdGEoYm9vbGVhbiBnbG9iYWwpCi0gICAgewotICAgICAgICBlbWl0KCJOYW1lOiAiICsgcW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpKTsKLSAgICAgICAgZW1pdCgiVHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICBlbWl0KCJVc2U6ICIgKyBhdHRydXNlQ29kZVN0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICBlbWl0KCJEZWZhdWx0OiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTYsIDApKQotICAgICAgICAgICAgZW1pdCgiRGVmYXVsdCB2YWx1ZTogIiArIHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKLSAgICAgICAgZW1pdCgiRml4ZWQ6ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgIGVtaXQoIldzZGxBcnJheVR5cGU6ICIgKyBTT0FQQXJyYXlUeXBlU3RyaW5nKHJlYWRTT0FQQXJyYXlUeXBlKCkpKTsKLSAgICAgICAgaWYgKGdsb2JhbCkKLSAgICAgICAgICAgIGVtaXQoIkZpbGVuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIHByZXR0eU9wdGlvbnMgPQotICAgICAgICBuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVQcmV0dHlQcmludCgpOwotICAgIAotICAgIHZvaWQgZHVtcFhtbCgpCi0gICAgewotICAgICAgICBTdHJpbmcgeG1sID0gcmVhZFN0cmluZygpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCggWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApLnhtbFRleHQoIHByZXR0eU9wdGlvbnMgKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIHggKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCAiISEhISEhIEJBRCBYTUwgISEhISEiICk7Ci0gICAgICAgICAgICBlbWl0KCB4bWwgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGR1bXBNb2RlbEdyb3VwRGF0YSgpCi0gICAgewotICAgICAgICBlbWl0KCJOYW1lOiAiICsgcW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpKTsKLSAgICAgICAgZW1pdCgiVGFyZ2V0IG5hbWVzcGFjZTogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgIGVtaXQoIkNoYW1lbGVvbjogIiArIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTUsIDApKQotICAgICAgICAgICAgZW1pdCgiUmVkZWZpbmU6ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgIGVtaXQoIk1vZGVsIEdyb3VwIFhtbDogIik7Ci0gICAgICAgIGR1bXBYbWwoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBBdHRyaWJ1dGVHcm91cERhdGEoKQotICAgIHsKLSAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgIGVtaXQoIlRhcmdldCBuYW1lc3BhY2U6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgICAgICBlbWl0KCJDaGFtZWxlb246ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgIGlmIChhdExlYXN0KDIsIDE1LCAwKSkKLSAgICAgICAgICAgIGVtaXQoIlJlZGVmaW5lOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBlbWl0KCJBdHRyaWJ1dGUgR3JvdXAgWG1sOiAiKTsKLSAgICAgICAgZHVtcFhtbCgpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgYWx3YXlzU3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWTogcmV0dXJuICJDT05TSVNURU5UTFkiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5ORVZFUjogcmV0dXJuICJORVZFUiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlZBUklBQkxFOiByZXR1cm4gIlZBUklBQkxFIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGZyZXF1ZW5jeSBjb2RlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcganRjU3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q6IHJldHVybiAiWE1MX09CSkVDVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjogcmV0dXJuICJKQVZBX0JPT0xFQU4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOiByZXR1cm4gIkpBVkFfRkxPQVQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRTogcmV0dXJuICJKQVZBX0RPVUJMRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURTogcmV0dXJuICJKQVZBX0JZVEUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOiByZXR1cm4gIkpBVkFfU0hPUlQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDogcmV0dXJuICJKQVZBX0lOVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzogcmV0dXJuICJKQVZBX0xPTkciOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6IHJldHVybiAiSkFWQV9CSUdfREVDSU1BTCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6IHJldHVybiAiSkFWQV9CSUdfSU5URUdFUiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOiByZXR1cm4gIkpBVkFfU1RSSU5HIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOiByZXR1cm4gIkpBVkFfQllURV9BUlJBWSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6IHJldHVybiAiSkFWQV9HREFURSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOiByZXR1cm4gIkpBVkFfR0RVUkFUSU9OIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9EQVRFOiByZXR1cm4gIkpBVkFfREFURSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6IHJldHVybiAiSkFWQV9RTkFNRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6IHJldHVybiAiSkFWQV9DQUxFTkRBUiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDogcmV0dXJuICJKQVZBX0xJU1QiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTTogcmV0dXJuICJKQVZBX0VOVU0iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDogcmV0dXJuICJKQVZBX09CSkVDVCI7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGphdmEgdHlwZSBjb2RlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcFByb3BlcnR5RGF0YSgpCi0gICAgewotICAgICAgICBlbWl0KCJQcm9wZXJ0eSIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgIGVtaXQoIlR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgaW50IHByb3BmbGFncyA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KCJGbGFnczogIiArIHByb3BlcnR5ZmxhZ3NTdHJpbmcocHJvcGZsYWdzKSk7Ci0gICAgICAgIGVtaXQoIkNvbnRhaW5lciB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIGVtaXQoIk1pbiBvY2N1cmFuY2VzOiAiICsgYmlnSW50ZWdlclN0cmluZyhyZWFkQmlnSW50ZWdlcigpKSk7Ci0gICAgICAgIGVtaXQoIk1heCBvY2N1cmFuY2VzOiAiICsgYmlnSW50ZWdlclN0cmluZyhyZWFkQmlnSW50ZWdlcigpKSk7Ci0gICAgICAgIGVtaXQoIk5pbGxhYmxlOiAiICsgYWx3YXlzU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgIGVtaXQoIkRlZmF1bHQ6ICIgKyBhbHdheXNTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgZW1pdCgiRml4ZWQ6ICIgKyBhbHdheXNTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgZW1pdCgiRGVmYXVsdCB0ZXh0OiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgZW1pdCgiSmF2YSBwcm9wIG5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgICAgICBlbWl0KCJKYXZhIHR5cGUgY29kZTogIiArIGp0Y1N0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICBlbWl0KCJUeXBlIGZvciBqYXZhIHNpZ25hdHVyZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICBlbWl0KCJKYXZhIHNldHRlciBkZWxpbWl0ZXI6ICIgKyBxbmFtZVNldFN0cmluZyhyZWFkUU5hbWVTZXQoKSkpOwotICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNiwgMCkpCi0gICAgICAgICAgICBlbWl0KCJEZWZhdWx0IHZhbHVlOiAiICsgcmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotICAgICAgICBpZiAoKChwcm9wZmxhZ3MgJiBGTEFHX1BST1BfSVNBVFRSKSA9PSAwKSAmJiBhdExlYXN0KDIsIDE3LCAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvcnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiQWNjZXB0ZWQgc3Vic3RpdHV0aW9ucyAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNpemUgOyBpKyspCi0gICAgICAgICAgICAgICAgZW1pdCgiICBBY2NlcHRlZCBuYW1lICIgKyByZWFkUU5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRkZW50KCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlYWRYbWxWYWx1ZU9iamVjdCgpCi0gICAgewotICAgICAgICBTdHJpbmcgdHlwZSA9IHJlYWRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICAKLSAgICAgICAgaW50IGJ0YyA9IHJlYWRTaG9ydCgpOwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgIHN3aXRjaCAoYnRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAibmlsIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShyZWFkQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gMTkpCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YlNlcXVlbmNlKDAsIDE2KSArICIuLi4iOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgIHZhbHVlID0gUU5hbWVIZWxwZXIucHJldHR5KHJlYWRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHZhbHVlID0gRG91YmxlLnRvU3RyaW5nKHJlYWREb3VibGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlICsgIiAoIiArIHR5cGUgKyAiOiAiICsgYnRjICsiKSI7Ci0gICAgfQotCi0gICAgZG91YmxlIHJlYWREb3VibGUoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZERvdWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvcihlKTsKLSAgICAgICAgICAgIHJldHVybiAwLjA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgU09BUEFycmF5VHlwZVN0cmluZyhTT0FQQXJyYXlUeXBlIHQpCi0gICAgewotICAgICAgICBpZiAodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLnByZXR0eSh0LmdldFFOYW1lKCkpICsgdC5zb2FwMTFEaW1lbnNpb25TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBTT0FQQXJyYXlUeXBlIHJlYWRTT0FQQXJyYXlUeXBlKCkKLSAgICB7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gcmVhZFFOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBkaW1lbnNpb25zID0gcmVhZFN0cmluZygpOwotICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3IFNPQVBBcnJheVR5cGUocU5hbWUsIGRpbWVuc2lvbnMpOwotICAgIH0KLQotICAgIFFOYW1lU2V0IHJlYWRRTmFtZVNldCgpCi0gICAgewotICAgICAgICBzaG9ydCBmbGFnID0gcmVhZFNob3J0KCk7Ci0KLSAgICAgICAgU2V0IHVyaVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIHNob3J0IHVyaUNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpQ291bnQ7IGkrKykKLSAgICAgICAgICAgIHVyaVNldC5hZGQocmVhZFN0cmluZygpKTsKLQotICAgICAgICBTZXQgcW5hbWVTZXQxID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgc2hvcnQgcW5jb3VudDEgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmNvdW50MTsgaSsrKQotICAgICAgICAgICAgcW5hbWVTZXQxLmFkZChyZWFkUU5hbWUoKSk7Ci0KLSAgICAgICAgU2V0IHFuYW1lU2V0MiA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIHNob3J0IHFuY291bnQyID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5jb3VudDI7IGkrKykKLSAgICAgICAgICAgIHFuYW1lU2V0Mi5hZGQocmVhZFFOYW1lKCkpOwotCi0gICAgICAgIGlmIChmbGFnID09IDEpCi0gICAgICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyh1cmlTZXQsIG51bGwsIHFuYW1lU2V0MSwgcW5hbWVTZXQyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHMobnVsbCwgdXJpU2V0LCBxbmFtZVNldDIsIHFuYW1lU2V0MSk7Ci0gICAgfQotCi0gICAgYnl0ZVtdIHJlYWRCeXRlQXJyYXkoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3J0IGxlbiA9IF9pbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtsZW5dOwotICAgICAgICAgICAgX2lucHV0LnJlYWRGdWxseShyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEJpZ0ludGVnZXIgcmVhZEJpZ0ludGVnZXIoKQotICAgIHsKLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHJlYWRCeXRlQXJyYXkoKTsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAxICYmIHJlc3VsdFswXSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMSkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKLSAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGJ5dGVbXSBTSU5HTEVfWkVST19CWVRFID0gbmV3IGJ5dGVbXSB7IChieXRlKTAgfTsKLQotICAgIHByaXZhdGUgaW50IF9tYWpvcnZlcjsKLSAgICBwcml2YXRlIGludCBfbWlub3J2ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgX3JlbGVhc2VubzsKLQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXRMZWFzdChpbnQgbWFqb3J2ZXIsIGludCBtaW5vcnZlciwgaW50IHJlbGVhc2VubykKLSAgICB7Ci0gICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoX21ham9ydmVyIDwgbWFqb3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChfbWlub3J2ZXIgPiBtaW5vcnZlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoX21pbm9ydmVyIDwgbWlub3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiAoX3JlbGVhc2VubyA+PSByZWxlYXNlbm8pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGF0TW9zdChpbnQgbWFqb3J2ZXIsIGludCBtaW5vcnZlciwgaW50IHJlbGVhc2VubykKLSAgICB7Ci0gICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKF9tYWpvcnZlciA8IG1ham9ydmVyKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChfbWlub3J2ZXIgPiBtaW5vcnZlcikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKF9taW5vcnZlciA8IG1pbm9ydmVyKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiAoX3JlbGVhc2VubyA8PSByZWxlYXNlbm8pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1NjaGVtYUNvbmZpZy5qYXZhIGIvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1NjaGVtYUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkzMWE4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9TY2hlbWFDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQuQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54YmVhbi5jb25maWcuTnNjb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhiZWFuLmNvbmZpZy5RbmFtZWNvbmZpZzsKLQotcHVibGljIGNsYXNzIFNjaGVtYUNvbmZpZwotewotICAgIHByaXZhdGUgTWFwIF9wYWNrYWdlTWFwOwotICAgIHByaXZhdGUgTWFwIF9wcmVmaXhNYXA7Ci0gICAgcHJpdmF0ZSBNYXAgX3N1ZmZpeE1hcDsKLSAgICBwcml2YXRlIE1hcCBfcW5hbWVNYXA7Ci0KLSAgICBwcml2YXRlIFNjaGVtYUNvbmZpZygpCi0gICAgewotICAgICAgICBfcGFja2FnZU1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3ByZWZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3N1ZmZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3FuYW1lTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYUNvbmZpZyBmb3JDb25maWdEb2N1bWVudHMoQ29uZmlnW10gY29uZmlncykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hQ29uZmlnKGNvbmZpZ3MpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYUNvbmZpZyhDb25maWdbXSBjb25maWdzKQotICAgIHsKLSAgICAgICAgX3BhY2thZ2VNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBfcHJlZml4TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgX3N1ZmZpeE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIF9xbmFtZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ29uZmlnIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0gICAgICAgICAgICBOc2NvbmZpZ1tdIG5zYSA9IGNvbmZpZy5nZXROYW1lc3BhY2VBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuc2EubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkTmFtZXNwYWNlU2V0dGluZyhuc2Fbal0uZ2V0VXJpKCksIG5zYVtqXS5nZXRQYWNrYWdlKCksIF9wYWNrYWdlTWFwKTsKLSAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VTZXR0aW5nKG5zYVtqXS5nZXRVcmkoKSwgbnNhW2pdLmdldFByZWZpeCgpLCBfcHJlZml4TWFwKTsKLSAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VTZXR0aW5nKG5zYVtqXS5nZXRVcmkoKSwgbnNhW2pdLmdldFN1ZmZpeCgpLCBfc3VmZml4TWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUW5hbWVjb25maWdbXSBxbmMgPSBjb25maWcuZ2V0UW5hbWVBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBxbmMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3FuYW1lTWFwLnB1dChxbmNbal0uZ2V0TmFtZSgpLCBxbmNbal0uZ2V0SmF2YW5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlY29yZE5hbWVzcGFjZVNldHRpbmcoT2JqZWN0IGtleSwgU3RyaW5nIHZhbHVlLCBNYXAgcmVzdWx0KQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGVsc2UgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LnB1dCgiIiwgdmFsdWUpOwotICAgICAgICBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcgJiYgIiMjYW55Ii5lcXVhbHMoa2V5KSkKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoTGlzdClrZXkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCIjI2xvY2FsIi5lcXVhbHModXJpKSkKLSAgICAgICAgICAgICAgICAgICAgdXJpID0gIiI7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dCh1cmksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBsb29rdXAoTWFwIG1hcCwgU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZyltYXAuZ2V0KHVyaSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKW1hcC5nZXQoIiMjYW55Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBQYWNrYWdlRm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gbG9va3VwKF9wYWNrYWdlTWFwLCB1cmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4Rm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gbG9va3VwKF9wcmVmaXhNYXAsIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBTdWZmaXhGb3JOYW1lc3BhY2UoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsb29rdXAoX3N1ZmZpeE1hcCwgdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cEphdmFuYW1lRm9yUU5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylfcW5hbWVNYXAuZ2V0KHFuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0F0dHJpYnV0ZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmExNzYzZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGF0dHJpYnV0ZQotICoKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWUKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZSB7Ci0gIC8qKgotICAgKiBHZXQgdGhlIFhNTE5hbWUgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlLgotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lCi0gICAqLwotICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdHlwZSBvZiB0aGUgY3VycmVudCBhdHRyaWJ1dGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB0eXBlIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZQotICAgKi8KLSAgcHVibGljIFhNTE5hbWUgZ2V0U2NoZW1hVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTM5M2YyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQXR0cmlidXRlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBzcGVjaWZpZXMgbWV0aG9kcyBmb3IgaXRlcmF0aW5nIG92ZXIgYXR0cmlidXRlcy4KLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZQotKi8KLQotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVJdGVyYXRvciB7Ci0gIC8qKgotICAgKiBHZXQgdGhlIG5leHQgQXR0cmlidXRlIG9uIHRoZSBzdHJlYW0KLSAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQXR0cmlidXRlCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlIG5leHQoKTsKLQotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBhdHRyaWJ1dGVzIG9uIHRoZSBzdHJlYW0KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc05leHQoKTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0cmVhbSB3aXRob3V0IHNoaWZ0aW5nIGl0Ci0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlIHBlZWsoKTsKLQotCi0gIC8qKgotICAgKiBTa2lwIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0cmVhbQotICAgKi8KLSAgcHVibGljIHZvaWQgc2tpcCgpOwotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0J1ZmZlcmVkWE1MSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQnVmZmVyZWRYTUxJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMWJmOWJiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQnVmZmVyZWRYTUxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLS8qKgotICogRXh0ZW5kcyB0aGUgWE1MSW5wdXRTdHJlYW0gdG8gYWxsb3cgbWFya2luZyBhbmQgcmVzZXRpbmcgb2YgdGhlIHN0cmVhbS4KLSAqCi0gKiBAc2luY2UgWE1MSW5wdXRTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlByb2Nlc3NpbmdJbnN0cnVjdGlvbgotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50Ci0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbmRFbGVtZW50Ci0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnVmZmVyZWRYTUxJbnB1dFN0cmVhbSBleHRlbmRzIFhNTElucHV0U3RyZWFtIHsKLSAgLyoqCi0gICAqIFNldHMgdGhlIG1hcmtzIGEgcG9pbnQgdG8gcmV0dXJuIHRvIGluIHRoZSBzdHJlYW0sCi0gICAqIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcmsuCi0gICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgaW4gQnVmZmVyZWRTdHJlYW1zCi0gICAqLwotICBwdWJsaWMgdm9pZCBtYXJrKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc3RyZWFtIHRvIHRoZSBwcmV2aW91cyBtYXJrLgotICAgKiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBtYXJrOwotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQ2hhbmdlUHJlZml4TWFwcGluZy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9DaGFuZ2VQcmVmaXhNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxNjQzOTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9DaGFuZ2VQcmVmaXhNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogVGhpcyBldmVudCBzaWduYWxzIHRoYXQgYSBwcmVmaXggbWFwcGluZyBoYXMgY2hhbmdlZCBmcm9tCi0gKiBPbGROYW1lc3BhY2VOYW1lIHRvIHRoZSBOZXdOYW1lc3BhY2VOYW1lCi0gKgotICoKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbmRQcmVmaXhNYXBwaW5nCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlUHJlZml4TWFwcGluZyBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgdXJpIHRoYXQgdGhlIHByZWZpeCB3YXMgYm91bmQgdG8KLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHVyaQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRPbGROYW1lc3BhY2VVcmkoKTsKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgbmV3IHVyaSB0aGF0IHRoZSBwcmVmaXggaXMgYm91bmQgdG8KLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHVyaQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROZXdOYW1lc3BhY2VVcmkoKTsKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgcHJlZml4IHRoYXQgaXMgYm91bmQKLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHByZWZpeAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQ2hhcmFjdGVyRGF0YS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9DaGFyYWN0ZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiZTk1NTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9DaGFyYWN0ZXJEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciBjaGFyYWN0ZXIgZGF0YQotICoKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0qLwotcHVibGljIGludGVyZmFjZSBDaGFyYWN0ZXJEYXRhIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKioKLSAgICogR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZWxlbWVudCwKLSAgICogcmV0dXJucyBudWxsIGlmIHRoZSBlbGVtZW50IGhhcyBubyBjb250ZW50Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29udGVudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQ29tbWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9Db21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5YjM2NGQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9Db21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciBjb21tZW50IGRhdGEKLSAqCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLQotcHVibGljIGludGVyZmFjZSBDb21tZW50IGV4dGVuZHMgQ2hhcmFjdGVyRGF0YSB7Ci0gIC8qKgotICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLgotICAgKi8KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRWxlbWVudEZpbHRlci5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxNzlhNWMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICoKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBmaWx0ZXIgb24gZWxlbWVudHMKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRGaWx0ZXIgewotICAvKioKLSAgICogdGVzdHMgd2hldGhlciB0aGlzIGV2ZW50IGlzIHBhcnQgb2YgdGhpcyBzdHJlYW0gCi0gICAqLwotICBib29sZWFuIGFjY2VwdChYTUxFdmVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW5kRG9jdW1lbnQuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW5kRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQwNDAyYy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0VuZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciB0aGUgZW5kIG9mIGEgZG9jdW1lbnQKLSAqCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW5kRG9jdW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLgotICAgKi8KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW5kRWxlbWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbmRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4ZTdjYWUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbmRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciB0aGUgZW5kIGVsZW1lbnQgZXZlbnQuCi0gKiBUaGUgbmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIGdldE5hbWUgbWV0aG9kIG9mCi0gKiBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQgaW50ZXJmYWNlLgotICoKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0qLwotcHVibGljIGludGVyZmFjZSBFbmRFbGVtZW50IGV4dGVuZHMgWE1MRXZlbnQgewotICAvKioKLSAgICogTm8gbWV0aG9kcyBhcmUgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZS4gIAotICAgKi8KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW5kUHJlZml4TWFwcGluZy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbmRQcmVmaXhNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkNGVjNjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbmRQcmVmaXhNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogVGhpcyBldmVudCBzaWduYWxzIHRoYXQgYSBwcmVmaXggbWFwcGluZyBoYXMgZ29uZSBvdXQgb2Ygc2NvcGUKLSAqCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydFByZWZpeE1hcHBpbmcKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmcKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZFByZWZpeE1hcHBpbmcgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qIAotICAgKiBSZXR1cm5zIHRoZSBwcmVmaXggdGhhdCBoYXMgZ29uZSBvdXQgb2Ygc2NvcGUKLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHByZWZpeAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW50aXR5UmVmZXJlbmNlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0VudGl0eVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmMwYzEzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBoYW5kbGluZyBFbnRpdHkgRGVjbGFyYXRpb25zCi0gKgotICoKLSAqIEB2ZXJzaW9uIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZW50aXR5IHdhcyBza2lwcGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBza2lwcGVkKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0xvY2F0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0xvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4M2NlYTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGRvY3VtZW50IGxvY2F0aW9uIG9mIHRoZSBldmVudC4gIFRoaXMgaXMgbm90Ci0gKiByZXF1aXJlZCB0byBiZSBleGFjdCBhbmQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LgotICogCi0gKgotICogQHZlcnNpb24gMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvY2F0aW9uIHsKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgY3VycmVudCBjb2x1bW4gbnVtYmVyCi0gICAqCi0gICAqIEByZXR1cm4gaW50ZWdlciB2YWx1ZSBvZiB0aGUgY3VycmVudCBjb2x1bW4gbnVtYmVyCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpOyAKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgY3VycmVudCBsaW5lCi0gICAqCi0gICAqIEByZXR1cm4gaW50ZWdlciB2YWx1ZSBvZiB0aGUgY3VycmVudCBsaW5lIG51bWJlcgotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCk7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHVibGljIElECi0gICAqCi0gICAqIEByZXR1cm4gcHVibGljIElEIG9yIG51bGwgaWYgbm90IHNldAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpOyAKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBzeXN0ZW0gSUQKLSAgICoKLSAgICogQHJldHVybiBzeXN0ZW0gSUQgb3IgbnVsbCBpZiBub3Qgc2V0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCk7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRiYThjOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOwotCi0vKioKLSAqIEEgbWFya2VyIGludGVyZmFjZSBmb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLSAqCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKgotICAgKiB0aGUgdGFyZ2V0IHNlY3Rpb24gb2YgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLSAgICoKLSAgICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBQSSBvciBudWxsCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpOwotICAvKgotICAgKiB0aGUgZGF0YSBzZWN0aW9uIG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgUEkncyBkYXRhIG9yIG51bGwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9SZWZlcmVuY2VSZXNvbHZlci5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9SZWZlcmVuY2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjA3MWY2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vUmVmZXJlbmNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gYWxsb3cgcmVzb2x1dGlvbiBvZiByZWZlcmVuY2VzCi0gKiBvbiBhIHN0cmVhbS4gIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZVJlc29sdmVyIHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHhtbCBwb2ludGVkIHRvIGJ5IHRoaXMgaWRyZWYgYXMgYW4gWE1MSW5wdXRTdHJlYW0KLSAgICogQHBhcmFtIGlkcmVmCi0gICAqLwotICBYTUxJbnB1dFN0cmVhbSByZXNvbHZlKFN0cmluZyBpZHJlZikKLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpZCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgaWRyZWYKLSAgICogQHBhcmFtIGlkcmVmCi0gICAqLwotICBTdHJpbmcgZ2V0SWQoU3RyaW5nIGlkcmVmKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3BhY2UuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTAwMzEyOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogVGhpcyBlbGVtZW50IHJldHVybnMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIGFsbG93IHNlcGFyYXRlCi0gKiBoYW5kbGluZyBieSB0aGUgYXBwbGljYXRpb24KLSAqCi0gKgotICogQHZlcnNpb24gMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3BhY2UgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhIHsKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGlnbm9yYWJsZSB3aGl0ZXNwYWNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpZ25vcmFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3RhcnREb2N1bWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjMjA2YzkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgc3RhcnQgZG9jdW1lbnQgZXZlbnQKLSAqCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhcnREb2N1bWVudCBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHN5c3RlbSBpZCBvZiB0aGUgc3RyZWFtCi0gICAqIEByZXR1cm4gdGhlIHN5c3RlbSBpZCwgZGVmYXVsdHMgdG8gIiIKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKTsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIGVuY29kaW5nIHN0eWxlIG9mIHRoaXMgWE1MIHN0cmVhbQotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGRlZmF1bHRzIHRvICJVVEYtOCIKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKTsKLSAgLyogCi0gICAqIFJldHVybnMgaWYgdGhpcyBYTUwgaXMgc3RhbmRhbG9uZQotICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIFhNTCwgZGVmYXVsdHMgdG8gInllcyIKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpOwotICAvKiAKLSAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiBYTUwgb2YgdGhpcyBYTUwgc3RyZWFtCi0gICAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgWE1MLCBkZWZhdWx0cyB0byAiMS4wIgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1N0YXJ0RWxlbWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWU3MjU2OS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1N0YXJ0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLS8qKgotICogVGhlIFN0YXJ0RWxlbWVudCBpbnRlcmZhY2UgcHJvdmlkZXMgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGFib3V0Ci0gKiBzdGFydCBlbGVtZW50cwotICoKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBTdGFydEVsZW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBSZXR1cm5zIGFuIEF0dHJpYnV0ZUl0ZXJhdG9yIG9mIG5vbi1uYW1lc3BhY2UgZGVjbGFyZWQgYXR0cmlidXRlcwotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldEF0dHJpYnV0ZXMoKTsKLSAgLyoqCi0gICAqIFJldHVybnMgYW4gQXR0cmlidXRlSXRlcmF0b3Igb2YgbmFtZXNwYWNlcyBkZWNsYXJlZCBpbiB0aGlzIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXROYW1lc3BhY2VzKCk7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBkZWNsYXJlZCBhdHRyaWJ1dGVzIGFuZCBuYW1lc3BhY2VzCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSByZWZlcnJlZCB0byBieSB0aGlzIG5hbWUKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlQnlOYW1lKFhNTE5hbWUgbmFtZSk7Ci0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSB0aGF0IHRoZSBwcmVmaXggaXMgYm91bmQgdG8gaW4gdGhlCi0gICAqIGNvbnRleHQgb2YgdGhpcyBlbGVtZW50LiAgUmV0dXJucyBudWxsIGlmIAotICAgKiB0aGUgcHJlZml4IGlzIG5vdCBib3VuZCBpbiB0aGlzIGNvbnRleHQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKFN0cmluZyBwcmVmaXgpOwotICAvKioKLSAgICogR2V0cyBhIGphdmEudXRpbC5NYXAgZnJvbSBwcmVmaXhlcyB0byBVUklzIGluIHNjb3BlIGZvciB0aGlzCi0gICAqIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZU1hcCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydFByZWZpeE1hcHBpbmcuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3RhcnRQcmVmaXhNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmMzY4NzEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydFByZWZpeE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IHNpZ25hbHMgdGhhdCBhIHByZWZpeCBtYXBwaW5nIGhhcyBiZWd1biBzY29wZQotICoKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmcKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmcKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXJ0UHJlZml4TWFwcGluZyBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHVyaSBvZiB0aGUgcHJlZml4IHRoYXQgaXMgaW4gc2NvcGUgZm9yIHRoZSBmb2xsb3dpbmcgCi0gICAqIGVsZW1lbnQKLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHVyaQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoKTsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHByZWZpeCB0aGF0IGlzIG5vdyBpbiBzY29wZQotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxFdmVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ODE4NjIwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBlbGVtZW50IGludGVyZmFjZSBmb3IgaGFuZGxpbmcgbWFya3VwIGV2ZW50cy4KLSAqCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudAotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kRWxlbWVudAotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZQotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnREb2N1bWVudAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MRXZlbnQgewotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGFuIFhNTEV2ZW50Ci0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlQ9MHgwMDAwMDAwMTsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFN0YXJ0RWxlbWVudAotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlQ9MHgwMDAwMDAwMjsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhbiBFbmRFbGVtZW50Ci0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9FTEVNRU5UPTB4MDAwMDAwMDQ7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OPTB4MDAwMDAwMDg7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBDaGFyYWN0ZXJEYXRhIEV2ZW50Ci0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQVJBQ1RFUl9EQVRBPTB4MDAwMDAwMTA7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBDb21tZW50Ci0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlQ9MHgwMDAwMDAyMDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFNwYWNlCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlNwYWNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRT0weDAwMDAwMDQwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgTnVsbEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfRUxFTUVOVD0weDAwMDAwMDgwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgU3RhcnREb2N1bWVudAotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydERvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9ET0NVTUVOVD0weDAwMDAwMTAwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGFuIEVuZERvY3VtZW50Ci0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZERvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfRE9DVU1FTlQ9MHgwMDAwMDIwMDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFN0YXJ0UHJlZml4TWFwcGluZwotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydFByZWZpeE1hcHBpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1BSRUZJWF9NQVBQSU5HPTB4MDAwMDA0MDA7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBFbmRQcmVmaXhNYXBwaW5nCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9QUkVGSVhfTUFQUElORz0weDAwMDAwODAwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgQ2hhbmdlUHJlZml4TWFwcGluZwotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFuZ2VQcmVmaXhNYXBwaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfUFJFRklYX01BUFBJTkc9MHgwMDAwMTAwMDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhbiBFbnRpdHlSZWZlcmVuY2UgCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVudGl0eVJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFRkVSRU5DRT0weDAwMDAyMDAwOwotICAvKioKLSAgICogR2V0IHRoZSBldmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCi0gICAqIHJldHVybnMgYW4gaW50ZWdlciBzbyB0aGF0IHN3aXRjaCBzdGF0ZW1lbnRzCi0gICAqIGNhbiBiZSB3cml0dGVuIG9uIHRoZSByZXN1bHQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpOwotICAvKioKLSAgICogR2V0IHRoZSBldmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCi0gICAqIHJldHVybnMgYW4gaW50ZWdlciBzbyB0aGF0IHN3aXRjaCBzdGF0ZW1lbnRzCi0gICAqIGNhbiBiZSB3cml0dGVuIG9uIHRoZSByZXN1bHQKLSAgICovCi0gIHB1YmxpYyBYTUxOYW1lIGdldFNjaGVtYVR5cGUoKTsKLSAgLyoqCi0gICAqIEdldCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSB0eXBlIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFzU3RyaW5nKCk7Ci0gIC8qKgotICAgKiBHZXQgdGhlIFhNTE5hbWUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lCi0gICAqLwotICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoaXMgRWxlbWVudCBoYXMgYSBuYW1lCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyBFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKTsKLQotICAvKioKLSAgICogTWV0aG9kIGFjY2VzcyB0byB0aGUgZWxlbWVudHMgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzRW50aXR5UmVmZXJlbmNlKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzU3RhcnRQcmVmaXhNYXBwaW5nKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzRW5kUHJlZml4TWFwcGluZygpOwotICBwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZVByZWZpeE1hcHBpbmcoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKTsKLSAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJEYXRhKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzU3BhY2UoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNOdWxsKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzU3RhcnREb2N1bWVudCgpOwotICBwdWJsaWMgYm9vbGVhbiBpc0VuZERvY3VtZW50KCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1hNTElucHV0U3RyZWFtLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1hNTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiYzIwOTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKLQotLyoqCi0gKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIGludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgWE1MIEV2ZW50cwotICogaW4gYW4gWE1MIGRvY3VtZW50LgotICoKLSAqIDxwPiBEaWZmZXJlbmNlIGZyb20gU0FYIDwvcD4KLSAqIDxwPiBBbiBldmVudCBzdHJlYW0gY2FuIGJlIHRob3VnaHQgb2YgZW5jYXBzdWxhdGluZyBTQVgKLSAqIGV2ZW50cy4gSXQgYXBwbGllcyBhbiBpdGVyYXRvci9wdWxsIG1ldGFwaG9yIHRvIHRoZSBwYXJzZXIgCi0gKiBhbGxvd2luZyBwcm9jZWR1cmFsLCBzdHJlYW0tYmFzZWQsIGhhbmRsaW5nIG9mIGlucHV0IFhNTCByYXRoZXIgdGhhbgotICogaGF2aW5nIHRvIHdyaXRlIGNoYWluZWQgZXZlbnQgaGFuZGxlcnMgdG8gaGFuZGxlIGNvbXBsZXggWE1MCi0gKiBkb2N1bWVudHMuCi0gKiA8cD4gRGlmZmVyZW5jZSBmcm9tIERPTSA8L3A+Ci0gKiA8cD5UaGUgcHVsbCBtZXRhcGhvciBhbGxvd3Mgc2luZ2xlLXBhc3MsIHN0cmVhbS1iYXNlZCAgcGFyc2luZyBvZiB0aGUgZG9jdW1lbnQgcmF0aGVyCi0gKiB0aGFuIHRyZWUgYmFzZWQgbWFuaXB1bGF0aW9uLjwvcD4KLSAqCi0gKiBAc2luY2UgWE1MSW5wdXRTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCi0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudAotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kRWxlbWVudAotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZQotICovCi0KLS8vIFJFVklFVyBwZGFwa3VzQGJlYS5jb20gMjAwMi1TZXAtMTMgLS0gd2hpbGUgSSBsaWtlIHRoZSBjb252ZW5pZW5jZQotLy8gb2YgbWFueSBvZiB0aGVzZSBtZXRob2RzLCBpdCBzdHJpa2VzIG1lIHRoYXQgbWFueSBvZiB0aGVzZSBtZXRob2RzCi0vLyBjb3VsZCBpbXBsZW1lbnRlZCBhcyBzdGF0aWMgbWV0aG9kcyBpbiBhIHV0aWxpdHkgY2xhc3MuICB0aGUgZG93bgotLy8gc2lkZSB0byBoYXZpbmcgdGhlbSBpbiB0aGlzIGJhc2UgaW50ZXJmYWNlIGlzIHRoYXQgaXQgbWFrZXMgdGhlCi0vLyBjb250cmFjdCBmb3IgaW1wbGVtZW50ZXJzIHVubmVjZXNzYXJpbHkgc3RlYXAgYW5kIHJlc3VsdHMgaW4KLS8vIGR1cGxpY2F0ZWQgY29kZSBpbiBtZXRob2RzIHRoYXQgY2FuJ3QgZXh0ZW5kIG9uZSBvZiB0aGUgY29tbW9uIGJhc2UKLS8vIGNsYXNzZXMuICAKLQotcHVibGljIGludGVyZmFjZSBYTUxJbnB1dFN0cmVhbSB7Ci0gIC8qKgotICAgKiBHZXQgdGhlIG5leHQgWE1MRXZlbnQgb24gdGhlIHN0cmVhbQotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIFhNTEV2ZW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZXZlbnRzIHRvIHB1bGwgb2YgdGhlIHN0cmVhbQotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0gIC8qKgotICAgKiBTa2lwIHRoZSBuZXh0IHN0cmVhbSBldmVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2tpcCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0gIC8qKgotICAgKiBTa2lwcyB0aGUgZW50aXJlIG5leHQgc3RhcnQgdGFnIC8gZW5kIHRhZyBwYWlyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2tpcEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogQ2hlY2sgdGhlIG5leHQgWE1MRXZlbnQgd2l0aG91dCByZWFkaW5nIGl0IGZyb20gdGhlIHN0cmVhbS4KLSAgICogUmV0dXJucyBudWxsIGlmIHRoZSBzdHJlYW0gaXMgYXQgRU9GIG9yIGhhcyBubyBtb3JlIFhNTEV2ZW50cy4KLSAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSAgICovCi0gIHB1YmxpYyBYTUxFdmVudCBwZWVrKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIFBvc2l0aW9uIHRoZSBzdHJlYW0gYXQgdGhlIG5leHQgWE1MRXZlbnQgb2YgdGhpcyB0eXBlLiAgVGhlIG1ldGhvZAotICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBjb250YWlucyBhbm90aGVyIFhNTEV2ZW50IG9mIHRoaXMgdHlwZQotICAgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiBAcGFyYW0gZXZlbnRUeXBlIEFuIGludGVnZXIgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZWxlbWVudCB0eXBlLgotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2tpcChpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogUG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgbmFtZS4gIFRoZSBtZXRob2QKLSAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gY29udGFpbnMgYW5vdGhlciBlbGVtZW50IHdpdGggdGhpcyBuYW1lCi0gICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuICBTa2lwIGlzIGEgZm9yd2FyZCBvcGVyYXRvciBvbmx5LiAgSXQgZG9lcwotICAgKiBub3QgbG9vayBiYWNrd2FyZCBpbiB0aGUgc3RyZWFtLgotICAgKiBAcGFyYW0gbmFtZSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIFhNTCBuYW1lLgotICAgKiBJZiB0aGUgWE1MTmFtZS5nZXROYW1lU3BhY2VOYW1lKCkgbWV0aG9kIG9uIHRoZSBYTUxOYW1lIGFyZ3VtZW50IHJldHVybnMKLSAgICogbnVsbCB0aGUgWE1MTmFtZSB3aWxsIG1hdGNoIGp1c3QgdGhlIGxvY2FsIG5hbWUuICBQcmVmaXhlcyBhcmUKLSAgICogbm90IGNoZWNrZWQgZm9yIGVxdWFsaXR5LgotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBza2lwKFhNTE5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIFBvc2l0aW9uIHRoZSBzdHJlYW0gYXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIG5hbWUgYW5kIHRoaXMgdHlwZS4KLSAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBjb250YWlucyBhbm90aGVyIGVsZW1lbnQgCi0gICAqIHdpdGggdGhpcyBuYW1lIG9mIHRoaXMgdHlwZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgCi0gICAqIEBwYXJhbSBuYW1lIEFuIG9iamVjdCB0aGF0IGRlZmluZXMgYW4gWE1MIG5hbWUuCi0gICAqIElmIHRoZSBYTUxOYW1lLmdldE5hbWVTcGFjZU5hbWUoKSBtZXRob2Qgb24gdGhlIFhNTE5hbWUgYXJndW1lbnQgcmV0dXJucwotICAgKiBudWxsIHRoZSBYTUxOYW1lIHdpbGwgbWF0Y2gganVzdCB0aGUgbG9jYWwgbmFtZS4gIFByZWZpeGVzIGFyZQotICAgKiBub3QgY2hlY2tlZCBmb3IgZXF1YWxpdHkuCi0gICAqIEBwYXJhbSBldmVudFR5cGUgQW4gaW50ZWdlciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBlbGVtZW50IHR5cGUuCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0gICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNraXAoWE1MTmFtZSBuYW1lLCBpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogZ2V0U3ViU3RyZWFtKCkgcmV0dXJucyBhIHN0cmVhbSB3aGljaCBwb2ludHMgdG8gdGhlIGVudGlyZSBuZXh0IGVsZW1lbnQgaW4gdGhlCi0gICAqIGN1cnJlbnQgc3RyZWFtLiAgRm9yIGV4YW1wbGU6IHRha2UgYSBkb2N1bWVudCB0aGF0IGhhcyBhIHJvb3Qgbm9kZSBBLCB3aGVyZSB0aGUgY2hpbGRyZW4KLSAgICogb2YgQSBhcmUgQiwgQywgYW5kIEQuIElmIHRoZSBzdHJlYW0gaXMgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgb2YgQSwgZ2V0U3ViU3RyZWFtKCkgd2lsbCByZXR1cm4gCi0gICAqIEEsIEIsIEMgYW5kIEQgaW5jbHVkaW5nIHRoZSBzdGFydCBlbGVtZW50IG9mIEEgYW5kIHRoZSBlbmQgZWxlbWVudCBvZiBBLiAgVGhlIHBvc2l0aW9uIG9mIHRoZSBwYXJlbnQKLSAgICogc3RyZWFtIGlzIG5vdCBjaGFuZ2VkIGFuZCB0aGUgZXZlbnRzIHJlYWQgYnkgdGhlIHN1YnN0cmVhbSBhcmUgd3JpdHRlbiBiYWNrIHRvIGl0cyBwYXJlbnQuICAgCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gZ2V0U3ViU3RyZWFtKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIENsb3NlcyB0aGlzIGlucHV0IHN0cmVhbSBhbmQgcmVsZWFzZXMgYW55IHN5c3RlbSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSByZXNvbHZlciB0aGF0IHdhcyBzZXQgZm9yIHRoaXMgc3RyZWFtLAotICAgKiByZXR1cm5zIG51bGwgaWYgbm8gUmVmZXJlbmNlUmVzb2x2ZXIgaGFzIGJlZW4gc2V0LgotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5SZWZlcmVuY2VSZXNvbHZlcgotICAgKi8KLSAgcHVibGljIFJlZmVyZW5jZVJlc29sdmVyIGdldFJlZmVyZW5jZVJlc29sdmVyKCk7Ci0gIC8qKgotICAgKiBQcm92aWRlcyBhIHdheSB0byBzZXQgdGhlIFJlZmVyZW5jZVJlc29sdmVyIG9mIHRoZSBzdHJlYW0sCi0gICAqIHRoaXMgaXMgbW9zdGx5IG5lZWRlZCBmb3IgaGFuZGxlIHJlZmVyZW5jZXMgdG8gb3RoZXIgcGFydHMgb2YgdGhlCi0gICAqIGRvY3VtZW50LgotICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5SZWZlcmVuY2VSZXNvbHZlcgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlUmVzb2x2ZXIoUmVmZXJlbmNlUmVzb2x2ZXIgcmVzb2x2ZXIpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MTmFtZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMmM3ZDkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBRdWFsaWZpZWQgTmFtZSBvZiBhbiBYTUwgZXZlbnQuCi0gKgotICoKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50Ci0gKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MTmFtZSB7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIHVyaSBvZiB0aGUgcHJlZml4IG9mIHRoaXMgbmFtZQotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSB1cmksIAotICAgKiBlbXB0eSBzdHJpbmcgaWYgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIGJvdW5kIHRvIGVtcHR5IHN0cmluZyAKLSAgICogb3IgbnVsbCBpZiB0aGUgbmFtZSBkb2VzIG5vdCBoYXZlIGEgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBsb2NhbG5hbWUgb2YgdGhlIHhtbCBuYW1lCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBsb2NhbG5hbWUsIGNhbm5vdCBiZSBudWxsCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBwcmVmaXggb2YgdGhlIHhtbCBuYW1lCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBwcmVmaXggb2YgdGhlIHhtbCBuYW1lIG9yIG51bGwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLSAgLyoKLSAgICogcmV0dXJucyB0aGUgcHJlZml4IG9mIHRoZSB4bWwgbmFtZSArICc6JyArIHRoZSBsb2NhbCBuYW1lCi0gICAqIGlmIHRoZSBwcmVmaXggaXMgbm90IG51bGwKLSAgICogcmV0dXJucyB0aGUgbG9jYWwgbmFtZSBvdGhlcndpc2UKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHByZWZpeCBwbHVzIHRoZSBsb2NhbCBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MU3RyZWFtRXhjZXB0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1hNTFN0cmVhbUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzcxNTFkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MU3RyZWFtRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0udXRpbHMuTmVzdGVkVGhyb3dhYmxlOwotCi0vKioKLSAqIFRoZSBiYXNlIGV4Y2VwdGlvbiBmb3IgdW5leHBlY3RlZCBpbnB1dCBkdXJpbmcgWE1MIGhhbmRsaW5nCi0gKgotICoKLSAqIEB2ZXJzaW9uIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxTdHJlYW1FeGNlcHRpb24gCi0gIGV4dGVuZHMgSU9FeGNlcHRpb24gCi0gIGltcGxlbWVudHMgTmVzdGVkVGhyb3dhYmxlIAotewotICBwcm90ZWN0ZWQgVGhyb3dhYmxlIHRoOwotCi0gIHB1YmxpYyBYTUxTdHJlYW1FeGNlcHRpb24oKSB7fQotCi0gIHB1YmxpYyBYTUxTdHJlYW1FeGNlcHRpb24oU3RyaW5nIG1zZykgeyAKLSAgICBzdXBlcihtc2cpOyAKLSAgfQotCi0gIHB1YmxpYyBYTUxTdHJlYW1FeGNlcHRpb24oVGhyb3dhYmxlIHRoKSB7Ci0gICAgdGhpcy50aCA9IHRoOwotICAgIAotICB9Ci0KLSAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGgpIHsKLSAgICBzdXBlcihtc2cpOwotICAgIHRoaXMudGggPSB0aDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXN0ZWQgZXhjZXB0aW9uLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBOZXN0ZWQgZXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgVGhyb3dhYmxlIGdldE5lc3RlZEV4Y2VwdGlvbigpIHsKLSAgICByZXR1cm4gZ2V0TmVzdGVkKCk7Ci0gIH0KLQotICAvL3RyeSB0byBkbyBzb21ldGluZyB1c2VmdWwKLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgIFN0cmluZyBtc2cgPSBzdXBlci5nZXRNZXNzYWdlKCk7Ci0KLSAgICBpZiAobXNnID09IG51bGwgJiYgdGggIT0gbnVsbCkgewotICAgICAgcmV0dXJuIHRoLmdldE1lc3NhZ2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0gIH0KLQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIE5lc3RlZFRocm93YWJsZSBpbXBsZW1lbnRhdGlvbi4KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmVzdGVkIFRocm93YWJsZS4KLSAgICoKLSAgICogQHJldHVybiAgICAgICAgICAgICAgICAgTmVzdGVkIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFRocm93YWJsZSBnZXROZXN0ZWQoKSB7Ci0gICAgcmV0dXJuIHRoOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBzdXBlclRvU3RyaW5nKCkgewotICAgIHJldHVybiBzdXBlci50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3VwZXJQcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcHMpIHsKLSAgICBzdXBlci5wcmludFN0YWNrVHJhY2UocHMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3VwZXJQcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcHcpIHsKLSAgICBzdXBlci5wcmludFN0YWNrVHJhY2UocHcpOwotICB9Ci0KLSAgLy8gRW5kIE5lc3RlZFRocm93YWJsZSBpbXBsZW1lbnRhdGlvbi4KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogUHJpbnRzIHRoZSBleGNlcHRpb24gbWVzc2FnZSBhbmQgaXRzIG5lc3RlZCBleGNlcHRpb24gbWVzc2FnZS4KLSAgICoKLSAgICogQHJldHVybiAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIE5lc3RlZFRocm93YWJsZS5VdGlsLnRvU3RyaW5nKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uIGFuZAotICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHMgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcykgeyAKLSAgICBOZXN0ZWRUaHJvd2FibGUuVXRpbC5wcmludFN0YWNrVHJhY2UodGhpcywgcyk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnRzIHRoZSBzdGFjayB0cmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24gYW5kCi0gICAqIGl0cyBuZXN0ZWQgZXhjZXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcyAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciB3KSB7IAotICAgIE5lc3RlZFRocm93YWJsZS5VdGlsLnByaW50U3RhY2tUcmFjZSh0aGlzLCB3KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICogaXRzIG5lc3RlZCBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4KLSAgICoKLSAgICogQHBhcmFtIHMgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0gICAgcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9ldmVudHMvRWxlbWVudFR5cGVOYW1lcy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9ldmVudHMvRWxlbWVudFR5cGVOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDY1NTM3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vZXZlbnRzL0VsZW1lbnRUeXBlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50VHlwZU5hbWVzIHsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShpbnQgdmFsKSB7IAotICAgIHN3aXRjaCh2YWwpIHsKLSAgICBjYXNlIFhNTEV2ZW50LlhNTF9FVkVOVDogcmV0dXJuICgiWE1MX0VWRU5UIik7Ci0gICAgY2FzZSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UOiByZXR1cm4gKCJTVEFSVF9FTEVNRU5UIik7Ci0gICAgY2FzZSBYTUxFdmVudC5FTkRfRUxFTUVOVDogcmV0dXJuICgiRU5EX0VMRU1FTlQiKTsKLSAgICBjYXNlIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT046IHJldHVybiAoIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iKTsKLSAgICBjYXNlIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBOiByZXR1cm4gKCJDSEFSQUNURVJfREFUQSIpOwotICAgIGNhc2UgWE1MRXZlbnQuQ09NTUVOVDogcmV0dXJuICgiQ09NTUVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuU1BBQ0U6IHJldHVybiAoIlNQQUNFIik7Ci0gICAgY2FzZSBYTUxFdmVudC5OVUxMX0VMRU1FTlQ6IHJldHVybiAoIk5VTExfRUxFTUVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfRE9DVU1FTlQ6IHJldHVybiAoIlNUQVJUX0RPQ1VNRU5UIik7Ci0gICAgY2FzZSBYTUxFdmVudC5FTkRfRE9DVU1FTlQ6IHJldHVybiAoIkVORF9ET0NVTUVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkc6IHJldHVybiAoIlNUQVJUX1BSRUZJWF9NQVBQSU5HIik7Ci0gICAgY2FzZSBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkc6IHJldHVybiAoIkNIQU5HRV9QUkVGSVhfTUFQUElORyIpOwotICAgIGNhc2UgWE1MRXZlbnQuRU5EX1BSRUZJWF9NQVBQSU5HOiByZXR1cm4gKCJFTkRfUFJFRklYX01BUFBJTkciKTsKLSAgICBjYXNlIFhNTEV2ZW50LkVOVElUWV9SRUZFUkVOQ0U6IHJldHVybiAoIkVOVElUWV9SRUZFUkVOQ0UiKTsKLSAgICBkZWZhdWx0OiByZXR1cm4gIiI7Ci0gICAgfQotICB9Ci0gIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGUoU3RyaW5nIHZhbCkgewotICAgIGlmICh2YWwuZXF1YWxzKCJYTUxfRVZFTlQiKSkgCi0gICAgICByZXR1cm4gWE1MRXZlbnQuWE1MX0VWRU5UOwotICAgIGlmICh2YWwuZXF1YWxzICgiU1RBUlRfRUxFTUVOVCIpKSByZXR1cm4gCi0gICAgICAgIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQ7IAotICAgIGlmICh2YWwuZXF1YWxzICgiRU5EX0VMRU1FTlQiKSkgcmV0dXJuIFhNTEV2ZW50LkVORF9FTEVNRU5UOwotICAgIGlmICh2YWwuZXF1YWxzICgiUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT047IAotICAgIGlmICh2YWwuZXF1YWxzICgiQ0hBUkFDVEVSX0RBVEEiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5DSEFSQUNURVJfREFUQTsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJDT01NRU5UIikpCi0gICAgICByZXR1cm4gWE1MRXZlbnQuQ09NTUVOVDsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJTUEFDRSIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LlNQQUNFOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIk5VTExfRUxFTUVOVCIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50Lk5VTExfRUxFTUVOVDsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJTVEFSVF9ET0NVTUVOVCIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIkVORF9ET0NVTUVOVCIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LkVORF9ET0NVTUVOVDsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJTVEFSVF9QUkVGSVhfTUFQUElORyIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIkNIQU5HRV9QUkVGSVhfTUFQUElORyIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LkNIQU5HRV9QUkVGSVhfTUFQUElORzsKLSAgICBpZiAodmFsLmVxdWFscyAoIkVOVElUWV9SRUZFUkVOQ0UiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5FTlRJVFlfUkVGRVJFTkNFOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIkVORF9QUkVGSVhfTUFQUElORyIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORzsKLQotICAgIHJldHVybiBYTUxFdmVudC5OVUxMX0VMRU1FTlQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vdXRpbHMvTmVzdGVkVGhyb3dhYmxlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL3V0aWxzL05lc3RlZFRocm93YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZThkYmUzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vdXRpbHMvTmVzdGVkVGhyb3dhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLnV0aWxzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgTmVzdGVkRXhjZXB0aW9uLCBOZXN0ZWRFcnJvciwgYW5kCi0gKiBOZXN0ZWRSdW50aW1lRXhjZXB0aW9uIGxhcmdlbHkgc28gVXRpbCBjYW4gcHJvdmlkZSBhIHN0YW5kYXJkCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0b1N0cmluZygpIGFuZCBwcmludFN0YWNrVHJhY2UoKQotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBKREsgMS40IHN0eWxlIG5lc3RlZCB0aHJvd2FibGVzIHdoZXJlIHBvc3NpYmxlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBOZXN0ZWRUaHJvd2FibGUgewotCi0gIC8qKiBHZXQgdGhlIG5lc3RlZCBUaHJvd2FibGUuICovCi0gIFRocm93YWJsZSBnZXROZXN0ZWQoKTsKLQotICAvKiogQ2FsbCBzdXBlci50b1N0cmluZygpLiBbS2x1ZGdlIGJ1dCBuZWNlc3NhcnkuXSAqLwotICBTdHJpbmcgc3VwZXJUb1N0cmluZygpOwotCi0gIC8qKiBDYWxsIHN1cGVyLnByaW50U3RhY2tUcmFjZSgpLiBbS2x1ZGdlIGJ1dCBuZWNlc3NhcnkuXSAqLwotICB2b2lkIHN1cGVyUHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHBzKTsKLQotICAvKiogQ2FsbCBzdXBlci5wcmludFN0YWNrVHJhY2UoKS4gW0tsdWRnZSBidXQgbmVjZXNzYXJ5Ll0gKi8KLSAgdm9pZCBzdXBlclByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBwbyk7Ci0KLSAgc3RhdGljIGNsYXNzIFV0aWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIGl0cyBuZXN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE5lc3RlZFRocm93YWJsZSBudCkgewotICAgICAgVGhyb3dhYmxlIG5lc3RlZCA9IG50LmdldE5lc3RlZCgpOwotICAgICAgaWYgKG5lc3RlZCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBudC5zdXBlclRvU3RyaW5nKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnQuc3VwZXJUb1N0cmluZygpICsgIiAtIHdpdGggbmVzdGVkIGV4Y2VwdGlvbjoiICsKLSAgICAgICAgICBFT0wgKyAiWyIgKyBuZXN0ZWRUb1N0cmluZyhuZXN0ZWQpICsgIl0iOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuZXN0ZWRUb1N0cmluZyhUaHJvd2FibGUgbmVzdGVkKSB7Ci0gICAgICBpZiAobmVzdGVkIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSA9IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBuZXN0ZWQ7Ci0gICAgICAgIHJldHVybiBuZXN0ZWQudG9TdHJpbmcoKSArICIgLSB3aXRoIHRhcmdldCBleGNlcHRpb246IiArCi0gICAgICAgICAgRU9MICsgIlsiICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLnRvU3RyaW5nKCkgKwotICAgICAgICAgICJdIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXN0ZWQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBQcmludFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YWNrVHJhY2UoTmVzdGVkVGhyb3dhYmxlIG50LCBQcmludFN0cmVhbSBzKSB7Ci0gICAgICBUaHJvd2FibGUgbmVzdGVkID0gbnQuZ2V0TmVzdGVkKCk7Ci0gICAgICBpZiAobmVzdGVkICE9IG51bGwpIHsKLSAgICAgICAgbmVzdGVkLnByaW50U3RhY2tUcmFjZShzKTsKLSAgICAgICAgcy5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0gbmVzdGVkIHdpdGhpbjogLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICB9Ci0gICAgICBudC5zdXBlclByaW50U3RhY2tUcmFjZShzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3ICAgICAgICAgICAgICAgICBQcmludFdyaXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YWNrVHJhY2UoTmVzdGVkVGhyb3dhYmxlIG50LCBQcmludFdyaXRlciB3KSB7Ci0gICAgICBUaHJvd2FibGUgbmVzdGVkID0gbnQuZ2V0TmVzdGVkKCk7Ci0gICAgICBpZiAobmVzdGVkICE9IG51bGwpIHsKLSAgICAgICAgbmVzdGVkLnByaW50U3RhY2tUcmFjZSh3KTsKLSAgICAgICAgdy5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0gbmVzdGVkIHdpdGhpbjogLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICB9Ci0gICAgICBudC5zdXBlclByaW50U3RhY2tUcmFjZSh3KTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9qYXZheC94bWwvbmFtZXNwYWNlL1FOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL2phdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkZTlmOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL2phdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZheC54bWwubmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIDxjb2RlPlFOYW1lPC9jb2RlPiBjbGFzcyByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiBhIHF1YWxpZmllZCBuYW1lCi0gKiBhcyBzcGVjaWZpZWQgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIj5YTUwKLSAqIFNjaGVtYSBQYXJ0MjogRGF0YXR5cGVzIHNwZWNpZmljYXRpb248L2E+LgotICogPHA+Ci0gKiBUaGUgdmFsdWUgb2YgYSBRTmFtZSBjb250YWlucyBhIDxiPm5hbWVzcGFjZVVSSTwvYj4sIGEgPGI+bG9jYWxQYXJ0PC9iPiBhbmQgYSA8Yj5wcmVmaXg8L2I+LgotICogVGhlIGxvY2FsUGFydCBwcm92aWRlcyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuIFRoZQotICogbmFtZXNwYWNlVVJJIGlzIGEgVVJJIHJlZmVyZW5jZSBpZGVudGlmeWluZyB0aGUgbmFtZXNwYWNlLgotICoKLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgUU5hbWUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIGNvbW1lbnQvc2hhcmVkIGVtcHR5IHN0cmluZyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlbXB0eVN0cmluZyA9ICIiLmludGVybigpOwotCi0gICAgLyoqIEZpZWxkIG5hbWVzcGFjZVVSSSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQotICAgIC8qKiBGaWVsZCBsb2NhbFBhcnQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbFBhcnQ7Ci0KLSAgICAvKiogRmllbGQgcHJlZml4ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBRTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQgTG9jYWwgcGFydCBvZiB0aGUgUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIGxvY2FsUGFydCkgewotICAgICAgICB0aGlzKGVtcHR5U3RyaW5nLCBsb2NhbFBhcnQsIGVtcHR5U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBOYW1lc3BhY2UgVVJJIGZvciB0aGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxQYXJ0KSB7Ci0gICAgICAgIHRoaXMobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQsIGVtcHR5U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBOYW1lc3BhY2UgVVJJIGZvciB0aGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lLgotICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IG9mIHRoZSBRTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCwgU3RyaW5nIHByZWZpeCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IChuYW1lc3BhY2VVUkkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IGVtcHR5U3RyaW5nCi0gICAgICAgICAgICAgICAgOiBuYW1lc3BhY2VVUkkuaW50ZXJuKCk7Ci0gICAgICAgIGlmIChsb2NhbFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBsb2NhbCBwYXJ0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmxvY2FsUGFydCA9IGxvY2FsUGFydC5pbnRlcm4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBwcmVmaXgiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4LmludGVybigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgTmFtZXNwYWNlIFVSSSBmb3IgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBOYW1lc3BhY2UgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgTG9jYWwgcGFydCBmb3IgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBMb2NhbCBwYXJ0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgUHJlZml4IGZvciB0aGlzIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotICAgICAgICByZXR1cm4gKChuYW1lc3BhY2VVUkkgPT0gZW1wdHlTdHJpbmcpCi0gICAgICAgICAgICAgICAgPyBsb2NhbFBhcnQKLSAgICAgICAgICAgICAgICA6ICd7JyArIG5hbWVzcGFjZVVSSSArICd9JyArIGxvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhpcyBRTmFtZSBmb3IgZXF1YWxpdHkgd2l0aCBhbm90aGVyIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCBhIFFOYW1lIG9yIGlzIG51bGwgdGhlbiB0aGlzIG1ldGhvZAotICAgICAqIHJldHVybnMgPHR0PmZhbHNlPC90dD4uCi0gICAgICogPHA+Ci0gICAgICogRm9yIHR3byBRTmFtZXMgdG8gYmUgY29uc2lkZXJlZCBlcXVhbCByZXF1aXJlcyB0aGF0IGJvdGgKLSAgICAgKiBsb2NhbFBhcnQgYW5kIG5hbWVzcGFjZVVSSSBtdXN0IGJlIGVxdWFsLiBUaGlzIG1ldGhvZCB1c2VzCi0gICAgICogPGNvZGU+U3RyaW5nLmVxdWFsczwvY29kZT4gdG8gY2hlY2sgZXF1YWxpdHkgb2YgbG9jYWxQYXJ0Ci0gICAgICogYW5kIG5hbWVzcGFjZVVSSS4gQW55IGNsYXNzIHRoYXQgZXh0ZW5kcyBRTmFtZSBpcyByZXF1aXJlZAotICAgICAqIHRvIHNhdGlzZnkgdGhpcyBlcXVhbGl0eSBjb250cmFjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzYXRpc2ZpZXMgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlIDxjb2RlPk9iamVjdC5lcXVhbHM8L2NvZGU+IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgaWRlbnRpY2FsIHRvIHRoaXMKLSAgICAgKiAgICAgIFFOYW1lOiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0KLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFFOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChuYW1lc3BhY2VVUkkgPT0gKChRTmFtZSkgb2JqKS5uYW1lc3BhY2VVUkkpCi0gICAgICAgICAgICAgICAgJiYgKGxvY2FsUGFydCA9PSAoKFFOYW1lKSBvYmopLmxvY2FsUGFydCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3RyaW5nIG11c3QgYmUgaW4gdGhlIGZvcm0gcmV0dXJuZWQgYnkgdGhlIFFOYW1lLnRvU3RyaW5nKCkKLSAgICAgKiBtZXRob2QsIGkuZS4gIntuYW1lc3BhY2VVUkl9bG9jYWxQYXJ0Iiwgd2l0aCB0aGUgIntuYW1lc3BhY2VVUkl9IgotICAgICAqIHBhcnQgYmVpbmcgb3B0aW9uYWwuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZG9lc24ndCBkbyBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIFFOYW1lLgotICAgICAqIEluIHBhcnRpY3VsYXIsIGl0IGRvZXNuJ3QgY2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIG5hbWVzcGFjZSBVUkkKLSAgICAgKiBpcyBhIGxlZ2FsIFVSSSAocGVyIFJGQyAyMzk2IGFuZCBSRkMgMjczMiksIG5vciB0aGF0IHRoZSByZXN1bHRpbmcKLSAgICAgKiBsb2NhbCBwYXJ0IGlzIGEgbGVnYWwgTkNOYW1lIHBlciB0aGUgWE1MIE5hbWVzcGFjZXMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQgYXMgYSBRTmFtZQotICAgICAqIEByZXR1cm4gUU5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSB2YWx1ZU9mKFN0cmluZyBzKSB7Ci0KLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBsaXRlcmFsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocy5jaGFyQXQoMCkgPT0gJ3snKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IHMuaW5kZXhPZignfScpOwotCi0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA9PSBzLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHMuc3Vic3RyaW5nKDEsIGkpLCBzLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgUU5hbWUgb2JqZWN0LiBUaGUgaGFzaCBjb2RlCi0gICAgICogaXMgYmFzZWQgb24gYm90aCB0aGUgbG9jYWxQYXJ0IGFuZCBuYW1lc3BhY2VVUkkgcGFydHMgb2YgdGhlCi0gICAgICogUU5hbWUuIFRoaXMgbWV0aG9kIHNhdGlzZmllcyB0aGUgIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlCi0gICAgICogPGNvZGU+T2JqZWN0Lmhhc2hDb2RlPC9jb2RlPiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIFFuYW1lIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkkuaGFzaENvZGUoKSBeIGxvY2FsUGFydC5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGRlc2VyaWFsaXphdGlvbiBwcm9wZXJseSBpbnRlcm5zIHRoZSByZXN1bHRzLgotICAgICAqIEBwYXJhbSBpbiB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gdG8gYmUgcmVhZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotICAgICAgICBuYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkkuaW50ZXJuKCk7Ci0gICAgICAgIGxvY2FsUGFydCA9IGxvY2FsUGFydC5pbnRlcm4oKTsKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LmludGVybigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9GaWx0ZXJYbWxPYmplY3QuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9GaWx0ZXJYbWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczYTE3NC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvRmlsdGVyWG1sT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBBIEZpbHRlclhtbE9iamVjdCBkZWxlZ2F0ZXMgdG8gc29tZSBvdGhlciBYbWxPYmplY3QsIHdoaWNoIGl0IGNhbiB1c2UgYXMKLSAqIGl0cyBiYXNpYyBzb3VyY2Ugb2YgZGF0YSwgcG9zc2libHkgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIGFsb25nIHRoZSB3YXkgb3IKLSAqIHByb3ZpZGluZyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuIFRoZSBjbGFzcyBGaWx0ZXJYbWxPYmplY3QgaXRzZWxmCi0gKiBzaW1wbHkgb3ZlcnJpZGVzIGFsbCBtZXRob2RzIG9mIFhtbE9iamVjdCB3aXRoIHZlcnNpb25zIHRoYXQgcGFzcyBhbGwKLSAqIHJlcXVlc3RzIHRvIHRoZSB1bmRlcmx5aW5nIFhtbE9iamVjdC4gU3ViY2xhc3NlcyBvZiBGaWx0ZXJYbWxPYmplY3QgbWF5Ci0gKiBmdXJ0aGVyIG92ZXJyaWRlIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhbmQgbWF5IGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsCi0gKiBtZXRob2RzIGFuZCBmaWVsZHMuCi0gKiA8cD4KLSAqIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0aGF0IEZpbHRlclhtbE9CamVjdCBoYXMgbm8gc3RvcmFnZSAoaS5lLiwgbm8KLSAqIG5vbi10cmFuc2llbnQgZmllbGRzKSwgYmVjYXVzZSBzdWJjbGFzc2VzIG1heSBiZSBzZXJpYWxpemFibGUgYW5kCi0gKiBhZGRpbmcgc3RvcmFnZSB3b3VsZCBicmVhayB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuCi0gKi8gCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyWG1sT2JqZWN0IGltcGxlbWVudHMgWG1sT2JqZWN0LCBTaW1wbGVWYWx1ZQotewotICAgIC8qKgotICAgICAqIFRoaXMgYWJzdHJhY3QgbWV0aG9kIGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgWG1sT2JqZWN0LgotICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHN1cHBseSBvciBjb21wdXRlIHRoZSB3cmFwcGVkIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBFdmVyeSBvdGhlciBtZXRob2Qgb2YgdGhpcyBjbGFzcyBkZWxlZ2F0ZXMgdG8gdGhlIG9iamVjdCByZXR1cm5lZAotICAgICAqIGZyb20gdGhpcyBtZXRob2QuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgb2JqZWN0IGltcGxlbWVudHMgYWxsIHRoZQotICAgICAqIG1ldGhvZHMgb2YgYm90aCBYbWxPYmplY3QgYW5kIFNpbXBsZVZhbHVlLgotICAgICAqLyAKLSAgICBwdWJsaWMgYWJzdHJhY3QgWG1sT2JqZWN0IHVuZGVybHlpbmdYbWxPYmplY3QoKTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zY2hlbWFUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkudmFsaWRhdGUob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGgoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnNlbGVjdFBhdGgocGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGgoU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2VsZWN0UGF0aChwYXRoLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5KFN0cmluZyBxdWVyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuZXhlY1F1ZXJ5KHF1ZXJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5KFN0cmluZyBxdWVyeSwgWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5leGVjUXVlcnkocXVlcnksIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY2hhbmdlVHlwZShTY2hlbWFUeXBlIG5ld1R5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLmNoYW5nZVR5cGUobmV3VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5pc05pbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5pbCgpCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2V0TmlsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5pc0ltbXV0YWJsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3Qgc2V0KFhtbE9iamVjdCBzcmNPYmopCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnNldChzcmNPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY29weSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLmNvcHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWx1ZUVxdWFscyhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS52YWx1ZUVxdWFscyhvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdmFsdWVIYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnZhbHVlSGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jb21wYXJlVG8ob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVWYWx1ZShYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jb21wYXJlVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5tb25pdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbERvY3VtZW50UHJvcGVydGllcyBkb2N1bWVudFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5kb2N1bWVudFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld0N1cnNvcigpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB4bWxUZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkueG1sVGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdSZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBuZXdEb21Ob2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3RG9tTm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZShjaCwgbGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKGZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKHcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld1hNTElucHV0U3RyZWFtKG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dChYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnhtbFRleHQob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3SW5wdXRTdHJlYW0ob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdSZWFkZXIob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0RvbU5vZGUob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUoY2gsIGxoLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKGZpbGUsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUob3MsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoV3JpdGVyIHcsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZSh3LCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5pbnN0YW5jZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc3RyaW5nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5ieXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5sb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5iaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5iaWdEZWNpbWFsVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuYnl0ZUFycmF5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5lbnVtVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmNhbGVuZGFyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBkYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5kYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdEYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ0R1cmF0aW9uVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnFOYW1lVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBsaXN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5saXN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkueGxpc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5vYmplY3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChib29sZWFuIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChieXRlIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoaW50IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChsb25nIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChCaWdJbnRlZ2VyIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoQmlnRGVjaW1hbCBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KGZsb2F0IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChkb3VibGUgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQodik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KGJ5dGVbXSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChDYWxlbmRhciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KERhdGUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoUU5hbWUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChMaXN0IG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCb29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCeXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldFNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0SW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRMb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCaWdEZWNpbWFsVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0RG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBnZXRFbnVtVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRFbnVtVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldENhbGVuZGFyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXREYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEdEYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0R0R1cmF0aW9uVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldFFOYW1lVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRMaXN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4Z2V0TGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkueGdldExpc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRPYmplY3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0U3RyaW5nVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJvb2xlYW5WYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJ5dGVWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0U2hvcnRWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRJbnRWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldExvbmdWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoQmlnSW50ZWdlciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0QmlnSW50ZWdlclZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJpZ0RlY2ltYWxWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRGbG9hdFZhbHVlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlKGRvdWJsZSB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldERvdWJsZVZhbHVlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0Qnl0ZUFycmF5VmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtVmFsdWUoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0RW51bVZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0Q2FsZW5kYXJWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGVWYWx1ZShEYXRlIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXREYXRlVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRHRGF0ZVZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R0R1cmF0aW9uVmFsdWUoR0R1cmF0aW9uIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRHRHVyYXRpb25WYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldFFOYW1lVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0TGlzdFZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRPYmplY3RWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdFNldChPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLm9iamVjdFNldChvYmopOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Zjk2MjAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIFhNTCBTY2hlbWEtY29tcGF0aWJsZSBHcmVnb3JpYW4gZGF0ZS4KLSAqIDxwPgotICogVGhlcmUgYXJlIG1hbnkgZGF0ZSB0eXBlcyBpbiBYTUwgU2NoZW1hLCBhbmQgdGhpcyB0eXBlCi0gKiByZXByZXNlbnRzIHRoZSBuYXR1cmFsIHVuaW9uIG9mIGFsbCB0aG9zZSB0eXBlcy4gIEEgR0RhdGUKLSAqIGNhbiBob2xkIGFueSBzdWJzZXQgb2YgZGF0ZSBmaWVsZHMgKFllYXIsIE1vbnRoLCBEYXksIFRpbWUsCi0gKiBUaW1lem9uZSwgb3Igc29tZSBjb21iaW5hdGlvbikuIFdoZXJldmVyIHRoZSBzcGVjaWZpY2F0aW9uCi0gKiBwcm92aWRlcyBndWlkYW5jZSwgdGhlIGd1aWRlbGluZXMgaW4gdGhlCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvIj5YTUwgU2NoZW1hIDEuMCBzcGVjaWZpY2F0aW9uPC9hPgotICogKHBsdXMgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDUveG1sc2NoZW1hLWVycmF0YSI+cHVibGlzaGVkIGVycmF0YTwvYT4pIGFyZSBmb2xsb3dlZC4KLSAqIDxwPgotICogSW5zdGFuY2VzIG1heSBzZXBhcmF0ZWx5IGhhdmUgdmFsdWVzIG9yIG5vIHZhbHVlcyBmb3IKLSAqIHRoZSB5ZWFyLCBtb250aCwgZGF5LW9mLW1vbnRoLCBhbmQgdGltZS1vZi1kYXkuIE5vdCBhbGwKLSAqIG9wZXJhdGlvbnMgYXJlIG1lYW5pbmdmdWwgb24gYWxsIGNvbWJpbmF0aW9ucy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdEYXRlIGltcGxlbWVudHMgR0RhdGVTcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIC8vIGZvciBmYXN0IGVxdWFsaXR5IGNvbXBhcmlzb24sIGhhc2hpbmcsIGFuZCBzZXJpYWxpemF0aW9uCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIF9jYW5vbmljYWxTdHJpbmc7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIF9zdHJpbmc7Ci0KLSAgICBwcml2YXRlIGludCBfYml0czsKLSAgICBwcml2YXRlIGludCBfQ1k7Ci0gICAgcHJpdmF0ZSBpbnQgX007Ci0gICAgcHJpdmF0ZSBpbnQgX0Q7Ci0gICAgcHJpdmF0ZSBpbnQgX2g7Ci0gICAgcHJpdmF0ZSBpbnQgX207Ci0gICAgcHJpdmF0ZSBpbnQgX3M7Ci0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9mczsKLSAgICBwcml2YXRlIGludCBfdHpzaWduOwotICAgIHByaXZhdGUgaW50IF90emg7Ci0gICAgcHJpdmF0ZSBpbnQgX3R6bTsKLSAgICAKLSAgICAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIF96ZXJvID0gQmlnRGVjaW1hbC52YWx1ZU9mKDApOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgX29uZSA9IEJpZ0RlY2ltYWwudmFsdWVPZigxKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSBiYXNlZCBvbiBhIGxleGljYWwgcmVwcmVzZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlKENoYXJTZXF1ZW5jZSBzdHJpbmcpCi0gICAgewotICAgICAgICAvLyBmaXJzdCB0cmltIFhNTCB3aGl0ZXNwYWNlCi0gICAgICAgIGludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIHdoaWxlIChsZW4gPiAwICYmIGlzU3BhY2Uoc3RyaW5nLmNoYXJBdChsZW4gLSAxKSkpCi0gICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgd2hpbGUgKHN0YXJ0IDwgbGVuICYmIGlzU3BhY2Uoc3RyaW5nLmNoYXJBdChzdGFydCkpKQotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLQotICAgICAgICAvLyBwaWNrIG9wdGlvbmFsIHRpbWV6b25lIG9mZiB0aGUgZW5kCi0gICAgICAgIGlmIChsZW4gLSBzdGFydCA+PSAxICYmIHN0cmluZy5jaGFyQXQobGVuIC0gMSkgPT0gJ1onKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRVpPTkU7Ci0gICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsZW4gLSBzdGFydCA+PSA2KQotICAgICAgICB0aW1lem9uZTogewotICAgICAgICAgICAgaW50IHR6c2lnbjsKLSAgICAgICAgICAgIGludCB0emhvdXI7Ci0gICAgICAgICAgICBpbnQgdHptaW51dGU7Ci0KLSAgICAgICAgICAgIGlmIChzdHJpbmcuY2hhckF0KGxlbiAtIDMpICE9ICc6JykKLSAgICAgICAgICAgICAgICBicmVhayB0aW1lem9uZTsKLQotICAgICAgICAgICAgc3dpdGNoIChzdHJpbmcuY2hhckF0KGxlbiAtIDYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgJy0nOgotICAgICAgICAgICAgICAgICAgICB0enNpZ24gPSAtMTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICAgICAgICAgIHR6c2lnbiA9IDE7IGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHRpbWV6b25lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0emhvdXIgPSB0d29EaWdpdChzdHJpbmcsIGxlbiAtIDUpOwotICAgICAgICAgICAgdHptaW51dGUgPSB0d29EaWdpdChzdHJpbmcsIGxlbiAtIDIpOwotICAgICAgICAgICAgaWYgKHR6aG91ciA+IDE0KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBob3VyIG11c3QgYmUgdHdvIGRpZ2l0cyBiZXR3ZWVuIC0xNCBhbmQgKzE0Iik7Ci0gICAgICAgICAgICBpZiAodHptaW51dGUgPiA1OSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIHpvbmUgbWludXRlIG11c3QgYmUgdHdvIGRpZ2l0cyBiZXR3ZWVuIDAwIGFuZCA1OSIpOwotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUVaT05FOwotICAgICAgICAgICAgX3R6c2lnbiA9IHR6c2lnbjsKLSAgICAgICAgICAgIF90emggPSB0emhvdXI7Ci0gICAgICAgICAgICBfdHptID0gdHptaW51dGU7Ci0gICAgICAgICAgICBsZW4gLT0gNjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBpY2sgZGF0ZSBmaWVsZHMgb2ZmIHRoZSBiZWdpbm5pbmcgaWYgaXQgZG9lc24ndCBsb29rIGxpa2UgYSB0aW1lCi0gICAgICAgIGlmIChzdGFydCA8IGxlbiAmJiAoc3RhcnQgKyAyID49IGxlbiB8fCBzdHJpbmcuY2hhckF0KHN0YXJ0ICsgMikgIT0gJzonKSkKLSAgICAgICAgc2NhbmRhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHBhcnNlIHllYXIgc2lnbgotICAgICAgICAgICAgYm9vbGVhbiBuZWd5ZWFyID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBsZW4gJiYgc3RyaW5nLmNoYXJBdChzdGFydCkgPT0gJy0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5lZ3llYXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNjYW4geWVhciBkaWdpdHMKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IDA7Ci0gICAgICAgICAgICBpbnQgZGlnaXRzID0gLXN0YXJ0OwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2ggPSBzdGFydCA8IGxlbiA/IHN0cmluZy5jaGFyQXQoc3RhcnQpIDogJ1wwJzsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRGlnaXQoY2gpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyBkaWdpdFZhbChjaCk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpZ2l0cyArPSBzdGFydDsKLSAgICAgICAgICAgIGlmIChkaWdpdHMgPiA2KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInllYXIgdG9vIGxvbmcgKHVwIHRvIDYgZGlnaXRzKSIpOwotICAgICAgICAgICAgZWxzZSBpZiAoZGlnaXRzID49IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1lFQVI7Ci0gICAgICAgICAgICAgICAgX0NZID0gIG5lZ3llYXIgPyAtdmFsdWUgOiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGRpZ2l0cyA+IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieWVhciBtdXN0IGJlIGZvdXIgZGlnaXRzIChtYXkgcGFkIHdpdGggemVyb2VzLCBlLmcuLCAwNTYwKSIpOwotCi0gICAgICAgICAgICAvLyBoeXBoZW4gaW50cm9kdWNlcyBhIG1vbnRoCi0gICAgICAgICAgICBpZiAoY2ggIT0gJy0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChuZWd5ZWFyICYmICFoYXNZZWFyKCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gYSBzaW5nbGUgbWludXMKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW5kYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLQotICAgICAgICAgICAgLy8gdHdvLWRpZ2l0IG1vbnRoCi0gICAgICAgICAgICBpZiAobGVuIC0gc3RhcnQgPj0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDEyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2JpdHMgfD0gSEFTX01PTlRIOwotICAgICAgICAgICAgICAgICAgICBfTSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBzdGFydCArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaHlwaGVuIGludHJvZHVjZXMgYSBkYXkKLSAgICAgICAgICAgIGNoID0gc3RhcnQgPCBsZW4gPyBzdHJpbmcuY2hhckF0KHN0YXJ0KSA6ICdcMCc7Ci0gICAgICAgICAgICBpZiAoY2ggIT0gJy0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaGFzTW9udGgoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBtaW51cyBhZnRlciBhIHllYXIKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW5kYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLQotICAgICAgICAgICAgLy8gdHdvLWRpZ2l0IGRheQotICAgICAgICAgICAgaWYgKGxlbiAtIHN0YXJ0ID49IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAzMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9iaXRzIHw9IEhBU19EQVk7Ci0gICAgICAgICAgICAgICAgICAgIF9EID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWhhc0RheSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGVycm9yIGluIHRoZSBvcmlnaW5hbCBzY2hlbWEgc3BlYyBwZXJtaXRzIGFuIGV4dHJhICctJyBoZXJlCi0gICAgICAgICAgICAgICAgaWYgKGhhc01vbnRoKCkgJiYgIWhhc1llYXIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gc3RhcnQgPCBsZW4gPyBzdHJpbmcuY2hhckF0KHN0YXJ0KSA6ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IC8vIG1pbnVzIGFmdGVyIGEgbW9udGgKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRpbWUKLSAgICAgICAgaWYgKHN0YXJ0IDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaGFzWWVhcigpIHx8IGhhc01vbnRoKCkgfHwgaGFzRGF5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQoc3RhcnQpICE9ICdUJykKLSAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXRlIGFuZCB0aW1lIG11c3QgYmUgc2VwYXJhdGVkIGJ5ICdUJyIpOwotICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsZW4gPCBzdGFydCArIDggfHwgc3RyaW5nLmNoYXJBdChzdGFydCArIDIpICE9ICc6JyB8fCBzdHJpbmcuY2hhckF0KHN0YXJ0ICsgNSkgIT0gJzonKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgaW50IGggPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChoID49IDI0KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhvdXIgbXVzdCBiZSBiZXR3ZWVuIDAwIGFuZCAyMyIpOwotICAgICAgICAgICAgaW50IG0gPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0ICsgMyk7Ci0gICAgICAgICAgICBpZiAobSA+PSA2MCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW51dGUgbXVzdCBiZSBiZXR3ZWVuIDAwIGFuZCA1OSIpOwotICAgICAgICAgICAgaW50IHMgPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0ICsgNik7Ci0gICAgICAgICAgICBpZiAocyA+PSA2MCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWNvbmQgbXVzdCBiZSBiZXR3ZWVuIDAwIGFuZCA1OSIpOwotCi0gICAgICAgICAgICBzdGFydCArPSA4OwotCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZzID0gX3plcm87Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBsZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQoc3RhcnQpICE9ICcuJykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCArIDEgPCBsZW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgbGVuOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEaWdpdChzdHJpbmcuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzID0gbmV3IEJpZ0RlY2ltYWwoc3RyaW5nLnN1YlNlcXVlbmNlKHN0YXJ0LCBsZW4pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKLSAgICAgICAgICAgIF9oID0gaDsKLSAgICAgICAgICAgIF9tID0gbTsKLSAgICAgICAgICAgIF9zID0gczsKLSAgICAgICAgICAgIF9mcyA9IGZzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGRhdGUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCi0gICAgICogYW4gdW5zcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IGJ5IG5vdCBzcGVjaWZ5aW5nIHRoZSB0aW1lem9uZSB0aGUgR0RhdGUKLSAgICAgKiBiZWNvbWVzIHBhcnRpYWxseSB1bm9yZGVyZWQgd2l0aCByZXNwZWN0IHRvIHRpbWVzIHRoYXQKLSAgICAgKiBkbyBoYXZlIGEgc3BlY2lmaWVkIHRpbWV6b25lLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZSgKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgX2JpdHMgPSBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRTsKLQotICAgICAgICBfQ1kgPSB5ZWFyOwotICAgICAgICBfTSA9IG1vbnRoOwotICAgICAgICBfRCA9IGRheTsKLSAgICAgICAgX2ggPSBob3VyOwotICAgICAgICBfbSA9IG1pbnV0ZTsKLSAgICAgICAgX3MgPSBzZWNvbmQ7Ci0gICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBfemVybyA6IGZyYWN0aW9uOwotCi0gICAgICAgIGlmICghaXNWYWxpZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gYWJzb2x1dGUgR0RhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsCi0gICAgICogbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsCi0gICAgICogc2Vjb25kcywgYW5kIGluIHRoZSB0aW1lem9uZSBzcGVjaWZpZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBhIHRpbWUgb3IgZGF0ZSB0aGF0IGlzbid0IGluIGEgc3BlY2lmaWVkIHRpbWV6b25lLAotICAgICAqIHRoZW4gdXNlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHRpbWV6b25lIGFyZ3VtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUoCi0gICAgICAgICAgICBpbnQgeWVhciwKLSAgICAgICAgICAgIGludCBtb250aCwKLSAgICAgICAgICAgIGludCBkYXksCi0gICAgICAgICAgICBpbnQgaG91ciwKLSAgICAgICAgICAgIGludCBtaW51dGUsCi0gICAgICAgICAgICBpbnQgc2Vjb25kLAotICAgICAgICAgICAgQmlnRGVjaW1hbCBmcmFjdGlvbiwKLSAgICAgICAgICAgIGludCB0elNpZ24sCi0gICAgICAgICAgICBpbnQgdHpIb3VyLAotICAgICAgICAgICAgaW50IHR6TWludXRlKQotICAgIHsKLSAgICAgICAgX2JpdHMgPSBIQVNfVElNRVpPTkUgfCBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRTsKLQotICAgICAgICBfQ1kgPSB5ZWFyOwotICAgICAgICBfTSA9IG1vbnRoOwotICAgICAgICBfRCA9IGRheTsKLSAgICAgICAgX2ggPSBob3VyOwotICAgICAgICBfbSA9IG1pbnV0ZTsKLSAgICAgICAgX3MgPSBzZWNvbmQ7Ci0gICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBfemVybyA6IGZyYWN0aW9uOwotICAgICAgICBfdHpzaWduID0gdHpTaWduOwotICAgICAgICBfdHpoID0gdHpIb3VyOwotICAgICAgICBfdHptID0gdHpNaW51dGU7Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGEgamF2YS51dGlsLkRhdGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGN1cnJlbnQgb2Zmc2V0IG9mIHRoZSBkZWZhdWx0IHRpbWV6b25lIGlzIHVzZWQgYXMgdGhlIHRpbWV6b25lLgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCBpZiBlYXN0ZXJuIGRheWxpZ2h0IHRpbWUgaXMgaW4gZWZmZWN0IGF0IHRoZSBnaXZlbgotICAgICAqIGRhdGUsIHRoZSB0aW1lem9uZSBvbiB0aGUgZWFzdCBjb2FzdCBvZiB0aGUgdW5pdGVkIHN0YXRlcwotICAgICAqIHRyYW5zbGF0ZXMgdG8gR01ULTA1OjAwIChFU1QpICsgMTowMCAoRFQgb2Zmc2V0KSA9PSBHTVQtMDQ6MDAuCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlKERhdGUgZGF0ZSkKLSAgICB7Ci0gICAgICAgIC8vIHJlcXVpcmVzIHNvbWUgZGF0ZSBtYXRoLCBzbyBjdG9yIGxpdmVzIG9uIEdEYXRlQnVpbGRlcgotICAgICAgICB0aGlzKG5ldyBHRGF0ZUJ1aWxkZXIoZGF0ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSBiYXNlZCBvbiBhIGphdmEudXRpbC5DYWxlbmRhci4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2FsZW5kYXIgZG9lcyBub3QgaGF2ZSBzb21lIGZpZWxkcyBzZXQsIHRoZSBzYW1lIGFic2VuY2UKLSAgICAgKiBvZiBpbmZvcm1hdGlvbiBpcyByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlLiAgTm90ZSB0aGF0Ci0gICAgICogamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIGZpbGxzIGluIGFsbCBmaWVsZHMgYXMgc29vbiBhcyBhbnkKLSAgICAgKiBhcmUgZmV0Y2hlZCwgc28gY29uc3RydWN0aW5nIGEgR0RhdGUgd2l0aCB0aGUgc2FtZSBjYWxlbmRhciBvYmplY3QKLSAgICAgKiB0d2ljZSBtYXkgcmVzdWx0IGluIGEgZGlmZmVyZW50IEdEYXRlIGJlY2F1c2Ugb2YgYSBjaGFuZ2VkIGNhbGVuZGFyLgotICAgICAqIE5vdGUgdGhhdCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyIGlzIHN0YWJsZSBpZiB5b3UgcmUtZ2V0IGEgc2V0IGZpZWxkLAotICAgICAqIHNvIGl0IGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgcHJvYmxlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUoQ2FsZW5kYXIgY2FsZW5kYXIpCi0gICAgewotICAgICAgICAvLyB3ZSBtdXN0IHNjcmFwZSB0aGUgImlzU2V0IiBpbmZvcm1hdGlvbiBvdXQgYmVmb3JlIGFjY2Vzc2luZyBhbnl0aGluZwotICAgICAgICBib29sZWFuIGlzU2V0WWVhciA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLllFQVIpOwotICAgICAgICBib29sZWFuIGlzU2V0RXJhID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuRVJBKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldE1vbnRoID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuTU9OVEgpOwotICAgICAgICBib29sZWFuIGlzU2V0RGF5ID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldEhvdXJPZkRheSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldEhvdXIgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5IT1VSKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldEFtUG0gPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5BTV9QTSk7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXRNaW51dGUgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5NSU5VVEUpOwotICAgICAgICBib29sZWFuIGlzU2V0U2Vjb25kID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuU0VDT05EKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldE1pbGxpcyA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLk1JTExJU0VDT05EKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldFpvbmUgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5aT05FX09GRlNFVCk7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXREc3QgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKLQotICAgICAgICBpZiAoaXNTZXRZZWFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgeSA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5ZRUFSKTsKLSAgICAgICAgICAgIGlmIChpc1NldEVyYSAmJiBjYWxlbmRhciBpbnN0YW5jZW9mIEdyZWdvcmlhbkNhbGVuZGFyKQotICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRVJBKSA9PSBHcmVnb3JpYW5DYWxlbmRhci5CQykKLSAgICAgICAgICAgICAgICAgICAgeSA9IDEgLSB5OwotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1lFQVI7Ci0gICAgICAgICAgICBfQ1kgPSB5OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1NldE1vbnRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfTU9OVEg7Ci0gICAgICAgICAgICBfTSA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkgKyAxOyAvLyAhIW5vdGUKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNTZXREYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19EQVk7Ci0gICAgICAgICAgICBfRCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gZ290VGltZSA9IGZhbHNlOwotCi0gICAgICAgIGludCBoID0gMDsKLSAgICAgICAgaW50IG0gPSAwOwotICAgICAgICBpbnQgcyA9IDA7Ci0gICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBfemVybzsKLQotICAgICAgICBpZiAoaXNTZXRIb3VyT2ZEYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGggPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOwotICAgICAgICAgICAgZ290VGltZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaXNTZXRIb3VyICYmIGlzU2V0QW1QbSkKLSAgICAgICAgewotICAgICAgICAgICAgaCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSKSArIGNhbGVuZGFyLmdldChDYWxlbmRhci5BTV9QTSkgKiAxMjsKLSAgICAgICAgICAgIGdvdFRpbWUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU2V0TWludXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBtID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSk7Ci0gICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NldFNlY29uZCkKLSAgICAgICAgewotICAgICAgICAgICAgcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5TRUNPTkQpOwotICAgICAgICAgICAgZ290VGltZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTZXRNaWxsaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZzID0gQmlnRGVjaW1hbC52YWx1ZU9mKGNhbGVuZGFyLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCksIDMpOwotICAgICAgICAgICAgZ290VGltZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ290VGltZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUU7Ci0gICAgICAgICAgICBfaCA9IGg7Ci0gICAgICAgICAgICBfbSA9IG07Ci0gICAgICAgICAgICBfcyA9IHM7Ci0gICAgICAgICAgICBfZnMgPSBmczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NldFpvbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpOwotICAgICAgICAgICAgaWYgKGlzU2V0RHN0KQotICAgICAgICAgICAgICAgIHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyArPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCk7Ci0KLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKLSAgICAgICAgICAgIGlmICh6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdHpzaWduID0gMDsKLSAgICAgICAgICAgICAgICBfdHpoID0gMDsKLSAgICAgICAgICAgICAgICBfdHptID0gMDsKLSAgICAgICAgICAgICAgICBUaW1lWm9uZSB6b25lID0gY2FsZW5kYXIuZ2V0VGltZVpvbmUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSB6b25lLmdldElEKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoKCkgPiAzKSBzd2l0Y2ggKGlkLmNoYXJBdCgzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOiBfdHpzaWduID0gMTsgYnJlYWs7ICAgLy8gR01UKzAwOjAwCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOiBfdHpzaWduID0gLTE7IGJyZWFrOyAgLy8gR01ULTAwOjAwCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90enNpZ24gPSAoem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIDwgMCA/IC0xIDogKzEpOwotICAgICAgICAgICAgICAgIHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyAqIF90enNpZ247Ci0gICAgICAgICAgICAgICAgX3R6aCA9IHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyAvIDM2MDAwMDA7Ci0gICAgICAgICAgICAgICAgX3R6bSA9ICh6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgLSBfdHpoICogMzYwMDAwMCkgLyA2MDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSBiYXNlZCBvbiBhbm90aGVyIEdEYXRlU3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGdkYXRlKQotICAgIHsKLSAgICAgICAgaWYgKGdkYXRlLmhhc1RpbWVab25lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKLSAgICAgICAgICAgIF90enNpZ24gPSBnZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKTsKLSAgICAgICAgICAgIF90emggPSBnZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKTsKLSAgICAgICAgICAgIF90em0gPSBnZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdkYXRlLmhhc1RpbWUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUU7Ci0gICAgICAgICAgICBfaCA9IGdkYXRlLmdldEhvdXIoKTsKLSAgICAgICAgICAgIF9tID0gZ2RhdGUuZ2V0TWludXRlKCk7Ci0gICAgICAgICAgICBfcyA9IGdkYXRlLmdldFNlY29uZCgpOwotICAgICAgICAgICAgX2ZzID0gZ2RhdGUuZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZGF0ZS5oYXNEYXkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsKLSAgICAgICAgICAgIF9EID0gZ2RhdGUuZ2V0RGF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2RhdGUuaGFzTW9udGgoKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX01PTlRIOwotICAgICAgICAgICAgX00gPSBnZGF0ZS5nZXRNb250aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdkYXRlLmhhc1llYXIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1lFQVI7Ci0gICAgICAgICAgICBfQ1kgPSBnZGF0ZS5nZXRZZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGlnaXQoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKGNoYXIpKGNoIC0gJzAnKSA8PSAnOScgLSAnMCcpOyAvLyBjaGFyIGlzIHVuc2lnbmVkCi0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1NwYWNlKGNoYXIgY2gpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IGRpZ2l0VmFsKGNoYXIgY2gpCi0gICAgewotICAgICAgICByZXR1cm4gKGNoIC0gJzAnKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdHdvRGlnaXQoQ2hhclNlcXVlbmNlIHN0ciwgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgY2hhciBjaDEgPSBzdHIuY2hhckF0KGluZGV4KTsKLSAgICAgICAgY2hhciBjaDIgPSBzdHIuY2hhckF0KGluZGV4ICsgMSk7Ci0gICAgICAgIGlmICghaXNEaWdpdChjaDEpIHx8ICFpc0RpZ2l0KGNoMikpCi0gICAgICAgICAgICByZXR1cm4gMTAwOyAvLyBub3QgdHdvIGRpZ2l0cwotICAgICAgICByZXR1cm4gZGlnaXRWYWwoY2gxKSAqIDEwICsgZGlnaXRWYWwoY2gyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWU6IGFsbCBHRGF0ZSBpbnN0YW5jZXMgYXJlIGltbXV0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ltbXV0YWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29tYmluYXRpb24gb2YgZmxhZ3MgaW5kaWNhdGluZyB0aGUgaW5mb3JtYXRpb24KLSAgICAgKiBjb250YWluZWQgYnkgdGhpcyBHRGF0ZS4gIFRoZSBmaXZlIGZsYWdzIGFyZQotICAgICAqIEhBU19USU1FWk9ORSwgSEFTX1lFQVIsIEhBU19NT05USCwgSEFTX0RBWSwgYW5kIEhBU19USU1FLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iaXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lem9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lWm9uZSgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfVElNRVpPTkUpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgeWVhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNZZWFyKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19ZRUFSKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vbnRoLW9mLXllYXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9udGgoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX01PTlRIKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGRheS1vZi1tb250aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXkoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX0RBWSkgIT0gMCk7IH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lLW9mLWRheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19USU1FKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGZ1bGwgZGF0ZSAoeWVhciwgbW9udGgsIGRheSkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXRlKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIChIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVIpKSA9PSAoSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSKSk7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0WWVhcigpCi0gICAgICAgIHsgcmV0dXJuIF9DWTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1vbnRoLW9mLXllYXIuIEphbnVhcnkgaXMgMS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKLSAgICAgICAgeyByZXR1cm4gX007ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKLSAgICAgICAgeyByZXR1cm4gX0Q7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5LiBNaWRuaWdodCBpcyAwLCBhbmQgMTFQTSBpcyAyMy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQotICAgICAgICB7IHJldHVybiBfaDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9tOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlLiBSYW5nZSBmcm9tIDAgdG8gNTkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTZWNvbmQoKQotICAgICAgICB7IHJldHVybiBfczsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9mczsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIHNpZ24uIEZvciB0aW1lIHpvbmVzIGVhc3Qgb2YgR01ULAotICAgICAqIHRoaXMgaXMgcG9zaXRpdmU7IGZvciB0aW1lIHpvbmVzIHdlc3QsIHRoaXMgaXMgbmVnYXRpdmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRUaW1lWm9uZVNpZ24oKQotICAgICAgICB7IHJldHVybiBfdHpzaWduOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgaG91ci4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKLSAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFRpbWVab25lSG91cigpCi0gICAgICAgIHsgcmV0dXJuIF90emg7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBtaW51dGVzLgotICAgICAqCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVNaW51dGUoKQotICAgICAgICB7IHJldHVybiBfdHptOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3VuZGVkIG1pbGxpc2Vjb25kIHZhbHVlLiBSYW5nZSBmcm9tIDAgdG8gOTk5Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaWxsaXNlY29uZCgpCi0gICAgewotICAgICAgICBpZiAoX2ZzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIF9mcy5zZXRTY2FsZSgzLCBCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApLnVuc2NhbGVkVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBTcGVjaWZpYyBtb21lbnRzIG9yCi0gICAgICogdGltZXMtb2YtZGF5IGluIGEgc3BlY2lmaWVkIHRpbWV6b25lIGFyZSBub3JtYWxpemVkIHRvCi0gICAgICogVVRDIHRpbWUgdG8gcHJvZHVjZSBhIGNhbm9uaWNhbCBzdHJpbmcgZm9ybSBmb3IgdGhlbS4KLSAgICAgKiBPdGhlciByZWN1cnJpbmcgdGltZSBzcGVjaWZpY2F0aW9ucyBrZWVwIHRoZWlyIHRpbWV6b25lCi0gICAgICogaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjYW5vbmljYWxTdHJpbmcoKQotICAgIHsKLSAgICAgICAgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBfY2Fub25pY2FsU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBHRGF0ZSBjb3JyZXNwb25kcyB0byBhIHZhbGlkIGdyZWdvcmlhbiBkYXRlIHZhbHVlCi0gICAgICogaW4gWE1MIHNjaGVtYS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuaXNWYWxpZEdEYXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEp1bGlhbiBkYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBHcmVnb3JpYW4gZGF0ZS4KLSAgICAgKiBUaGUgSnVsaWFuIGRhdGUgKEpEKSBpcyBhIGNvbnRpbnVvdXMgY291bnQgb2YgZGF5cyBmcm9tCi0gICAgICogMSBKYW51YXJ5IDQ3MTMgQkMgKD0gLTQ3MTIgSmFudWFyeSAxKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEp1bGlhbkRhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5qdWxpYW5EYXRlRm9yR0RhdGUodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGFuIHtAbGluayBYbWxDYWxlbmRhcn0uCi0gICAgICogPHA+Ci0gICAgICoge0BsaW5rIFhtbENhbGVuZGFyfSBpcyBhIHN1YmNsYXNzIG9mIHtAbGluayBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXJ9Ci0gICAgICogd2hpY2ggaXMgc2xpZ2h0bHkgY3VzdG9taXplZCB0byBtYXRjaCBYTUwgc2NoZW1hIGRhdGUgcnVsZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJldHVybmVkIHtAbGluayBYbWxDYWxlbmRhcn0gaGFzIG9ubHkgdGhvc2UgdGltZSBhbmQgZGF0ZSBmaWVsZHMKLSAgICAgKiBzZXQgdGhhdCBhcmUgcmVmbGVjdGVkIGluIHRoZSBHRGF0ZSBvYmplY3QuICBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlCi0gICAgICoge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29udHJhY3Qgd29ya3MsIGFueSBpbmZvcm1hdGlvbiBpbiB0aGUgaXNTZXQoKSB2YW5pc2hlcwotICAgICAqIGFzIHNvb24gYXMgeW91IHZpZXcgYW55IHVuc2V0IGZpZWxkIHVzaW5nIGdldCgpIG1ldGhvZHMuCi0gICAgICogVGhpcyBtZWFucyB0aGF0IGlmIGl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoaWNoIGRhdGUgZmllbGRzCi0gICAgICogYXJlIHNldCwgeW91IG11c3QgY2FsbCBpc1NldCgpIGZpcnN0IGJlZm9yZSBnZXQoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIgZ2V0Q2FsZW5kYXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxDYWxlbmRhcih0aGlzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGltZSBhcyBhIGphdmEudXRpbC5EYXRlCi0gICAgICogaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gR0RhdGVCdWlsZGVyLmRhdGVGb3JHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0RhdGUuCi0gICAgICogPHVsPgotICAgICAqIDxsaT5SZXR1cm5zIC0xIGlmIHRoaXMgPCBkYXRlLiAobGVzcy10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDAgaWYgdGhpcyA9PSBkYXRlLiAoZXF1YWwpCi0gICAgICogPGxpPlJldHVybnMgMSBpZiB0aGlzID4gZGF0ZS4gKGdyZWF0ZXItdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAyIGlmIHRoaXMgPD4gZGF0ZS4gKGluY29tcGFyYWJsZSkKLSAgICAgKiA8L3VsPgotICAgICAqIFR3byBpbnN0YW5jZXMgYXJlIGluY29tcGFyYWJsZSBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IGFtb3VudHMKLSAgICAgKiBvZiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUb0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlc3BlYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuY29tcGFyZUdEYXRlKHRoaXMsIGRhdGVzcGVjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBidWlsdGluIHR5cGUgY29kZSBmb3IgdGhlIHNoYXBlIG9mIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlLCBvciAwIGlmIHRoZQotICAgICAqIGluc3RhbmNlIGRvZXNuJ3QgY29udGFpbiBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEKLSAgICAgKiBTY2hlbWEgdHlwZS4KLSAgICAgKiA8cD4gCi0gICAgICogVmFsdWUgd2lsbCBiZSBlcXVhbCB0bwotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19OT1RfQlVJTFRJTn0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUn0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUl9NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEh9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIX0RBWX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEVfVElNRX0sIG9yCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX1RJTUV9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuYnRjRm9yRmxhZ3MoX2JpdHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkdXJhdGlvbiB0byB0aGlzIEdEYXRlLCBhbmQgcmV0dXJucyBhIG5ldyBHRGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUgYWRkKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCi0gICAgewotICAgICAgICBHRGF0ZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkR0R1cmF0aW9uKGR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9HRGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkdXJhdGlvbiB0byB0aGlzIEdEYXRlLCBhbmQgcmV0dXJucyBhIG5ldyBHRGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUgc3VidHJhY3QoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIEdEYXRlQnVpbGRlciBidWlsZGVyID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKLSAgICAgICAgYnVpbGRlci5zdWJ0cmFjdEdEdXJhdGlvbihkdXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvR0RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHRGF0ZSBpcyBhbiBpbW11dGFibGUgY2xhc3MsIGFuZCBlcXVhbGl0eSBpcyBjb21wdXRlZCBiYXNlZAotICAgICAqIG9uIGl0cyBjYW5vbmljYWwgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqID09IHRoaXMpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgR0RhdGUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGVuc3VyZUNhbm9uaWNhbFN0cmluZygpOwotICAgICAgICByZXR1cm4gX2Nhbm9uaWNhbFN0cmluZy5lcXVhbHMoKChHRGF0ZSlvYmopLmNhbm9uaWNhbFN0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIEdEYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBfY2Fub25pY2FsU3RyaW5nLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFNwZWNpZmljIG1vbWVudHMgb3IKLSAgICAgKiB0aW1lcy1vZi1kYXkgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUgYXJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgKiBVVEMgdGltZSB0byBwcm9kdWNlIGEgY2Fub25pY2FsIHN0cmluZyBmb3JtIGZvciB0aGVtLgotICAgICAqIE90aGVyIHJlY3VycmluZyB0aW1lIHNwZWNpZmljYXRpb25zIGtlZXAgdGhlaXIgdGltZXpvbmUKLSAgICAgKiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfY2Fub25pY2FsU3RyaW5nICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgYm9vbGVhbiBuZWVkTm9ybWFsaXplID0KLSAgICAgICAgICAgIChoYXNUaW1lWm9uZSgpICYmIGdldFRpbWVab25lU2lnbigpICE9IDAgJiYgaGFzVGltZSgpICYmCi0gICAgICAgICAgICAoKGhhc0RheSgpID09IGhhc01vbnRoKCkgJiYgaGFzRGF5KCkgPT0gaGFzWWVhcigpKSkpOwotCi0gICAgICAgIGlmICghbmVlZE5vcm1hbGl6ZSAmJiBnZXRGcmFjdGlvbigpICE9IG51bGwgJiYgZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnSW50ZWdlciBiaSA9IGdldEZyYWN0aW9uKCkudW5zY2FsZWRWYWx1ZSgpOwotICAgICAgICAgICAgbmVlZE5vcm1hbGl6ZSA9IChiaS5tb2QoR0RhdGVCdWlsZGVyLlRFTikuc2lnbnVtKCkgPT0gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW5lZWROb3JtYWxpemUpCi0gICAgICAgICAgICBfY2Fub25pY2FsU3RyaW5nID0gdG9TdHJpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBHRGF0ZUJ1aWxkZXIgZ2RiID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKLSAgICAgICAgICAgIGdkYi5ub3JtYWxpemUoKTsKLSAgICAgICAgICAgIF9jYW5vbmljYWxTdHJpbmcgPSBnZGIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGltZXpvbmUuIEZvciB0eXBlcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgKiB0byBkZWZpbmVkIHNjaGVtYSB0eXBlcyAoc2NoZW1hQnVpbHRpblR5cGVDb2RlKCkgPiAwKSwKLSAgICAgKiB0aGlzIHByb3ZpZGVzIHRoZSBuYXR1cmFsIGxleGljYWwgcmVwcmVzZW50YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBib3RoIHRpbWUgYW5kIHRpbWV6b25lIGFyZSBzcGVjaWZpZWQsIHRoaXMgc3RyaW5nIGlzIG5vdAotICAgICAqIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdW5sZXNzIHRoZSB0aW1lem9uZSBpcyBVVEMgKFopCi0gICAgICogKHNpbmNlIHRoZSBzYW1lIG1vbWVudCBpbiB0aW1lIGNhbiBiZSBleHByZXNzZWQgaW4gZGlmZmVyZW50Ci0gICAgICogdGltZXpvbmVzKS4gVG8gZ2V0IGEgY2Fub25pY2FsIHN0cmluZywgdXNlIHRoZSBjYW5vbmljYWxTdHJpbmcoKQotICAgICAqIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RyaW5nID09IG51bGwpCi0gICAgICAgICAgICBfc3RyaW5nID0gZm9ybWF0R0RhdGUodGhpcyk7Ci0gICAgICAgIHJldHVybiBfc3RyaW5nOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBfdGVuc0RpZ2l0ID0KLSAgICB7Ci0gICAgICAgICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywKLSAgICAgICAgJzEnLCAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLAotICAgICAgICAnMicsICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsCi0gICAgICAgICczJywgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywKLSAgICAgICAgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLAotICAgICAgICAnNScsICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsCi0gICAgICAgICc2JywgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywKLSAgICAgICAgJzcnLCAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLAotICAgICAgICAnOCcsICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsCi0gICAgICAgICc5JywgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywKLSAgICB9OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBfb25lc0RpZ2l0ID0KLSAgICB7Ci0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9wYWRUd29BcHBlbmQoY2hhcltdIGIsIGludCBpLCBpbnQgbikKLSAgICB7Ci0gICAgICAgIGFzc2VydChuID49IDAgJiYgbiA8IDEwMCk7Ci0gICAgICAgIGJbaV0gPSBfdGVuc0RpZ2l0W25dOwotICAgICAgICBiW2kgKyAxXSA9IF9vbmVzRGlnaXRbbl07Ci0gICAgICAgIHJldHVybiBpICsgMjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX3BhZEZvdXJBcHBlbmQoY2hhcltdIGIsIGludCBpLCBpbnQgbikKLSAgICB7Ci0gICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgYltpKytdID0gJy0nOwotICAgICAgICAgICAgbiA9IC1uOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuID49IDEwMDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IEludGVnZXIudG9TdHJpbmcobik7Ci0gICAgICAgICAgICBzLmdldENoYXJzKDAsIHMubGVuZ3RoKCksIGIsIGkpOwotICAgICAgICAgICAgcmV0dXJuIGkgKyBzLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGludCBxID0gbiAvIDEwMDsKLSAgICAgICAgaW50IHIgPSBuIC0gcSAqIDEwMDsKLSAgICAgICAgYltpXSA9IF90ZW5zRGlnaXRbcV07Ci0gICAgICAgIGJbaSArIDFdID0gX29uZXNEaWdpdFtxXTsKLSAgICAgICAgYltpICsgMl0gPSBfdGVuc0RpZ2l0W3JdOwotICAgICAgICBiW2kgKyAzXSA9IF9vbmVzRGlnaXRbcl07Ci0gICAgICAgIHJldHVybiBpICsgNDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVpvbmUgR01UWk9ORSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lWm9uZVtdIE1JTlVTWk9ORSA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDE6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTAyOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDQ6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA1OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wNjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDc6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA4OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wOTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTA6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTExOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xMjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTM6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTE0OjAwIiksCi0gICAgICAgICAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVab25lW10gUExVU1pPTkUgPQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDA6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzAxOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDM6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA0OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDY6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA3OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswODowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDk6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzEwOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxMTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTI6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzEzOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxNDowMCIpLAotICAgICAgICAgICAgfTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFRpbWVab25lIHRpbWVab25lRm9yR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGUpCi0gICAgewotICAgICAgICAvLyB1c2UgYSBjYWNoZWQgdGltZXpvbmUgaWYgaW50ZWdyYWw7IG90aGVyd2lzZSBtYWtlIGEgbmV3IG9uZS4KLSAgICAgICAgaWYgKCFkYXRlLmhhc1RpbWVab25lKCkpCi0gICAgICAgICAgICByZXR1cm4gVGltZVpvbmUuZ2V0RGVmYXVsdCgpOwotICAgICAgICBpZiAoZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEdNVFpPTkU7Ci0gICAgICAgIGlmIChkYXRlLmdldFRpbWVab25lTWludXRlKCkgPT0gMCAmJiBkYXRlLmdldFRpbWVab25lSG91cigpIDw9IDE0ICYmIGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPj0gMCkKLSAgICAgICAgICAgIHJldHVybiBkYXRlLmdldFRpbWVab25lU2lnbigpIDwgMCA/IE1JTlVTWk9ORVtkYXRlLmdldFRpbWVab25lSG91cigpXSA6IFBMVVNaT05FW2RhdGUuZ2V0VGltZVpvbmVIb3VyKCldOwotICAgICAgICAKLSAgICAgICAgY2hhcltdIHpiID0gbmV3IGNoYXJbOV07Ci0gICAgICAgIHpiWzBdID0gJ0cnOwotICAgICAgICB6YlsxXSA9ICdNJzsKLSAgICAgICAgemJbMl0gPSAnVCc7Ci0gICAgICAgIHpiWzNdID0gKGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPCAwKSA/ICctJyA6ICcrJzsKLSAgICAgICAgR0RhdGUuX3BhZFR3b0FwcGVuZCh6YiwgNCwgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSk7Ci0gICAgICAgIHpiWzZdID0gJzonOwotICAgICAgICBHRGF0ZS5fcGFkVHdvQXBwZW5kKHpiLCA3LCBkYXRlLmdldFRpbWVab25lTWludXRlKCkpOwotICAgICAgICByZXR1cm4gVGltZVpvbmUuZ2V0VGltZVpvbmUobmV3IFN0cmluZyh6YikpOwotICAgIH0KLSAgICAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgZm9ybWF0R0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICAvLyBXZSd2ZSB1c2VkIGEgY2hhcltdIHJhdGhlciB0aGFuIGEgU3RyaW5nQnVmZmVyIGZvciBhIDR4IHNwZWVkdXAKLSAgICAgICAgLy8gLVlZKDEwKVlZLU1NLUREVEhIOk1NOlNTLkZGRkZGRitaSDpaTQotICAgICAgICAvLyAxICsgMTAgICArIDMrIDMrIDMrIDMrIDMrMSArIHMgKyAzKyAzID0gMzMgKyBzCi0gICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBzcGVjLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgIGNoYXJbXSBtZXNzYWdlID0gbmV3IGNoYXJbMzMgKyAoZnMgPT0gbnVsbCA/IDAgOiBmcy5zY2FsZSgpKV07Ci0gICAgICAgIGludCBpID0gMDsKLQotICAgICAgICBpZiAoc3BlYy5oYXNZZWFyKCkgfHwgc3BlYy5oYXNNb250aCgpIHx8IHNwZWMuaGFzRGF5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRteTogewotICAgICAgICAgICAgICAgIGlmIChzcGVjLmhhc1llYXIoKSkKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9wYWRGb3VyQXBwZW5kKG1lc3NhZ2UsIDAsIHNwZWMuZ2V0WWVhcigpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICctJzsKLQotICAgICAgICAgICAgICAgIGlmICghKHNwZWMuaGFzTW9udGgoKSB8fCBzcGVjLmhhc0RheSgpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG15OwotCi0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJy0nOwotICAgICAgICAgICAgICAgIGlmIChzcGVjLmhhc01vbnRoKCkpCi0gICAgICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0TW9udGgoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXNwZWMuaGFzRGF5KCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRteTsKLQotICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICctJzsKLSAgICAgICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldERheSgpKTsKLSAgICAgICAgICAgICAgICBicmVhayBkbXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3BlYy5oYXNUaW1lKCkpCi0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJ1QnOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNwZWMuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldEhvdXIoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnOic7Ci0gICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldE1pbnV0ZSgpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICc6JzsKLSAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0U2Vjb25kKCkpOwotICAgICAgICAgICAgaWYgKGZzICE9IF96ZXJvKSAvLyAob3B0aW1pemF0aW9uIH4zJSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnJhYyA9IHNwZWMuZ2V0RnJhY3Rpb24oKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGludCBwb2ludCA9IGZyYWMuaW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgIGlmIChwb2ludCA+PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJhYy5nZXRDaGFycyhwb2ludCwgZnJhYy5sZW5ndGgoKSwgbWVzc2FnZSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGkgKz0gZnJhYy5sZW5ndGgoKSAtIHBvaW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzcGVjLmhhc1RpbWVab25lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzcGVjLmdldFRpbWVab25lU2lnbigpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJ1onOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9IHNwZWMuZ2V0VGltZVpvbmVTaWduKCkgPiAwID8gJysnIDogJy0nOwotICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0VGltZVpvbmVIb3VyKCkpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICc6JzsKLSAgICAgICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldFRpbWVab25lTWludXRlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaXQgd291bGQgYmUgbmljZSB0byB1c2UgKDAsIGksIG1lc3NhZ2UpIGN0b3IgaW5zdGVhZAotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhtZXNzYWdlLCAwLCBpKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlQnVpbGRlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTY0YzgwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NTYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLS8qKgotICogVXNlZCB0byBidWlsZCB7QGxpbmsgR0RhdGUgR0RhdGVzfS4KLSAqIDxwPgotICogTGlrZSBHRGF0ZSwgYSBHRGF0ZUJ1aWxkZXIgcmVwcmVzZW50cyBhbiBHcmVnb3JpYW4gRGF0ZSwgVGltZSwKLSAqIGFuZCBUaW1lem9uZSwgb3Igc3Vic2V0IG9mIGluZm9ybWF0aW9uIChZZWFyLCBNb250aCwgRGF5LAotICogVGltZSwgVGltZXpvbmUsIG9yIHNvbWUgY29tYmluYXRpb24pLiBXaGVyZXZlciBpdCBwcm92aWRlcwotICogZ3VpZGFuY2UsIHRoZSBYTUwgU2NoZW1hIDEuMCBzcGVjaWZpY2F0aW9uIChwbHVzIHB1Ymxpc2hlZAotICogZXJyYXRhKSBpcyBmb2xsb3dlZC4KLSAqIDxwPgotICogSW5zdGFuY2VzIG1heSBzZXBhcmF0ZWx5IHNldCBvciBjbGVhciB0aGUgeWVhciwgbW9udGgsCi0gKiBkYXktb2YtbW9udGgsIGFuZCB0aW1lLW9mLWRheS4gTm90IGFsbCBvcGVyYXRpb25zIGFyZQotICogbWVhbmluZ2Z1bCBvbiBhbGwgY29tYmluYXRpb25zLiBJbiBwYXJ0aWN1bGFyLCB0aW1lem9uZQotICogbm9ybWFsaXphdGlvbiBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZXJlIGlzIGEgdGltZSwgb3IKLSAqIGEgdGltZSB0b2dldGhlciB3aXRoIGEgZnVsbCBkYXRlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR0RhdGVCdWlsZGVyIGltcGxlbWVudHMgR0RhdGVTcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgaW50IF9iaXRzOwotICAgIHByaXZhdGUgaW50IF9DWTsKLSAgICBwcml2YXRlIGludCBfTTsKLSAgICBwcml2YXRlIGludCBfRDsKLSAgICBwcml2YXRlIGludCBfaDsKLSAgICBwcml2YXRlIGludCBfbTsKLSAgICBwcml2YXRlIGludCBfczsKLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgX2ZzOwotICAgIHByaXZhdGUgaW50IF90enNpZ247Ci0gICAgcHJpdmF0ZSBpbnQgX3R6aDsKLSAgICBwcml2YXRlIGludCBfdHptOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlQnVpbGRlciBzcGVjaWZ5aW5nIG5vIGRhdGUgb3IgdGltZQotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYW5vdGhlciBHRGF0ZUJ1aWxkZXIgd2l0aCB0aGUgc2FtZSB2YWx1ZQotICAgICAqIGFzIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRGF0ZUJ1aWxkZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgR0RhdGUgZnJvbSB0aGlzIEdEYXRlQnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUgdG9HRGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdEYXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnV0cyBhIEdEYXRlQnVpbGRlciBieSBjb3B5aW5nIGFub3RoZXIgR0RhdGVTcGVjaWZpY2FpdG9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoR0RhdGVTcGVjaWZpY2F0aW9uIGdkYXRlKQotICAgIHsKLSAgICAgICAgaWYgKGdkYXRlLmhhc1RpbWVab25lKCkpCi0gICAgICAgICAgICBzZXRUaW1lWm9uZShnZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSwgZ2RhdGUuZ2V0VGltZVpvbmVIb3VyKCksIGdkYXRlLmdldFRpbWVab25lTWludXRlKCkpOwotCi0gICAgICAgIGlmIChnZGF0ZS5oYXNUaW1lKCkpCi0gICAgICAgICAgICBzZXRUaW1lKGdkYXRlLmdldEhvdXIoKSwgZ2RhdGUuZ2V0TWludXRlKCksIGdkYXRlLmdldFNlY29uZCgpLCBnZGF0ZS5nZXRGcmFjdGlvbigpKTsKLQotICAgICAgICBpZiAoZ2RhdGUuaGFzRGF5KCkpCi0gICAgICAgICAgICBzZXREYXkoZ2RhdGUuZ2V0RGF5KCkpOwotCi0gICAgICAgIGlmIChnZGF0ZS5oYXNNb250aCgpKQotICAgICAgICAgICAgc2V0TW9udGgoZ2RhdGUuZ2V0TW9udGgoKSk7Ci0KLSAgICAgICAgaWYgKGdkYXRlLmhhc1llYXIoKSkKLSAgICAgICAgICAgIHNldFllYXIoZ2RhdGUuZ2V0WWVhcigpKTsKLSAgICB9Ci0KLSAgICAvLyBGb3JtczoKLQotICAgIC8vIERhdGUgcGFydDoKLSAgICAvLyBZZWFyOiAgICAgICAoLT9cZHs0LH0pCi0gICAgLy8gWWVhck1vbnRoOiAgKC0/XGR7NCx9KS0oXGR7Mn0pCi0gICAgLy8gRGF0ZTogICAgICAgKC0/XGR7NCx9KS0oXGR7Mn0pLShcZHsyfSkKLSAgICAvLyBNb250aDogICAgICAtLShcZHsyfSkoLS0pPyAgICAgICAgICAgICAgLy9lcnJhdGEgUi00OAotICAgIC8vIE1vbnRoRGF5OiAgIC0tKFxkezJ9KS0oXGR7Mn0pCi0gICAgLy8gRGF5OiAgICAgICAgLS0tKFxkezJ9KQotCi0gICAgLy8gVGltZSBwYXJ0OgotICAgIC8vIFRpbWU6ICAgICAgIChcZHsyfSk6KFxkezJ9KTooXGR7Mn0pKC5cZCopPwotCi0gICAgLy8gVGltZXpvbmUgcGFydDoKLSAgICAvLyBUWjogICAgICAgICAoWil8KFsrLV1cZHsyfSk6KFxkezJ9KQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlQnVpbGRlciBmcm9tIGEgbGV4aWNhbAotICAgICAqIHJlcHJlc2VudGF0aW9uLiBUaGUgbGV4aWNhbCBzcGFjZSBjb250YWlucyB0aGUKLSAgICAgKiB1bmlvbiBvZiB0aGUgbGV4aWNhbCBzcGFjZXMgb2YgYWxsIHRoZSBzY2hlbWEKLSAgICAgKiBkYXRlL3RpbWUgdHlwZXMgKGV4Y2VwdCBmb3IgZHVyYXRpb24pLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoQ2hhclNlcXVlbmNlIHN0cmluZykKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IEdEYXRlKHN0cmluZykpOwotICAgIH0KLQotCi0gICAgcHVibGljIEdEYXRlQnVpbGRlcihDYWxlbmRhciBjYWxlbmRhcikKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IEdEYXRlKGNhbGVuZGFyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlQnVpbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgeWVhciwgbW9udGgsIGRheSwKLSAgICAgKiBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsIGZyYWN0aW9uYWwgc2Vjb25kcywgaW4KLSAgICAgKiBhbiB1bnNwZWNpZmllZCB0aW1lem9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgYnkgbm90IHNwZWNpZnlpbmcgdGhlIHRpbWV6b25lIHRoZSBHRGF0ZUJ1aWxkZXIKLSAgICAgKiBiZWNvbWVzIHBhcnRpYWxseSB1bm9yZGVyZWQgd2l0aCByZXNwZWN0IHRvIHRpbWVzdGhhdCBkbyBoYXZlIGEKLSAgICAgKiBzcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHllYXIgVGhlIHllYXIKLSAgICAgKiBAcGFyYW0gbW9udGggVGhlIG1vbnRoLCBmcm9tIDEtMTIKLSAgICAgKiBAcGFyYW0gZGF5IFRoZSBkYXkgb2YgbW9udGgsIGZyb20gMS0zMQotICAgICAqIEBwYXJhbSBob3VyIFRoZSBob3VyIG9mIGRheSwgZnJvbSAwLTIzCi0gICAgICogQHBhcmFtIG1pbnV0ZSBUaGUgbWludXRlIG9mIGhvdXIsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCBvZiBtaW51dGUsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZnJhY3Rpb24gb2Ygc2Vjb25kLCAwLjAgdG8gMC45OTkuLi4gKG1heSBiZSBudWxsKSAKLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICBfYml0cyA9IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOwotCi0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBhYnNvbHV0ZSBHRGF0ZUJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsCi0gICAgICogbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsCi0gICAgICogc2Vjb25kcywgYW5kIGluIHRoZSB0aW1lem9uZSBzcGVjaWZpZWQuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHlvdSBjYW4gcmVleHByZXNzIHRoZSBHRGF0ZUJ1aWxkZXIgaW4gYW55IHRpbWV6b25lIHVzaW5nCi0gICAgICogbm9ybWFsaXplVG9UaW1lWm9uZSgpLiBUaGUgbm9ybWFsaXplKCkgbWV0aG9kIG5vcm1hbGl6ZXMgdG8gVVRDLgotICAgICAqIDxwPgotICAgICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgYSB0aW1lIG9yIGRhdGUgdGhhdCBpc24ndCBpbiBhIHNwZWNpZmllZCB0aW1lem9uZSwKLSAgICAgKiB0aGVuIHVzZSB0aGUgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB0aW1lem9uZSBhcmd1bWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geWVhciB0aGUgeWVhcgotICAgICAqIEBwYXJhbSBtb250aCB0aGUgbW9udGgsIGZyb20gMS0xMgotICAgICAqIEBwYXJhbSBkYXkgdGhlIGRheSBvZiBtb250aCwgZnJvbSAxLTMxCi0gICAgICogQHBhcmFtIGhvdXIgdGhlIGhvdXIgb2YgZGF5LCBmcm9tIDAtMjMKLSAgICAgKiBAcGFyYW0gbWludXRlIHRoZSBtaW51dGUgb2YgaG91ciwgZnJvbSAwLTU5Ci0gICAgICogQHBhcmFtIHNlY29uZCB0aGUgc2Vjb25kIG9mIG1pbnV0ZSwgZnJvbSAwLTU5Ci0gICAgICogQHBhcmFtIGZyYWN0aW9uIHRoZSBmcmFjdGlvbiBvZiBzZWNvbmQsIDAuMCB0byAwLjk5OS4uLiAobWF5IGJlIG51bGwpCi0gICAgICogQHBhcmFtIHR6U2lnbiB0aGUgdGltZXpvbmUgb2Zmc2V0IHNpZ24sIGVpdGhlciArMSwgMCwgb3IgLTEKLSAgICAgKiBAcGFyYW0gdHpIb3VyIHRoZSB0aW1lem9uZSBvZmZzZXQgaG91cgotICAgICAqIEBwYXJhbSB0ek1pbnV0ZSB0aGUgdGltZXpvbmUgb2Zmc2V0IG1pbnV0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24sCi0gICAgICAgICAgICBpbnQgdHpTaWduLAotICAgICAgICAgICAgaW50IHR6SG91ciwKLSAgICAgICAgICAgIGludCB0ek1pbnV0ZSkKLSAgICB7Ci0gICAgICAgIF9iaXRzID0gSEFTX1RJTUVaT05FIHwgSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUU7Ci0KLSAgICAgICAgX0NZID0geWVhcjsKLSAgICAgICAgX00gPSBtb250aDsKLSAgICAgICAgX0QgPSBkYXk7Ci0gICAgICAgIF9oID0gaG91cjsKLSAgICAgICAgX20gPSBtaW51dGU7Ci0gICAgICAgIF9zID0gc2Vjb25kOwotICAgICAgICBfZnMgPSBmcmFjdGlvbiA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcmFjdGlvbjsKLSAgICAgICAgX3R6c2lnbiA9IHR6U2lnbjsKLSAgICAgICAgX3R6aCA9IHR6SG91cjsKLSAgICAgICAgX3R6bSA9IHR6TWludXRlOwotCi0gICAgICAgIGlmICghaXNWYWxpZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZUJ1aWxkZXIgYmFzZWQgb24gYSBqYXZhLnV0aWwuRGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY3VycmVudCBvZmZzZXQgb2YgdGhlIGRlZmF1bHQgdGltZXpvbmUgaXMgdXNlZCBhcyB0aGUgdGltZXpvbmUuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIGlmIGVhc3Rlcm4gZGF5bGlnaHQgdGltZSBpcyBpbiBlZmZlY3QgYXQgdGhlIGdpdmVuCi0gICAgICogZGF0ZSwgdGhlIHRpbWV6b25lIG9uIHRoZSBlYXN0IGNvYXN0IG9mIHRoZSB1bml0ZWQgc3RhdGVzCi0gICAgICogdHJhbnNsYXRlcyB0byBHTVQtMDU6MDAgKEVTVCkgKyAxOjAwIChEVCBvZmZzZXQpID09IEdNVC0wNDowMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZSBvYmplY3QgdG8gY29weQotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgc2V0RGF0ZShkYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBpbnN0YW5jZSBpcyBpbW11dGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb21iaW5hdGlvbiBvZiBmbGFncyBpbmRpY2F0aW5nIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIGNvbnRhaW5lZCBieSB0aGlzIEdEYXRlLiAgVGhlIGZpdmUgZmxhZ3MgYXJlCi0gICAgICogSEFTX1RJTUVaT05FLCBIQVNfWUVBUiwgSEFTX01PTlRILCBIQVNfREFZLCBhbmQgSEFTX1RJTUUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRGbGFncygpCi0gICAgewotICAgICAgICByZXR1cm4gX2JpdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWV6b25lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1RpbWVab25lKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19USU1FWk9ORSkgIT0gMCk7IH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB5ZWFyLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1llYXIoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX1lFQVIpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgbW9udGgtb2YteWVhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb250aCgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfTU9OVEgpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgZGF5LW9mLW1vbnRoLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0RheSgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfREFZKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWUtb2YtZGF5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1RpbWUoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX1RJTUUpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgZnVsbCBkYXRlICh5ZWFyLCBtb250aCwgZGF5KQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0RhdGUoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgKEhBU19EQVkgfCBIQVNfTU9OVEggfCBIQVNfWUVBUikpID09IChIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVIpKTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgeWVhci4gU2hvdWxkIGJlIGEgZm91ci1kaWdpdCB5ZWFyIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRZZWFyKCkKLSAgICAgICAgeyByZXR1cm4gX0NZOyAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbW9udGgtb2YteWVhci4gSmFudWFyeSBpcyAxLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TW9udGgoKQotICAgICAgICB7IHJldHVybiBfTTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRheS1vZi1tb250aC4gVGhlIGZpcnN0IGRheSBvZiBlYWNoIG1vbnRoIGlzIDEuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXREYXkoKQotICAgICAgICB7IHJldHVybiBfRDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG91ci1vZi1kYXkuIE1pZG5pZ2h0IGlzIDAsIGFuZCAxMVBNIGlzIDIzLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SG91cigpCi0gICAgICAgIHsgcmV0dXJuIF9oOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW51dGUtb2YtaG91ci4gUmFuZ2UgZnJvbSAwIHRvIDU5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWludXRlKCkKLSAgICAgICAgeyByZXR1cm4gX207IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlY29uZC1vZi1taW51dGUuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFNlY29uZCgpCi0gICAgICAgIHsgcmV0dXJuIF9zOyB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZC4gUmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIEJpZ0RlY2ltYWwgZ2V0RnJhY3Rpb24oKQotICAgICAgICB7IHJldHVybiBfZnM7IH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91bmRlZCBtaWxsaXNlY29uZCB2YWx1ZS4gUmFuZ2UgZnJvbSAwIHRvIDk5OQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWlsbGlzZWNvbmQoKQotICAgIHsKLSAgICAgICAgaWYgKF9mcyA9PSBudWxsIHx8IF9mcyA9PSBHRGF0ZS5femVybykKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gX2ZzLnNldFNjYWxlKDMsIEJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9VUCkudW5zY2FsZWRWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIHNpZ24uIEZvciB0aW1lIHpvbmVzIGVhc3Qgb2YgR01ULAotICAgICAqIHRoaXMgaXMgcG9zaXRpdmU7IGZvciB0aW1lIHpvbmVzIHdlc3QsIHRoaXMgaXMgbmVnYXRpdmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRUaW1lWm9uZVNpZ24oKQotICAgICAgICB7IHJldHVybiBfdHpzaWduOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgaG91ci4KLSAgICAgKiBUaGlzIGlzIGFsd2F5cyBwb3NpdGl2ZTogZm9yIHRoZSBzaWduLCBsb29rIGF0Ci0gICAgICogZ2V0VGltZVpvbmVTaWduKCkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRUaW1lWm9uZUhvdXIoKQotICAgICAgICB7IHJldHVybiBfdHpoOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgbWludXRlcy4KLSAgICAgKiBUaGlzIGlzIGFsd2F5cyBwb3NpdGl2ZTogZm9yIHRoZSBzaWduLCBsb29rIGF0Ci0gICAgICogZ2V0VGltZVpvbmVTaWduKCkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRUaW1lWm9uZU1pbnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF90em07IH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgotICAgICAqIEBwYXJhbSB5ZWFyIHRoZSB5ZWFyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WWVhcihpbnQgeWVhcikKLSAgICB7Ci0gICAgICAgIGlmICh5ZWFyIDwgLTQ3MTIgfHwgeWVhciA+IDk5OTk5OSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInllYXIgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIF9iaXRzIHw9IEhBU19ZRUFSOyBfQ1kgPSB5ZWFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1vbnRoLW9mLXllYXIuIEphbnVhcnkgaXMgMS4KLSAgICAgKiBAcGFyYW0gbW9udGggdGhlIG1vbnRoLCBmcm9tIDEtMTIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb250aChpbnQgbW9udGgpCi0gICAgewotICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtb250aCBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgX2JpdHMgfD0gSEFTX01PTlRIOyBfTSA9IG1vbnRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRheS1vZi1tb250aC4gVGhlIGZpcnN0IGRheSBvZiBlYWNoIG1vbnRoIGlzIDEuCi0gICAgICogQHBhcmFtIGRheSB0aGUgZGF5IG9mIG1vbnRoLCBmcm9tIDEtMzEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXkoaW50IGRheSkKLSAgICB7Ci0gICAgICAgIGlmIChkYXkgPCAxIHx8IGRheSA+IDMxKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF5IG91dCBvZiByYW5nZSIpOwotICAgICAgICBfYml0cyB8PSBIQVNfREFZOyBfRCA9IGRheTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lLiBIb3VycyBpbiB0aGUgZGF5IHJhbmdlIGZyb20gMCB0byAyMzsKLSAgICAgKiBtaW51dGVzIGFuZCBzZWNvbmRzIHJhbmdlIGZyb20gMCB0byA1OTsgYW5kIGZyYWN0aW9uYWwKLSAgICAgKiBzZWNvbmRzIHJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgotICAgICAqIFRoZSBmcmFjdGlvbiBjYW4gYmUgbnVsbCBhbmQgaXMgYXNzdW1lZCB0byBiZSB6ZXJvLgotICAgICAqIEBwYXJhbSBob3VyIHRoZSBob3VyIG9mIGRheSwgZnJvbSAwLTIzCi0gICAgICogQHBhcmFtIG1pbnV0ZSB0aGUgbWludXRlIG9mIGhvdXIsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBvZiBtaW51dGUsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBmcmFjdGlvbiB0aGUgZnJhY3Rpb24gb2Ygc2Vjb25kLCAwLjAgdG8gMC45OTkuLi4gKG1heSBiZSBudWxsKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICBpZiAoaG91ciA8IDAgfHwgaG91ciA+IDIzKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaG91ciBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgaWYgKG1pbnV0ZSA8IDAgfHwgbWludXRlID4gNTkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW51dGUgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIGlmIChzZWNvbmQgPCAwIHx8IHNlY29uZCA+IDU5KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2Vjb25kIG91dCBvZiByYW5nZSIpOwotICAgICAgICBpZiAoZnJhY3Rpb24gIT0gbnVsbCAmJiAoZnJhY3Rpb24uc2lnbnVtKCkgPCAwIHx8IGZyYWN0aW9uLmNvbXBhcmVUbyhHRGF0ZS5fb25lKSA+IDEpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnJhY3Rpb24gb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIF9iaXRzIHw9IEhBU19USU1FOwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZSB6b25lIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG90aGVyIHRpbWUKLSAgICAgKiBmaWVsZHMuIElmIHlvdSB3aXRoIHRvIGFkanVzdCBvdGhlciB0aW1lIGZpZWxkcyB0byBleHByZXNzCi0gICAgICogdGhlIHNhbWUgYWN0dWFsIG1vbWVudCBpbiB0aW1lIGluIGEgZGlmZmVyZW50IHRpbWUgem9uZSwKLSAgICAgKiB1c2Ugbm9ybWFsaXplVG9UaW1lWm9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaW1lem9uZXMgbXVzdCBiZSBiZXR3ZWVuIC0xNDowMCBhbmQgKzE0OjAwLiBTaWduCi0gICAgICogbXVzdCBiZSAtMSBvciAxIChvciAwIGZvciBVVEMgb25seSksIGFuZCB0aGUgb2Zmc2V0IGhvdXJzCi0gICAgICogYW5kIG1pbnV0ZSBhcmd1bWVudHMgbXVzdCBiZSBub25uZWdhdGl2ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHpTaWduIHRoZSB0aW1lem9uZSBvZmZzZXQgc2lnbiwgZWl0aGVyICsxLCAwLCBvciAtMQotICAgICAqIEBwYXJhbSB0ekhvdXIgdGhlIHRpbWV6b25lIG9mZnNldCBob3VyCi0gICAgICogQHBhcmFtIHR6TWludXRlIHRoZSB0aW1lem9uZSBvZmZzZXQgbWludXRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKGludCB0elNpZ24sIGludCB0ekhvdXIsIGludCB0ek1pbnV0ZSkKLSAgICB7Ci0gICAgICAgIGlmICghKCh0elNpZ24gPT0gMCAmJiB0ekhvdXIgPT0gMCAmJiB0ek1pbnV0ZSA9PSAwKSB8fAotICAgICAgICAgICAgICAoKHR6U2lnbiA9PSAtMSB8fCB0elNpZ24gPT0gMSkgJiYKLSAgICAgICAgICAgICAgICh0ekhvdXIgPj0gMCAmJiB0ek1pbnV0ZSA+PSAwKSAmJgotICAgICAgICAgICAgICAgKHR6SG91ciA9PSAxNCAmJiB0ek1pbnV0ZSA9PSAwIHx8IHR6SG91ciA8IDE0ICYmIHR6TWludXRlIDwgNjApKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIHpvbmUgb3V0IG9mIHJhbmdlICgtMTQ6MDAgdG8gKzE0OjAwKS4gKCIgKwotICAgICAgICAgICAgICAgICh0elNpZ248MCA/ICItIiA6ICIrIikgKyB0ekhvdXIgKyAiOiIgKyB0ek1pbnV0ZSArICIpIik7Ci0KLSAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUVaT05FOwotICAgICAgICBfdHpzaWduID0gdHpTaWduOwotICAgICAgICBfdHpoID0gdHpIb3VyOwotICAgICAgICBfdHptID0gdHpNaW51dGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpbWUgem9uZSBiYXNlZCBvbiBhIG51bWJlciBvZiBvZmZzZXQgbWludXRlcyByYXRoZXIKLSAgICAgKiB0aGFuIHNpZ24vaG91ci9taW51dGU7IGZvciBleGFtcGxlLCBzZXRUaW1lWm9uZSgtNjApIGlzIHRoZQotICAgICAqIHNhbWUgYXMgc2V0VGltZVpvbmUoLTEsIDEsIDApLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKGludCB0elRvdGFsTWludXRlcykKLSAgICB7Ci0gICAgICAgIGlmICh0elRvdGFsTWludXRlcyA8IC0xNCAqIDYwIHx8IHR6VG90YWxNaW51dGVzID4gMTQgKiA2MCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBvdXQgb2YgcmFuZ2UgKC04NDAgdG8gODQwIG1pbnV0ZXMpLiAoIiArIHR6VG90YWxNaW51dGVzICsgIikiKTsKLSAgICAgICAgCi0gICAgICAgIGludCB0elNpZ24gPSB0elRvdGFsTWludXRlcyA8IDAgPyAtMSA6IHR6VG90YWxNaW51dGVzID4gMCA/IDEgOiAwOwotICAgICAgICB0elRvdGFsTWludXRlcyAqPSB0elNpZ247Ci0gICAgICAgIGludCB0ekggPSB0elRvdGFsTWludXRlcyAvIDYwOwotICAgICAgICBpbnQgdHpNID0gdHpUb3RhbE1pbnV0ZXMgLSB0ekggKiA2MDsKLSAgICAgICAgCi0gICAgICAgIHNldFRpbWVab25lKHR6U2lnbiwgdHpILCB0ek0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgeWVhci4gQWZ0ZXIgY2xlYXJpbmcsIGhhc1llYXIgcmV0dXJucyBmYWxzZSBhbmQgdGhlCi0gICAgICogdmFsdWUgb2YgZ2V0WWVhciBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJZZWFyKCkKLSAgICAgICAgeyBfYml0cyAmPSB+SEFTX1lFQVI7IF9DWSA9IDA7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIG1vbnRoLW9mLXllYXIuIEFmdGVyIGNsZWFyaW5nLiBoYXNNb250aCByZXR1cm5zIGZhbHNlIGFuZAotICAgICAqIHRoZSB2YWx1ZSBvZiBnZXRNb250aCBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJNb250aCgpCi0gICAgICAgIHsgX2JpdHMgJj0gfkhBU19NT05USDsgX00gPSAwOyAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBkYXktb2YtbW9udGguIEFmdGVyIGNsZWFyaW5nLiBoYXNEYXkgcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiB0aGUgdmFsdWUgb2YgZ2V0RGF5IGlzIHVuZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckRheSgpCi0gICAgICAgIHsgX2JpdHMgJj0gfkhBU19EQVk7IF9EID0gMDsgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgdGltZS1vZi1kYXkuCi0gICAgICogQWZ0ZXIgY2xlYXJpbmcuIGhhc1RpbWUgcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiB0aGUgdmFsdWUgb2YgZ2V0VGltZSBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJUaW1lKCkKLSAgICB7Ci0gICAgICAgIF9iaXRzICY9IH5IQVNfVElNRTsKLSAgICAgICAgX2ggPSAwOwotICAgICAgICBfbSA9IDA7Ci0gICAgICAgIF9zID0gMDsKLSAgICAgICAgX2ZzID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIHRpbWV6b25lLiBBZnRlciBjbGVhcmluZy4gaGFzVGltZVpvbmUgcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiB0aGUgdmFsdWUgb2YgZ2V0VGltZVpvbmVIb3VyIGFuZCBnZXRUaW1lWm9uZU1pbnV0ZSBhcmUgdW5kZWZpbmVkLgotICAgICAqIERvZXMgbm90IGNoYW5nZSB0aGUgb3RoZXIgdGltZSBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJUaW1lWm9uZSgpCi0gICAgewotICAgICAgICBfYml0cyAmPSB+SEFTX1RJTUVaT05FOwotICAgICAgICBfdHpzaWduID0gMDsKLSAgICAgICAgX3R6aCA9IDA7Ci0gICAgICAgIF90em0gPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgYWxsIGRhdGUgZmllbGRzIGxpZSB3aXRoaW4gdGhlaXIgbGVnYWwgcmFuZ2VzLiAgQSBHRGF0ZUJ1aWxkZXIKLSAgICAgKiBjYW4gYmUgaW52YWxpZCwgZm9yIGV4YW1wbGUsIGlmIHlvdSBjaGFuZ2UgdGhlIG1vbnRoIHRvIEZlYnJ1YXJ5Ci0gICAgICogYW5kIHRoZSBkYXktb2YtbW9udGggaXMgMzEuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0gICAgewotICAgICAgICByZXR1cm4gaXNWYWxpZEdEYXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZEdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgaWYgKGRhdGUuaGFzTW9udGgoKSAmJiAoZGF0ZS5nZXRNb250aCgpIDwgMSB8fCBkYXRlLmdldE1vbnRoKCkgPiAxMikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGRhdGUuaGFzRGF5KCkgJiYgKGRhdGUuZ2V0RGF5KCkgPCAxIHx8IGRhdGUuZ2V0RGF5KCkgPiAzMSB8fAotICAgICAgICAgICAgZGF0ZS5nZXREYXkoKSA+IDI4ICYmIGRhdGUuaGFzTW9udGgoKSAmJgotICAgICAgICAgICAgICAgIChkYXRlLmhhc1llYXIoKSA/IGRhdGUuZ2V0RGF5KCkgPiBfbWF4RGF5SW5Nb250aEZvcihkYXRlLmdldFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZS5nZXREYXkoKSA+IF9tYXhEYXlJbk1vbnRoKGRhdGUuZ2V0TW9udGgoKSkpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lKCkgJiYgKGRhdGUuZ2V0SG91cigpIDwgMCB8fCBkYXRlLmdldEhvdXIoKSA+IDIzIHx8Ci0gICAgICAgICAgICBkYXRlLmdldE1pbnV0ZSgpIDwgMCB8fCBkYXRlLmdldE1pbnV0ZSgpID4gNTkgfHwKLSAgICAgICAgICAgIGRhdGUuZ2V0U2Vjb25kKCkgPCAwIHx8IGRhdGUuZ2V0U2Vjb25kKCkgPiA1OSB8fAotICAgICAgICAgICAgZGF0ZS5nZXRGcmFjdGlvbigpLnNpZ251bSgpIDwgMCB8fCBkYXRlLmdldEZyYWN0aW9uKCkuY29tcGFyZVRvKEdEYXRlLl9vbmUpID49IDApKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChkYXRlLmhhc1RpbWVab25lKCkgJiYKLSAgICAgICAgICAgICghKChkYXRlLmdldFRpbWVab25lU2lnbigpID09IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA9PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA9PSAwKSB8fAotICAgICAgICAgICAgICAoKGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPT0gLTEgfHwgZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA9PSArMSkgJiYKLSAgICAgICAgICAgICAgICAvLyBOQjogYWxsb3cgKzAwOjAwIGFuZCAtMDA6MDAKLSAgICAgICAgICAgICAgICAvLyAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA9PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA+IDAgfHwgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA+IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID49IDApICYmCi0gICAgICAgICAgICAgICAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA+PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA+PSAwKSAmJgotICAgICAgICAgICAgICAgKGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPT0gMTQgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID09IDAgfHwgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA8IDE0ICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA8IDYwKSkpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBldmVyeXRpbmcgbG9va3Mga29zaGVyCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsaXplcyB0aGUgaW5zdGFuY2UsIGVuc3VyaW5nIGRhdGUgYW5kIHRpbWUgZmllbGRzIGFyZSB3aXRoaW4KLSAgICAgKiB0aGVpciBub3JtYWwgcmFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIElmIG5vIHRpbWV6b25lIG9yIG5vIHRpbWUgaXMgc3BlY2lmaWVkLCBvciBpZiBhIHBhcnRpYWwgZGF0ZSBpcyBzcGVjaWZpZWQsIHRoaXMKLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nLCBhbmQgbGVhdmVzIHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbiBhcy1pcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhIHRpbWUgb3IgdGltZSBhbmQgZGF0ZSBpcyBzcGVjaWZpZWQsIHRoaXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIHRpbWV6b25lCi0gICAgICogdG8gVVRDLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpCi0gICAgewotICAgICAgICAvLyBEYXRlVGltZSBvciBUaW1lLCB3aXRoIFRpbWVab25lOiBub3JtYWxpemUgdG8gVVRDLgotICAgICAgICAvLyBJbiB0aGUgcHJvY2VzcyBhbGwgdGhlIGZpZWxkcyB3aWxsIGJlIG5vcm1hbGl6ZWQuCi0gICAgICAgIGlmIChoYXNEYXkoKSA9PSBoYXNNb250aCgpICYmIGhhc0RheSgpID09IGhhc1llYXIoKSAmJgotICAgICAgICAgICAgaGFzVGltZVpvbmUoKSAmJiBoYXNUaW1lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vcm1hbGl6ZVRvVGltZVpvbmUoMCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyB0aW1lem9uZSwgb3IgaW5jb21wbGV0ZSBkYXRlLgotICAgICAgICAgICAgbG9uZyBjYXJyeSA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChoYXNUaW1lKCkpCi0gICAgICAgICAgICAgICAgY2FycnkgPSBfbm9ybWFsaXplVGltZSgpOwotCi0gICAgICAgICAgICBpZiAoaGFzRGF5KCkpCi0gICAgICAgICAgICAgICAgX0QgKz0gY2Fycnk7Ci0KLSAgICAgICAgICAgIGlmIChoYXNEYXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX25vcm1hbGl6ZURhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGhhc01vbnRoKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gd2l0aCBpbmNvbXBsZXRlIGRhdGVzLCBqdXN0IG1vbnRocyBjYW4gYmUgbm9ybWFsaXplZDoKLSAgICAgICAgICAgICAgICAvLyBkYXlzIHN0YXkgZGVub3JtYWxpemVkLgotICAgICAgICAgICAgICAgIGlmIChfTSA8IDEgfHwgX00gPiAxMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0ZW1wID0gX007Ci0gICAgICAgICAgICAgICAgICAgIF9NID0gX21vZHVsbyh0ZW1wLCAxLCAxMyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNZZWFyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfQ1kgPSBfQ1kgKyAoaW50KV9mUXVvdGllbnQodGVtcCwgMSwgMTMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGZyYWN0aW9uYWwgc2Vjb25kcwotICAgICAgICBpZiAoaGFzVGltZSgpICYmIF9mcyAhPSBudWxsICYmIF9mcy5zY2FsZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9mcy5zaWdudW0oKSA9PSAwKQotICAgICAgICAgICAgICAgIF9mcyA9IEdEYXRlLl96ZXJvOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgYmkgPSBfZnMudW5zY2FsZWRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBiaS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGludCBsYXN0emVybzsKLSAgICAgICAgICAgICAgICBmb3IgKGxhc3R6ZXJvID0gc3RyLmxlbmd0aCgpOyBsYXN0emVybyA+IDA7IGxhc3R6ZXJvIC09IDEpCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGxhc3R6ZXJvIC0gMSkgIT0gJzAnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3R6ZXJvIDwgc3RyLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICBfZnMgPSBfZnMuc2V0U2NhbGUoX2ZzLnNjYWxlKCkgLSBzdHIubGVuZ3RoKCkgKyBsYXN0emVybyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgdGltZSBhbmQgdGltZXpvbmUgYXJlIGtub3duLCB0aGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSB0aW1lem9uZSB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgVVRDIG9mZnNldCwgYWx0ZXJpbmcgbWludXRlcywgaG91cnMsIGRheSwgbW9udGgsIGFuZCB5ZWFyIGFzCi0gICAgICogbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBhY3R1YWwgZGVzY3JpYmVkIG1vbWVudCBpbiB0aW1lIGlzIHRoZSBzYW1lLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIGFuIGVycm9yIHRvIG9wZXJhdGUgb24gaW5zdGFuY2VzIHdpdGhvdXQgYSB0aW1lIG9yIHRpbWV6b25lLCBvcgotICAgICAqIHdpdGggYSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGRhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR6U2lnbiB0aGUgdGltZXpvbmUgb2Zmc2V0IHNpZ24sIGVpdGhlciArMSwgMCwgb3IgLTEKLSAgICAgKiBAcGFyYW0gdHpIb3VyIHRoZSB0aW1lem9uZSBvZmZzZXQgaG91cgotICAgICAqIEBwYXJhbSB0ek1pbnV0ZSB0aGUgdGltZXpvbmUgb2Zmc2V0IG1pbnV0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemVUb1RpbWVab25lKGludCB0elNpZ24sIGludCB0ekhvdXIsIGludCB0ek1pbnV0ZSkKLSAgICB7Ci0gICAgICAgIGlmICghKCh0elNpZ24gPT0gMCAmJiB0ekhvdXIgPT0gMCAmJiB0ek1pbnV0ZSA9PSAwKSB8fAotICAgICAgICAgICAgICAoKHR6U2lnbiA9PSAtMSB8fCB0elNpZ24gPT0gMSkgJiYKLSAgICAgICAgICAgICAgICh0ekhvdXIgPj0gMCAmJiB0ek1pbnV0ZSA+PSAwKSAmJgotICAgICAgICAgICAgICAgKHR6SG91ciA9PSAxNCAmJiB0ek1pbnV0ZSA9PSAwIHx8IHR6SG91ciA8IDE0ICYmIHR6TWludXRlIDwgNjApKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIHpvbmUgbXVzdCBiZSBiZXR3ZWVuIC0xNDowMCBhbmQgKzE0OjAwIik7Ci0KLSAgICAgICAgaWYgKCFoYXNUaW1lWm9uZSgpIHx8ICFoYXNUaW1lKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3Qgbm9ybWFsaXplIHRpbWUgem9uZSB3aXRob3V0IGJvdGggdGltZSBhbmQgdGltZXpvbmUiKTsKLQotICAgICAgICBpZiAoIShoYXNEYXkoKSA9PSBoYXNNb250aCgpICYmIGhhc0RheSgpID09IGhhc1llYXIoKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgZG8gZGF0ZSBtYXRoIHdpdGhvdXQgYSBjb21wbGV0ZSBkYXRlIik7Ci0KLSAgICAgICAgaW50IGhzaGlmdCA9IHR6U2lnbiAqIHR6SG91ciAtIF90enNpZ24gKiBfdHpoOwotICAgICAgICBpbnQgbXNoaWZ0ID0gdHpTaWduICogdHpNaW51dGUgLSBfdHpzaWduICogX3R6bTsKLQotICAgICAgICBfdHpzaWduID0gdHpTaWduOwotICAgICAgICBfdHpoID0gdHpIb3VyOwotICAgICAgICBfdHptID0gdHpNaW51dGU7Ci0gICAgICAgIGFkZER1cmF0aW9uKDEsIDAsIDAsIDAsIGhzaGlmdCwgbXNoaWZ0LCAwLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3JtYWxpemVzIHRvIGEgdGltZSB6b25lIHNwZWNpZmllZCBieSBhIG51bWJlciBvZiBvZmZzZXQgbWludXRlcyByYXRoZXIKLSAgICAgKiB0aGFuIHNpZ24vaG91ci9taW51dGU7IGZvciBleGFtcGxlLCBub3JtYWxpemVUb1RpbWVab25lKC02MCkgaXMgdGhlCi0gICAgICogc2FtZSBhcyBub3JtYWxpemVUb1RpbWVab25lKC0xLCAxLCAwKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemVUb1RpbWVab25lKGludCB0elRvdGFsTWludXRlcykKLSAgICB7Ci0gICAgICAgIGlmICh0elRvdGFsTWludXRlcyA8IC0xNCAqIDYwIHx8IHR6VG90YWxNaW51dGVzID4gMTQgKiA2MCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBvdXQgb2YgcmFuZ2UgKC04NDAgdG8gODQwIG1pbnV0ZXMpLiAoIiArIHR6VG90YWxNaW51dGVzICsgIikiKTsKLSAgICAgICAgCi0gICAgICAgIGludCB0elNpZ24gPSB0elRvdGFsTWludXRlcyA8IDAgPyAtMSA6IHR6VG90YWxNaW51dGVzID4gMCA/IDEgOiAwOwotICAgICAgICB0elRvdGFsTWludXRlcyAqPSB0elNpZ247Ci0gICAgICAgIGludCB0ekggPSB0elRvdGFsTWludXRlcyAvIDYwOwotICAgICAgICBpbnQgdHpNID0gdHpUb3RhbE1pbnV0ZXMgLSB0ekggKiA2MDsKLSAgICAgICAgCi0gICAgICAgIG5vcm1hbGl6ZVRvVGltZVpvbmUodHpTaWduLCB0ekgsIHR6TSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZ2l2ZW4gZHVyYXRpb24gdG8gdGhlIGRhdGUvdGltZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIGR1cmF0aW9uIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEdEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgYWRkRHVyYXRpb24oZHVyYXRpb24uZ2V0U2lnbigpLCBkdXJhdGlvbi5nZXRZZWFyKCksIGR1cmF0aW9uLmdldE1vbnRoKCksIGR1cmF0aW9uLmdldERheSgpLAotICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbi5nZXRIb3VyKCksIGR1cmF0aW9uLmdldE1pbnV0ZSgpLCBkdXJhdGlvbi5nZXRTZWNvbmQoKSwgZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VidHJhY3RzIGEgZ2l2ZW4gZHVyYXRpb24gZnJvbSB0aGUgZGF0ZS90aW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgZHVyYXRpb24gdG8gc3VidHJhY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdWJ0cmFjdEdEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgYWRkRHVyYXRpb24oLWR1cmF0aW9uLmdldFNpZ24oKSwgZHVyYXRpb24uZ2V0WWVhcigpLCBkdXJhdGlvbi5nZXRNb250aCgpLCBkdXJhdGlvbi5nZXREYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24uZ2V0SG91cigpLCBkdXJhdGlvbi5nZXRNaW51dGUoKSwgZHVyYXRpb24uZ2V0U2Vjb25kKCksIGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsaXplcyB0aGUgZGF0ZSBieSBjYXJyeWluZyBvdmVyIHRvIHRoZSB5ZWFyIGFueSBtb250aHMgb3V0c2lkZSAxLi4xMgotICAgICAqIGFuZCBjYXJyeWluZyBvdmVyIHRvIHRoZSBtb250aCBhbnkgZGF5cyBvdXRzaWRlIDEuLihkYXlzLWluLW1vbnRoKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgX25vcm1hbGl6ZURhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKF9NIDwgMSB8fCBfTSA+IDEyIHx8IF9EIDwgMSB8fCBfRCA+IF9tYXhEYXlJbk1vbnRoRm9yKF9DWSwgX00pKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmaXggbW9udGhzIGZpcnN0Ci0gICAgICAgICAgICBpbnQgdGVtcCA9IF9NOwotICAgICAgICAgICAgX00gPSBfbW9kdWxvKHRlbXAsIDEsIDEzKTsKLSAgICAgICAgICAgIF9DWSA9IF9DWSArIChpbnQpX2ZRdW90aWVudCh0ZW1wLCAxLCAxMyk7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gcHVsbCBkYXlzIG91dAotICAgICAgICAgICAgaW50IGV4dHJhZGF5cyA9IF9EIC0gMTsKLSAgICAgICAgICAgIF9EID0gMTsKLQotICAgICAgICAgICAgLy8gdGhlbiB1c2UgdGhlIGp1bGlhbiBkYXRlIGZ1bmN0aW9uIHRvIGZpeAotICAgICAgICAgICAgc2V0SnVsaWFuRGF0ZShnZXRKdWxpYW5EYXRlKCkgKyBleHRyYWRheXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsaXplcyB0aW1lIHNvIHRoYXQgZnJhY3Rpb25zIGFyZSAwLi4xKGV4YyksIHNlY29uZHMvbWludXRlcyAwLi41OSwKLSAgICAgKiBhbmQgaG91cnMgMC4uMjQuIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIHRvIGNhcnJ5IG92ZXIgZnJvbSBub3JtYWxpemluZwotICAgICAqIGF3YXkgbW9yZSB0aGFuIDI0IGhvdXJzLgotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyBfbm9ybWFsaXplVGltZSgpCi0gICAgewotICAgICAgICBsb25nIGNhcnJ5ID0gMDsKLSAgICAgICAgbG9uZyB0ZW1wOwotCi0gICAgICAgIC8vIGZyYWN0aW9ucwotICAgICAgICBpZiAoX2ZzICE9IG51bGwgJiYgKF9mcy5zaWdudW0oKSA8IDAgfHwgX2ZzLmNvbXBhcmVUbyhHRGF0ZS5fb25lKSA+PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBiZGNhcnJ5ID0gX2ZzLnNldFNjYWxlKDAsIEJpZ0RlY2ltYWwuUk9VTkRfRkxPT1IpOwotICAgICAgICAgICAgX2ZzID0gX2ZzLnN1YnRyYWN0KGJkY2FycnkpOwotICAgICAgICAgICAgY2FycnkgPSBiZGNhcnJ5LmxvbmdWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNhcnJ5ICE9IDAgfHwgX3MgPCAwIHx8IF9zID4gNTkgfHwgX20gPCAwIHx8IF9tID4gNTAgfHwgX2ggPCAwIHx8IF9oID4gMjMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNlY29uZHMKLSAgICAgICAgICAgIHRlbXAgPSBfcyArIGNhcnJ5OwotICAgICAgICAgICAgY2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDYwKTsKLSAgICAgICAgICAgIF9zID0gX21vZCh0ZW1wLCA2MCwgY2FycnkpOwotCi0gICAgICAgICAgICAvLyBtaW51dGVzCi0gICAgICAgICAgICB0ZW1wID0gX20gKyBjYXJyeTsKLSAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCA2MCk7Ci0gICAgICAgICAgICBfbSA9IF9tb2QodGVtcCwgNjAsIGNhcnJ5KTsKLQotICAgICAgICAgICAgLy8gaG91cnMKLSAgICAgICAgICAgIHRlbXAgPSBfaCArIGNhcnJ5OwotICAgICAgICAgICAgY2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDI0KTsKLSAgICAgICAgICAgIF9oID0gX21vZCh0ZW1wLCAyNCwgY2FycnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNhcnJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBnaXZlbiBkdXJhdGlvbiB0byB0aGUgZGF0ZS90aW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaWduICsxIHRvIGFkZCwgLTEgdG8gc3VidHJhY3QKLSAgICAgKiBAcGFyYW0geWVhciB0aGUgbnVtYmVyIG9mIHllYXJzIHRvIGFkZAotICAgICAqIEBwYXJhbSBtb250aCB0aGUgbnVtYmVyIG9mIG1vbnRocyB0byBhZGQKLSAgICAgKiBAcGFyYW0gZGF5IHRoZSBudW1iZXIgb2YgZGF5cyB0byBhZGQKLSAgICAgKiBAcGFyYW0gaG91ciB0aGUgbnVtYmVyIG9mIGhvdXJzIHRvIGFkZAotICAgICAqIEBwYXJhbSBtaW51dGUgdGhlIG51bWJlciBvZiBtaW51dGVzIHRvIGFkZAotICAgICAqIEBwYXJhbSBzZWNvbmQgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZAotICAgICAqIEBwYXJhbSBmcmFjdGlvbiB0aGUgbnVtYmVyIG9mIGZyYWN0aW9uYWwgc2Vjb25kcyB0byBhZGQgKG1heSBiZSBudWxsKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZER1cmF0aW9uKGludCBzaWduLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB0aW1lbWF0aCA9IGhvdXIgIT0gMCB8fCBtaW51dGUgIT0gMCB8fCBzZWNvbmQgIT0gMCB8fCBmcmFjdGlvbiAhPSBudWxsICYmIGZyYWN0aW9uLnNpZ251bSgpICE9IDA7Ci0gICAgICAgIGlmICh0aW1lbWF0aCAmJiAhaGFzVGltZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGRvIHRpbWUgbWF0aCB3aXRob3V0IGEgY29tcGxldGUgdGltZSIpOwotICAgICAgICBib29sZWFuIGRhdGVtYXRoID0gaGFzRGF5KCkgJiYgKGRheSAhPSAwIHx8IHRpbWVtYXRoKTsKLSAgICAgICAgaWYgKGRhdGVtYXRoICYmICFoYXNEYXRlKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgZG8gZGF0ZSBtYXRoIHdpdGhvdXQgYSBjb21wbGV0ZSBkYXRlIik7Ci0KLSAgICAgICAgaW50IHRlbXA7Ci0KLSAgICAgICAgLy8gbW9udGhzICsgeWVhcnMgYXJlIGVhc3kKLSAgICAgICAgaWYgKG1vbnRoICE9IDAgfHwgeWVhciAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBfRCB0byBiZSBwZWdnZWQgYmVmb3JlIGNoYW5naW5nIG1vbnRoCi0gICAgICAgICAgICBpZiAoaGFzRGF5KCkpCi0gICAgICAgICAgICAgICAgX25vcm1hbGl6ZURhdGUoKTsKLQotICAgICAgICAgICAgLy8gQWRkIG1vbnRocyBhbmQgeWVhcnMKLSAgICAgICAgICAgIHRlbXAgPSBfTSArIHNpZ24gKiBtb250aDsKLSAgICAgICAgICAgIF9NID0gX21vZHVsbyh0ZW1wLCAxLCAxMyk7Ci0gICAgICAgICAgICBfQ1kgPSBfQ1kgKyBzaWduICogeWVhciArIChpbnQpX2ZRdW90aWVudCh0ZW1wLCAxLCAxMyk7Ci0KLSAgICAgICAgICAgIC8vIEluIG5ldyBtb250aCwgZGF5IG1heSBuZWVkIHRvIGJlIHBlZ2dlZCBiZWZvcmUgcHJvY2VlZGluZwotICAgICAgICAgICAgaWYgKGhhc0RheSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydChfRCA+PSAxKTsKLSAgICAgICAgICAgICAgICB0ZW1wID0gX21heERheUluTW9udGhGb3IoX0NZLCBfTSk7Ci0gICAgICAgICAgICAgICAgaWYgKF9EID4gdGVtcCkKLSAgICAgICAgICAgICAgICAgICAgX0QgPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBjYXJyeSA9IDA7Ci0KLSAgICAgICAgaWYgKHRpbWVtYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmcmFjdGlvbnMKLSAgICAgICAgICAgIGlmIChmcmFjdGlvbiAhPSBudWxsICYmIGZyYWN0aW9uLnNpZ251bSgpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9mcy5zaWdudW0oKSA9PSAwICYmIHNpZ24gPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgX2ZzID0gZnJhY3Rpb247Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBfZnMgPSAoc2lnbiA9PSAxKSA/IF9mcy5hZGQoZnJhY3Rpb24pIDogX2ZzLnN1YnRyYWN0KGZyYWN0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2Vjb25kcywgbWludXRlcywgaG91cnMKLSAgICAgICAgICAgIF9zICs9IHNpZ24gKiBzZWNvbmQ7Ci0gICAgICAgICAgICBfbSArPSBzaWduICogbWludXRlOwotICAgICAgICAgICAgX2ggKz0gc2lnbiAqIGhvdXI7Ci0KLSAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aW1lCi0gICAgICAgICAgICBjYXJyeSA9IF9ub3JtYWxpemVUaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0ZW1hdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRheXM6IG1heSByZXF1aXJlIHJlbm9ybWFsaXphdGlvbgotICAgICAgICAgICAgX0QgKz0gc2lnbiAqIGRheSArIGNhcnJ5OwotICAgICAgICAgICAgX25vcm1hbGl6ZURhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHt5ZWFyLG1vbnRofSBjb21wdXRlcyBtYXhpbXVtCi0gICAgICogbnVtYmVyIG9mIGRheXMgZm9yIGdpdmVuIG1vbnRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IF9tYXhEYXlJbk1vbnRoRm9yKGludCB5ZWFyLCBpbnQgbW9udGgpCi0gICAgewotICAgICAgICBpZiAobW9udGggPT0gNCB8fCBtb250aCA9PSA2IHx8IG1vbnRoID09IDkgfHwgbW9udGggPT0gMTEpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0KLSAgICAgICAgaWYgKG1vbnRoID09IDIpCi0gICAgICAgICAgICByZXR1cm4gKF9pc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCk7Ci0KLSAgICAgICAgcmV0dXJuIDMxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHt5ZWFyLG1vbnRofSBjb21wdXRlcyBtYXhpbXVtCi0gICAgICogbnVtYmVyIG9mIGRheXMgZm9yIGdpdmVuIG1vbnRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IF9tYXhEYXlJbk1vbnRoKGludCBtb250aCkKLSAgICB7Ci0gICAgICAgIGlmIChtb250aCA9PSA0IHx8IG1vbnRoID09IDYgfHwgbW9udGggPT0gOSB8fCBtb250aCA9PSAxMSkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLQotICAgICAgICBpZiAobW9udGggPT0gMikKLSAgICAgICAgICAgIHJldHVybiAyOTsKLQotICAgICAgICByZXR1cm4gMzE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSnVsaWFuIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIEdyZWdvcmlhbiBkYXRlLgotICAgICAqIFRoZSBKdWxpYW4gZGF0ZSAoSkQpIGlzIGEgY29udGludW91cyBjb3VudCBvZiBkYXlzIGZyb20KLSAgICAgKiAxIEphbnVhcnkgNDcxMyBCQyAoPSAtNDcxMiBKYW51YXJ5IDEpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SnVsaWFuRGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4ganVsaWFuRGF0ZUZvckdEYXRlKHRoaXMpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgR3JlZ29yaWFuIGRhdGUgYmFzZWQgb24gdGhlIGdpdmVuIEp1bGlhbiBkYXRlLgotICAgICAqIFRoZSBKdWxpYW4gZGF0ZSAoSkQpIGlzIGEgY29udGludW91cyBjb3VudCBvZiBkYXlzIGZyb20KLSAgICAgKiAxIEphbnVhcnkgNDcxMyBCQyAoPSAtNDcxMiBKYW51YXJ5IDEpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBqdWxpYW5kYXkgdGhlIGp1bGlhbiBkYXkgbnVtYmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SnVsaWFuRGF0ZShpbnQganVsaWFuZGF5KQotICAgIHsKLSAgICAgICAgaWYgKGp1bGlhbmRheSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXRlIGJlZm9yZSB5ZWFyIC00NzEyIik7Ci0KLSAgICAgICAgaW50IHRlbXA7Ci0gICAgICAgIGludCBxZXBvYzsKLQotICAgICAgICAvLyBmcm9tIGh0dHA6Ly9hYS51c25vLm5hdnkubWlsL2ZhcS9kb2NzL0pEX0Zvcm11bGEuaHRtbAotICAgICAgICB0ZW1wID0ganVsaWFuZGF5ICsgNjg1Njk7Ci0gICAgICAgIHFlcG9jID0gNCAqIHRlbXAgLyAxNDYwOTc7Ci0gICAgICAgIHRlbXAgPSB0ZW1wIC0gKDE0NjA5NyAqIHFlcG9jICsgMykgLyA0OwotICAgICAgICBfQ1kgPSA0MDAwICogKHRlbXAgKyAxKSAvIDE0NjEwMDE7Ci0gICAgICAgIHRlbXAgPSB0ZW1wIC0gMTQ2MSAqIF9DWSAvIDQgKyAzMTsKLSAgICAgICAgX00gPSA4MCAqIHRlbXAgLyAyNDQ3OwotICAgICAgICBfRCA9IHRlbXAgLSAyNDQ3ICogX00gLyA4MDsKLSAgICAgICAgdGVtcCA9IF9NIC8gMTE7Ci0gICAgICAgIF9NID0gX00gKyAyIC0gMTIgKiB0ZW1wOwotICAgICAgICBfQ1kgPSAxMDAgKiAocWVwb2MgLSA0OSkgKyBfQ1kgKyB0ZW1wOwotCi0gICAgICAgIF9iaXRzIHw9IEhBU19EQVkgfCBIQVNfTU9OVEggfCBIQVNfWUVBUjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdGltZSBhbmQgZGF0ZSBiYXNlZCBvbiBhIGphdmEudXRpbC5EYXRlIGluc3RhbmNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSB0aW1lem9uZSBvZmZzZXQgdXNlZCBpcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBUaW1lWm9uZS4gKFRoZQotICAgICAqIGRlZmF1bHQgVGltZVpvbmUgaXMgY29uc3VsdGVkIHRvIGluY29ycG9yYXRlIGRheWxpZ2h0IHNhdmluZ3Mgb2Zmc2V0cwotICAgICAqIGlmIGFwcGxpY2FibGUgZm9yIHRoZSBjdXJyZW50IGRhdGUgYXMgd2VsbCBhcyB0aGUgYmFzZSB0aW1lem9uZSBvZmZzZXQuKQotICAgICAqIDxwPgotICAgICAqIElmIHlvdSB3aXNoIHRvIG5vcm1hbGl6ZSB0aGUgdGltZXpvbmUsIGUuZy4sIHRvIFVUQywgZm9sbG93IHRoaXMgd2l0aAotICAgICAqIGEgY2FsbCB0byBub3JtYWxpemVUb1RpbWVab25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRlIHRoZSBEYXRlIG9iamVjdCB0byBjb3B5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZShEYXRlIGRhdGUpCi0gICAgewotICAgICAgICAvLyBEZWZhdWx0IHRpbWV6b25lCi0gICAgICAgIFRpbWVab25lIGR0eiA9IFRpbWVab25lLmdldERlZmF1bHQoKTsKLSAgICAgICAgaW50IG9mZnNldCA9IGR0ei5nZXRPZmZzZXQoZGF0ZS5nZXRUaW1lKCkpOwotICAgICAgICBpbnQgb2Zmc2V0c2lnbiA9IDE7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBvZmZzZXRzaWduID0gLTE7Ci0gICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGludCBvZmZzZXRtaW4gPSBvZmZzZXQgLyAoMTAwMCAqIDYwKTsKLSAgICAgICAgaW50IG9mZnNldGhyID0gb2Zmc2V0bWluIC8gNjA7Ci0gICAgICAgIG9mZnNldG1pbiA9IG9mZnNldG1pbiAtIG9mZnNldGhyICogNjA7Ci0KLSAgICAgICAgc2V0VGltZVpvbmUob2Zmc2V0c2lnbiwgb2Zmc2V0aHIsIG9mZnNldG1pbik7Ci0gICAgICAgIAotICAgICAgICAvLyBwYXJhbm9pYTogdHouZ2V0T2Zmc2V0IGNhbiByZXR1cm4gZnJhY3Rpb25zIG9mIG1pbnV0ZXMsIGJ1dCB3ZSBtdXN0IHJvdW5kCi0gICAgICAgIGludCByb3VuZGVkb2Zmc2V0ID0gb2Zmc2V0c2lnbiAqIChvZmZzZXRociAqIDYwICsgb2Zmc2V0bWluKSAqIDYwICogMTAwMDsKLQotICAgICAgICAvLyBtaWRuaWdodAotICAgICAgICBzZXRUaW1lKDAsIDAsIDAsIEdEYXRlLl96ZXJvKTsKLQotICAgICAgICAvLyBTZXQgdG8gSmFudWFyeSAxLCAxOTcwLgotICAgICAgICAvLyBzZXRKdWxpYW5EYXRlKDI0NDA1ODgpOwotICAgICAgICBfYml0cyB8PSBIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVI7Ci0gICAgICAgIF9DWSA9IDE5NzA7Ci0gICAgICAgIF9NID0gMTsKLSAgICAgICAgX0QgPSAxOwotCi0gICAgICAgIC8vIEFkZCBhIGR1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotICAgICAgICBhZGRHRHVyYXRpb24obmV3IEdEdXJhdGlvbigxLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZihkYXRlLmdldFRpbWUoKSArIHJvdW5kZWRvZmZzZXQsIDMpKSk7Ci0KLSAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBzcy4wMDAgLT4gc3MKLSAgICAgICAgaWYgKF9mcy5zaWdudW0oKSA9PSAwKQotICAgICAgICAgICAgX2ZzID0gR0RhdGUuX3plcm87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvcGllcyBhIEdEYXRlU3BlY2lmaWNhdGlvbiwgY29tcGxldGVseSByZXBsYWNpbmcgdGhlIGN1cnJlbnQKLSAgICAgKiBpbmZvcm1hdGlvbiBpbiB0aGlzIEdEYXRlQnVpbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2RhdGUgdGhlIEdEYXRlU3BlY2lmaWNhdGlvbiB0byBjb3B5Ci0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldEdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBnZGF0ZSkKLSAgICB7Ci0gICAgICAgIF9iaXRzID0gZ2RhdGUuZ2V0RmxhZ3MoKSAmIChIQVNfVElNRVpPTkUgfCBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRSk7Ci0gICAgICAgIF9DWSA9IGdkYXRlLmdldFllYXIoKTsKLSAgICAgICAgX00gPSBnZGF0ZS5nZXRNb250aCgpOwotICAgICAgICBfRCA9IGdkYXRlLmdldERheSgpOwotICAgICAgICBfaCA9IGdkYXRlLmdldEhvdXIoKTsKLSAgICAgICAgX20gPSBnZGF0ZS5nZXRNaW51dGUoKTsKLSAgICAgICAgX3MgPSBnZGF0ZS5nZXRTZWNvbmQoKTsKLSAgICAgICAgX2ZzID0gZ2RhdGUuZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgX3R6c2lnbiA9IGdkYXRlLmdldFRpbWVab25lU2lnbigpOwotICAgICAgICBfdHpoID0gZ2RhdGUuZ2V0VGltZVpvbmVIb3VyKCk7Ci0gICAgICAgIF90em0gPSBnZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGFuIHtAbGluayBYbWxDYWxlbmRhcn0uCi0gICAgICogPHA+Ci0gICAgICoge0BsaW5rIFhtbENhbGVuZGFyfSBpcyBhIHN1YmNsYXNzIG9mIHtAbGluayBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXJ9Ci0gICAgICogd2hpY2ggaXMgc2xpZ2h0bHkgY3VzdG9taXplZCB0byBtYXRjaCBYTUwgc2NoZW1hIGRhdGUgcnVsZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJldHVybmVkIHtAbGluayBYbWxDYWxlbmRhcn0gaGFzIG9ubHkgdGhvc2UgdGltZSBhbmQgZGF0ZSBmaWVsZHMKLSAgICAgKiBzZXQgdGhhdCBhcmUgcmVmbGVjdGVkIGluIHRoZSBHRGF0ZSBvYmplY3QuICBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlCi0gICAgICoge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29udHJhY3Qgd29ya3MsIGFueSBpbmZvcm1hdGlvbiBpbiB0aGUgaXNTZXQoKSB2YW5pc2hlcwotICAgICAqIGFzIHNvb24gYXMgeW91IHZpZXcgYW55IHVuc2V0IGZpZWxkIHVzaW5nIGdldCgpIG1ldGhvZHMuCi0gICAgICogVGhpcyBtZWFucyB0aGF0IGlmIGl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoaWNoIGRhdGUgZmllbGRzCi0gICAgICogYXJlIHNldCwgeW91IG11c3QgY2FsbCBpc1NldCgpIGZpcnN0IGJlZm9yZSBnZXQoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIgZ2V0Q2FsZW5kYXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxDYWxlbmRhcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYSBqYXZhLnV0aWwuRGF0ZQotICAgICAqIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBEYXRlIGdldERhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRhdGVGb3JHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQganVsaWFuRGF0ZUZvckdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgaWYgKCFkYXRlLmhhc0RhdGUoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBkbyBkYXRlIG1hdGggd2l0aG91dCBhIGNvbXBsZXRlIGRhdGUiKTsKLQotICAgICAgICAvLyBmcm9tIGh0dHA6Ly9hYS51c25vLm5hdnkubWlsL2ZhcS9kb2NzL0pEX0Zvcm11bGEuaHRtbAotICAgICAgICBpbnQgcmVzdWx0ID0gZGF0ZS5nZXREYXkoKS0zMjA3NSsxNDYxKihkYXRlLmdldFllYXIoKSs0ODAwKyhkYXRlLmdldE1vbnRoKCktMTQpLzEyKS80KwotICAgICAgICAgICAgMzY3KihkYXRlLmdldE1vbnRoKCktMi0oZGF0ZS5nZXRNb250aCgpLTE0KS8xMioxMikvMTItMyooKGRhdGUuZ2V0WWVhcigpKzQ5MDArKGRhdGUuZ2V0TW9udGgoKS0xNCkvMTIpLzEwMCkvNDsKLQotICAgICAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGUgdG9vIGZhciBpbiB0aGUgcGFzdCAoeWVhciBhbGxvd2VkIHRvIC00NzEyKSIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgRGF0ZSBkYXRlRm9yR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGUpCi0gICAgewotICAgICAgICBsb25nIGpEYXRlID0ganVsaWFuRGF0ZUZvckdEYXRlKGRhdGUpOwotICAgICAgICBsb25nIHRvMTk3MERhdGUgPSBqRGF0ZSAtIDI0NDA1ODg7Ci0gICAgICAgIGxvbmcgdG8xOTcwTXMgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogdG8xOTcwRGF0ZTsKLQotICAgICAgICB0bzE5NzBNcyArPSBkYXRlLmdldE1pbGxpc2Vjb25kKCk7Ci0gICAgICAgIHRvMTk3ME1zICs9IGRhdGUuZ2V0U2Vjb25kKCkgKiAxMDAwOwotICAgICAgICB0bzE5NzBNcyArPSBkYXRlLmdldE1pbnV0ZSgpICogNjAgKiAxMDAwOwotICAgICAgICB0bzE5NzBNcyArPSBkYXRlLmdldEhvdXIoKSAqIDYwICogNjAgKiAxMDAwOwotICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lWm9uZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bzE5NzBNcyAtPSAoZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpICogZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSkgKiA2MCAqIDEwMDA7Ci0gICAgICAgICAgICB0bzE5NzBNcyAtPSAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSAqIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkpICogNjAgKiA2MCAqIDEwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBUaW1lWm9uZSBkZWYgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZGVmLmdldE9mZnNldCh0bzE5NzBNcyk7Ci0gICAgICAgICAgICB0bzE5NzBNcyAtPSBvZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IERhdGUodG8xOTcwTXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIGxlYXAgeWVhcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfaXNMZWFwWWVhcihpbnQgeWVhcikKLSAgICB7Ci0gICAgICAgIC8vIEJVR0JVRzogSnVsaWFuIGNhbGVuZGFyPwotICAgICAgICByZXR1cm4gKCh5ZWFyICUgNCA9PSAwKSAmJiAoKHllYXIgJSAxMDAgIT0gMCkgfHwgKHllYXIgJSA0MDAgPT0gMCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmUXVvdGllbnQoYSwgYikgPSB0aGUgZ3JlYXRlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYS9iCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBfZlF1b3RpZW50KGxvbmcgYSwgaW50IGIpCi0gICAgewotICAgICAgICBpZiAoKGEgPCAwKSA9PSAoYiA8IDApKQotICAgICAgICAgICAgcmV0dXJuIGEgLyBiOwotCi0gICAgICAgIHJldHVybiAtKChiIC0gYSAtIDEpIC8gYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbW9kdWxvKGEsIGIpID0gYSAtIGZRdW90aWVudChhLGIpKmIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgX21vZChsb25nIGEsIGludCBiLCBsb25nIHF1b3RpZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpbnQpKGEgLSBxdW90aWVudCpiKSA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbW9kdWxvKGEgLSBsb3csIGhpZ2ggLSBsb3cpICsgbG93Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9tb2R1bG8obG9uZyB0ZW1wLCBpbnQgbG93LCBpbnQgaGlnaCkKLSAgICB7Ci0gICAgICAgIGxvbmcgYSA9IHRlbXAgLSBsb3c7Ci0gICAgICAgIGludCBiID0gaGlnaCAtIGxvdzsKLSAgICAgICAgcmV0dXJuIChfbW9kKGEsIGIsIF9mUXVvdGllbnQoYSwgYikpICsgbG93KSA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUXVvdGllbnQoYSAtIGxvdywgaGlnaCAtIGxvdykKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIF9mUXVvdGllbnQobG9uZyB0ZW1wLCBpbnQgbG93LCBpbnQgaGlnaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZlF1b3RpZW50KHRlbXAgLSBsb3csIGhpZ2ggLSBsb3cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdG8gdGhlIGZpcnN0IHBvc3NpYmxlIG1vbWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgX3NldFRvRmlyc3RNb21lbnQoKQotICAgIHsKLSAgICAgICAgLy8gMTU4NCB3YXMgdGhlIGZpcnN0IGxlYXAgeWVhciBkdXJpbmcgd2hpY2ggdGhlIEdyZWdvcmlhbgotICAgICAgICAvLyBjYWxlbmRhciB3YXMgaW4gdXNlOiBzZWVtcyBsaWtlIHRoZSBtb3N0IHJlYXNvbmFibGUgImZpcnN0IgotICAgICAgICAvLyB5ZWFyIHRvIHVzZSBpbiBhYnNlbmNlIG9mIGEgeWVhci4KLQotICAgICAgICBpZiAoIWhhc1llYXIoKSkKLSAgICAgICAgICAgIHNldFllYXIoMTU4NCk7Ci0KLSAgICAgICAgaWYgKCFoYXNNb250aCgpKQotICAgICAgICAgICAgc2V0TW9udGgoMSk7Ci0KLSAgICAgICAgaWYgKCFoYXNEYXkoKSkKLSAgICAgICAgICAgIHNldERheSgxKTsKLQotICAgICAgICBpZiAoIWhhc1RpbWUoKSkKLSAgICAgICAgICAgIHNldFRpbWUoMCwgMCwgMCwgR0RhdGUuX3plcm8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmlzb24gdG8gYW5vdGhlciBHRGF0ZS4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKLSAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQotICAgICAqIDwvdWw+Ci0gICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cwotICAgICAqIG9mIGluZm9ybWF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRlc3BlYyB0aGUgZGF0ZSB0byBjb21wYXJlIGFnYWluc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUb0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlc3BlYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlR0RhdGUodGhpcywgZGF0ZXNwZWMpOwotICAgIH0KLQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmVHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gdGRhdGUsIEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlc3BlYykKLSAgICB7Ci0gICAgICAgIC8vIHNhbWUgYW1vdW50IG9mIGluZm9ybWF0aW9uOiBsb29rcyBnb29kCi0gICAgICAgIGludCBiaXRkaWZmID0gdGRhdGUuZ2V0RmxhZ3MoKSBeIGRhdGVzcGVjLmdldEZsYWdzKCk7Ci0KLSAgICAgICAgZWFzeTogaWYgKChiaXRkaWZmICYgKEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FIHwgSEFTX1RJTUVaT05FKSkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgdGhlIG90aGVyIGRhdGUgbmVlZHMgdG8gYmUgbm9ybWFsaXplZCB0bwotICAgICAgICAgICAgLy8gb3VyIHRpbWV6b25lLCBtYWtlIGEgY2xvbmUgYW5kIGRvIHNvIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICBpZiAodGRhdGUuaGFzVGltZVpvbmUoKSAmJgotICAgICAgICAgICAgICAgIChkYXRlc3BlYy5nZXRUaW1lWm9uZUhvdXIoKSAhPSB0ZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSB8fAotICAgICAgICAgICAgICAgICBkYXRlc3BlYy5nZXRUaW1lWm9uZU1pbnV0ZSgpICE9IHRkYXRlLmdldFRpbWVab25lTWludXRlKCkgfHwKLSAgICAgICAgICAgICAgICAgZGF0ZXNwZWMuZ2V0VGltZVpvbmVTaWduKCkgIT0gdGRhdGUuZ2V0VGltZVpvbmVTaWduKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGVzcGVjID0gbmV3IEdEYXRlQnVpbGRlcihkYXRlc3BlYyk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSB0ZGF0ZS5nZXRGbGFncygpICYgKEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYWdzICE9IDAgJiYgZmxhZ3MgIT0gKEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSkgfHwgIXRkYXRlLmhhc1RpbWUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZXNlIGNhc2VzIHdlJ2xsIG5lZWQgdG8gZmlsbCBpbiBmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgKChHRGF0ZUJ1aWxkZXIpZGF0ZXNwZWMpLl9zZXRUb0ZpcnN0TW9tZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRkYXRlID0gbmV3IEdEYXRlQnVpbGRlcih0ZGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICgoR0RhdGVCdWlsZGVyKXRkYXRlKS5fc2V0VG9GaXJzdE1vbWVudCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICgoR0RhdGVCdWlsZGVyKWRhdGVzcGVjKS5ub3JtYWxpemVUb1RpbWVab25lKHRkYXRlLmdldFRpbWVab25lU2lnbigpLCB0ZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSwgdGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbXBhcmUgYnkgZmllbGQKLSAgICAgICAgICAgIHJldHVybiBmaWVsZHdpc2VDb21wYXJlKHRkYXRlLCBkYXRlc3BlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkaWZmZXJlbnQgYW1vdW50cyBvZiBpbmZvcm1hdGlvbiAoZXhjZXB0IHRpbWV6b25lKTogbm90IGNvbXBhcmFibGUKLSAgICAgICAgaWYgKChiaXRkaWZmICYgKEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FKSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIC8vIFRoZSBzY2hlbWEgc3BlYyBzYXlzIHdlIHNob3VsZCB0cnkgdG8gY29tcGFyZSB3aXRoLXRpbWV6b25lIGFuZAotICAgICAgICAvLyB3aXRob3V0LXRpbWV6b25lIHNwZWNpZmljYXRpb25zLi4uIFdlbGwsIE9LLCBzdXJlLCBpZiB0aGV5IHNheSBzby4KLQotICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGEgdGltZXpvbmUgYnV0IHRoZSBvdGhlciBkb2VzOiByZXZlcnNlIHRoZSBjYWxsCi0gICAgICAgIGlmICghdGRhdGUuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNvbXBhcmVHRGF0ZShkYXRlc3BlYywgdGRhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSAyID8gMiA6IC1yZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgdGRhdGUgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGEgdGltZXpvbmUgYW5kIGRhdGVzcGVjIG5vdC4KLQotICAgICAgICAvLyBUbyBtdWNrIHdpdGggdGhlIHRpbWVzLCBtYWtlIGNsb25lcwotICAgICAgICBHRGF0ZUJ1aWxkZXIgcGRhdGUgPSBuZXcgR0RhdGVCdWlsZGVyKHRkYXRlKTsKLQotICAgICAgICAvLyBUbyBjb3ZlciB0aGUgb25lIHVuY292ZXJlZCBjYXNlOiBpZiBvbmUgZGF0ZSBpcyAwMi8yOCBhbmQgdGhlCi0gICAgICAgIC8vIG90aGVyIGRhdGUgaXMgMDMvMDEsIHNoaWZ0IGRheXMgY2xvc2VyIGJ5IG9uZSB0byBzaW11bGF0ZSBiZWluZwotICAgICAgICAvLyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoIHdpdGhpbiBhIGxlYXAgeWVhcgotICAgICAgICBpZiAoKHRkYXRlLmdldEZsYWdzKCkgJiAoSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZKSkgPT0gKEhBU19NT05USCB8IEhBU19EQVkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGRhdGUuZ2V0RGF5KCkgPT0gMjggJiYgdGRhdGUuZ2V0TW9udGgoKSA9PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkYXRlc3BlYy5nZXREYXkoKSA9PSAwMSAmJiBkYXRlc3BlYy5nZXRNb250aCgpID09IDMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwZGF0ZS5zZXREYXkoMjkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGRhdGVzcGVjLmdldERheSgpID09IDI4ICYmIGRhdGVzcGVjLmdldE1vbnRoKCkgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGRhdGUuZ2V0RGF5KCkgPT0gMDEgJiYgdGRhdGUuZ2V0TW9udGgoKSA9PSAzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGRhdGUuc2V0TW9udGgoMDIpOwotICAgICAgICAgICAgICAgICAgICBwZGF0ZS5zZXREYXkoMjkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZvciB0aW1lc3BhbnMsIGNvbXBhcmUgYnkgZmlyc3QgaW5zdGFudCBvZiB0aW1lCi0gICAgICAgIC8vIHBvc3NpYmxlLiBUaGVyZWZvcmUsIGZpbGwgaW4gTWlkbmlnaHQsIEphbnVhcnkgMSwgMTU4NCAoYSBsZWFwIHllYXIpCi0gICAgICAgIC8vIGluIGFic2VuY2Ugb2Ygb3RoZXIgaW5mb3JtYXRpb24uCi0gICAgICAgIHBkYXRlLl9zZXRUb0ZpcnN0TW9tZW50KCk7Ci0KLSAgICAgICAgLy8gUCA8IFEgaWYgUCA8IChRIHdpdGggdGltZSB6b25lICsxNDowMCkKLSAgICAgICAgR0RhdGVCdWlsZGVyIHFwbHVzZGF0ZSA9IG5ldyBHRGF0ZUJ1aWxkZXIoZGF0ZXNwZWMpOwotICAgICAgICBxcGx1c2RhdGUuX3NldFRvRmlyc3RNb21lbnQoKTsKLSAgICAgICAgcXBsdXNkYXRlLnNldFRpbWVab25lKDEsIDE0LCAwKTsKLSAgICAgICAgcXBsdXNkYXRlLm5vcm1hbGl6ZVRvVGltZVpvbmUodGRhdGUuZ2V0VGltZVpvbmVTaWduKCksIHRkYXRlLmdldFRpbWVab25lSG91cigpLCB0ZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKTsKLSAgICAgICAgaWYgKGZpZWxkd2lzZUNvbXBhcmUocGRhdGUsIHFwbHVzZGF0ZSkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgLy8gUCA+IFEgaWYgUCA+IChRIHdpdGggdGltZSB6b25lIC0xNDowMCkKLSAgICAgICAgR0RhdGVCdWlsZGVyIHFtaW51c2RhdGUgPSBxcGx1c2RhdGU7Ci0gICAgICAgIHFtaW51c2RhdGUuc2V0R0RhdGUoZGF0ZXNwZWMpOwotICAgICAgICBxbWludXNkYXRlLl9zZXRUb0ZpcnN0TW9tZW50KCk7Ci0gICAgICAgIHFtaW51c2RhdGUuc2V0VGltZVpvbmUoLTEsIDE0LCAwKTsKLSAgICAgICAgcW1pbnVzZGF0ZS5ub3JtYWxpemVUb1RpbWVab25lKHRkYXRlLmdldFRpbWVab25lU2lnbigpLCB0ZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSwgdGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgIGlmIChmaWVsZHdpc2VDb21wYXJlKHBkYXRlLCBxbWludXNkYXRlKSA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgLy8gUCA8PiBRIG90aGVyd2lzZQotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIGEgc2ltcGxlIG1vc3Qtc2lnbmlmaWNhbnQtZGlnaXQtZmlyc3QgY29tcGFyaXNvbiwKLSAgICAgKiBpZ25vcmluZyBhbnkgdGltZXpvbmUgb3IgaGFzL2RvZXNuJ3QgaGF2ZSBpc3N1ZXMuCi0gICAgICogVGhlIGRhdGEgbXVzdCBoYXZlIGJlZW4gZGlnZXN0ZWQgZmlyc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpZWxkd2lzZUNvbXBhcmUoR0RhdGVTcGVjaWZpY2F0aW9uIHRkYXRlLCBHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0ZGF0ZS5oYXNZZWFyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBDWSA9IGRhdGUuZ2V0WWVhcigpOwotICAgICAgICAgICAgaW50IFRDWSA9IHRkYXRlLmdldFllYXIoKTsKLSAgICAgICAgICAgIGlmIChUQ1kgPCBDWSkgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKFRDWSA+IENZKSByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGRhdGUuaGFzTW9udGgoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IE0gPSBkYXRlLmdldE1vbnRoKCk7Ci0gICAgICAgICAgICBpbnQgVE0gPSB0ZGF0ZS5nZXRNb250aCgpOwotICAgICAgICAgICAgaWYgKFRNIDwgTSkgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKFRNID4gTSkgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRkYXRlLmhhc0RheSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgRCA9IGRhdGUuZ2V0RGF5KCk7Ci0gICAgICAgICAgICBpbnQgVEQgPSB0ZGF0ZS5nZXREYXkoKTsKLSAgICAgICAgICAgIGlmIChURCA8IEQpIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmIChURCA+IEQpIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZGF0ZS5oYXNUaW1lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBoID0gZGF0ZS5nZXRIb3VyKCk7Ci0gICAgICAgICAgICBpbnQgdGggPSB0ZGF0ZS5nZXRIb3VyKCk7Ci0gICAgICAgICAgICBpZiAodGggPCBoKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAodGggPiBoKSByZXR1cm4gMTsKLSAgICAgICAgICAgIGludCBtID0gZGF0ZS5nZXRNaW51dGUoKTsKLSAgICAgICAgICAgIGludCB0bSA9IHRkYXRlLmdldE1pbnV0ZSgpOwotICAgICAgICAgICAgaWYgKHRtIDwgbSkgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKHRtID4gbSkgcmV0dXJuIDE7Ci0gICAgICAgICAgICBpbnQgcyA9IGRhdGUuZ2V0U2Vjb25kKCk7Ci0gICAgICAgICAgICBpbnQgdHMgPSB0ZGF0ZS5nZXRTZWNvbmQoKTsKLSAgICAgICAgICAgIGlmICh0cyA8IHMpIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmICh0cyA+IHMpIHJldHVybiAxOwotICAgICAgICAgICAgQmlnRGVjaW1hbCBmcyA9IGRhdGUuZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgdGZzID0gdGRhdGUuZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgICAgIGlmICh0ZnMgPT0gbnVsbCAmJiBmcyA9PSBudWxsKSByZXR1cm4gMDsKLSAgICAgICAgICAgIHJldHVybiAodGZzID09IG51bGwgPyBHRGF0ZS5femVybyA6IHRmcykuY29tcGFyZVRvKGZzID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ1aWx0aW4gdHlwZSBjb2RlIGZvciB0aGUgc2hhcGUgb2YgdGhlIGluZm9ybWF0aW9uCi0gICAgICogY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UsIG9yIDAgaWYgdGhlCi0gICAgICogaW5zdGFuY2UgZG9lc24ndCBjb250YWluIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYQotICAgICAqIFNjaGVtYSB0eXBlLgotICAgICAqIDxwPiAKLSAgICAgKiBWYWx1ZSB3aWxsIGJlIGVxdWFsIHRvCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX05PVF9CVUlMVElOfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEhfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURV9USU1FfSwgb3IKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfVElNRX0uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRCdWlsdGluVHlwZUNvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJ0Y0ZvckZsYWdzKF9iaXRzKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQgYnRjRm9yRmxhZ3MoaW50IGZsYWdzKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChmbGFncyAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgSEFTX1lFQVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjsKLSAgICAgICAgICAgIGNhc2UgSEFTX1lFQVIgfCBIQVNfTU9OVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDsKLSAgICAgICAgICAgIGNhc2UgSEFTX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOwotICAgICAgICAgICAgY2FzZSBIQVNfTU9OVEggfCBIQVNfREFZOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWTsKLSAgICAgICAgICAgIGNhc2UgSEFTX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfR19EQVk7Ci0gICAgICAgICAgICBjYXNlIEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfREFURTsKLSAgICAgICAgICAgIGNhc2UgSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRTsKLSAgICAgICAgICAgIGNhc2UgSEFTX1RJTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX1RJTUU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgZmllbGRzIGluIHRoaXMgR0RhdGVCdWlsZGVyIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlCi0gICAgICogZm9yIHRoZSBnaXZlbiBTY2hlbWFUeXBlIGRhdGUgY29kZS4gIFRoZSBjb2RlIHNob3VsZCBiZQotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJ9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJfTU9OVEh9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USF9EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX0RBWX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEV9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFX1RJTUV9LCBvcgotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19USU1FfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZUNvZGUgdGhlIHR5cGUgY29kZSB0byBhcHBseQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWx0aW5UeXBlQ29kZShpbnQgdHlwZUNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHR5cGVDb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICAvL0hBU19ZRUFSCi0gICAgICAgICAgICAgICAgY2xlYXJNb250aCgpOwotICAgICAgICAgICAgICAgIGNsZWFyRGF5KCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJUaW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICAgICAgLy9IQVNfWUVBUiB8IEhBU19NT05USAotICAgICAgICAgICAgICAgIGNsZWFyRGF5KCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJUaW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIC8vSEFTX01PTlRICi0gICAgICAgICAgICAgICAgY2xlYXJZZWFyKCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJEYXkoKTsKLSAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgIC8vSEFTX01PTlRIIHwgSEFTX0RBWQotICAgICAgICAgICAgICAgIGNsZWFyWWVhcigpOwotICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgLy9IQVNfREFZCi0gICAgICAgICAgICAgICAgY2xlYXJZZWFyKCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJNb250aCgpOwotICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgICAgICAvL0hBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWQotICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIC8vSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUUKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgLy9IQVNfVElNRQotICAgICAgICAgICAgICAgIGNsZWFyWWVhcigpOwotICAgICAgICAgICAgICAgIGNsZWFyTW9udGgoKTsKLSAgICAgICAgICAgICAgICBjbGVhckRheSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29kZVR5cGUgbXVzdCBiZSBvbmUgb2YgU2NoZW1hVHlwZSBCVENfICBEQVRFIFRJTUUgcmVsYXRlZCB0eXBlcy4iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBURU4gPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTApOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFNwZWNpZmljIG1vbWVudHMgb3IKLSAgICAgKiB0aW1lcy1vZi1kYXkgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUgYXJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgKiBVVEMgdGltZSB0byBwcm9kdWNlIGEgY2Fub25pY2FsIHN0cmluZyBmb3JtIGZvciB0aGVtLgotICAgICAqIE90aGVyIHJlY3VycmluZyB0aW1lIHNwZWNpZmljYXRpb25zIGtlZXAgdGhlaXIgdGltZXpvbmUKLSAgICAgKiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNhbm9uaWNhbFN0cmluZygpCi0gICAgewotICAgICAgICBib29sZWFuIG5lZWROb3JtYWxpemUgPQotICAgICAgICAgICAgKGhhc1RpbWVab25lKCkgJiYgZ2V0VGltZVpvbmVTaWduKCkgIT0gMCAmJiBoYXNUaW1lKCkgJiYKLSAgICAgICAgICAgICgoaGFzRGF5KCkgPT0gaGFzTW9udGgoKSAmJiBoYXNEYXkoKSA9PSBoYXNZZWFyKCkpKSk7Ci0KLSAgICAgICAgaWYgKCFuZWVkTm9ybWFsaXplICYmIGdldEZyYWN0aW9uKCkuc2NhbGUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgYmkgPSBnZXRGcmFjdGlvbigpLnVuc2NhbGVkVmFsdWUoKTsKLSAgICAgICAgICAgIG5lZWROb3JtYWxpemUgPSAoYmkubW9kKFRFTikuc2lnbnVtKCkgPT0gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW5lZWROb3JtYWxpemUpCi0gICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKLQotICAgICAgICBHRGF0ZUJ1aWxkZXIgY2RhdGUgPSBuZXcgR0RhdGVCdWlsZGVyKHRoaXMpOwotICAgICAgICBjZGF0ZS5ub3JtYWxpemUoKTsKLSAgICAgICAgcmV0dXJuIGNkYXRlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hdHVyYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBUaGlzIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uCi0gICAgICogdGhhdCBpcyBhdmFpbGFibGUsIGluY2x1ZGluZyB0aW1lem9uZS4gRm9yIHR5cGVzIHRoYXQgY29ycmVzcG9uZAotICAgICAqIHRvIGRlZmluZWQgc2NoZW1hIHR5cGVzIChzY2hlbWFCdWlsdGluVHlwZUNvZGUoKSA+IDApLAotICAgICAqIHRoaXMgcHJvdmlkZXMgdGhlIG5hdHVyYWwgbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIGJvdGggdGltZSBhbmQgdGltZXpvbmUgYXJlIHNwZWNpZmllZCwgdGhpcyBzdHJpbmcgaXMgbm90Ci0gICAgICogdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1bmxlc3MgdGhlIHRpbWV6b25lIGlzIFVUQyAoWikKLSAgICAgKiAoc2luY2UgdGhlIHNhbWUgbW9tZW50IGluIHRpbWUgY2FuIGJlIGV4cHJlc3NlZCBpbiBkaWZmZXJlbnQKLSAgICAgKiB0aW1lem9uZXMpLiBUbyBnZXQgYSBjYW5vbmljYWwgc3RyaW5nLCB1c2UgdGhlIGNhbm9uaWNhbFN0cmluZygpCi0gICAgICogbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlLmZvcm1hdEdEYXRlKHRoaXMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlU3BlY2lmaWNhdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlU3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FmNjFlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZVNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgU2NoZW1hLWNvbXBhdGlibGUgR3JlZ29yaWFuIGRhdGUuCi0gKiA8cD4KLSAqIEJvdGggdGhlIGltbXV0YWJsZSBHRGF0ZSBhbmQgdGhlIG11dGFibGUgR0RhdGVCdWlsZGVyIGFyZQotICogR0RhdGVTcGVjaWZpY2F0aW9ucy4gIFVzZSB0aGlzIGludGVyZmFjZSB3aGVyZSB5b3Ugd2FudCB0bwotICogYWxsb3cgY2FsbGVycyB0byBwYXNzIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBhIEdEYXRlLgotICogCi0gKiBAc2VlIEdEYXRlCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR0RhdGVTcGVjaWZpY2F0aW9uCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGluZGljYXRpbmcgdGhlIGluZm9ybWF0aW9uCi0gICAgICogY29udGFpbmVkIGJ5IHRoaXMgR0RhdGUuICBUaGUgZml2ZSBmbGFncyBhcmUKLSAgICAgKiB7QGxpbmsgI0hBU19USU1FWk9ORX0sIHtAbGluayAjSEFTX1lFQVJ9LCB7QGxpbmsgI0hBU19NT05USH0sCi0gICAgICoge0BsaW5rICNIQVNfREFZfSwgYW5kIHtAbGluayAjSEFTX1RJTUV9LgotICAgICAqLwotICAgIGludCBnZXRGbGFncygpOwotCi0gICAgLyoqIFRpbWV6b25lIGlzIHNwZWNpZmllZC4gU2VlIHtAbGluayAjZ2V0RmxhZ3N9LiAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgSEFTX1RJTUVaT05FID0gMTsKLSAgICAvKiogWWVhciBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19ZRUFSID0gMjsKLSAgICAvKiogTW9udGggb2YgeWVhciBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19NT05USCA9IDQ7Ci0gICAgLyoqIERheSBvZiBtb250aCBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19EQVkgPSA4OwotICAgIC8qKiBUaW1lIG9mIGRheSBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19USU1FID0gMTY7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgR0RhdGUgc3BlY2lmaWNhdGlvbiBpcyBpbW11dGFibGUuIEdEYXRlIHJldHVybnMgdHJ1ZSwKLSAgICAgKiBhbmQgR0RhdGVCdWlsZGVyIHJldHVybnMgZmFsc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ltbXV0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIEdEYXRlIGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgZ3JlZ29yaWFuIGRhdGUgdmFsdWUKLSAgICAgKiBpbiBYTUwgc2NoZW1hLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWV6b25lLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzVGltZVpvbmUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB5ZWFyLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzWWVhcigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vbnRoLW9mLXllYXIuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNNb250aCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGRheS1vZi1tb250aC4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0RheSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWUtb2YtZGF5LgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzVGltZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGZ1bGwgZGF0ZSAoeWVhciwgbW9udGgsIGRheSkKLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0RhdGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIGludCBnZXRZZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyLiBKYW51YXJ5IGlzIDEuCi0gICAgICovCi0gICAgaW50IGdldE1vbnRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqLwotICAgIGludCBnZXREYXkoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5LiBNaWRuaWdodCBpcyAwLCBhbmQgMTFQTSBpcyAyMy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0SG91cigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0TWludXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlLiBSYW5nZSBmcm9tIDAgdG8gNTkuCi0gICAgICovCi0gICAgaW50IGdldFNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIHNpZ24uIEZvciB0aW1lIHpvbmVzIGVhc3Qgb2YgR01ULAotICAgICAqIHRoaXMgaXMgcG9zaXRpdmU7IGZvciB0aW1lIHpvbmVzIHdlc3QsIHRoaXMgaXMgbmVnYXRpdmUuCi0gICAgICovCi0gICAgaW50IGdldFRpbWVab25lU2lnbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIGhvdXIuCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIGludCBnZXRUaW1lWm9uZUhvdXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBtaW51dGVzLgotICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKLSAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0VGltZVpvbmVNaW51dGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZC4gUmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCi0gICAgICovCi0gICAgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91bmRlZCBtaWxsaXNlY29uZCB2YWx1ZS4gUmFuZ2UgZnJvbSAwIHRvIDk5OQotICAgICAqLwotICAgIGludCBnZXRNaWxsaXNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSnVsaWFuIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIEdyZWdvcmlhbiBkYXRlLgotICAgICAqIFRoZSBKdWxpYW4gZGF0ZSAoSkQpIGlzIGEgY29udGludW91cyBjb3VudCBvZiBkYXlzIGZyb20KLSAgICAgKiAxIEphbnVhcnkgNDcxMyBCQyAoPSAtNDcxMiBKYW51YXJ5IDEpLgotICAgICAqLwotICAgIGludCBnZXRKdWxpYW5EYXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYW4ge0BsaW5rIFhtbENhbGVuZGFyfS4KLSAgICAgKiA8cD4KLSAgICAgKiB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcn0KLSAgICAgKiB3aGljaCBpcyBzbGlnaHRseSBjdXN0b21pemVkIHRvIG1hdGNoIFhNTCBzY2hlbWEgZGF0ZSBydWxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFhtbENhbGVuZGFyfSBoYXMgb25seSB0aG9zZSB0aW1lIGFuZCBkYXRlIGZpZWxkcwotICAgICAqIHNldCB0aGF0IGFyZSByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlIG9iamVjdC4gIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUKLSAgICAgKiB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfSBjb250cmFjdCB3b3JrcywgYW55IGluZm9ybWF0aW9uIGluIHRoZSBpc1NldCgpIHZhbmlzaGVzCi0gICAgICogYXMgc29vbiBhcyB5b3UgdmlldyBhbnkgdW5zZXQgZmllbGQgdXNpbmcgZ2V0KCkgbWV0aG9kcy4KLSAgICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hpY2ggZGF0ZSBmaWVsZHMKLSAgICAgKiBhcmUgc2V0LCB5b3UgbXVzdCBjYWxsIGlzU2V0KCkgZmlyc3QgYmVmb3JlIGdldCgpLgotICAgICAqLwotICAgIFhtbENhbGVuZGFyIGdldENhbGVuZGFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYSBqYXZhLnV0aWwuRGF0ZQotICAgICAqIGluc3RhbmNlLgotICAgICAqLwotICAgIERhdGUgZ2V0RGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEYXRlLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGdkYXRlc3BlYyB0aGUgZGF0ZSB0byBjb21wYXJlIGFnYWluc3QuCi0gICAgICovCi0gICAgaW50IGNvbXBhcmVUb0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBnZGF0ZXNwZWMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHRpbiB0eXBlIGNvZGUgZm9yIHRoZSBzaGFwZSBvZiB0aGUgaW5mb3JtYXRpb24KLSAgICAgKiBjb250YWluZWQgaW4gdGhpcyBpbnN0YW5jZSwgb3IgMCBpZiB0aGUKLSAgICAgKiBpbnN0YW5jZSBkb2Vzbid0IGNvbnRhaW4gaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byBhCi0gICAgICogU2NoZW1hIHR5cGUuCi0gICAgICogPHA+IAotICAgICAqIFZhbHVlIHdpbGwgYmUgZXF1YWwgdG8KLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfTk9UX0JVSUxUSU59LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJ9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJfTU9OVEh9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USF9EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX0RBWX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEV9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFX1RJTUV9LCBvcgotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19USU1FfS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gU3BlY2lmaWMgbW9tZW50cyBvcgotICAgICAqIHRpbWVzLW9mLWRheSBpbiBhIHNwZWNpZmllZCB0aW1lem9uZSBhcmUgbm9ybWFsaXplZCB0bwotICAgICAqIFVUQyB0aW1lIHRvIHByb2R1Y2UgYSBjYW5vbmljYWwgc3RyaW5nIGZvcm0gZm9yIHRoZW0uCi0gICAgICogT3RoZXIgcmVjdXJyaW5nIHRpbWUgc3BlY2lmaWNhdGlvbnMga2VlcCB0aGVpciB0aW1lem9uZQotICAgICAqIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIFN0cmluZyBjYW5vbmljYWxTdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGltZXpvbmUuIEZvciB0eXBlcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgKiB0byBkZWZpbmVkIHNjaGVtYSB0eXBlcyAoc2NoZW1hQnVpbHRpblR5cGVDb2RlKCkgPiAwKSwKLSAgICAgKiB0aGlzIHByb3ZpZGVzIHRoZSBuYXR1cmFsIGxleGljYWwgcmVwcmVzZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBXaGVuIGJvdGggdGltZSBhbmQgdGltZXpvbmUgYXJlIHNwZWNpZmllZCwgdGhpcyBzdHJpbmcgaXMgbm90Ci0gICAgICogdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1bmxlc3MgdGhlIHRpbWV6b25lIGlzIFVUQyAoWikKLSAgICAgKiAoc2luY2UgdGhlIHNhbWUgbW9tZW50IGluIHRpbWUgY2FuIGJlIGV4cHJlc3NlZCBpbiBkaWZmZXJlbnQKLSAgICAgKiB0aW1lem9uZXMpLiBUbyBnZXQgYSBjYW5vbmljYWwgc3RyaW5nLCB1c2UgdGhlIGNhbm9uaWNhbFN0cmluZygpCi0gICAgICogbWV0aG9kLgotICAgICAqLwotICAgIFN0cmluZyB0b1N0cmluZygpOwotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMjA5NGQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIFhNTCBTY2hlbWEtY29tcGF0aWJsZSBkdXJhdGlvbi4KLSAqIDxwPgotICogQSBkdXJhdGlvbiBpcyBtYWRlIHVwIG9mIGEgbnVtYmVyIG9mIHllYXJzLCBtb250aHMsIGRheXMsIGhvdXJzLAotICogbWludXRlcywgc2Vjb25kcywgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzLiBTZWUgdGhlCi0gKiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24KLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24iPnNlY3Rpb24gb24geHM6ZHVyYXRpb248L2E+Ci0gKiBmb3IgZGV0YWlscyBvbiB0aGUgcnVsZXMgZm9yCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uLW9yZGVyIj5jb21wYXJpbmcgZHVyYXRpb25zPC9hPiBhbmQKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYWRkaW5nLWR1cmF0aW9ucy10by1kYXRlVGltZXMiPmFkZGluZyBkdXJhdGlvbnMgdG8gZGF0ZXM8L2E+LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR0R1cmF0aW9uIGltcGxlbWVudHMgR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIGludCBfc2lnbjsKLSAgICBwcml2YXRlIGludCBfQ1k7Ci0gICAgcHJpdmF0ZSBpbnQgX007Ci0gICAgcHJpdmF0ZSBpbnQgX0Q7Ci0gICAgcHJpdmF0ZSBpbnQgX2g7Ci0gICAgcHJpdmF0ZSBpbnQgX207Ci0gICAgcHJpdmF0ZSBpbnQgX3M7Ci0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9mczsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgR0R1cmF0aW9uIHJlcHJlc2VudGluZyB6ZXJvIHNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbigpCi0gICAgewotICAgICAgICBfc2lnbiA9ICsxOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX05PVEhJTkcgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX1lFQVIgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX01PTlRIID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9EQVkgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX0hPVVIgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX01JTlVURSA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fU0VDT05EID0gNjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRHVyYXRpb24gZnJvbSBhIGxleGljYWwKLSAgICAgKiByZXByZXNlbnRhdGlvbi4gVGhlIGxleGljYWwgc3BhY2UgY29udGFpbnMgdGhlCi0gICAgICogdW5pb24gb2YgdGhlIGxleGljYWwgc3BhY2VzIG9mIGFsbCB0aGUgc2NoZW1hCi0gICAgICogZGF0ZS90aW1lIHR5cGVzIChleGNlcHQgZm9yIGR1cmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uKENoYXJTZXF1ZW5jZSBzdHIpCi0gICAgewotICAgICAgICAvLyBGb3JtOiAgICAgICAgLVBuWW5NbkRUbkhuTW5TCi0gICAgICAgIC8vICh3aGVyZSBlYWNoIG4gbWF5IGJlIHByZWNlZGVkIGJ5IGEgLSBmb3IgdXMsIGFuZCB0aGUgd2hvbGUgbWF5IGJlIC0pCi0KLSAgICAgICAgLy8gZmlyc3QgdHJpbSBYTUwgd2hpdGVzcGFjZQotICAgICAgICBpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICB3aGlsZSAobGVuID4gMCAmJiBHRGF0ZS5pc1NwYWNlKHN0ci5jaGFyQXQobGVuIC0gMSkpKQotICAgICAgICAgICAgbGVuIC09IDE7Ci0gICAgICAgIHdoaWxlIChzdGFydCA8IGxlbiAmJiBHRGF0ZS5pc1NwYWNlKHN0ci5jaGFyQXQoc3RhcnQpKSkKLSAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0KLSAgICAgICAgX3NpZ24gPSAxOwotICAgICAgICBib29sZWFuIHRtYXJrID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHN0YXJ0IDwgbGVuICYmIHN0ci5jaGFyQXQoc3RhcnQpID09ICctJykKLSAgICAgICAgewotICAgICAgICAgICAgX3NpZ24gPSAtMTsKLSAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnQgPj0gbGVuIHx8IHN0ci5jaGFyQXQoc3RhcnQpICE9ICdQJykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cmF0aW9uIG11c3QgYmVnaW4gd2l0aCBQIik7Ci0KLSAgICAgICAgc3RhcnQgKz0gMTsKLQotICAgICAgICBpbnQgc2VlbiA9IFNFRU5fTk9USElORzsKLSAgICAgICAgX2ZzID0gR0RhdGUuX3plcm87Ci0KLSAgICAgICAgZm9yICg7c3RhcnQgPCBsZW47IHN0YXJ0ICs9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gbmVndmFsID0gZmFsc2U7Ci0gICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChzdGFydCk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1QnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0bWFyaykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVyYXRpb24gbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgVCciKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VlbiA+IFNFRU5fREFZKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUIGluIGR1cmF0aW9uIG11c3QgcHJlY2VkZSB0aW1lIGZpZWxkcyIpOwotICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX0RBWTsKLSAgICAgICAgICAgICAgICB0bWFyayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gbGVuKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGR1cmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgY2ggPSBzdHIuY2hhckF0KHN0YXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmVndmFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gbGVuKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGR1cmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICBjaCA9IHN0ci5jaGFyQXQoc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFHRGF0ZS5pc0RpZ2l0KGNoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGR1cmF0aW9uIik7Ci0gICAgICAgICAgICBpbnQgdmFsdWUgPSBHRGF0ZS5kaWdpdFZhbChjaCk7Ci0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgICAgICAgICAgY2ggPSAoc3RhcnQgPCBsZW4pID8gc3RyLmNoYXJBdChzdGFydCkgOiAnXDAnOwotICAgICAgICAgICAgICAgIGlmICghR0RhdGUuaXNEaWdpdChjaCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIEdEYXRlLmRpZ2l0VmFsKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnLicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSBzdGFydDsKLSAgICAgICAgICAgICAgICBkbyBpICs9IDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgR0RhdGUuaXNEaWdpdChjaCA9IHN0ci5jaGFyQXQoaSkpKTsKLSAgICAgICAgICAgICAgICBfZnMgPSBuZXcgQmlnRGVjaW1hbChzdHIuc3ViU2VxdWVuY2Uoc3RhcnQsIGkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChpID49IGxlbiB8fCBjaCAhPSAnUycpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmVndmFsKQotICAgICAgICAgICAgICAgIHZhbHVlID0gLXZhbHVlOwotICAgICAgICAgICAgc3dpdGNoIChzZWVuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9OT1RISU5HOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1knKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9ZRUFSOwotICAgICAgICAgICAgICAgICAgICAgICAgX0NZID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9ZRUFSOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ00nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9NT05USDsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9NT05USDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdEJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fREFZOwotICAgICAgICAgICAgICAgICAgICAgICAgX0QgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX0RBWToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdIJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0bWFyaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIGluIGR1cmF0aW9uIG11c3QgZm9sbG93IFQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX0hPVVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfaCA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIFNFRU5fSE9VUjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdNJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0bWFyaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIGluIGR1cmF0aW9uIG11c3QgZm9sbG93IFQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX01JTlVURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9tID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9NSU5VVEU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnUycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG1hcmspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSBpbiBkdXJhdGlvbiBtdXN0IGZvbGxvdyBUIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9TRUNPTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfcyA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXJhdGlvbiBtdXN0IHNwZWNpZnkgWSBNIEQgVCBIIE0gUyBpbiBvcmRlciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgc2lnbiwKLSAgICAgKiB5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsCi0gICAgICogZnJhY3Rpb25hbCBzZWNvbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24oCi0gICAgICAgICAgICBpbnQgc2lnbiwKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKHNpZ24gIT0gMSAmJiBzaWduICE9IC0xKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICBfc2lnbiA9IHNpZ247Ci0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbiBmcm9tIGFub3RoZXIgR0R1cmF0aW9uU3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZ0R1cmF0aW9uKQotICAgIHsKLSAgICAgICAgX3NpZ24gPSBnRHVyYXRpb24uZ2V0U2lnbigpOwotICAgICAgICBfQ1kgPSBnRHVyYXRpb24uZ2V0WWVhcigpOwotICAgICAgICBfTSA9IGdEdXJhdGlvbi5nZXRNb250aCgpOwotICAgICAgICBfRCA9IGdEdXJhdGlvbi5nZXREYXkoKTsKLSAgICAgICAgX2ggPSBnRHVyYXRpb24uZ2V0SG91cigpOwotICAgICAgICBfbSA9IGdEdXJhdGlvbi5nZXRNaW51dGUoKTsKLSAgICAgICAgX3MgPSBnRHVyYXRpb24uZ2V0U2Vjb25kKCk7Ci0gICAgICAgIF9mcyA9IGdEdXJhdGlvbi5nZXRGcmFjdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbm90aGVyIEdEYXRlIHdpdGggdGhlIHNhbWUgdmFsdWUKLSAgICAgKiBhcyB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0R1cmF0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbCBHRHVyYXRpb24gaW5zdGFuY2VzIHJldHVybiB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGR1cmF0aW9uOiArMSBpcyBmb3J3YXJkcwotICAgICAqIGFuZCAtMSBpcyBiYWNrd2FyZHMgaW4gdGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFNpZ24oKQotICAgICAgICB7IHJldHVybiBfc2lnbjsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgeWVhciBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRZZWFyKCkKLSAgICAgICAgeyByZXR1cm4gX0NZOyAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbW9udGgtb2YteWVhciBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRNb250aCgpCi0gICAgICAgIHsgcmV0dXJuIF9NOyAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF5LW9mLW1vbnRoIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldERheSgpCi0gICAgICAgIHsgcmV0dXJuIF9EOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3VyLW9mLWRheSBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRIb3VyKCkKLSAgICAgICAgeyByZXR1cm4gX2g7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1pbnV0ZS1vZi1ob3VyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9tOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFNlY29uZCgpCi0gICAgICAgIHsgcmV0dXJuIF9zOyB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZC4gUmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCi0gICAgICovCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0RnJhY3Rpb24oKQotICAgICAgICB7IHJldHVybiBfZnM7IH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cwotICAgICAqIG9mIHRoZSBkdXJhdGlvbiBhcmUgbm9ubmVnYXRpdmUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0gICAgewotICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5pc1ZhbGlkRHVyYXRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEdXJhdGlvbi4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKLSAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQotICAgICAqIDwvdWw+Ci0gICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cwotICAgICAqIG9mIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5jb21wYXJlRHVyYXRpb25zKHRoaXMsIGR1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmF0dXJhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1cmF0aW9uLgotICAgICAqIDxwPgotICAgICAqIEFueSBjb21wb25lbnRzIHRoYXQgYXJlIHplcm8gYXJlIG9taXR0ZWQuIE5vdGUgdGhhdCBpZiB0aGUgZHVyYXRpb24KLSAgICAgKiBpcyBpbnZhbGlkLCBpLmUuLCBpdCBoYXMgbmVnYXRpdmUgY29tcG9uZW50cywgdGhvc2UgbmVnYXRpdmUKLSAgICAgKiBjb21wb25lbnRzIGFyZSBzZXJpYWxpemVkIG91dCBoZXJlLiBUbyBjaGVjayBmb3IgdmFsaWRpdHksIHVzZQotICAgICAqIHRoZSBpc1ZhbGlkKCkgbWV0aG9kOyBhbmQgdG8gbm9ybWFsaXplIG1vc3QgZHVyYXRpb25zIHRvIGEgdmFsaWQKLSAgICAgKiBmb3JtIHVzZSB0aGUgbm9ybWFsaXplKCkgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEdXJhdGlvbkJ1aWxkZXIuZm9ybWF0RHVyYXRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBHRHVyYXRpb24gd2hpY2ggaXMgdGhlIHN1bSBvZiB0aGlzIG9uZSBhbmQgdGhlCi0gICAgICogc3VwcGxpZWQgZHVyYXRpb24uICBEb2VzIGEgZmllbGR3aXNlIGFkZGl0aW9uLCB3aXRoIG5vIG5vcm1hbGl6YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbiBhZGQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGludCBzaWduID0gX3NpZ24gKiBkdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIHJldHVybiBfYWRkKGR1cmF0aW9uLCBzaWduKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEdEdXJhdGlvbiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nCi0gICAgICogdGhlIHN1cHBsaWVkIGR1cmF0aW9uIGZyb20gdGhpcyBvbmUuICBEb2VzIGEgZmllbGR3aXNlCi0gICAgICogc3VidHJhY3Rpb24sIHdpdGggbm8gbm9ybWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uIHN1YnRyYWN0KEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCi0gICAgewotICAgICAgICBpbnQgc2lnbiA9IC1fc2lnbiAqIGR1cmF0aW9uLmdldFNpZ24oKTsKLSAgICAgICAgcmV0dXJuIF9hZGQoZHVyYXRpb24sIHNpZ24pOwotICAgIH0KLQotICAgIHByaXZhdGUgR0R1cmF0aW9uIF9hZGQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbiwgaW50IHNpZ24pCi0gICAgewotICAgICAgICBHRHVyYXRpb24gcmVzdWx0ID0gbmV3IEdEdXJhdGlvbih0aGlzKTsKLSAgICAgICAgcmVzdWx0Ll9DWSArPSBzaWduICogZHVyYXRpb24uZ2V0WWVhcigpOwotICAgICAgICByZXN1bHQuX00gKz0gc2lnbiAqIGR1cmF0aW9uLmdldE1vbnRoKCk7Ci0gICAgICAgIHJlc3VsdC5fRCArPSBzaWduICogZHVyYXRpb24uZ2V0RGF5KCk7Ci0gICAgICAgIHJlc3VsdC5faCArPSBzaWduICogZHVyYXRpb24uZ2V0SG91cigpOwotICAgICAgICByZXN1bHQuX20gKz0gc2lnbiAqIGR1cmF0aW9uLmdldE1pbnV0ZSgpOwotICAgICAgICByZXN1bHQuX3MgKz0gc2lnbiAqIGR1cmF0aW9uLmdldFNlY29uZCgpOwotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXRGcmFjdGlvbigpLnNpZ251bSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIGlmIChyZXN1bHQuX2ZzLnNpZ251bSgpID09IDAgJiYgc2lnbiA9PSAxKQotICAgICAgICAgICAgcmVzdWx0Ll9mcyA9IGR1cmF0aW9uLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdC5fZnMgPSBzaWduID4gMCA/Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5fZnMuYWRkKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpIDoKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0Ll9mcy5zdWJ0cmFjdChkdXJhdGlvbi5nZXRGcmFjdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUd28gR0R1cmF0aW9ucyBhcmUgZXF1YWwgaWYgYWxsIHRoZWlyIGZpZWxkcyBhcmUgZXF1YWwuCi0gICAgICogVGhlIGVxdWFscyBmdW5jdGlvbiBkb2VzIG5vdCBhcHBseSBub3JtYWxpemF0aW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqID09IHRoaXMpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgR0R1cmF0aW9uKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBHRHVyYXRpb24gZHVyYXRpb24gPSAoR0R1cmF0aW9uKW9iajsKLSAgICAgICAgcmV0dXJuIChfc2lnbiA9PSBkdXJhdGlvbi5nZXRTaWduKCkgJiYKLSAgICAgICAgICAgICAgICBfQ1kgPT0gZHVyYXRpb24uZ2V0WWVhcigpICYmCi0gICAgICAgICAgICAgICAgX00gPT0gZHVyYXRpb24uZ2V0TW9udGgoKSAmJgotICAgICAgICAgICAgICAgIF9EID09IGR1cmF0aW9uLmdldERheSgpICYmCi0gICAgICAgICAgICAgICAgX2ggPT0gZHVyYXRpb24uZ2V0SG91cigpICYmCi0gICAgICAgICAgICAgICAgX20gPT0gZHVyYXRpb24uZ2V0TWludXRlKCkgJiYKLSAgICAgICAgICAgICAgICBfcyA9PSBkdXJhdGlvbi5nZXRTZWNvbmQoKSAmJgotICAgICAgICAgICAgICAgIF9mcy5lcXVhbHMoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChfcyArCi0gICAgICAgICAgICAgICAgX20gKiAoNjAgKyA3KSArCi0gICAgICAgICAgICAgICAgX2ggKiAoNjAgKiA2MCArIDcpICsKLSAgICAgICAgICAgICAgICBfRCAqICg2MCAqIDYwICogMjQgKyA3KSArCi0gICAgICAgICAgICAgICAgX00gKiAoNjAgKiA2MCAqIDI0ICogMzEgKyA3KSArCi0gICAgICAgICAgICAgICAgX0NZICooNjAgKiA2MCAqIDI0ICogMzcyICsgNykgKwotICAgICAgICAgICAgICAgIF9zaWduICogMTE5MTcwNDkpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25CdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzBlNGRmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIFVzZWQgdG8gYnVpbGQge0BsaW5rIEdEdXJhdGlvbiBHRHVyYXRpb25zfS4KLSAqLyAKLXB1YmxpYyBjbGFzcyBHRHVyYXRpb25CdWlsZGVyIGltcGxlbWVudHMgR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIGludCBfc2lnbjsKLSAgICBwcml2YXRlIGludCBfQ1k7Ci0gICAgcHJpdmF0ZSBpbnQgX007Ci0gICAgcHJpdmF0ZSBpbnQgX0Q7Ci0gICAgcHJpdmF0ZSBpbnQgX2g7Ci0gICAgcHJpdmF0ZSBpbnQgX207Ci0gICAgcHJpdmF0ZSBpbnQgX3M7Ci0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9mczsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgR0R1cmF0aW9uQnVpbGRlciByZXByZXNlbnRpbmcgemVybyBzZWNvbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb25CdWlsZGVyKCkKLSAgICB7Ci0gICAgICAgIF9zaWduID0gKzE7Ci0gICAgICAgIF9mcyA9IEdEYXRlLl96ZXJvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRHVyYXRpb24gZnJvbSBhIGxleGljYWwKLSAgICAgKiByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uQnVpbGRlcihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IEdEdXJhdGlvbihzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbkJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHNpZ24sCi0gICAgICogeWVhciwgbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbAotICAgICAqIGZyYWN0aW9uYWwgc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uQnVpbGRlcigKLSAgICAgICAgICAgIGludCBzaWduLAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICBpZiAoc2lnbiAhPSAxICYmIHNpZ24gIT0gLTEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIF9zaWduID0gc2lnbjsKLSAgICAgICAgX0NZID0geWVhcjsKLSAgICAgICAgX00gPSBtb250aDsKLSAgICAgICAgX0QgPSBkYXk7Ci0gICAgICAgIF9oID0gaG91cjsKLSAgICAgICAgX20gPSBtaW51dGU7Ci0gICAgICAgIF9zID0gc2Vjb25kOwotICAgICAgICBfZnMgPSBmcmFjdGlvbiA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcmFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uQnVpbGRlciBmcm9tIGFub3RoZXIgR0R1cmF0aW9uQnVpbGRlclNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbkJ1aWxkZXIoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBnRHVyYXRpb24pCi0gICAgewotICAgICAgICBfc2lnbiA9IGdEdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIF9DWSA9IGdEdXJhdGlvbi5nZXRZZWFyKCk7Ci0gICAgICAgIF9NID0gZ0R1cmF0aW9uLmdldE1vbnRoKCk7Ci0gICAgICAgIF9EID0gZ0R1cmF0aW9uLmdldERheSgpOwotICAgICAgICBfaCA9IGdEdXJhdGlvbi5nZXRIb3VyKCk7Ci0gICAgICAgIF9tID0gZ0R1cmF0aW9uLmdldE1pbnV0ZSgpOwotICAgICAgICBfcyA9IGdEdXJhdGlvbi5nZXRTZWNvbmQoKTsKLSAgICAgICAgX2ZzID0gZ0R1cmF0aW9uLmdldEZyYWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFub3RoZXIgR0R1cmF0aW9uQnVpbGRlciB3aXRoIHRoZSBzYW1lIHZhbHVlCi0gICAgICogYXMgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdEdXJhdGlvbkJ1aWxkZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgR0R1cmF0aW9uIGZyb20gdGhpcyBHRHVyYXRpb25CdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24gdG9HRHVyYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRHVyYXRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0byB0aGlzIGR1cmF0aW9uLiAgRG9lcyBhIGZpZWxkd2lzZSBhZGQsIHdpdGggbm8KLSAgICAgKiBub3JtYWxpemF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEdEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgaW50IHNpZ24gPSBfc2lnbiAqIGR1cmF0aW9uLmdldFNpZ24oKTsKLSAgICAgICAgX2FkZChkdXJhdGlvbiwgc2lnbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VidHJhY3RzIGZyb20gdGhpcyBkdXJhdGlvbi4gIERvZXMgYSBmaWVsZHdpc2Ugc3VidHJhY3Rpb24sCi0gICAgICogd2l0aCBubyBub3JtYWxpemF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN1YnRyYWN0R0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCi0gICAgewotICAgICAgICBpbnQgc2lnbiA9IC1fc2lnbiAqIGR1cmF0aW9uLmdldFNpZ24oKTsKLSAgICAgICAgX2FkZChkdXJhdGlvbiwgc2lnbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIF9hZGQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbiwgaW50IHNpZ24pCi0gICAgewotICAgICAgICBfQ1kgKz0gc2lnbiAqIGR1cmF0aW9uLmdldFllYXIoKTsKLSAgICAgICAgX00gKz0gc2lnbiAqIGR1cmF0aW9uLmdldE1vbnRoKCk7Ci0gICAgICAgIF9EICs9IHNpZ24gKiBkdXJhdGlvbi5nZXREYXkoKTsKLSAgICAgICAgX2ggKz0gc2lnbiAqIGR1cmF0aW9uLmdldEhvdXIoKTsKLSAgICAgICAgX20gKz0gc2lnbiAqIGR1cmF0aW9uLmdldE1pbnV0ZSgpOwotICAgICAgICBfcyArPSBzaWduICogZHVyYXRpb24uZ2V0U2Vjb25kKCk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoX2ZzLnNpZ251bSgpID09IDAgJiYgc2lnbiA9PSAxKQotICAgICAgICAgICAgX2ZzID0gZHVyYXRpb24uZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX2ZzID0gc2lnbiA+IDAgPwotICAgICAgICAgICAgICAgICAgICBfZnMuYWRkKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpIDoKLSAgICAgICAgICAgICAgICAgICAgX2ZzLnN1YnRyYWN0KGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNpZ24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2lnbihpbnQgc2lnbikKLSAgICB7Ci0gICAgICAgIGlmIChzaWduICE9IDEgJiYgc2lnbiAhPSAtMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgX3NpZ24gPSBzaWduOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHllYXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFllYXIoaW50IHllYXIpCi0gICAgICAgIHsgX0NZID0geWVhcjsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbW9udGggY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vbnRoKGludCBtb250aCkKLSAgICAgICAgeyBfTSA9IG1vbnRoOyB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXkgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERheShpbnQgZGF5KQotICAgICAgICB7IF9EID0gZGF5OyAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaG91ciBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG91cihpbnQgaG91cikKLSAgICAgICAgeyBfaCA9IGhvdXI7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtaW51dGUgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1pbnV0ZShpbnQgbWludXRlKQotICAgICAgICB7IF9tID0gbWludXRlOyB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZWNvbmQgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlY29uZChpbnQgc2Vjb25kKQotICAgICAgICB7IF9zID0gc2Vjb25kOyB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZyYWN0aW9uKEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgICAgIHsgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247IH0KLQotICAgIC8qKgotICAgICAqIEFsbCBHRHVyYXRpb24gaW5zdGFuY2VzIHJldHVybiB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGR1cmF0aW9uOiArMSBpcyBmb3J3YXJkcwotICAgICAqIGFuZCAtMSBpcyBiYWNrd2FyZHMgaW4gdGltZS4KLSAgICAgKiBUaGlzIHZhbHVlIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlCi0gICAgICogdHJ1ZSBkaXJlY3Rpb24gb2YgdGhlIGR1cmF0aW9uIGlmIHRoZSBkdXJhdGlvbgotICAgICAqIGlzIG5vdCBub3JtYWxpemVkIG9yIG5vdCBub3JtYWxpemFibGUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTaWduKCkKLSAgICAgICAgeyByZXR1cm4gX3NpZ247IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0WWVhcigpCi0gICAgICAgIHsgcmV0dXJuIF9DWTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1vbnRoLW9mLXllYXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TW9udGgoKQotICAgICAgICB7IHJldHVybiBfTTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRheS1vZi1tb250aCBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXREYXkoKQotICAgICAgICB7IHJldHVybiBfRDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG91ci1vZi1kYXkgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SG91cigpCi0gICAgICAgIHsgcmV0dXJuIF9oOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW51dGUtb2YtaG91ciBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRNaW51dGUoKQotICAgICAgICB7IHJldHVybiBfbTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vjb25kLW9mLW1pbnV0ZSBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTZWNvbmQoKQotICAgICAgICB7IHJldHVybiBfczsgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQuIFJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX2ZzOyB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIGNvbXBvbmVudHMKLSAgICAgKiBvZiB0aGUgZHVyYXRpb24gYXJlIG5vbm5lZ2F0aXZlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEdXJhdGlvbkJ1aWxkZXIuaXNWYWxpZER1cmF0aW9uKHRoaXMpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsaXplIGEgZHVyYXRpb24gdmFsdWUuIFRoaXMgZW5zdXJlcyB0aGF0IG1vbnRocywKLSAgICAgKiBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIGZyYWN0aW9ucyBhcmUgcG9zaXRpdmUgYW5kCi0gICAgICogd2l0aGluIHRoZSByYW5nZXMgMC4uMTEsIDAuLjIzLCAwLi41OSwgZXRjLiBOZWdhdGl2ZQotICAgICAqIGR1cmF0aW9ucyBhcmUgaW5kaWNhdGVkIGJ5IGEgbmVnYXRpdmUgc2lnbiByYXRoZXIKLSAgICAgKiB0aGFuIG5lZ2F0aXZlIGNvbXBvbmVudHMuCi0gICAgICogPHA+Ci0gICAgICogTW9zdCBkdXJhdGlvbiBzcGVjaWZpY2F0aW9ucyBjYW4gYmUgbm9ybWFsaXplZCB0bwotICAgICAqIHZhbGlkIGR1cmF0aW9ucyB3aXRoIGFsbCBwb3NpdGl2ZSBjb21wb25lbnRzLCBidXQKLSAgICAgKiBub3QgYWxsIG9mIHRoZW0gY2FuLgotICAgICAqIDxwPgotICAgICAqIFRoZSBvbmx5IHNpdHVhdGlvbnMgd2hpY2ggY2Fubm90IGJlIG5vcm1hbGl6ZWQgYXJlCi0gICAgICogd2hlcmUgdGhlIHllYXIvbW9udGggYW5kIHRoZSBkYXkvaG91ci9taW51dGUvc2Vjb25kCi0gICAgICogb2Zmc2V0cyBhcmUgb2Ygb3Bwb3NpdGUgc2lnbi4gRGF5cyBjYW5ub3QgYmUgY2FycmllZAotICAgICAqIGludG8gbW9udGhzIHNpbmNlIHRoZSBsZW5ndGggb2YgYSBHcmVnb3JpYW4gbW9udGggaXMKLSAgICAgKiB2YXJpYWJsZSBkZXBlbmRpbmcgb24gd2hlbiB0aGUgZHVyYXRpb24gaXMgYXBwbGllZC4KLSAgICAgKiBJbiB0aGVzZSBjYXNlcywgdGhpcyBtZXRob2Qgbm9ybWFsaXplcyB0aGUgY29tcG9uZW50cwotICAgICAqIHNvIHRoYXQgImRheSIgaXMgdGhlIG9ubHkgbmVnYXRpdmUgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpCi0gICAgewotICAgICAgICBfbm9ybWFsaXplSW1wbCh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmUXVvdGllbnQoYSwgYikgPSB0aGUgZ3JlYXRlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYS9iCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBfZlF1b3RpZW50KGxvbmcgYSwgaW50IGIpCi0gICAgewotICAgICAgICBpZiAoKGEgPCAwKSA9PSAoYiA8IDApKQotICAgICAgICAgICAgcmV0dXJuIGEgLyBiOwotCi0gICAgICAgIHJldHVybiAtKChiIC0gYSAtIDEpIC8gYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbW9kdWxvKGEsIGIpID0gYSAtIGZRdW90aWVudChhLGIpKmIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX21vZChsb25nIGEsIGludCBiLCBsb25nIHF1b3RpZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpbnQpKGEgLSBxdW90aWVudCpiKSA7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIGltcGxlbWVuYXRpb24gb2Ygbm9ybWFsaXplLiBUaGUgZmxhZyBpcwotICAgICAqIHRvIGZhY2lsaXRhdGUgdGhpcyBtZXRob2QgY2FsbGluZyBpdHNlbGYgd2l0aG91dAotICAgICAqIGRhbmdlciBvZiBpbmZpbml0ZSByZWN1cnNpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9ub3JtYWxpemVJbXBsKGJvb2xlYW4gYWRqdXN0U2lnbikKLSAgICB7Ci0gICAgICAgIGxvbmcgdGVtcDsKLQotICAgICAgICAvLyBtb250aHMgdG8geWVhcnMKLSAgICAgICAgaWYgKF9NIDwgMCB8fCBfTSA+IDExKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gX007Ci0gICAgICAgICAgICBsb25nIHljYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgMTIpOwotICAgICAgICAgICAgX00gPSBfbW9kKHRlbXAsIDEyLCB5Y2FycnkpOwotICAgICAgICAgICAgX0NZICs9IHljYXJyeTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgY2FycnkgPSAwOwotCi0gICAgICAgIC8vIGZyYWN0aW9ucyB0byBzZWNvbmRzCi0gICAgICAgIGlmIChfZnMgIT0gbnVsbCAmJiAoX2ZzLnNpZ251bSgpIDwgMCB8fCBfZnMuY29tcGFyZVRvKEdEYXRlLl9vbmUpID49IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIGJkY2FycnkgPSBfZnMuc2V0U2NhbGUoMCwgQmlnRGVjaW1hbC5ST1VORF9GTE9PUik7Ci0gICAgICAgICAgICBfZnMgPSBfZnMuc3VidHJhY3QoYmRjYXJyeSk7Ci0gICAgICAgICAgICBjYXJyeSA9IGJkY2FycnkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYXJyeSAhPSAwIHx8IF9zIDwgMCB8fCBfcyA+IDU5IHx8IF9tIDwgMCB8fCBfbSA+IDUwIHx8IF9oIDwgMCB8fCBfaCA+IDIzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZWNvbmRzCi0gICAgICAgICAgICB0ZW1wID0gX3MgKyBjYXJyeTsKLSAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCA2MCk7Ci0gICAgICAgICAgICBfcyA9IF9tb2QodGVtcCwgNjAsIGNhcnJ5KTsKLQotICAgICAgICAgICAgLy8gbWludXRlcwotICAgICAgICAgICAgdGVtcCA9IF9tICsgY2Fycnk7Ci0gICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgNjApOwotICAgICAgICAgICAgX20gPSBfbW9kKHRlbXAsIDYwLCBjYXJyeSk7Ci0KLSAgICAgICAgICAgIC8vIGhvdXJzCi0gICAgICAgICAgICB0ZW1wID0gX2ggKyBjYXJyeTsKLSAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCAyNCk7Ci0gICAgICAgICAgICBfaCA9IF9tb2QodGVtcCwgMjQsIGNhcnJ5KTsKLSAgICAgICAgICAgIF9EICs9IGNhcnJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9DWSA9PSAwICYmIF9NID09IDAgJiYgX0QgPT0gMCAmJiBfaCA9PSAwICYmIF9tID09IDAgJiYgX3MgPT0gMCAmJiAoX2ZzID09IG51bGwgfHwgX2ZzLnNpZ251bSgpID09IDApKQotICAgICAgICAgICAgX3NpZ24gPSAxOwotCi0gICAgICAgIGlmIChhZGp1c3RTaWduICYmIChfRCA8IDAgfHwgX0NZIDwgMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBzaWduID0gKF9EIDw9IDAgJiYgKF9DWSA8IDAgfHwgX0NZID09IDAgJiYgX00gPT0gMCkpID8gLV9zaWduIDogX2dldFRvdGFsU2lnblNsb3dseSgpOwotICAgICAgICAgICAgaWYgKHNpZ24gPT0gMikKLSAgICAgICAgICAgICAgICBzaWduID0gKF9DWSA8IDApID8gLV9zaWduIDogX3NpZ247Ci0gICAgICAgICAgICBpZiAoc2lnbiA9PSAwKQotICAgICAgICAgICAgICAgIHNpZ24gPSAxOwotICAgICAgICAgICAgaWYgKHNpZ24gIT0gX3NpZ24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3NpZ24gPSBzaWduOwotICAgICAgICAgICAgICAgIF9DWSA9IC1fQ1k7Ci0gICAgICAgICAgICAgICAgX00gPSAtX007Ci0gICAgICAgICAgICAgICAgX0QgPSAtX0Q7Ci0gICAgICAgICAgICAgICAgX2ggPSAtX2g7Ci0gICAgICAgICAgICAgICAgX20gPSAtX207Ci0gICAgICAgICAgICAgICAgX3MgPSAtX3M7Ci0gICAgICAgICAgICAgICAgaWYgKF9mcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfZnMgPSBfZnMubmVnYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfbm9ybWFsaXplSW1wbChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gaXNWYWxpZER1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gc3BlYykKLSAgICB7Ci0gICAgICAgIGlmICghKHNwZWMuZ2V0U2lnbigpID09IDEgfHwgc3BlYy5nZXRTaWduKCkgPT0gLTEpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiAoc3BlYy5nZXRZZWFyKCkgPj0gMCAmJiBzcGVjLmdldE1vbnRoKCkgPj0gMCAmJiBzcGVjLmdldERheSgpID49IDAgJiYKLSAgICAgICAgICAgICAgICBzcGVjLmdldEhvdXIoKSA+PSAwICYmIHNwZWMuZ2V0TWludXRlKCkgPj0gMCAgJiYgc3BlYy5nZXRTZWNvbmQoKSA+PSAwICYmCi0gICAgICAgICAgICAgICAgc3BlYy5nZXRGcmFjdGlvbigpLnNpZ251bSgpID49IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmlzb24gdG8gYW5vdGhlciBHRHVyYXRpb24uCi0gICAgICogPHVsPgotICAgICAqIDxsaT5SZXR1cm5zIC0xIGlmIHRoaXMgPCBkYXRlLiAobGVzcy10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDAgaWYgdGhpcyA9PSBkYXRlLiAoZXF1YWwpCi0gICAgICogPGxpPlJldHVybnMgMSBpZiB0aGlzID4gZGF0ZS4gKGdyZWF0ZXItdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAyIGlmIHRoaXMgPD4gZGF0ZS4gKGluY29tcGFyYWJsZSkKLSAgICAgKiA8L3VsPgotICAgICAqIFR3byBpbnN0YW5jZXMgYXJlIGluY29tcGFyYWJsZSBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IGFtb3VudHMKLSAgICAgKiBvZiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUb0dEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEdXJhdGlvbkJ1aWxkZXIuY29tcGFyZUR1cmF0aW9ucyh0aGlzLCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hdHVyYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkdXJhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBBbnkgY29tcG9uZW50cyB0aGF0IGFyZSB6ZXJvIGFyZSBvbWl0dGVkLiBOb3RlIHRoYXQgaWYgdGhlIGR1cmF0aW9uCi0gICAgICogaXMgaW52YWxpZCwgaS5lLiwgaXQgaGFzIG5lZ2F0aXZlIGNvbXBvbmVudHMsIHRob3NlIG5lZ2F0aXZlCi0gICAgICogY29tcG9uZW50cyBhcmUgc2VyaWFsaXplZCBvdXQgaGVyZS4gVG8gY2hlY2sgZm9yIHZhbGlkaXR5LCB1c2UKLSAgICAgKiB0aGUgaXNWYWxpZCgpIG1ldGhvZDsgYW5kIHRvIG5vcm1hbGl6ZSBtb3N0IGR1cmF0aW9ucyB0byBhIHZhbGlkCi0gICAgICogZm9ybSB1c2UgdGhlIG5vcm1hbGl6ZSgpIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmZvcm1hdER1cmF0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBjb21wYXJlRHVyYXRpb25zKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZDEsIEdEdXJhdGlvblNwZWNpZmljYXRpb24gZDIpCi0gICAgewotICAgICAgICAvLyBmaXJzdCBkbyBhbiBhbGwtZmllbGRzIGNoZWNrCi0gICAgICAgIGlmIChkMS5nZXRGcmFjdGlvbigpLnNpZ251bSgpID09IDAgJiYgZDIuZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgczEgPSBkMS5nZXRTaWduKCk7Ci0gICAgICAgICAgICBpbnQgczIgPSBkMi5nZXRTaWduKCk7Ci0gICAgICAgICAgICBsb25nIG1vbnRoMSA9IHMxICogKChsb25nKWQxLmdldFllYXIoKSAqIDEyICsgZDEuZ2V0TW9udGgoKSk7Ci0gICAgICAgICAgICBsb25nIG1vbnRoMiA9IHMyICogKChsb25nKWQyLmdldFllYXIoKSAqIDEyICsgZDIuZ2V0TW9udGgoKSk7Ci0gICAgICAgICAgICBsb25nIHNlYzEgPSBzMSAqICgoKChsb25nKWQxLmdldERheSgpICogMjQgKyBkMS5nZXRIb3VyKCkpICogNjAgKyBkMS5nZXRNaW51dGUoKSkgKiA2MCArIGQxLmdldFNlY29uZCgpKTsKLSAgICAgICAgICAgIGxvbmcgc2VjMiA9IHMyICogKCgoKGxvbmcpZDIuZ2V0RGF5KCkgKiAyNCArIGQyLmdldEhvdXIoKSkgKiA2MCArIGQyLmdldE1pbnV0ZSgpKSAqIDYwICsgZDIuZ2V0U2Vjb25kKCkpOwotICAgICAgICAgICAgaWYgKG1vbnRoMSA9PSBtb250aDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlYzEgPT0gc2VjMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgaWYgKHNlYzEgPCBzZWMyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKHNlYzEgPiBzZWMyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtb250aDEgPCBtb250aDIgJiYgc2VjMSAtIHNlYzIgPCAyOCAqIDI0ICogNjAgKiA2MCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAobW9udGgxID4gbW9udGgyICYmIHNlYzIgLSBzZWMxIDwgMjggKiAyNCAqIDYwICogNjApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGUgYW5zd2VyIGlzbid0IG9idmlvdXMsIHNvIHRoZW4gZG8gYSB0b3RhbC1zaWduIGNoZWNrCi0gICAgICAgIEdEdXJhdGlvbkJ1aWxkZXIgZGlmZiA9IG5ldyBHRHVyYXRpb25CdWlsZGVyKGQxKTsKLSAgICAgICAgZGlmZi5zdWJ0cmFjdEdEdXJhdGlvbihkMik7Ci0gICAgICAgIHJldHVybiBkaWZmLl9nZXRUb3RhbFNpZ25TbG93bHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXIgc2NoZW1hIHNwZWMsIGNvbXBhcmlzb24gb2YgZHVyYXRpb25zIGlzIHNpbXBseSBkb25lCi0gICAgICogYnkgY2FsY3VsYXRpbmcgYWRkaW5nIHRoZSBkdXJhdGlvbiB0byB0aGVzZSBmb3VyIGRhdGVzIGFuZAotICAgICAqIGNvbXBhcmluZyB0aGUgcmVzdWx0cy4gSWYgdGhlIHJlc3VsdHMgYXJlIGFtYmlndW91cywgdGhlCi0gICAgICogYW5zd2VyIGlzICJpbmNvbXBhcmFibGUiLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEdEYXRlW10gX2NvbXBEYXRlID0gbmV3IEdEYXRlW10KLSAgICB7Ci0gICAgICAgIG5ldyBHRGF0ZSgxNjk2LCA5LCAxLCAwLCAwLCAwLCBudWxsLCAwLCAwLCAwKSwKLSAgICAgICAgbmV3IEdEYXRlKDE2OTcsIDIsIDEsIDAsIDAsIDAsIG51bGwsIDAsIDAsIDApLAotICAgICAgICBuZXcgR0RhdGUoMTkwMywgMywgMSwgMCwgMCwgMCwgbnVsbCwgMCwgMCwgMCksCi0gICAgICAgIG5ldyBHRGF0ZSgxOTAzLCA3LCAxLCAwLCAwLCAwLCBudWxsLCAwLCAwLCAwKQotICAgIH07Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgdG90YWwgc2lnbiBvZiB0aGUgZHVyYXRpb24sICsxCi0gICAgICogaWYgdGhlIGR1cmF0aW9uIG1vdmVzIGZvcndhcmQgaW4gdGltZSwgLTEgaWYgdGhlCi0gICAgICogZHVyYXRpb24gbW92ZXMgYmFja3dhcmRzIGluIHRpbWUsIDAgaWYgdGhlIGR1cmF0aW9uCi0gICAgICogaXMgemVyby1sZW5ndGgsIGFuZCAyIGlmIHRoZSBkdXJhdGlvbiBtYXkgYmUgcG9zaXRpdmUKLSAgICAgKiBvciBuZWdhdGl2ZSBkZXBlbmRpbmcgb24gdGhlIGRhdGUuCi0gICAgICoKLSAgICAgKiAoRm9yIGV4YW1wbGUsIG9uZSBtb250aCBtaW51cyAzMCBkYXlzIGlzIGluZGV0ZXJtaW5hdGUpLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IF9nZXRUb3RhbFNpZ25TbG93bHkoKQotICAgIHsKLSAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgIGludCBuZWcgPSAwOwotICAgICAgICBpbnQgemVyID0gMDsKLQotICAgICAgICBHRGF0ZUJ1aWxkZXIgZW5kZGF0ZSA9IG5ldyBHRGF0ZUJ1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY29tcERhdGUubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuZGRhdGUuc2V0R0RhdGUoX2NvbXBEYXRlW2ldKTsKLSAgICAgICAgICAgIGVuZGRhdGUuYWRkR0R1cmF0aW9uKHRoaXMpOwotICAgICAgICAgICAgc3dpdGNoIChlbmRkYXRlLmNvbXBhcmVUb0dEYXRlKF9jb21wRGF0ZVtpXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgICAgICAgICAgbmVnKys7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgemVyKys7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcG9zKys7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBvcyA9PSBfY29tcERhdGUubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuICsxOwotICAgICAgICBpZiAobmVnID09IF9jb21wRGF0ZS5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmICh6ZXIgPT0gX2NvbXBEYXRlLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgZm9ybWF0RHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIC8vIFNpZ24rUDogICAgICAoLSk/UAotICAgICAgICAvLyBZZWFyOiAgICAgICAgKD86KFxkKylZKT8KLSAgICAgICAgLy8gTW9udGg6ICAgICAgICg/OihcZCspTSk/Ci0gICAgICAgIC8vIERheTogICAgICAgICAoPzooXGQrKUQpPwotICAgICAgICAvLyBUaW1lOiAgICAgICAgKD86KFQpCi0gICAgICAgIC8vIEhvdXJzOiAgICAgICAgICAoPzooXGQrKUgpPwotICAgICAgICAvLyBNaW51dGVzOiAgICAgICAgKD86KFxkKylNKT8KLSAgICAgICAgLy8gU2Vjb25kczogICAgICAgICg/OihcZCsoPzpcLlxkKik/fCg/Oi5cZCspUyk/Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKDMwKTsKLQotICAgICAgICBpZiAoZHVyYXRpb24uZ2V0U2lnbigpIDwgMCkKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCctJyk7Ci0KLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ1AnKTsKLQotICAgICAgICBpZiAoZHVyYXRpb24uZ2V0WWVhcigpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGR1cmF0aW9uLmdldFllYXIoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnWScpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldE1vbnRoKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZHVyYXRpb24uZ2V0TW9udGgoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnTScpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldERheSgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGR1cmF0aW9uLmdldERheSgpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdEJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHVyYXRpb24uZ2V0SG91cigpICE9IDAgfHwgZHVyYXRpb24uZ2V0TWludXRlKCkgIT0gMCB8fCBkdXJhdGlvbi5nZXRTZWNvbmQoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdUJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHVyYXRpb24uZ2V0SG91cigpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGR1cmF0aW9uLmdldEhvdXIoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnSCcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldE1pbnV0ZSgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGR1cmF0aW9uLmdldE1pbnV0ZSgpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdNJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIHMgPSBkdXJhdGlvbi5nZXRGcmFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGR1cmF0aW9uLmdldFNlY29uZCgpICE9IDApCi0gICAgICAgICAgICAgICAgcyA9IHMuYWRkKEJpZ0RlY2ltYWwudmFsdWVPZihkdXJhdGlvbi5nZXRTZWNvbmQoKSkpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQocyk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnUycpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGR1cmF0aW9uLmdldFNlY29uZCgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGR1cmF0aW9uLmdldFNlY29uZCgpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdTJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5sZW5ndGgoKSA8PSAyKQotICAgICAgICAgICAgLy8gU3BlY2lmeSB6ZXJvIHNlY29uZHMgaWYgZXZlcnl0aGluZyB3YXMgMAotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIlQwUyIpOwotCi0gICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvblNwZWNpZmljYXRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25TcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzVjZmYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvblNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIFhNTCBTY2hlbWEtY29tcGF0aWJsZSBkdXJhdGlvbi4KLSAqIDxwPgotICogQm90aCB0aGUgaW1tdXRhYmxlIEdEdXJhdGlvbiBhbmQgdGhlIG11dGFibGUgR0R1cmF0aW9uQnVpbGRlciBhcmUKLSAqIEdEdXJhdGlvblNwZWNpZmljYXRpb25zLiAgVXNlIHRoaXMgaW50ZXJmYWNlIHdoZXJlIHlvdSB3YW50IHRvCi0gKiBhbGxvdyBjYWxsZXJzIHRvIHBhc3MgYW55IGltcGxlbWVudGF0aW9uIG9mIGEgR0R1cmF0aW9uLgotICogCi0gKiBAc2VlIEdEdXJhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdEdXJhdGlvblNwZWNpZmljYXRpb24KLXsKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgaW5zdGFuY2UgaXMgaW1tdXRhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNJbW11dGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGR1cmF0aW9uOiArMSBpcyBmb3J3YXJkcwotICAgICAqIGFuZCAtMSBpcyBiYWNrd2FyZHMgaW4gdGltZS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0U2lnbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgeWVhciBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldFllYXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1vbnRoLW9mLXllYXIgY29tcG9uZW50LgotICAgICAqLwotICAgIGludCBnZXRNb250aCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF5LW9mLW1vbnRoIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RGF5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3VyLW9mLWRheSBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldEhvdXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1pbnV0ZS1vZi1ob3VyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBpbnQgZ2V0TWludXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBpbnQgZ2V0U2Vjb25kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQuIFJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIEJpZ0RlY2ltYWwgZ2V0RnJhY3Rpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cwotICAgICAqIG9mIHRoZSBkdXJhdGlvbiBhcmUgbm9ubmVnYXRpdmUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0R1cmF0aW9uLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgaW50IGNvbXBhcmVUb0dEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZUNhY2hlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDU1ZjU5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQSBjYWNoZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wgUU5hbWUgaW5zdGFuY2VzLiAgRWFjaCB0aHJlYWQgaGFzIG9uZS4KLSAqLyAKLXB1YmxpYyBmaW5hbCBjbGFzcyBRTmFtZUNhY2hlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEID0gMC43MGY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotICAgIHByaXZhdGUgaW50IG51bUVudHJpZXMgPSAwOwotICAgIHByaXZhdGUgaW50IHRocmVzaG9sZDsKLSAgICBwcml2YXRlIGludCBoYXNobWFzazsKLSAgICBwcml2YXRlIFFOYW1lW10gdGFibGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUU5hbWVDYWNoZSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsQ2FwYWNpdHkgYW5kIGxvYWRGYWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gaW5pdGlhbGx5IG1ha2Ugc3BhY2UgZm9yCi0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgYSBudW1iZXIgdG8gY29udHJvbCB0aGUgZGVuc2l0eSBvZiB0aGUgaGFzaHRhYmxlCi0gICAgICovIAotICAgIHB1YmxpYyBRTmFtZUNhY2hlKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpCi0gICAgewotICAgICAgICBhc3NlcnQgaW5pdGlhbENhcGFjaXR5ID4gMDsKLSAgICAgICAgYXNzZXJ0IGxvYWRGYWN0b3IgPiAwICYmIGxvYWRGYWN0b3IgPCAxOwotCi0gICAgICAgIC8vIEZpbmQgYSBwb3dlciBvZiAyID49IGluaXRpYWxDYXBhY2l0eQotICAgICAgICBpbnQgY2FwYWNpdHkgPSAxNjsKLSAgICAgICAgd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSAKLSAgICAgICAgICAgIGNhcGFjaXR5IDw8PSAxOwotICAgIAotICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotICAgICAgICB0aGlzLmhhc2htYXNrID0gY2FwYWNpdHkgLSAxOwotICAgICAgICB0aHJlc2hvbGQgPSAoaW50KShjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotICAgICAgICB0YWJsZSA9IG5ldyBRTmFtZVtjYXBhY2l0eV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFFOYW1lQ2FjaGUgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbENhcGFjaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIG51bWJlciBvZiBlbnRyaWVzIHRvIGluaXRpYWxseSBtYWtlIHNwYWNlIGZvcgotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWVDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KQotICAgIHsKLSAgICAgICAgdGhpcyhpbml0aWFsQ2FwYWNpdHksIERFRkFVTFRfTE9BRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyBhIFFOYW1lIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZSBhbmQgbG9jYWxuYW1lLgotICAgICAqIENyZWF0ZXMgb25lIGlmIG9uZSBpcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgdGhlIGxvY2FsbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGNhY2hlZCBRTmFtZQotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgICovCi0gICAgICAgIGFzc2VydCBsb2NhbE5hbWUgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gIiI7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gaGFzaCh1cmksIGxvY2FsTmFtZSkgJiBoYXNobWFzazsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFFOYW1lIHEgPSB0YWJsZVtpbmRleF07Ci0gICAgICAgICAgICBpZiAocSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG51bUVudHJpZXMrKzsKLSAgICAgICAgICAgICAgICBpZiAobnVtRW50cmllcyA+PSB0aHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgICAgIHJlaGFzaCgpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2luZGV4XSA9IG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChlcXVhbHMocSwgdXJpLCBsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBxOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBpbmRleCA9IChpbmRleC0xKSAmIGhhc2htYXNrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlaGFzaCgpCi0gICAgewotICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdGFibGUubGVuZ3RoICogMjsKLSAgICAgICAgUU5hbWVbXSBuZXdUYWJsZSA9IG5ldyBRTmFtZVtuZXdMZW5ndGhdOwotICAgICAgICBpbnQgbmV3SGFzaG1hc2sgPSBuZXdMZW5ndGggLSAxOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHRhYmxlLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgcSA9IHRhYmxlW2ldOwotICAgICAgICAgICAgaWYgKHEgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSBoYXNoKHEuZ2V0TmFtZXNwYWNlVVJJKCksIHEuZ2V0TG9jYWxQYXJ0KCkpICYgbmV3SGFzaG1hc2s7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG5ld1RhYmxlW25ld0luZGV4XSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXdJbmRleCA9IChuZXdJbmRleCAtIDEpICYgbmV3SGFzaG1hc2s7Ci0gICAgICAgICAgICAgICAgbmV3VGFibGVbbmV3SW5kZXhdID0gcTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRhYmxlID0gbmV3VGFibGU7Ci0gICAgICAgIGhhc2htYXNrID0gbmV3SGFzaG1hc2s7Ci0gICAgICAgIHRocmVzaG9sZCA9IChpbnQpKG5ld0xlbmd0aCAqIGxvYWRGYWN0b3IpOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh1cmkuaGFzaENvZGUoKSA8PCA1KSArIGxvY2FsTmFtZS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKFFOYW1lIHEsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gcS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSAmJiBxLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh1cmkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZmM1MzMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgbGF0dGljZSBvZiBmaW5pdGUgYW5kIGluZmluaXRlIHNldHMgb2YgUU5hbWVzLgotICogVGhlIGxhdHRpY2UgdGhlIG1pbmltYWwgb25lIHRoYXQgaXMgY2xvc2VkIHVuZGVyIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGFuZAotICogaW52ZXJzZSwgYW5kIGNvbnRhaW5zIGluZGl2aWR1YWwgUU5hbWVzIGFzIHdlbGwgYXMgZW50aXJlIG5hbWVzcGFjZXMuCi0gKiBIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGUgdHdvIGtpbmRzIG9mIFFOYW1lU2V0czoKLSAqIDx1bD4KLSAqIDxsaT5BIFFOYW1lU2V0IGNhbiBjb3ZlciBhIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlcywgYWRkaXRpb25hbGx5IGluY2x1ZGluZyBhIGZpbml0ZQotICogICAgIHNldCBvZiBRTmFtZXMgb3V0c2lkZSB0aG9zZSBuYW1lc3BhY2VzLCBhbmQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi0gKiAgICAgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyBleGNsdWRlZCBmcm9tIHRob3NlIG5hbWVzcGFlczoKLSAqICAgPHVsPgotICogICA8bGk+ZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyA9PSB0aGUgc2V0IG9mIGV4Y2x1ZGVkIFFOYW1lcyBmcm9tIGNvdmVyZWRVUklzIG5hbWVzcGFjZXMKLSAqICAgPGxpPmV4Y2x1ZGVkVVJJcyA9PSBudWxsCi0gKiAgIDxsaT5pbmNsdWRlZFVSSXMgPT0gdGhlIHNldCBvZiBjb3ZlcmVkIG5hbWVzcGFjZSBVUklzCi0gKiAgIDxsaT5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzID09IHNldCBvZiBhZGRpdGlvbmFsIFFOYW1lcyBvdXRzaWRlIGNvdmVyZWRVUklzIG5hbWVzcGFjZXMKLSAqICAgPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+QSBRTmFtZVNldCBjYW4gY292ZXIgYWxsIG5hbWVzcGFjZXMgZXhjZXB0IGZvciBhIGZpbml0ZSBudW1iZXIgb2YgZXhjbHVkZWQgb25lcywKLSAqICAgICBhZGRpdGlvbmFsbHkgaW5jbHVkaW5nIGEgZmluaXRlIHNldCBvZiBRTmFtZXMgd2l0aGluIHRoZSBleGNsdWRlZCBuYW1lc3BhY2VzLAotICogICAgIGFuZCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyBvdXRzaWRlIHRoZSBleGNsdWRlZCBuYW1lc3BhY2VzOgotICogICA8dWw+Ci0gKiAgIDxsaT5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzID09IHRoZSBzZXQgb2YgZXhjbHVkZWQgUU5hbWVzIG91dHNpZGUgdW5jb3ZlcmVkVVJJcyBuYW1lc3BhY2VzCi0gKiAgIDxsaT5leGNsdWRlZFVSSXMgPT0gdGhlIHNldCBvZiB1bmNvdmVyZWQgbmFtZXNwYWNlIFVSSXMKLSAqICAgPGxpPmluY2x1ZGVkVVJJcyA9PSBudWxsCi0gKiAgIDxsaT5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzID09IHNldCBvZiBhZGRpdGlvbmFsIFFOYW1lcyBmcm9tIHVuY292ZXJlZFVSSXMgbmFtZXNwYWNlcwotICogICA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIE5vdGljZSB0aGF0IGEgZmluaXRlIHNldCBvZiBRTmFtZXMgaXMgYSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGZpcnN0Ci0gKiBjYXRlZ29yeSBvdXRsaW5lZCBhYm92ZToKLSAqIDx1bD4KLSAqIDxsaT5BIFFuYW1lU2V0IGNhbiBjb250YWluIGEgZmluaXRlIG51bWJlciBvZiBRTmFtZXM6Ci0gKiAgIDx1bD4KLSAqICAgPGxpPmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMgPT0gbnVsbAotICogICA8bGk+ZXhjbHVkZWRVUklzID09IG51bGwKLSAqICAgPGxpPmluY2x1ZGVkVVJJcyA9PSBlbXB0eSBzZXQKLSAqICAgPGxpPmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMgPT0gc2V0IG9mIGluY2x1ZGVkIFFOYW1lcwotICogICA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBRTmFtZVNldCBpbXBsZW1lbnRzIFFOYW1lU2V0U3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2ludmVydGVkOwotICAgIHByaXZhdGUgZmluYWwgU2V0IF9pbmNsdWRlZFVSSXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2V4Y2x1ZGVkUU5hbWVzOwotICAgIHByaXZhdGUgZmluYWwgU2V0IF9pbmNsdWRlZFFOYW1lczsKLQotICAgIC8qKgotICAgICAqIFRoZSBlbXB0eSBRTmFtZVNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lU2V0IEVNUFRZID0gbmV3IFFOYW1lU2V0KG51bGwsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFFOYW1lU2V0IGNvbnRhaW5pbmcgYWxsIFFOYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lU2V0IEFMTCA9IG5ldyBRTmFtZVNldChDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIG51bGwsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBRTmFtZVNldCBjb250YWluaW5nIGFsbCBRTmFtZXMgaW4gdGhlIGxvY2FsIChuby0pbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgTE9DQUwgPSBuZXcgUU5hbWVTZXQobnVsbCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKCIiKSwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFFOYW1lU2V0IGNvbnRhaW5pbmcgYWxsIFFOYW1lcyBleGNlcHQgZm9yIHRob3NlIGluIHRoZSBsb2NhbCAobm8tKW5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lU2V0IE5PTkxPQ0FMID0gbmV3IFFOYW1lU2V0KENvbGxlY3Rpb25zLnNpbmdsZXRvbigiIiksIG51bGwsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLQotICAgIC8qKgotICAgICAqIFByaXZhdGUgZnVuY3Rpb24gdG8gbWluaW1pemUgb2JqZWN0IGNyZWF0aW9uIHdoZW4gY29weWluZyBzZXRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFNldCBtaW5TZXRDb3B5KFNldCBvcmlnaW5hbCkKLSAgICB7Ci0gICAgICAgIGlmIChvcmlnaW5hbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmIChvcmlnaW5hbC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotICAgICAgICBpZiAob3JpZ2luYWwuc2l6ZSgpID09IDEpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG9yaWdpbmFsLml0ZXJhdG9yKCkubmV4dCgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0KG9yaWdpbmFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUU5hbWVTZXQgYmFzZWQgb24gdGhlIGdpdmVuIHNldHMgb2YgZXhjbHVkZWQgVVJJcywKLSAgICAgKiBpbmNsdWRlZCBVUklzLCBleGNsdWRlZCBRTmFtZXMgaW4gaW5jbHVkZWQgbmFtZXNwYWNlcywgYW5kIGluY2x1ZGVkCi0gICAgICogUU5hbWVzIGluIGV4Y2x1ZGVkIG5hbWVzcGFjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBuYW1lc3BhY2UgVVJJIHN0cmluZ3MgdG8gZXhjbHVkZSBmcm9tIHRoZSBzZXQsIG9yIG51bGwgaWYgdGhpcyBzZXQgaXMgaW5maW5pdGUKLSAgICAgKiBAcGFyYW0gaW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUkkgc3RyaW5ncyB0byBpbmNsdWRlIGluIHRoZSBzZXQsIG9yIG51bGwgaWYgdGhpcyBzZXQgaXMgaW5maW5pdGUKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBleGNlcHRpb25hbCBRTmFtZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSBpbmNsdWRlZCBuYW1lc3BhY2VzCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgZXhjZXB0aW9uYWwgUU5hbWVzIHRvIGluY2x1ZGUgdGhhdCBhcmUgaW4gdGhlIGV4Y2x1ZGVkIG5hbWVzcGFjZXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBRTmFtZVNldAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWVTZXQgZm9yU2V0cyhTZXQgZXhjbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRVUklzLCBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMpCi0gICAgewotICAgICAgICBpZiAoKGV4Y2x1ZGVkVVJJcyAhPSBudWxsKSA9PSAoaW5jbHVkZWRVUklzICE9IG51bGwpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXhhY3RseSBvbmUgb2YgZXhjbHVkZWRVUklzIGFuZCBpbmNsdWRlZFVSSXMgbXVzdCBiZSBudWxsIik7Ci0KLSAgICAgICAgaWYgKGV4Y2x1ZGVkVVJJcyA9PSBudWxsICYmIGluY2x1ZGVkVVJJcy5pc0VtcHR5KCkgJiYgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFk7Ci0gICAgICAgIGlmIChpbmNsdWRlZFVSSXMgPT0gbnVsbCAmJiBleGNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEFMTDsKLSAgICAgICAgaWYgKGV4Y2x1ZGVkVVJJcyA9PSBudWxsICYmIGluY2x1ZGVkVVJJcy5zaXplKCkgPT0gMSAmJiBpbmNsdWRlZFVSSXMuY29udGFpbnMoIiIpICYmCi0gICAgICAgICAgICBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzLmlzRW1wdHkoKSAmJiBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBMT0NBTDsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyA9PSBudWxsICYmIGV4Y2x1ZGVkVVJJcy5zaXplKCkgPT0gMSAmJiBleGNsdWRlZFVSSXMuY29udGFpbnMoIiIpICYmCi0gICAgICAgICAgICBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzLmlzRW1wdHkoKSAmJiBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBOT05MT0NBTDsKLQotICAgICAgICByZXR1cm4gbmV3IFFOYW1lU2V0KAotICAgICAgICAgICAgICAgIG1pblNldENvcHkoZXhjbHVkZWRVUklzKSwKLSAgICAgICAgICAgICAgICBtaW5TZXRDb3B5KGluY2x1ZGVkVVJJcyksCi0gICAgICAgICAgICAgICAgbWluU2V0Q29weShleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKSwKLSAgICAgICAgICAgICAgICBtaW5TZXRDb3B5KGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUU5hbWVTZXQgYmFzZWQgb24gdGhlIGdpdmVuIGFycmF5IG9mIGluY2x1ZGVkIFFOYW1lcwotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmNsdWRlZFFOYW1lcyB0aGUgYXJyYXkgb2YgaW5jbHVkZWQgUU5hbWVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBmb3JBcnJheShRTmFtZVtdIGluY2x1ZGVkUU5hbWVzKQotICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkUU5hbWVzID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmNsdWRlZFFOYW1lcyBjYW5ub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWVTZXQobnVsbCwgbmV3IEhhc2hTZXQoKSwgbnVsbCwgbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChpbmNsdWRlZFFOYW1lcykpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUU5hbWVTZXQgd2l0aCB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgZ2l2ZW4KLSAgICAgKiBRTmFtZVNldFNwZWNpZmljYXRpb24uCi0gICAgICogQHJldHVybiB0aGUgY29waWVkIFFOYW1lU2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBmb3JTcGVjaWZpY2F0aW9uKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzcGVjKQotICAgIHsKLSAgICAgICAgaWYgKHNwZWMgaW5zdGFuY2VvZiBRTmFtZVNldCkKLSAgICAgICAgICAgIHJldHVybiAoUU5hbWVTZXQpc3BlYzsKLSAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHMoc3BlYy5leGNsdWRlZFVSSXMoKSwgc3BlYy5pbmNsdWRlZFVSSXMoKSwgc3BlYy5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCksIHNwZWMuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUU5hbWVTZXQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gd2lsZGNhcmQgbmFtZXNwYWNlIHN0cmluZy4KLSAgICAgKiBUaGlzIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcywgcGx1cyBzcGVjaWFsIHRva2VucyBhcyBzcGVjaWZpZWQKLSAgICAgKiBpbiB0aGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uICgjI2FueSwgIyNvdGhlciwgIyN0YXJnZXROYW1lc3BhY2UsICMjbG9jYWwpLgotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFFOYW1lU2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBmb3JXaWxkY2FyZE5hbWVzcGFjZVN0cmluZyhTdHJpbmcgd2lsZGNhcmQsIFN0cmluZyB0YXJnZXRVUkkpCi0gICAgewotICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU3BlY2lmaWNhdGlvbihuZXcgUU5hbWVTZXRCdWlsZGVyKHdpbGRjYXJkLCB0YXJnZXRVUkkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUU5hbWVTZXQgY29udGFpbmluZyBvbmx5IHRoZSBnaXZlbiBRTmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBRTmFtZVNldAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWVTZXQgc2luZ2xldG9uKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lU2V0KG51bGwsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmFtZSkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFFOYW1lU2V0QnVpbGRlciB3aG9zZSBjb250ZW50cyBhcmUgZ2l2ZW4gYnkKLSAgICAgKiB0aGUgZm91ciBzZXRzLgotICAgICAqCi0gICAgICogVGhpcyBjb25zdHVjdG9yIGlzIFBSSVZBVEUgYmVjYXVzZSBpdCB1c2VzIHRoZSBnaXZlbgotICAgICAqIHNldHMgZGlyZWN0bHksIGFuZCBpdCB0cnVzdHMgaXRzIGNhbGxlcnMgdG8gc2V0IG9ubHkgaW1tdXRhYmxlIHZhbHVlcy4KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGlzIG9ubHkgY2FsbGVkIGJ5IHRoZSBzdGF0aWMgYnVpbGRlciBtZXRob2RzIG9uCi0gICAgICogUU5hbWVTZXQ6IHRob3NlIG1ldGhvZHMgYXJlIGFsbCBjYXJlZnVsIGFzc2lnbiBvbmx5IHVuY2hhbmdpbmcgc2V0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFFOYW1lU2V0KFNldCBleGNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFVSSXMsIFNldCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcykKLSAgICB7Ci0gICAgICAgIGlmIChpbmNsdWRlZFVSSXMgIT0gbnVsbCAmJiBleGNsdWRlZFVSSXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmVydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzID0gaW5jbHVkZWRVUklzOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJczsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXhjbHVkZWRVUklzICE9IG51bGwgJiYgaW5jbHVkZWRVUklzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnZlcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzID0gZXhjbHVkZWRVUklzOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJczsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXhhY3RseSBvbmUgb2YgZXhjbHVkZWRVUklzIGFuZCBpbmNsdWRlZFVSSXMgbXVzdCBiZSBudWxsIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9jYWwgeG1sIG5hbWVzIGFyZSBoYXNlZCB1c2luZyAiIiBhcyB0aGUgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuc0Zyb21OYW1lKFFOYW1lIHhtbE5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgbnMgPSB4bWxOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICByZXR1cm4gbnMgPT0gbnVsbCA/ICIiIDogbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyB0aGUgZ2l2ZW4gcW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW4gPSBfaW5jbHVkZWRVUklzLmNvbnRhaW5zKG5zRnJvbU5hbWUobmFtZSkpID8KLSAgICAgICAgICAgICAgICAgICAgICFfZXhjbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKTsKLSAgICAgICAgcmV0dXJuIF9pbnZlcnRlZCBeIGluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBNb2RlbFRyYW5zaXRpb25TZXQgY29udGFpbnMgYWxsIFFOYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ludmVydGVkICYmIF9pbmNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIF9pbmNsdWRlZFFOYW1lcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyBubyBRTmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gIV9pbnZlcnRlZCAmJiBfaW5jbHVkZWRVUklzLmlzRW1wdHkoKSAmJiBfaW5jbHVkZWRRTmFtZXMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgUU5hbWVTZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgb25lIGFuZCBhbm90aGVyLgotICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCB0byBpbnNlcnNlY3Qgd2l0aAotICAgICAqIEByZXR1cm4gdGhlIGludGVyc2VjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldCBpbnRlcnNlY3QoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIFFOYW1lU2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHRoaXMpOwotICAgICAgICByZXN1bHQucmVzdHJpY3Qoc2V0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1FOYW1lU2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSB1bmlvbiBvZiB0aGlzIG9uZSBhbmQgYW5vdGhlci4KLSAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgdG8gdW5pb24gd2l0aAotICAgICAqIEByZXR1cm4gdGhlIHVuaW9uCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IHVuaW9uKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBRTmFtZVNldEJ1aWxkZXIgcmVzdWx0ID0gbmV3IFFOYW1lU2V0QnVpbGRlcih0aGlzKTsKLSAgICAgICAgcmVzdWx0LmFkZEFsbChzZXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvUU5hbWVTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIGludmVyc2Ugb2YgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IGludmVyc2UoKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gRU1QVFkpCi0gICAgICAgICAgICByZXR1cm4gQUxMOwotICAgICAgICBpZiAodGhpcyA9PSBBTEwpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFk7Ci0gICAgICAgIGlmICh0aGlzID09IExPQ0FMKQotICAgICAgICAgICAgcmV0dXJuIE5PTkxPQ0FMOwotICAgICAgICBpZiAodGhpcyA9PSBOT05MT0NBTCkKLSAgICAgICAgICAgIHJldHVybiBMT0NBTDsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZVNldChpbmNsdWRlZFVSSXMoKSwgZXhjbHVkZWRVUklzKCksIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSwgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBzZXQgaXMgYSBzdWJzZXQgb2YgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIHNldCB0aGUgc2V0IHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjb250YWlucyBhbGwgUU5hbWVzIGNvbnRhaW5lZCBieSB0aGUgZ2l2ZW4gc2V0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIC8vIGEuY29udGFpbnMoYikgPT0gYS5pbnZlcnNlLmlzRGlzam9pbnQoYikKLSAgICAgICAgaWYgKCFfaW52ZXJ0ZWQgJiYgc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW52ZXJzZSgpLmlzRGlzam9pbnQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBzZXQgaXMgZGlzam9pbnQgZnJvbSB0aGlzIG9uZS4KLSAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgdG8gdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2V0IGlzIGRpc2pvaW50IGZyb20gdGhpcyBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2pvaW50KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkICYmIHNldC5leGNsdWRlZFVSSXMoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChfaW52ZXJ0ZWQpCi0gICAgICAgICAgICByZXR1cm4gaXNEaXNqb2ludEltcGwoc2V0LCB0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGlzRGlzam9pbnRJbXBsKHRoaXMsIHNldCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Rpc2pvaW50SW1wbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0MSwgUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldDIpCi0gICAgewotICAgICAgICBTZXQgaW5jbHVkZVVSSXMgPSBzZXQxLmluY2x1ZGVkVVJJcygpOwotICAgICAgICBTZXQgb3RoZXJJbmNsdWRlVVJJcyA9IHNldDIuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgIGlmIChvdGhlckluY2x1ZGVVUklzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG90aGVySW5jbHVkZVVSSXMuY29udGFpbnMoaS5uZXh0KCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXQgb3RoZXJFeGNsdWRlVVJJcyA9IHNldDIuZXhjbHVkZWRVUklzKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbmNsdWRlVVJJcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghb3RoZXJFeGNsdWRlVVJJcy5jb250YWlucyhpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNldDEuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXQyLmNvbnRhaW5zKChRTmFtZSlpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluY2x1ZGVVUklzLnNpemUoKSA+IDApCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQyLmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2V0MS5jb250YWlucygoUU5hbWUpaS5uZXh0KCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIE5hbWVzcGFjZXMgdGhhdCBhcmUgZnVsbHkgZXhjbHVkZWQgZnJvbSB0aGUgc2V0IGV4Y2VwdCBmb3IgYSBmaW5pdGUKLSAgICAgKiBudW1iZXIgb2YgaW5kaXZpZHVhbCBRTmFtZSBleGNlcHRpb25zLiAgUmV0dXJucyBudWxsIGlmIHRoaXMgc2V0IGlzIGluZmluaXRlLgotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBleGNsdWRlZCBuYW1lc3BhY2UgVVJJIHN0cmluZ3MKLSAgICAgKi8gCi0gICAgcHVibGljIFNldCBleGNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9pbnZlcnRlZCkgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW5jbHVkZWRVUklzKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmFtZXNwYWNlcyB0aGF0IGFyZSBmdWxseSBpbmNsdWRlZCBpbiBzZXQgZXhjZXB0IGZvciBhIGZpbml0ZQotICAgICAqIG51bWJlciBvZiBpbmRpdmlkdWFsIFFOYW1lIGV4Y2VwdGlvbnMuIFJldHVybnMgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgaW5jbHVkZWQgbmFtZXNwYWNlIFVSSSBzdHJpbmdzCi0gICAgICovIAotICAgIHB1YmxpYyBTZXQgaW5jbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIGlmICghX2ludmVydGVkKSByZXR1cm4gX2luY2x1ZGVkVVJJczsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBzZXQgb2YgUU5hbWVzIGV4Y2x1ZGVkIGZyb20gdGhlIHNldCBldmVuIHRob3VnaCB0aGV5IGFyZSB3aXRoaW4KLSAgICAgKiBhIG5hbWVzcGFjZSB0aGF0IGlzIG90aGVyd2lzZSBmdWxseSBpbmNsdWRlZCBpbiB0aGUgc2V0LgotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBleGNsdWRlZCBRTmFtZXMgZnJvbSB3aXRoaW4gaW5jbHVkZWRVUkkgbmFtZXNwYWNlcwotICAgICAqLyAKLSAgICBwdWJsaWMgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW52ZXJ0ZWQgPyBfaW5jbHVkZWRRTmFtZXMgOiBfZXhjbHVkZWRRTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzZXQgb2YgUU5hbWVzIGluY2x1ZGVkIGluIHRoZSBzZXQgZXZlbiB0aG91Z2ggdGhleSBhcmUgd2l0aGluCi0gICAgICogYSBuYW1lc3BhY2UgdGhhdCBpcyBvdGhlcndpc2UgZnVsbHkgaW5jbHVkZWQgaW4gdGhlIHNldC4KLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgaW5jbHVkZWQgUU5hbWVzIGZyb20gd2l0aGluIGV4Y2x1ZGVkVVJJIG5hbWVzcGFjZXMKLSAgICAgKi8gCi0gICAgcHVibGljIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2ludmVydGVkID8gX2V4Y2x1ZGVkUU5hbWVzIDogX2luY2x1ZGVkUU5hbWVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJldHR5UU5hbWUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiQCIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNlZnVsIGZvciBkZWJ1Z2dpbmcsIHN1YmplY3QgdG8gY2hhbmdlLgotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJRTmFtZVNldCIpOwotICAgICAgICBzYi5hcHBlbmQoX2ludmVydGVkID8gIi0oIiA6ICIrKCIpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiKypAIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoaS5uZXh0KCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9leGNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIrIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocHJldHR5UU5hbWUoKFFOYW1lKWkubmV4dCgpKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGluZGV4ID0gc2IubGFzdEluZGV4T2YoIiwgIik7Ci0gICAgICAgIGlmIChpbmRleCA+IDApCi0gICAgICAgICAgICBzYi5zZXRMZW5ndGgoaW5kZXgpOwotICAgICAgICBzYi5hcHBlbmQoJyknKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0QnVpbGRlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTk0NTYxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFVzZWQgdG8gYnVpbGQge0BsaW5rIFFOYW1lU2V0IFFOYW1lU2V0c30uCi0gKi8gCi1wdWJsaWMgY2xhc3MgUU5hbWVTZXRCdWlsZGVyIGltcGxlbWVudHMgUU5hbWVTZXRTcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBfaW52ZXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBTZXQgX2luY2x1ZGVkVVJJczsKLSAgICBwcml2YXRlIFNldCBfZXhjbHVkZWRRTmFtZXM7Ci0gICAgcHJpdmF0ZSBTZXQgX2luY2x1ZGVkUU5hbWVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0QnVpbGRlcigpCi0gICAgewotICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgX2luY2x1ZGVkVVJJcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIF9leGNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFFOYW1lU2V0QnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZSBnaXZlbiBieQotICAgICAqIGFub3RoZXIgUU5hbWVTZXRTcGVjaWZpY2F0aW9uLgotICAgICAqIEBwYXJhbSBzZXQgdGhlIFFOYW1lU2V0U3BlY2lmaWNhaXRvbiB0byBjb3B5Ci0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0QnVpbGRlcihRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgU2V0IGluY2x1ZGVkVVJJcyA9IHNldC5pbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFVSSXMpOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnZlcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzID0gbmV3IEhhc2hTZXQoc2V0LmV4Y2x1ZGVkVVJJcygpKTsKLSAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkpOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgUU5hbWVTZXRCdWlsZGVyIHdob3NlIGluaXRhbCBjb250ZW50cyBhcmUgZ2l2ZW4gYnkKLSAgICAgKiB0aGUgZm91ciBzZXRzLiAgRXhhY3RseSBvbmUgb2YgZWl0aGVyIGV4Y2x1ZGVkVVJJcyBvciBpbmNsdWRlZFVSSXMgbXVzdAotICAgICAqIGJlIG5vbi1udWxsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSSBzdHJpbmdzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgc2V0LCBvciBudWxsIGlmIHRoaXMgc2V0IGlzIGluZmluaXRlCi0gICAgICogQHBhcmFtIGluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBuYW1lc3BhY2UgVVJJIHN0cmluZ3MgdG8gaW5jbHVkZSBpbiB0aGUgc2V0LCBvciBudWxsIGlmIHRoaXMgc2V0IGlzIGluZmluaXRlCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgZXhjZXB0aW9uYWwgUU5hbWVzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgaW5jbHVkZWQgbmFtZXNwYWNlcwotICAgICAqIEBwYXJhbSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIGV4Y2VwdGlvbmFsIFFOYW1lcyB0byBpbmNsdWRlIHRoYXQgYXJlIGluIHRoZSBleGNsdWRlZCBuYW1lc3BhY2VzCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0QnVpbGRlcihTZXQgZXhjbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRVUklzLCBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMpCi0gICAgewotICAgICAgICBpZiAoaW5jbHVkZWRVUklzICE9IG51bGwgJiYgZXhjbHVkZWRVUklzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnZlcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgX2luY2x1ZGVkVVJJcyA9IG5ldyBIYXNoU2V0KGluY2x1ZGVkVVJJcyk7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGV4Y2x1ZGVkVVJJcyAhPSBudWxsICYmIGluY2x1ZGVkVVJJcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgX2luY2x1ZGVkVVJJcyA9IG5ldyBIYXNoU2V0KGV4Y2x1ZGVkVVJJcyk7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkV4YWN0bHkgb25lIG9mIGV4Y2x1ZGVkVVJJcyBhbmQgaW5jbHVkZWRVUklzIG11c3QgYmUgbnVsbCIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFFOYW1lU2V0QnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZSBnaXZlbgotICAgICAqIGFzIGEgbGlzdCBvZiBuYW1lc3BhY2UgVVJJcywgdXNpbmcgdGhlIHNhbWUgZm9ybWF0IHVzZWQgYnkgd2lsZGNhcmRzCi0gICAgICogaW4gWFNEIGZpbGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgYSB3aWxkY2FyZCBuYW1lc3BhY2Ugc3BlY2lmaWNhdGlvbiBzdHJpbmcgc3VjaCBhcyAiIyNhbnkiLAotICAgICAqICAgICAgICAiIyNvdGhlciIsICIjI2xvY2FsIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgb3IgYSBzcGFjZS1zZXBhcmF0ZWQKLSAgICAgKiAgICAgICAgbGlzdCBvZiBVUklzLgotICAgICAqIEBwYXJhbSB0YXJnZXRVUkkgdGhlIGN1cnJlbnQgdGFyZ2V0TmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0QnVpbGRlcihTdHJpbmcgc3RyLCBTdHJpbmcgdGFyZ2V0VVJJKQotICAgIHsKLSAgICAgICAgdGhpcygpOwotCi0gICAgICAgIGlmIChzdHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHN0ciA9ICIjI2FueSI7Ci0KLSAgICAgICAgU3RyaW5nW10gdXJpID0gc3BsaXRMaXN0KHN0cik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYWRkdXJpID0gdXJpW2ldOwotICAgICAgICAgICAgaWYgKGFkZHVyaS5zdGFydHNXaXRoKCIjIyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhZGR1cmkuZXF1YWxzKCIjI290aGVyIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0VVJJID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciB0ZW1wID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wLmFkZE5hbWVzcGFjZSh0YXJnZXRVUkkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wLmFkZE5hbWVzcGFjZSgiIik7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAuaW52ZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEFsbCh0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHVyaS5lcXVhbHMoIiMjYW55IikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBpbnZlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVyaVtpXS5lcXVhbHMoIiMjdGFyZ2V0TmFtZXNwYWNlIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0VVJJID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHVyaSA9IHRhcmdldFVSSTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodXJpW2ldLmVxdWFscygiIyNsb2NhbCIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkdXJpID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkTmFtZXNwYWNlKGFkZHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9jYWwgeG1sIG5hbWVzIGFyZSBoYXNlZCB1c2luZyAiIiBhcyB0aGUgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuc0Zyb21OYW1lKFFOYW1lIFFOYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIHJldHVybiBucyA9PSBudWxsID8gIiIgOiBuczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGNoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjaCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNwbGl0TGlzdChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChzLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RSSU5HQVJSQVk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgcy5sZW5ndGgoKSAmJiBpc1NwYWNlKHMuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICBpZiAoaSA+PSBzLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pcmVzdWx0LnRvQXJyYXkoRU1QVFlfU1RSSU5HQVJSQVkpOwotICAgICAgICAgICAgc3RhcnQgPSBpOwotICAgICAgICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmICFpc1NwYWNlKHMuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHMuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCB4bWwgbmFtZXMgZnJvbSBxbmFtZXNldCB3aG9zZSBuYW1lc3BhY2UgbWF0Y2hlcyB0aGUgdXJpLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWF0Y2hpbmdOcyhTdHJpbmcgdXJpLCBTZXQgcW5hbWVzZXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZXNldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhuc0Zyb21OYW1lKChRTmFtZSlpLm5leHQoKSkpKQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIHhtbCBuYW1lcyBmcm9tIHFuYW1lc2V0IHdob3NlIG5hbWVzcGFjZSBpcyBpbiB0aGUKLSAgICAgKiBmaXJzdCBzZXQgb2YgdXJpcyBidXQgbm90IHRoZSBzZWNvbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxNYXRjaGluZ0ZpcnN0T25seShTZXQgc2V0Rmlyc3QsIFNldCBzZXRTZWNvbmQsIFNldCBxbmFtZXNldCkKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHFuYW1lc2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBucyA9IG5zRnJvbU5hbWUoKFFOYW1lKWkubmV4dCgpKTsKLSAgICAgICAgICAgIGlmIChzZXRGaXJzdC5jb250YWlucyhucykgJiYgIXNldFNlY29uZC5jb250YWlucyhucykpCi0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbGwgeG1sIG5hbWVzIGZyb20gcW5hbWVzZXQgd2hvc2UgbmFtZXNwYWNlIGlzIGluIGJvdGgKLSAgICAgKiBzZXRzIG9mIHVyaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxNYXRjaGluZ0JvdGgoU2V0IHNldEZpcnN0LCBTZXQgc2V0U2Vjb25kLCBTZXQgcW5hbWVzZXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZXNldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSBuc0Zyb21OYW1lKChRTmFtZSlpLm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoc2V0Rmlyc3QuY29udGFpbnMobnMpICYmIHNldFNlY29uZC5jb250YWlucyhucykpCi0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbGwgeG1sIG5hbWVzIGZyb20gcW5hbWVzZXQgd2hvc2UgbmFtZXNwYWNlIGlzIGluIG5laXRoZXIKLSAgICAgKiBzZXQgb2YgdXJpcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1hdGNoaW5nTmVpdGhlcihTZXQgc2V0Rmlyc3QsIFNldCBzZXRTZWNvbmQsIFNldCBxbmFtZXNldCkKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHFuYW1lc2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBucyA9IG5zRnJvbU5hbWUoKFFOYW1lKWkubmV4dCgpKTsKLSAgICAgICAgICAgIGlmICghc2V0Rmlyc3QuY29udGFpbnMobnMpICYmICFzZXRTZWNvbmQuY29udGFpbnMobnMpKQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIHRoZSBnaXZlbiBxbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbiA9IF9pbmNsdWRlZFVSSXMuY29udGFpbnMobnNGcm9tTmFtZShuYW1lKSkgPwotICAgICAgICAgICAgICAgICAgICAgIV9leGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpOwotICAgICAgICByZXR1cm4gX2ludmVydGVkIF4gaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyBhbGwgUU5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW52ZXJ0ZWQgJiYgX2luY2x1ZGVkVVJJcy5zaXplKCkgPT0gMCAmJiBfaW5jbHVkZWRRTmFtZXMuc2l6ZSgpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyBubyBRTmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gIV9pbnZlcnRlZCAmJiBfaW5jbHVkZWRVUklzLnNpemUoKSA9PSAwICYmIF9pbmNsdWRlZFFOYW1lcy5zaXplKCkgPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIG9uZSBhbmQgYW5vdGhlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWVTZXQgaW50ZXJzZWN0KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBRTmFtZVNldEJ1aWxkZXIgcmVzdWx0ID0gbmV3IFFOYW1lU2V0QnVpbGRlcih0aGlzKTsKLSAgICAgICAgcmVzdWx0LnJlc3RyaWN0KHNldCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9RTmFtZVNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgUU5hbWVTZXQgdGhhdCBpcyB0aGUgdW5pb24gb2YgdGhpcyBvbmUgYW5kIGFub3RoZXIuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IHVuaW9uKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBRTmFtZVNldEJ1aWxkZXIgcmVzdWx0ID0gbmV3IFFOYW1lU2V0QnVpbGRlcih0aGlzKTsKLSAgICAgICAgcmVzdWx0LmFkZEFsbChzZXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvUU5hbWVTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIGludmVyc2Ugb2YgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IGludmVyc2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHMoaW5jbHVkZWRVUklzKCksIGV4Y2x1ZGVkVVJJcygpLCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCksIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgc3Vic2V0IG9mIHRoaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoIV9pbnZlcnRlZCAmJiBzZXQuZXhjbHVkZWRVUklzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbnZlcnNlKCkuaXNEaXNqb2ludChzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNldCBpcyBkaXNqb2ludCBmcm9tIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzam9pbnQoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQgJiYgc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKF9pbnZlcnRlZCkKLSAgICAgICAgICAgIHJldHVybiBpc0Rpc2pvaW50SW1wbChzZXQsIHRoaXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gaXNEaXNqb2ludEltcGwodGhpcywgc2V0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXNqb2ludEltcGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldDEsIFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQyKQotICAgIHsKLSAgICAgICAgU2V0IGluY2x1ZGVVUklzID0gc2V0MS5pbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgU2V0IG90aGVySW5jbHVkZVVSSXMgPSBzZXQyLmluY2x1ZGVkVVJJcygpOwotICAgICAgICBpZiAob3RoZXJJbmNsdWRlVVJJcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbmNsdWRlVVJJcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChvdGhlckluY2x1ZGVVUklzLmNvbnRhaW5zKGkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2V0IG90aGVyRXhjbHVkZVVSSXMgPSBzZXQyLmV4Y2x1ZGVkVVJJcygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZVVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW90aGVyRXhjbHVkZVVSSXMuY29udGFpbnMoaS5uZXh0KCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQxLmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2V0Mi5jb250YWlucygoUU5hbWUpaS5uZXh0KCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmNsdWRlVVJJcy5zaXplKCkgPiAwKQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0Mi5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNldDEuY29udGFpbnMoKFFOYW1lKWkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGlzIFFOYW1lU2V0QnVpbGRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIF9pbnZlcnRlZCA9IGZhbHNlOwotICAgICAgICBfaW5jbHVkZWRVUklzLmNsZWFyKCk7Ci0gICAgICAgIF9leGNsdWRlZFFOYW1lcy5jbGVhcigpOwotICAgICAgICBfaW5jbHVkZWRRTmFtZXMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZlcnRzIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludmVydCgpCi0gICAgewotICAgICAgICBfaW52ZXJ0ZWQgPSAhX2ludmVydGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzaW5nbGUgUU5hbWUgdG8gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCFfaW52ZXJ0ZWQpCi0gICAgICAgICAgICBhZGRJbXBsKHFuYW1lKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVtb3ZlSW1wbChxbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbnRpcmUgbmFtZXNwYWNlIFVSSSBvZiBRTmFtZXMgdG8gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICogVGhlIGVtcHR5IHN0cmluZyBpcyB1c2VkIHRvIHNpZ25pZml5IHRoZSAobG9jYWwpIG5vLW5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmICghX2ludmVydGVkKQotICAgICAgICAgICAgYWRkTmFtZXNwYWNlSW1wbCh1cmkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW1vdmVOYW1lc3BhY2VJbXBsKHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgY29udGVudHMgb2YgYW5vdGhlciBRTmFtZVNldCB0byB0aGlzIFFOYW1lU2V0QnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBbGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQpCi0gICAgICAgICAgICByZW1vdmVBbGxJbXBsKHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWRkQWxsSW1wbChzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcW5hbWUgZnJvbSB0aGlzIFFOYW1lU2V0QnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgYWRkSW1wbChxbmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbW92ZUltcGwocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gZW50aXJlIG5hbWVzcGFjZSBVUkkgZnJvbSB0aGlzIFFOYW1lU2V0QnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVOYW1lc3BhY2UoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQpCi0gICAgICAgICAgICBhZGROYW1lc3BhY2VJbXBsKHVyaSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbW92ZU5hbWVzcGFjZUltcGwodXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBjb250ZW50cyBvZiBhIGdpdmVuIFFOYW1lU2V0IGZyb20gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgYWRkQWxsSW1wbChzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbW92ZUFsbEltcGwoc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RyaWN0cyB0aGUgY29udGVudHMgb2YgdGhpcyBRTmFtZVNldEJ1aWxkZXIgdG8gYmUgYSBzdWJzZXQgb2YgdGhlCi0gICAgICogZ2l2ZW4gUU5hbWVTZXQuIEluIG90aGVyIHdvcmRzLCBjb21wdXRlcyBhbiBpbnRlcnNlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3QoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQpCi0gICAgICAgICAgICBhZGRBbGxJbXBsKHNldC5leGNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVtb3ZlQWxsSW1wbChzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYWRkKHFuYW1lKSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRJbXBsKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnMobnNGcm9tTmFtZShxbmFtZSkpKQotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzLnJlbW92ZShxbmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5hZGQocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFkZChucykgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkTmFtZXNwYWNlSW1wbChTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOcyh1cmksIF9leGNsdWRlZFFOYW1lcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ05zKHVyaSwgX2luY2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMuYWRkKHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhZGQoc2V0KSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRBbGxJbXBsKFNldCBpbmNsdWRlZFVSSXMsIFNldCBleGNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lcywgU2V0IGV4Y2x1ZGVkUU5hbWVzKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBleGNsdWRlID0gKGV4Y2x1ZGVkVVJJcyAhPSBudWxsKTsKLSAgICAgICAgU2V0IHNwZWNpYWxVUklzID0gZXhjbHVkZSA/IGV4Y2x1ZGVkVVJJcyA6IGluY2x1ZGVkVVJJczsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZXhjbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKChleGNsdWRlIF4gc3BlY2lhbFVSSXMuY29udGFpbnModXJpKSkgJiYgIWV4Y2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleGNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zRnJvbU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoIV9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSAmJiAhX2luY2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcy5hZGQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zRnJvbU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoIV9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWV4Y2x1ZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nRmlyc3RPbmx5KGluY2x1ZGVkVVJJcywgX2luY2x1ZGVkVVJJcywgX2luY2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMuYWRkQWxsKGluY2x1ZGVkVVJJcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ05laXRoZXIoZXhjbHVkZWRVUklzLCBfaW5jbHVkZWRVUklzLCBfaW5jbHVkZWRRTmFtZXMpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2luY2x1ZGVkVVJJcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCi0gICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4Y2x1ZGVkVVJJcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghX2luY2x1ZGVkVVJJcy5jb250YWlucyh1cmkpKQotICAgICAgICAgICAgICAgICAgICBfaW5jbHVkZWRVUklzLmFkZCh1cmkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX2luY2x1ZGVkVVJJcy5yZW1vdmUodXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNldCB0ZW1wID0gX2V4Y2x1ZGVkUU5hbWVzOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gX2luY2x1ZGVkUU5hbWVzOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gdGVtcDsKLSAgICAgICAgICAgIF9pbnZlcnRlZCA9ICFfaW52ZXJ0ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiByZW1vdmUocW5hbWUpIHRoYXQgaWdub3JlcyBpbnZlcnNpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUltcGwoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2luY2x1ZGVkVVJJcy5jb250YWlucyhuc0Zyb21OYW1lKHFuYW1lKSkpCi0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMuYWRkKHFuYW1lKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLnJlbW92ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgcmVtb3ZlKG5zKSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVOYW1lc3BhY2VJbXBsKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAoX2luY2x1ZGVkVVJJcy5jb250YWlucyh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ05zKHVyaSwgX2V4Y2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMucmVtb3ZlKHVyaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ05zKHVyaSwgX2luY2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHJlbW92ZShzZXQpIHRoYXQgaWdub3JlcyBpbnZlcnNpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEltcGwoU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkUU5hbWVzLCBTZXQgZXhjbHVkZWRRTmFtZXMpCi0gICAgewotICAgICAgICBib29sZWFuIGV4Y2x1ZGUgPSAoZXhjbHVkZWRVUklzICE9IG51bGwpOwotICAgICAgICBTZXQgc3BlY2lhbFVSSXMgPSBleGNsdWRlID8gZXhjbHVkZWRVUklzIDogaW5jbHVkZWRVUklzOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zRnJvbU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoZXhjbHVkZSBeIHNwZWNpYWxVUklzLmNvbnRhaW5zKHVyaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zRnJvbU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoX2luY2x1ZGVkVVJJcy5jb250YWlucyh1cmkpKQotICAgICAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcy5hZGQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleGNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zRnJvbU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoX2luY2x1ZGVkVVJJcy5jb250YWlucyh1cmkpICYmICFfZXhjbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleGNsdWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ0ZpcnN0T25seShfaW5jbHVkZWRVUklzLCBleGNsdWRlZFVSSXMsIF9leGNsdWRlZFFOYW1lcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ0JvdGgoX2luY2x1ZGVkVVJJcywgaW5jbHVkZWRVUklzLCBfZXhjbHVkZWRRTmFtZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2luY2x1ZGVkVVJJcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXhjbHVkZSBeIHNwZWNpYWxVUklzLmNvbnRhaW5zKGkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBleGNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9pbnZlcnRlZCkgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW5jbHVkZWRVUklzKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBpbmNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgaWYgKCFfaW52ZXJ0ZWQpIHJldHVybiBfaW5jbHVkZWRVUklzOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW52ZXJ0ZWQgPyBfaW5jbHVkZWRRTmFtZXMgOiBfZXhjbHVkZWRRTmFtZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbnZlcnRlZCA/IF9leGNsdWRlZFFOYW1lcyA6IF9pbmNsdWRlZFFOYW1lcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJldHR5UU5hbWUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiQCIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNlZnVsIGZvciBkZWJ1Z2dpbmcsIHN1YmplY3QgdG8gY2hhbmdlLgotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJRTmFtZVNldEJ1aWxkZXIiKTsKLSAgICAgICAgc2IuYXBwZW5kKF9pbnZlcnRlZCA/ICItKCIgOiAiKygiKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2luY2x1ZGVkVVJJcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIisqQCIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGkubmV4dCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZXhjbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocHJldHR5UU5hbWUoKFFOYW1lKWkubmV4dCgpKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2luY2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiKyIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHByZXR0eVFOYW1lKChRTmFtZSlpLm5leHQoKSkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIGludCBpbmRleCA9IHNiLmxhc3RJbmRleE9mKCIsICIpOwotICAgICAgICBpZiAoaW5kZXggPiAwKQotICAgICAgICAgICAgc2Iuc2V0TGVuZ3RoKGluZGV4KTsKLSAgICAgICAgc2IuYXBwZW5kKCcpJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFFOYW1lU2V0fSBlcXVpdmFsZW50IHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMKLSAgICAgKiBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovIAotICAgIHB1YmxpYyBRTmFtZVNldCB0b1FOYW1lU2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTcGVjaWZpY2F0aW9uKHRoaXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldFNwZWNpZmljYXRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldFNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkMmYxMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRTcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsYXR0aWNlIG9mIGZpbml0ZSBhbmQgaW5maW5pdGUgc2V0cyBvZiBRTmFtZXMuCi0gKiAKLSAqIEBzZWUgUU5hbWVTZXQKLSAqLwotcHVibGljIGludGVyZmFjZSBRTmFtZVNldFNwZWNpZmljYXRpb24KLXsKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBzZXQgY29udGFpbnMgdGhlIGdpdmVuIFFOYW1lLgotICAgICAqCi0gICAgICogUm91Z2hseSBlcXVpdmFsZW50IHRvOgotICAgICAqICAgIChpbmNsdWRlZFVSSXMoKSA9PSBudWxsID8KLSAgICAgKiAgICAgICAgICAgZXhjbHVkZWRVUklzKCkuY29udGFpbnMobmFtZXNwYWNlKSA6Ci0gICAgICogICAgICAgICAgIGluY2x1ZGVkVVJJcygpLmNvbnRhaW5zKG5hbWVzcGFjZSkKLSAgICAgKiAgICApID8KLSAgICAgKiAgICAgICAgIWV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKS5jb250YWlucyhuYW1lKSA6Ci0gICAgICogICAgICAgICBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuY29udGFpbnMobmFtZSkKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgc2V0IGlzIHRoZSBzZXQgb2YgYWxsIFFOYW1lcy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQWxsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBzZXQgaXMgZW1wdHkuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzdWJzZXQgb2YgdGhpcyBzZXQuCi0gICAgICovIAotICAgIGJvb2xlYW4gY29udGFpbnNBbGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBpcyBkaXNqb2ludCBmcm9tIHRoZSBzcGVjaWZpZWQgc2V0LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEaXNqb2ludChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiB3aXRoIGFub3RoZXIgUU5hbWVTZXQuCi0gICAgICovCi0gICAgUU5hbWVTZXQgaW50ZXJzZWN0KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5pb24gd2l0aCBhbm90aGVyIFFOYW1lU2V0LgotICAgICAqLwotICAgIFFOYW1lU2V0IHVuaW9uKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoaXMgUU5hbWVTZXQuIFRoYXQgaXMgdGhlIFFOYW1lU2V0IHdoaWNoCi0gICAgICogY29udGFpbnMgYWxsIHRoZSBRTmFtZXMgbm90IGNvbnRhaW5lZCBpbiB0aGlzIHNldC4gSW4gb3RoZXIgd29yZHMKLSAgICAgKiBmb3Igd2hpY2ggc2V0LmNvbnRhaW5zKG5hbWUpICE9IHNldC5pbnZlcnNlKCkuY29udGFpbnMobmFtZSkgZm9yCi0gICAgICogYWxsIG5hbWVzLgotICAgICAqLwotICAgIFFOYW1lU2V0IGludmVyc2UoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUklzIHRoYXQgYXJlIGFsbW9zdCBjb21wbGV0ZWx5IGV4Y2x1ZGVkIGZyb20KLSAgICAgKiB0aGUgc2V0ICh0aGF0IGlzLCBlYWNoIG5hbWVzcGFjZSBVUkkgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2V0IHdpdGggd2l0aAotICAgICAqIGEgZmluaXRlIG51bWJlciBvZiBRTmFtZSBleGNlcHRpb25zKS4gTnVsbCBpZiB0aGUgc2V0IG9mIG5hbWVzcGFjZVVSSXMKLSAgICAgKiB0aGF0IGFyZSBhbG1vc3QgY29tcGxldGVseSBpbmNsdWRlZCBpcyBpbmZpbml0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIChtZWFuaW5nIGFsbW9zdCBhbGwgVVJJcyBleGNsdWRlZCkgaWYgaW5jbHVkZWRVUklzKCkgaXMgbm9uLW51bGw7Ci0gICAgICogbm9uLW51bGwgb3RoZXJ3aXNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIHNldCBhcyBpbnZlcnNlKCkuaW5jbHVkZWRVUklzKCkuCi0gICAgICovCi0gICAgU2V0IGV4Y2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSXMgdGhhdCBhcmUgYWxtb3N0IGNvbXBsZXRlbHkgaW5jbHVkZWQgaW4KLSAgICAgKiB0aGUgc2V0ICh0aGF0IGlzLCBlYWNoIG5hbWVzcGFjZSBVUkkgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2V0IHdpdGggd2l0aAotICAgICAqIGEgZmluaXRlIG51bWJlciBvZiBRTmFtZSBleGNlcHRpb25zKS4gTnVsbCBpZiB0aGUgc2V0IG9mIG5hbWVzcGFjZVVSSXMKLSAgICAgKiB0aGF0IGFyZSBhbG1vc3QgY29tcGxldGVseSBpbmNsdWRlZCBpcyBpbmZpbml0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIChtZWFuaW5nIGFsbW9zdCBhbGwgVVJJcyBpbmNsdWRlZCkgaWYgZXhjbHVkZWRVUklzKCkgaXMgbm9uLW51bGw7Ci0gICAgICogbm9uLW51bGwgb3RoZXJ3aXNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIGFzIGludmVyc2UuZXhjbHVkZWRVUklzKCkuCi0gICAgICovCi0gICAgU2V0IGluY2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgUU5hbWVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNldCB3aXRoaW4gbmFtZXNwYWNlcwotICAgICAqIHRoYXQgYXJlIG90aGVyd2lzZSBpbmNsdWRlZC4gU2hvdWxkIG9ubHkgY29udGFpbiBRTmFtZXMgd2l0aGluIG5hbWVzcGFjZQotICAgICAqIHRoYXQgYXJlIHdpdGhpbiB0aGUgc2V0IGluY2x1ZGVkVVJJcygpIChvciBhbnkgVVJJLCBpZiBpbmNsdWRlZFVSSXMoKQotICAgICAqIGlzIG51bGwsIHdoaWNoIG1lYW5zIHRoYXQgYWxsIFVSSXMgYXJlIGFsbW9zdCBjb21wbGV0ZWx5IGluY2x1ZGVkKS4KLSAgICAgKiA8cD4KLSAgICAgKiBOZXZlciBudWxsLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIHNldCBhcyBpbnZlcnNlKCkuaW5jbHVkZWRRTmFtZXMoKS4KLSAgICAgKi8KLSAgICBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgUU5hbWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBzZXQgd2l0aGluIG5hbWVzcGFjZXMKLSAgICAgKiB0aGF0IGFyZSBvdGhlcndpc2UgZXhjbHVkZWQuIFNob3VsZCBvbmx5IGNvbnRhaW4gUU5hbWVzIHdpdGhpbiBuYW1lc3BhY2UKLSAgICAgKiB0aGF0IGFyZSB3aXRoaW4gdGhlIHNldCBleGNsdWRlZFVSSXMoKSAob3IgYW55IFVSSSwgaWYgZXhjbHVkZWRVUklzKCkKLSAgICAgKiBpcyBudWxsLCB3aGljaCBtZWFucyB0aGF0IGFsbCBVUklzIGFyZSBhbG1vc3QgY29tcGxldGVseSBleGNsdWRlZCkuCi0gICAgICogPHA+Ci0gICAgICogTmV2ZXIgbnVsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2FtZSBhcyBpbnZlcnNlKCkuZXhjbHVkZWRRTmFtZXMoKS4KLSAgICAgKi8KLSAgICBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUF0dHJpYnV0ZUdyb3VwLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3ZDBmYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGdyb3VwLgotICogPHA+Ci0gKiBBbiBhdHRyaWJ1dGUgZ3JvdXAgaXMgYSBzeW50YWN0aWMgY29uc3RydWN0LCBub3QgYSBwYXJ0Ci0gKiBvZiB0aGUgbG9naWNhbCBtb2RlbC4gRm9yIGV4YW1wbGUsIHR5cGVzIGRlY2xhcmVkIHdpdGhpbiBhbgotICogYXR0cmlidXRlIGdyb3VwIGJlY29tZSBsb2NhbCB0byB0aGUgdHlwZSB0aGF0IHVzZXMgdGhlIGdyb3VwIC0KLSAqIHRoZXkncmUgbm90IGxvY2FsIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaXRzZWxmLiBUaGVyZWZvcmUKLSAqIGluIHRoZSBsb2dpY2FsIG1vZGVsIG9mIGEgc2NoZW1hIHR5cGUgc3lzdGVtLCBhbiBhdHRyaWJ1dGUKLSAqIGdyb3VwIGRvZXNuJ3QgcmVwcmVzZW50IGFueXRoaW5nLiBJdHMgY29udGVudHMgYXJlIG1lcmdlZAotICogaW50byB0aGUgbG9naWNhbCBtb2RlbCBhdCBwYXJzZSB0aW1lLgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjZmluZEF0dHJpYnV0ZUdyb3VwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQXR0cmlidXRlR3JvdXAgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVAuCi0gICAgICovCi0gICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBncm91cC4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIGF0dHJpYnV0ZSBncm91cHMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hQXR0cmlidXRlR3JvdXAgYXR0cmlidXRlR3JvdXApCi0gICAgICAgICAgICB7IHN1cGVyKGF0dHJpYnV0ZUdyb3VwKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXApZ2V0Q29tcG9uZW50KCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlTW9kZWwuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGZjNjFmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZSBhbGxvd2VkIG9uIGEgY29tcGxleCB0eXBlLgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0QXR0cmlidXRlTW9kZWwKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQXR0cmlidXRlTW9kZWwKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBtb2RlbC4KLSAgICAgKi8KLSAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIGdldEF0dHJpYnV0ZShRTmFtZSBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFFOYW1lU2V0IHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIHdpbGRjYXJkIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgUU5hbWVTZXQgZ2V0V2lsZGNhcmRTZXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2Nlc3NpbmcgY29kZSAoe0BsaW5rICNTVFJJQ1R9LCB7QGxpbmsgI0xBWH0sIHtAbGluayAjU0tJUH0pLgotICAgICAqIFJldHVybnMgMCAoe0BsaW5rICNOT05FfSkgaWYgbm8gd2lsZGNhcmQgc3BlY2lmaWVkLgotICAgICAqLwotICAgIGludCBnZXRXaWxkY2FyZFByb2Nlc3MoKTsKLQotICAgIC8qKiBTZWUge0BsaW5rICNnZXRXaWxkY2FyZFByb2Nlc3N9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLSAgICAvKiogU3RyaWN0IHdpbGRjYXJkIHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUUklDVCA9IDE7Ci0gICAgLyoqIExheCB3aWxkY2FyZCBwcm9jZXNzaW5nLiBTZWUge0BsaW5rICNnZXRXaWxkY2FyZFByb2Nlc3N9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBMQVggPSAyOwotICAgIC8qKiBTa2lwIHdpbGRjYXJkIHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNLSVAgPSAzOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUNvbXBvbmVudC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU0NGQzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZ2xvYmFsIFNjaGVtYSBDb21wb25lbnQuICBUaGF0IGlzLCBhIHR5cGUsIGVsZW1lbnQsIGF0dHJpYnV0ZSwKLSAqIG1vZGVsIGdyb3VwLCBhdHRyaWJ1dGUgZ3JvdXAsIG9yIGlkZW50aXR5IGNvbnN0cmFpbnQuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCBub3QgYWxsIHR5cGVzLCBlbGVtZW50cywgYW5kIGF0dHJpYnV0ZXMgYXJlIGdsb2JhbDsgbG9jYWwKLSAqIHR5cGVzLCBlbGVtZW50LCBhbmQgYXR0cmlidXRlcyBkbyBub3QgYXBwZWFyIGluIHRoZSBnbG9iYWwgbG9va3VwIHRhYmxlLgotICogQWxzbyBub3RlIHRoYXQgb3RoZXIgaW5mb3JtYXRpb24gaXRlbXMgc3VjaCBhcyBwYXJ0aWNsZXMsIGZhY2V0cywgYW5kCi0gKiBzbyBvbiBhcmUgbm90IGdsb2JhbGx5IGluZGV4ZWQsIHNvIGFyZSBub3QgU2NoZW1hQ29tcG9uZW50cy4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlCi0gKiBAc2VlIFNjaGVtYUdsb2JhbEVsZW1lbnQKLSAqIEBzZWUgU2NoZW1hR2xvYmFsQXR0cmlidXRlCi0gKiBAc2VlIFNjaGVtYUF0dHJpYnV0ZUdyb3VwCi0gKiBAc2VlIFNjaGVtYU1vZGVsR3JvdXAKLSAqIEBzZWUgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqIEEgdHlwZSBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRZUEUgPSAwOwotICAgIC8qKiBBbiBlbGVtZW50IGRlZmluaXRpb24uICBTZWUge0BsaW5rICNnZXRDb21wb25lbnRUeXBlfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0gICAgLyoqIEFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURSA9IDM7Ci0gICAgLyoqIEFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9HUk9VUCA9IDQ7Ci0gICAgLyoqIEFuIGlkZW50aXR5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBJREVOVElUWV9DT05TVFJBSU5UID0gNTsKLSAgICAvKiogQSBtb2RlbCBncm91cCBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE1PREVMX0dST1VQID0gNjsKLSAgICAvKiogQSBub3RhdGlvbiBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OID0gNzsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgY29kZSBmb3IgdGhlIHNjaGVtYSBvYmplY3QsIGVpdGhlciB7QGxpbmsgI1RZUEV9LAotICAgICAqIHtAbGluayAjRUxFTUVOVH0sIHtAbGluayAjQVRUUklCVVRFfSwge0BsaW5rICNBVFRSSUJVVEVfR1JPVVB9LAotICAgICAqIHtAbGluayAjTU9ERUxfR1JPVVB9LCB7QGxpbmsgI0lERU5USVRZX0NPTlNUUkFJTlR9LCBvciB7QGxpbmsgI05PVEFUSU9OfS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZXN5c3RlbSB3aXRoaW4gd2hpY2ggdGhpcyBjb21wb25lbnQgZGVmaW5pdGlvbiByZXNpZGVzCi0gICAgICovCi0gICAgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2NoZW1hIGNvbXBvbmVudAotICAgICAqLwotICAgIFFOYW1lIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEEgbGF6eSByZWZlcmVuY2UgdG8gYSBjb21wb25lbnQuIFVzZWQgYnkgU2NoZW1hVHlwZUxvYWRlcnMgdG8KLSAgICAgKiBhdm9pZCBsb2FkaW5nIGNvbXBvbmVudHMgdW50aWwgdGhleSBhcmUgYWN0dWFsbHkgbmVlZGVkLgotICAgICAqIAotICAgICAqIEBleGNsdWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBSZWYKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBSZWYoU2NoZW1hQ29tcG9uZW50IHNjaGVtYUNvbXBvbmVudCkKLSAgICAgICAgICAgIHsgX3NjaGVtYUNvbXBvbmVudCA9IHNjaGVtYUNvbXBvbmVudDsgfQotCi0gICAgICAgIHByb3RlY3RlZCBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzY2hlbWFUeXBlU3lzdGVtLCBTdHJpbmcgaGFuZGxlKQotICAgICAgICAgICAgeyBhc3NlcnQoaGFuZGxlICE9IG51bGwpOyBfc2NoZW1hVHlwZVN5c3RlbSA9IHNjaGVtYVR5cGVTeXN0ZW07IF9oYW5kbGUgPSBoYW5kbGU7IH0KLQotICAgICAgICBwcml2YXRlIFNjaGVtYUNvbXBvbmVudCBfc2NoZW1hQ29tcG9uZW50OwotICAgICAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW0gX3NjaGVtYVR5cGVTeXN0ZW07Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgX2hhbmRsZTsKLQotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgICBwdWJsaWMgZmluYWwgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKLSAgICAgICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlU3lzdGVtOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3NjaGVtYUNvbXBvbmVudCA9PSBudWxsICYmIF9oYW5kbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfc2NoZW1hQ29tcG9uZW50ID0gX3NjaGVtYVR5cGVTeXN0ZW0ucmVzb2x2ZUhhbmRsZShfaGFuZGxlKTsKLQotICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWFDb21wb25lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcgb2Ygc2NoZW1hIGNvbXBvbmVudHMuCi0gICAgICovIAotICAgIHB1YmxpYyBSZWYgZ2V0Q29tcG9uZW50UmVmKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hRmllbGQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFlNGVmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGVsZW1lbnQgb3IgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0Q29udGFpbmVyRmllbGQKLSAqIEBzZWUgU2NoZW1hTG9jYWxFbGVtZW50Ci0gKiBAc2VlIFNjaGVtYUxvY2FsQXR0cmlidXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUZpZWxkCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9ybS11bnF1YWxpZmllZC1vci1xdWFsaWZpZWQgbmFtZS4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdXNlIGlzIGFuIGF0dHJpYnV0ZQotICAgICAqLwotICAgIGJvb2xlYW4gaXNBdHRyaWJ1dGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgbmlsbGFibGU7IGFsd2F5cyBmYWxzZSBmb3IgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTmlsbGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyB1c2UuCi0gICAgICovCi0gICAgU2NoZW1hVHlwZSBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtaW5PY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUuCi0gICAgICogSWYgaXQgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGlzIGRlZmF1bHRzIHRvIEJpZ0ludGVnZXIuT05FLgotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXhPY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUsIG9yIG51bGwgaWYgaXQKLSAgICAgKiBpcyB1bmJvdW5kZWQuCi0gICAgICogSWYgaXQgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGlzIGRlZmF1bHRzIHRvIEJpZ0ludGVnZXIuT05FLgotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0TWF4T2NjdXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBhcyBwbGFpbiB0ZXh0LiBTZWUge0BsaW5rICNpc0RlZmF1bHR9IGFuZCB7QGxpbmsgI2lzRml4ZWR9LgotICAgICAqLwotICAgIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGFzIGEgc3Ryb25nbHktdHlwZWQgdmFsdWUuICBTZWUge0BsaW5rICNpc0RlZmF1bHR9IGFuZCB7QGxpbmsgI2lzRml4ZWR9LgotICAgICAqLwotICAgIFhtbEFueVNpbXBsZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIGEgZGVmYXVsdCBpcyBzdXBwbGllZC4gSWYge0BsaW5rICNpc0ZpeGVkfSwgdGhlbiBpc0RlZmF1bHQgaXMgYWx3YXlzIHRydWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIGZpeGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNGaXhlZCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUdsb2JhbEF0dHJpYnV0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUdsb2JhbEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQ5MzJiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGdsb2JhbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjZmluZEF0dHJpYnV0ZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZXh0ZW5kcyBTY2hlbWFMb2NhbEF0dHJpYnV0ZSwgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSAueHNkIGZpbGUgd2l0aGluIHdoaWNoIHRoaXMgYXR0cmlidXRlIHdhcyBkZWZpbmVkCi0gICAgICovIAotICAgIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBleGNsdWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBSZWYgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQuUmVmCi0gICAgewotICAgICAgICBwdWJsaWMgUmVmKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBlbGVtZW50KQotICAgICAgICAgICAgeyBzdXBlcihlbGVtZW50KTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBnZXQoKQotICAgICAgICAgICAgeyByZXR1cm4gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSlnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJ1bnMgYSBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBwb2ludGluZyB0byB0aGlzIGVsZW1lbnQgaXRzZWxmLgotICAgICAqLwotICAgIHB1YmxpYyBSZWYgZ2V0UmVmKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hR2xvYmFsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE2MDUyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZ2xvYmFsIGVsZW1lbnQgZGVmaW5pdGlvbi4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyI2ZpbmRFbGVtZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hR2xvYmFsRWxlbWVudCBleHRlbmRzIFNjaGVtYUxvY2FsRWxlbWVudCwgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSAueHNkIGZpbGUgd2l0aGluIHdoaWNoIHRoaXMgYXR0cmlidXRlIHdhcyBkZWZpbmVkCi0gICAgICovIAotICAgIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgb2YgUU5hbWVzIGZvciBlbGVtZW50cyB0aGF0IGFyZSB0aGUgbWVtYmVycyBvZiB0aGUKLSAgICAgKiBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHdoaWNoIHRoaXMgZWxlbWVudCBpcyB0aGUgaGVhZCwKLSAgICAgKiBub3QgaW5jbHVkaW5nIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBRTmFtZVtdIHN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVsZW1lbnQgdGhhdCBpcyB0aGUgaGVhZCBvZiB0aGlzIGVsZW1lbnQncyBzdWJzdGl0dXRpb24KLSAgICAgKiBncm91cCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBhIG1lbWJlcgotICAgICAqIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwLgotICAgICAqLwotICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXAoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdXNpbmcgdGhpcyBlbGVtZW50IGFzIHRoZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uCi0gICAgICogZ3JvdXAgZm9yIGEgc3Vic3RpdHV0aW9uIHZpYSB0eXBlIGV4dGVuc2lvbiBpcyBwcm9oaWJpdGVkLgotICAgICAqIElmIGJvdGggZmluYWxFeHRlbnNpb24gYW5kIGZpbmFsUmVzdHJpY3Rpb24gYXJlIHRydWUsIHRoaXMKLSAgICAgKiBlbGVtZW50IGNhbm5vdCBiZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwLgotICAgICAqIFNlbnNpYmxlIG9ubHkgZm9yIGdsb2JhbCBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbEV4dGVuc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB1c2luZyB0aGlzIGVsZW1lbnQgYXMgdGhlIGhlYWQgb2YgYSBzdWJzdGl0dXRpb24KLSAgICAgKiBncm91cCBmb3IgYSBzdWJzdGl0dXRpb24gdmlhIHR5cGUgcmVzdHJpY3Rpb24gaXMgcHJvaGliaXRlZC4KLSAgICAgKiBJZiBib3RoIGZpbmFsRXh0ZW5zaW9uIGFuZCBmaW5hbFJlc3RyaWN0aW9uIGFyZSB0cnVlLCB0aGlzCi0gICAgICogZWxlbWVudCBjYW5ub3QgYmUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cC4KLSAgICAgKiBTZW5zaWJsZSBvbmx5IGZvciBnbG9iYWwgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxSZXN0cmljdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBhbGxvdyBvbi1kZW1hbmQgbG9hZGluZyBvZiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAZXhjbHVkZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVmIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50LlJlZgotICAgIHsKLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFHbG9iYWxFbGVtZW50IGVsZW1lbnQpCi0gICAgICAgICAgICB7IHN1cGVyKGVsZW1lbnQpOyB9Ci0KLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgICAgIHsgc3VwZXIoc3lzdGVtLCBoYW5kbGUpOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUdsb2JhbEVsZW1lbnQgZ2V0KCkKLSAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFHbG9iYWxFbGVtZW50KWdldENvbXBvbmVudCgpOyB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cnVucyBhIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHBvaW50aW5nIHRvIHRoaXMgZWxlbWVudCBpdHNlbGYuCi0gICAgICovCi0gICAgcHVibGljIFJlZiBnZXRSZWYoKTsKLQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkY2IwOGQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGlkZW50aXR5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbi4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzZWxlY3RvciB4cGF0aCBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U2VsZWN0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIHNlbGVjdG9yLgotICAgICAqLwotICAgIE9iamVjdCBnZXRTZWxlY3RvclBhdGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiAoYSBjb3B5IG9mKSB0aGUgeHBhdGhzIGZvciBhbGwgdGhlIGZpZWxkcy4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRGaWVsZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIGZpZWxkLgotICAgICAqLwotICAgIE9iamVjdCBnZXRGaWVsZFBhdGgoaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHJlYWQtb25seSBjb3B5IG9mIHRoZSBuYW1lc3BhY2UgbWFwLiBUaGlzIGlzIHRoZSAKLSAgICAgKiBzZXQgb2YgcHJlZml4IHRvIFVSSSBtYXBwaW5ncyB0aGF0IHdlcmUgaW4gc2NvcGUgaW4gdGhlCi0gICAgICogc2NoZW1hIGF0IHRoZSBwb2ludCBhdCB3aGljaCB0aGlzIGNvbnN0cmFpbnQgd2FzIGRlY2xhcmVkCi0gICAgICovCi0gICAgTWFwIGdldE5TTWFwKCk7Ci0KLSAgICAvKiogQSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUta2V5Ij54czprZXk8L2E+IGNvbnN0cmFpbnQuICBTZWUge0BsaW5rICNnZXRDb25zdHJhaW50Q2F0ZWdvcnl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENDX0tFWSA9IDE7Ci0gICAgLyoqIEEgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWtleSI+eHM6a2V5UmVmPC9hPiBjb25zdHJhaW50LiAgU2VlIHtAbGluayAjZ2V0Q29uc3RyYWludENhdGVnb3J5fS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQ19LRVlSRUYgPSAyOwotICAgIC8qKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1rZXkiPnhzOnVuaXF1ZTwvYT4gY29uc3RyYWludC4gIFNlZSB7QGxpbmsgI2dldENvbnN0cmFpbnRDYXRlZ29yeX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0NfVU5JUVVFID0gMzsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY29uc3RyYWludCBjYXRlZ29yeS4gRWl0aGVyIHtAbGluayAjQ0NfS0VZfSwge0BsaW5rICNDQ19LRVlSRUZ9LAotICAgICAqIG9yIHtAbGluayAjQ0NfVU5JUVVFfS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0Q29uc3RyYWludENhdGVnb3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgdGhhdCBhIGtleSByZWYgcmVmZXJzIHRvLiBPbmx5IHZhbGlkIGZvcgotICAgICAqIGtleXJlZnMuCi0gICAgICovCi0gICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGdldFJlZmVyZW5jZWRLZXkoKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgaWRlbnRpdHkgY29uc3RyYWludHMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGlkYykKLSAgICAgICAgICAgIHsgc3VwZXIoaWRjKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZ2V0KCkKLSAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQpZ2V0Q29tcG9uZW50KCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxBdHRyaWJ1dGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODMyNzc1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbG9jYWwgb3IgZ2xvYmFsIGF0dHJpYnV0ZSBkZWZpbml0aW9uLgotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBleHRlbmRzIFNjaGVtYUZpZWxkCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgI1BST0hJQklURUR9LCB7QGxpbmsgI09QVElPTkFMfSwgb3Ige0BsaW5rICNSRVFVSVJFRH0uCi0gICAgICogKEFjdHVhbGx5LCBuZXZlciByZXR1cm5zIFBST0hJQklURUQgYmVjYXVzZSB0aGUgc2NoZW1hIHNwZWNpZmljYWlvbgotICAgICAqIHN0YXRlcyB0aGF0IGEgcHJvaGliaXRlZCBhdHRyaWJ1dGUgaXMgZXF1aXZhbGVudCB0byBubyBhdHRyaWJ1dGUKLSAgICAgKiBhdCBhbGwsIHNvIGEgcHJvaGliaXRlZCBhdHRyaWJ1dGUgd2lsbCBuZXZlciBiZSBwcmVzZW50IGluIHRoZSBjb21waWxlZAotICAgICAqIG1vZGVsLikKLSAgICAgKi8KLSAgICBpbnQgZ2V0VXNlKCk7Ci0KLSAgICAvKiogQSBwcm9oaWJpdGVkIGF0dHJpYnV0ZS4gIFNlZSB7QGxpbmsgI2dldFVzZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBQUk9ISUJJVEVEID0gMTsKLSAgICAvKiogQW4gb3B0aW9uYWwgYXR0cmlidXRlLiAgU2VlIHtAbGluayAjZ2V0VXNlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMID0gMjsKLSAgICAvKiogQSByZXF1aXJlZCBhdHRyaWJ1dGUuICBTZWUge0BsaW5rICNnZXRVc2V9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRUQgPSAzOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUxvY2FsRWxlbWVudC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUxvY2FsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZlYjQwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGxvY2FsIG9yIGdsb2JhbCBlbGVtZW50IGRlZmluaXRpb24uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUxvY2FsRWxlbWVudCBleHRlbmRzIFNjaGVtYUZpZWxkCi17Ci0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBleHRlbnNpb24gaXMgYmxvY2tlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGJsb2NrRXh0ZW5zaW9uKCk7Ci0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiByZXN0cmljdGlvbiBpcyBibG9ja2VkLgotICAgICAqLwotICAgIGJvb2xlYW4gYmxvY2tSZXN0cmljdGlvbigpOwotICAgIC8qKgotICAgICAqIFRydWUgaWYgZWxlbWVudCBzdWJzdGl0dXRpb24gaXMgYmxvY2tlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGJsb2NrU3Vic3RpdHV0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZWxlbWVudCBpcyBwcm9oaWJpdGVkIGluIGNvbnRlbnQuIE9ubHkKLSAgICAgKiBzZW5zaWJsZSBpZiB0aGlzIGlzIHRoZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwOwotICAgICAqIHRoZW4gb25seSBzdWJzdGl0dXRpb24gZ3JvdXAgbWVtYmVycyBjYW4gYXBwZWFyLjxQPgotICAgICAqIAotICAgICAqIEFsdGhvdWdoIGxvY2FsIGVsZW1lbnRzIGNhbm5vdCBiZSBhYnN0cmFjdCwgaWYgYW4gZWxlbWVudCAKLSAgICAgKiB1c2UgaXMgYSByZWYgdG8gYSBnbG9iYWwgZWxlbWVudCwgdGhlbiB0aGUgZmxhZyBmcm9tIHRoZSAKLSAgICAgKiBnbG9iYWwgZWxlbWVudCBpcyBjb3BpZWQgaW4gdG8gdGhlIGxvY2FsIGVsZW1lbnQgd2hlcmUgdGhlIAotICAgICAqIHVzZSBvY2N1cnMuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0Fic3RyYWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgS2V5LCBLZXlSZWYsIGFuZCBVbmlxdWUgY29uc3RyYWludHMKLSAgICAgKiBvbiB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYU1vZGVsR3JvdXAuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFNb2RlbEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZWY2NjEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYU1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBtb2RlbCBncm91cC4KLSAqIDxwPgotICogQSBtb2RlbCBncm91cCBpcyBhIHN5bnRhY3RpYyBjb25zdHJ1Y3QsIG5vdCBhIHBhcnQgb2YKLSAqIHRoZSBsb2dpY2FsIG1vZGVsLiBGb3IgZXhhbXBsZSwgdHlwZXMgZGVjbGFyZWQgd2l0aGluIGEKLSAqIG1vZGVsIGdyb3VwIGJlY29tZSBsb2NhbCB0byB0aGUgdHlwZSB0aGF0IHVzZXMgdGhlIGdyb3VwIC0KLSAqIHRoZXkncmUgbm90IGxvY2FsIHRvIHRoZSBtb2RlbCBncm91cCBpdHNlbGYuIFRoZXJlZm9yZSBpbgotICogdGhlIGxvZ2ljYWwgbW9kZWwgb2YgYSBzY2hlbWEgdHlwZSBzeXN0ZW0sIGEgbW9kZWwgZ3JvdXAKLSAqIGRvZXNuJ3QgcmVwcmVzZW50IGFueXRoaW5nLiBJdHMgY29udGVudHMgYXJlIG1lcmdlZCBpbnRvCi0gKiB0aGUgbG9naWNhbCBtb2RlbCBhdCBwYXJzZSB0aW1lLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYU1vZGVsR3JvdXAgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIFNjaGVtYUNvbXBvbmVudC5HUk9VUC4KLSAgICAgKi8KLSAgICBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIG1vZGVsIGdyb3VwLgotICAgICAqLwotICAgIFFOYW1lIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgbW9kZWwgZ3JvdXBzLgotICAgICAqIAotICAgICAqIEBleGNsdWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBSZWYgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQuUmVmCi0gICAgewotICAgICAgICBwdWJsaWMgUmVmKFNjaGVtYU1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgICAgICAgICAgIHsgc3VwZXIobW9kZWxHcm91cCk7IH0KLQotICAgICAgICBwdWJsaWMgUmVmKFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtLCBTdHJpbmcgaGFuZGxlKQotICAgICAgICAgICAgeyBzdXBlcihzeXN0ZW0sIGhhbmRsZSk7IH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgICAgICAgICAgeyByZXR1cm4gU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYU1vZGVsR3JvdXAgZ2V0KCkKLSAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFNb2RlbEdyb3VwKWdldENvbXBvbmVudCgpOyB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVBhcnRpY2xlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hUGFydGljbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkYmQyMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hUGFydGljbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBTY2hlbWEgcGFydGljbGUgZGVmaW5pdGlvbi4KLSAqIDxwPgotICogVGhlIGNvbnRlbnQgbW9kZWwgb2YgYSBjb21wbGV4IHR5cGUgaXMgYSB0cmVlIG9mIHBhcnRpY2xlcy4gIEVhY2gKLSAqIHBhcnRpY2xlIGlzIGVpdGhlciBhbiB7QGxpbmsgI0FMTH0sIHtAbGluayAjQ0hPSUNFfSwge0BsaW5rICNTRVFVRU5DRX0sCi0gKiB7QGxpbmsgI0VMRU1FTlR9LCBvciB7QGxpbmsgI1dJTERDQVJEfS4KLSAqIEFsbCwgY2hvaWNlIGFuZCBzZXF1ZW5jZSBwYXJ0aWNsZXMgYXJlIGdyb3VwcyB0aGF0IGNhbiBoYXZlIGNoaWxkCi0gKiBwYXJ0aWNsZXM7IGVsZW1lbnRzIGFuZCB3aWxkY2FyZHMgYXJlIGFsd2F5cyBsZWF2ZXMgb2YgdGhlIHBhcnRpY2xlIHRyZWUuCi0gKiA8cD4KLSAqIFRoZSB0cmVlIG9mIHBhcnRpY2xlcyBhdmFpbGFibGUgb24gYSBzY2hlbWEgdHlwZSBpcyBtaW5pbWl6ZWQsIHRoYXQKLSAqIGlzLCBpdCBhbHJlYWR5IGhhcyByZW1vdmVkICJwb2ludGxlc3MiIHBhcnRpY2xlcyBzdWNoIGFzIGVtcHR5Ci0gKiBzZXF1ZW5jZXMsIG5vbnJlcGVhdGluZyBzZXF1ZW5jZXMgd2l0aCBvbmx5IG9uZSBpdGVtLCBhbmQgc28gb24uCi0gKiAoPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtcGFydGljbGUtcmVzdHJpY3QiPlBvaW50bGVzcyBwYXJ0aWNsZXM8L2E+Ci0gKiBhcmUgZGVmaW5lZCBwcmVjaXNlbHkgaW4gdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbi4pCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRDb250ZW50TW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFQYXJ0aWNsZQotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcnRpY2xlIHR5cGUgKHtAbGluayAjQUxMfSwge0BsaW5rICNDSE9JQ0V9LAotICAgICAqIHtAbGluayAjU0VRVUVOQ0V9LCB7QGxpbmsgI0VMRU1FTlR9LCBvciB7QGxpbmsgI1dJTERDQVJEfSkuIAotICAgICAqLyAKLSAgICBpbnQgZ2V0UGFydGljbGVUeXBlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW4gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWNvbnRlbnRNb2RlbCI+eHM6YWxsPC9hPiBncm91cC4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IEFMTCA9IDE7Ci0gICAgLyoqCi0gICAgICogQSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUtY29udGVudE1vZGVsIj54czpjaG9pY2U8L2E+IGdyb3VwLgotICAgICAqIFNlZSB7QGxpbmsgI2dldFBhcnRpY2xlVHlwZX0uCi0gICAgICovIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gMjsKLSAgICAvKioKLSAgICAgKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1jb250ZW50TW9kZWwiPnhzOnNlcXVlbmNlPC9hPiBncm91cC4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFID0gMzsKLSAgICAvKioKLSAgICAgKiBBbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUtZWxlbWVudCI+eHM6ZWxlbWVudDwvYT4gcGFydGljbGUuCi0gICAgICogVGhpcyBjb2RlIG1lYW5zIHRoZSBwYXJ0aWNsZSBjYW4gYmUgY29lcmNlZCB0byB7QGxpbmsgU2NoZW1hTG9jYWxFbGVtZW50fS4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSA0OwotICAgIC8qKgotICAgICAqIEFuIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1vcGVubmVzcyI+eHM6YW55PC9hPiBwYXJ0aWNsZSwKLSAgICAgKiBhbHNvIGtub3duIGFzIGFuIGVsZW1lbnQgd2lsZGNhcmQuCi0gICAgICogU2VlIHtAbGluayAjZ2V0UGFydGljbGVUeXBlfS4KLSAgICAgKi8gCi0gICAgc3RhdGljIGZpbmFsIGludCBXSUxEQ0FSRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtaW5PY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUuCi0gICAgICogSWYgaXQncyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHRoaXMgcmV0dXJucyBCaWdJbnRlZ2VyLk9ORS4KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlIGZvciB0aGlzIHBhcnRpY2xlLCBvciBudWxsIGlmIGl0Ci0gICAgICogaXMgdW5ib3VuZGVkLgotICAgICAqIElmIGl0J3Mgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGlzIHJldHVybnMgQmlnSW50ZWdlci5PTkUuCi0gICAgICovCi0gICAgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1pbk9jY3VycyB2YWx1ZSwgcGVnZ2VkIHRvIGEgMzItYml0IGludCBmb3IKLSAgICAgKiBjb252ZW5pZW5jZSBvZiBhIHZhbGlkYXRpbmcgc3RhdGUgbWFjaGluZSB0aGF0IGRvZXNuJ3QgY291bnQKLSAgICAgKiBoaWdoZXIgdGhhbiBNQVhfSU5UIGFueXdheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlLCBwZWdnZWQgdG8gYSAzMi1iaXQgaW50IGZvcgotICAgICAqIGNvbnZlbmllbmNlIG9mIGEgdmFsaWRhdGluZyBzdGF0ZSBtYWNoaW5lIHRoYXQgZG9lc24ndCBjb3VudAotICAgICAqIGhpZ2hlciB0aGFuIE1BWF9JTlQgYW55d2F5LiBVbmJvdW5kZWQgaXMgZ2l2ZW4gYXMgTUFYX0lOVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludE1heE9jY3VycygpOwotCi0KLSAgICAvKioKLSAgICAgKiBPbmUgaWYgbWluT2NjdXJzID09IG1heE9jY3VycyA9PSAxLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNTaW5nbGV0b24oKTsKLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdG8gc2VxdWVuY2UsIGNob2ljZSwgYW5kIGFsbCBwYXJ0aWNsZXMgb25seTogcmV0dXJucyBhbiBhcnJheQotICAgICAqIG9mIGFsbCB0aGUgcGFydGljbGUgY2hpbGRyZW4gaW4gb3JkZXIuCi0gICAgICovCi0gICAgU2NoZW1hUGFydGljbGVbXSBnZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbm90aGVyIHdheSB0byBhY2Nlc3MgdGhlIHBhcnRpY2xlIGNoaWxkcmVuLgotICAgICAqLwotICAgIFNjaGVtYVBhcnRpY2xlIGdldFBhcnRpY2xlQ2hpbGQoaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBpbnQgY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBwYXJ0aWNsZSBjYW4gc3RhcnQgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudAotICAgICAqICh0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdHJ1Y3R1cmUgb2YgYWxsIGNoaWxkIHBhcnRpY2xlcwotICAgICAqIG9mIGNvdXJzZSkuCi0gICAgICovCi0gICAgYm9vbGVhbiBjYW5TdGFydFdpdGhFbGVtZW50KFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUU5hbWVTZXQgb2YgZWxlbWVudCBuYW1lcyB0aGF0IGNhbiBiZQotICAgICAqIGFjY2VwdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBwYXJ0aWNsZS4KLSAgICAgKi8KLSAgICBRTmFtZVNldCBhY2NlcHRlZFN0YXJ0TmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBwYXJ0aWNsZSBjYW4gYmUgc2tpcHBlZCAodGFraW5nIGludG8gYWNjb3VudAotICAgICAqIGJvdGggdGhlIG1pbk9jdXJzIGFzIHdlbGwgYXMgdGhlIHN0cnVjdHVyZSBvZiBhbGwgdGhlCi0gICAgICogY2hpbGQgcGFydGljbGVzKQotICAgICAqLwotICAgIGJvb2xlYW4gaXNTa2lwcGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciB3aWxkY2FyZHMsIHJldHVybnMgYSBRTmFtZVNldCByZXByZXNlbnRpbmcgdGhlIHdpbGRjYXJkLgotICAgICAqLwotICAgIFFOYW1lU2V0IGdldFdpbGRjYXJkU2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igd2lsZGNhcmRzLCByZXR1cm5zIHRoZSBwcm9jZXNzaW5nIGNvZGUgKHtAbGluayAjU1RSSUNUfSwge0BsaW5rICNMQVh9LCB7QGxpbmsgI1NLSVB9KS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0V2lsZGNhcmRQcm9jZXNzKCk7Ci0KLSAgICAvKiogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNXaWxkY2FyZF9kZXRhaWxzIj5TdHJpY3Qgd2lsZGNhcmQ8L2E+IHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUUklDVCA9IDE7Ci0gICAgLyoqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jV2lsZGNhcmRfZGV0YWlscyI+TGF4IHdpbGRjYXJkPC9hPiBwcm9jZXNzaW5nLiBTZWUge0BsaW5rICNnZXRXaWxkY2FyZFByb2Nlc3N9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBMQVggPSAyOwotICAgIC8qKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI1dpbGRjYXJkX2RldGFpbHMiPlNraXAgd2lsZGNhcmQ8L2E+IHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNLSVAgPSAzOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRoZSBRTmFtZSBmb3IgdGhlIGVsZW1lbnQgdXNlLgotICAgICAqIE1heSBiZSB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHJlZmVyZW5jZWQgZWxlbWVudCdzIG5hbWUuCi0gICAgICovCi0gICAgUU5hbWUgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIFNjaGVtYVR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRydWUgaWYgbmlsbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc05pbGxhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZWxlbWVudHMgb25seTogcmV0dXJucyB0aGUgZGVmYXVsdCAob3IgZml4ZWQpIHRleHQgdmFsdWUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3IgZWxlbWVudHMgb25seTogcmV0dXJucyB0aGUgZGVmYXVsdCAob3IgZml4ZWQpIHN0cm9uZ2x5LXR5cGVkIHZhbHVlCi0gICAgICovCi0gICAgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiBUcnVlIGlmIGhhcyBkZWZhdWx0LiBJZiBpc0ZpeGVkLCB0aGVuIGlzRGVmYXVsdCBpcyBhbHdheXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVmYXVsdCgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRydWUgaWYgaXMgZml4ZWQgdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ZpeGVkKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hUHJvcGVydHkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDcxMjYxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHN1bW1hcnkgb2Ygc2ltaWxhciBTY2hlbWFGaWVsZHMgaW4gYSBjb21wbGV4IHR5cGUuCi0gKiA8cD4KLSAqIEluIGEgc2NoZW1hIHR5cGUsIGV2ZXJ5IGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIG11c3QgaGF2ZSB0aGUKLSAqIHNhbWUgdHlwZS4gIFRoZXJlZm9yZSwgYWxsIHRvZ2V0aGVyLCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAqIGZvcm0gYSBjb2hlcmVudCBjb2xsZWN0aW9uIG9mIHNpbWlsYXIgZWxlbWVudHMuICBTaW1pbGFybHksIGF0dHJpYnV0ZXMKLSAqIGNhbiBvbmx5IGJlIGRlZmluZWQgb25jZSwgc28gZWFjaCBhdHRyaWJ1dGUgb2J2aW91c2x5IGlzIGEgY29oZXJlbnQKLSAqIGdyb3VwIG9uIGl0cyBvd24uCi0gKiA8cD4KLSAqIEEgU2NoZW1hUHJvcGVydHkgcmVwcmVzZW50cyBhIHN1bW1hcnkgb2YgdGhlIHRoZSBlbGVtZW50cyB3aXRoIGEKLSAqIGdpdmVuIG5hbWUgb3IgdGhlIGF0dHJpYnV0ZSB3aXRoIGEgZ2l2ZW4gbmFtZS4gIEl0IHJlcHJlc2VudHMgdGhlCi0gKiBzdW1tYXJ5IGNhcmRpbmFsaXR5IG9mIHRoZSBmaWVsZHMsIHRoZSBzdW1tYXJ5IGRlZmF1bHQgYW5kIGZpeGVkCi0gKiB2YWx1ZXMsIGFuZCBzbyBvbi4gIFdoZW4gaW5mZXJyaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGVsZW1lbnQKLSAqIG9yIGF0dHJpYnV0ZSwgaXQgaXMgdHlwaWNhbGx5IGVhc2llciB0byBjb25zdWx0IHRoZW4gU2NoZW1hUHJvcGVydHkKLSAqIHRoYW4gdG8gaHVudCBmb3IgdGhlIGV4YWN0IFNjaGVtYUZpZWxkIGluIHRoZSBwYXJ0aWNsZSB0cmVlIG9yCi0gKiBhdHRyaWJ1dGUgbW9kZWwuCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRQcm9wZXJ0aWVzCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0QXR0cmlidXRlUHJvcGVydGllcwotICogQHNlZSBTY2hlbWFUeXBlI2dldEVsZW1lbnRQcm9wZXJ0aWVzCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0QXR0cmlidXRlUHJvcGVydHkKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRFbGVtZW50UHJvcGVydHkKLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFQcm9wZXJ0eQotewotICAgIC8qKgotICAgICAqIFRoZSB0eXBlIHdpdGhpbiB3aGljaCB0aGlzIHByb3BlcnR5IGFwcGVhcnMKLSAgICAgKi8gCi0gICAgU2NoZW1hVHlwZSBnZXRDb250YWluZXJUeXBlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50IG9yIGF0dHJpYnV0ZQotICAgICAqLyAKLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZWxlbWVudCBwcm9wZXJ0aWVzIHRoZSBzZXQgb2YgbmFtZXMgdGhhdCBhcmUgYWNjZXB0ZWQgZm9yIHRoaXMgcHJvcGVydHkKLSAgICAgKiBpZiB0aGlzIGVsZW1lbnQgaXMgdGhlIGhlYWQgb2YgYSBzdWJzdGl0dXRpb24gZ3JvdXAuIFRoaXMgd2lsbCBhbHdheXMKLSAgICAgKiBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBpZSwgdGhlIHByb3BlcnR5J3MgbmFtZS4KLSAgICAgKi8KLSAgICBRTmFtZVtdIGFjY2VwdGVkTmFtZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgSmF2YSBuYW1lIGZvciB0aGlzIHByb3BlcnR5LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBtZXRob2QgdG8KLSAgICAgKiBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSBpcyBjYWxsZWQgZ2V0Rmlyc3ROYW1lLCB0aGVuIHRoaXMgbWV0aG9kCi0gICAgICogcmV0dXJucyB0aGUgc3RyaW5nICJGaXJzdE5hbWUiLiAgTWF5IGJlIG51bGwgaWYgdGhlIHNjaGVtYSB0eXBlCi0gICAgICogaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHRvIEphdmEuCi0gICAgICovIAotICAgIFN0cmluZyBnZXRKYXZhUHJvcGVydHlOYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnRpZXMuCi0gICAgICovIAotICAgIGJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBmb3IgYXR0cmlidXRlcy4KLSAgICAgKi8gCi0gICAgYm9vbGVhbiBpc0F0dHJpYnV0ZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNjaGVtYSB0eXBlIGZvciB0aGUgcHJvcGVydHkuCi0gICAgICovIAotICAgIFNjaGVtYVR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLy8gbm90ZSB0aGF0IGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHksIGlmIHRoZSBhcnJheSBnZXR0ZXIgc2hvd3MgdXAgZmlyc3QsCi0gICAgLy8gdGhlbiB0aGUgc2luZ2VsdG9uIGdldHRlciBpcyBuZXZlciBhbGxvd2VkIHRvIHNob3cgdXAuCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2NoZW1hIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgSmF2YSBnZXR0ZXIgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAgICogQXBwbGllcyBvbmx5IHRvIHR5cGVzIHRoYXQgaGF2ZSBiZWVuIGNvZGUgZ2VuZXJhdGVkIHRvIEphdmE7IG1heQotICAgICAqIGJlIGEgYmFzZSB0eXBlIG9mIGdldFR5cGUoKS4KLSAgICAgKi8gCi0gICAgcHVibGljIFNjaGVtYVR5cGUgamF2YUJhc2VkT25UeXBlKCk7IC8vIEphdmEgcHJvcGVydHkgdHlwZSBiYXNlZCBvbiB0aGlzIGJhc2UgdHlwZQotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBKYXZhIGdldHRlciB0aGF0IHJldHVybnMgYSBzaW5nbGV0b24uCi0gICAgICovIAotICAgIGJvb2xlYW4gZXh0ZW5kc0phdmFTaW5nbGV0b24oKTsgLy8gaGFzIHNpbmdsZXRvbiBnZXR0ZXIKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZXJlIGlzIGFuIEphdmEgaXNTZXQgbWV0aG9kIHRoYXQgdGVzdHMgZm9yIHByZXNlbmNlLgotICAgICAqLyAKLSAgICBib29sZWFuIGV4dGVuZHNKYXZhT3B0aW9uKCk7ICAgIC8vIGhhcyBpc1NldCB0ZXN0ZXIKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZXJlIGlzIGEgSmF2YSBnZXR0ZXIgdGhhdCByZXR1cm5zIGFuIGFycmF5LgotICAgICAqLyAKLSAgICBib29sZWFuIGV4dGVuZHNKYXZhQXJyYXkoKTsgICAgIC8vIGhhcyBhcnJheSBnZXR0ZXIgKGNhbGxlZCAtQXJyYXksIGlmIHNpbmdsZXRvbiBpcyBwcmVzZW50KQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hdHVyYWwgSmF2YSB0eXBlIGZvciB0aGlzIHByb3BlcnR5LiAgUmV0dXJucyBlaXRoZXIKLSAgICAgKiBYTUxfT0JKRUNUIChmb3IgY29tcGxleCB0eXBlcykgb3Igb25lIG9mIHRoZSBKQVZBXyogY29uc3RhbnRzIGRlc2NyaWJlZAotICAgICAqIGluIHRoaXMgaW50ZXJmYWNlLgotICAgICAqLyAKLSAgICBpbnQgZ2V0SmF2YVR5cGVDb2RlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGVsZW1lbnQgbmFtZXMgd2hpY2ggc2hvdWxkIGFwcGVhciBzdHJpY3RseSBhZnRlciBhbGwKLSAgICAgKiBvY2N1cmVuY2VzIG9mIHRoZSBlbGVtZW50cyBkZXNjcmliZWQgYnkgdGhpcyBwcm9wZXJ0eS4gRm9yIGVsZW1lbnQgcHJvcGVydGllcyBvbmx5LgotICAgICAqLyAKLSAgICBRTmFtZVNldCBnZXRKYXZhU2V0dGVyRGVsaW1pdGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3VtbWFyaXplZCBtaW5pbXVtIG9jY3VycmFuY2UgbnVtYmVyLgotICAgICAqIEZvciBleGFtcGxlLCBhIHNlcXVlbmNlIGNvbnRhaW5pbmcgYSBub25vcHRpb25hbCBzaW5nbGV0b24gZWxlbWVudCByZXBlYXRlZCB0d2ljZSB3aWxsCi0gICAgICogcmVzdWx0IGluIGEgcHJvcGVydHkgZ2V0TWluT2NjdXJzKCkgb2YgMi4KLSAgICAgKi8gCi0gICAgQmlnSW50ZWdlciBnZXRNaW5PY2N1cnMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3VtbWFyaXplZCBtaW5pbXVtIG9jY3VycmFuY2UgbnVtYmVyLgotICAgICAqIEZvciBleGFtcGxlLCBhIHNlcXVlbmNlIGNvbnRhaW5pbmcgYSBub25vcHRpb25hbCBzaW5nbGV0b24gZWxlbWVudCByZXBlYXRlZCB0d2ljZSB3aWxsCi0gICAgICogcmVzdWx0IGluIGEgcHJvcGVydHkgZ2V0TWF4T2NjdXJzKCkgb2YgMi4KLSAgICAgKi8gCi0gICAgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0BsaW5rICNORVZFUn0sIHtAbGluayAjVkFSSUFCTEV9LCBvciB7QGxpbmsgI0NPTlNJU1RFTlRMWX0gbmlsbGFibGUsIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgKiBuaWxsYWJpbGl0eSBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBwcm9wZXJ0eS4gCi0gICAgICovCi0gICAgaW50IGhhc05pbGxhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAbGluayAjTkVWRVJ9LCB7QGxpbmsgI1ZBUklBQkxFfSwgb3Ige0BsaW5rICNDT05TSVNURU5UTFl9IGRlZmF1bHRlZCwgZGVwZW5kaW5nIG9uIHRoZQotICAgICAqIGRlZmF1bHRzIHByZXNlbnQgaW4gdGhlIGVsZW1lbnRzIGluIHRoaXMgcHJvcGVydHkuIAotICAgICAqLwotICAgIGludCBoYXNEZWZhdWx0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAbGluayAjTkVWRVJ9LCB7QGxpbmsgI1ZBUklBQkxFfSwgb3Ige0BsaW5rICNDT05TSVNURU5UTFl9IGZpeGVkLCBkZXBlbmRpbmcgb24gdGhlCi0gICAgICogZml4ZWQgY29uc3RyYWludHMgcHJlc2VudCBpbiB0aGUgZWxlbWVudHMgaW4gdGhpcyBwcm9wZXJ0eS4gCi0gICAgICovCi0gICAgaW50IGhhc0ZpeGVkKCk7Ci0KLSAgICAvKiogQXBwbGllcyB0byBubyBlbGVtZW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4gIFNlZSB7QGxpbmsgI2hhc05pbGxhYmxlfSwge0BsaW5rICNoYXNEZWZhdWx0fSwge0BsaW5rICNoYXNGaXhlZH0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5FVkVSID0gMDsKLSAgICAvKiogQXBwbGllcyB0byBzb21lLCBidXQgbm90IG90aGVyIGVsZW1lbnRzIGZvciB0aGlzIHByb3BlcnR5LiAgU2VlIHtAbGluayAjaGFzTmlsbGFibGV9LCB7QGxpbmsgI2hhc0RlZmF1bHR9LCB7QGxpbmsgI2hhc0ZpeGVkfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEUgPSAxOwotICAgIC8qKiBBcHBsaWVzIHRvIGFsbCBlbGVtZW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4gIFNlZSB7QGxpbmsgI2hhc05pbGxhYmxlfSwge0BsaW5rICNoYXNEZWZhdWx0fSwge0BsaW5rICNoYXNGaXhlZH0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlNJU1RFTlRMWSA9IDI7Ci0KLSAgICAvKiogQW4gWE1MIEJlYW4gdHlwZSB0aGF0IGluaGVyaXRzIGZyb20ge0BsaW5rIFhtbE9iamVjdH0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUID0gMDsKLQotICAgIC8qKiBKYXZhIHByaW1pdGl2ZSB0eXBlIGNvZGVzIChmb3Igbm9uLW51bGxhYmxlIEphdmEgdHlwZXMpIGFyZSBiZXR3ZWVuIEpBVkFfRklSU1RfUFJJTUlUSVZFIGFuZCBKQVZBX0xBU1RfUFJJTUlUSVZFLCBpbmNsdXNpdmUuICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0ZJUlNUX1BSSU1JVElWRSA9IDE7Ci0KLSAgICAvKiogQSBKYXZhIGJvb2xlYW4uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0JPT0xFQU4gPSAxOwotICAgIC8qKiBBIEphdmEgZmxvYXQuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0ZMT0FUID0gMjsKLSAgICAvKiogQSBKYXZhIGRvdWJsZS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfRE9VQkxFID0gMzsKLSAgICAvKiogQSBKYXZhIGJ5dGUuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0JZVEUgPSA0OwotICAgIC8qKiBBIEphdmEgc2hvcnQuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX1NIT1JUID0gNTsKLSAgICAvKiogQSBKYXZhIGludC4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfSU5UID0gNjsKLSAgICAvKiogQSBKYXZhIGxvbmcuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0xPTkcgPSA3OwotCi0gICAgLyoqIEphdmEgcHJpbWl0aXZlIHR5cGUgY29kZXMgKGZvciBub24tbnVsbGFibGUgSmF2YSB0eXBlcykgYXJlIGJldHdlZW4gSkFWQV9GSVJTVF9QUklNSVRJVkUgYW5kIEpBVkFfTEFTVF9QUklNSVRJVkUsIGluY2x1c2l2ZS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFTVF9QUklNSVRJVkUgPSA3OwotCi0gICAgLyoqIEEge0BsaW5rIGphdmEubWF0aC5CaWdEZWNpbWFsfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQklHX0RFQ0lNQUwgPSA4OwotICAgIC8qKiBBIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0JJR19JTlRFR0VSID0gOTsKLSAgICAvKiogQSB7QGxpbmsgU3RyaW5nfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfU1RSSU5HID0gMTA7Ci0gICAgLyoqIEEgYnl0ZVtdLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CWVRFX0FSUkFZID0gMTE7Ci0gICAgLyoqIEEge0BsaW5rIEdEYXRlfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfR0RBVEUgPSAxMjsKLSAgICAvKiogQSB7QGxpbmsgR0R1cmF0aW9ufS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfR0RVUkFUSU9OID0gMTM7Ci0gICAgLyoqIEEge0BsaW5rIGphdmEudXRpbC5EYXRlfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfREFURSA9IDE0OwotICAgIC8qKiBBIHtAbGluayBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfUU5BTUUgPSAxNTsKLSAgICAvKiogQSB7QGxpbmsgamF2YS51dGlsLkxpc3R9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MSVNUID0gMTY7Ci0gICAgLyoqIEEge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0NBTEVOREFSID0gMTc7Ci0KLSAgICAvKiogQSBnZW5lcmF0ZWQge0BsaW5rIFN0cmluZ0VudW1BYnN0cmFjdEJhc2V9IHN1YmNsYXNzLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9FTlVNID0gMTg7Ci0gICAgLyoqIEEge0BsaW5rIGphdmEubGFuZy5PYmplY3R9LCB1c2VkIGZvciBzb21lIHNpbXBsZSB0eXBlIHVuaW9ucy4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfT0JKRUNUID0gMTk7IC8vIGZvciBzb21lIHVuaW9ucwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBvciBmaXhlZCB2YWx1ZSwKLSAgICAgKiBpZiBpdCBpcyBjb25zaXN0ZW50LiBJZiBpdCBpcyBub3QgY29uc2lzdGVudCwKLSAgICAgKiB0aGVuIHJldHVybnMgbnVsbC4KLSAgICAgKiBTZWUge0BsaW5rICNoYXNEZWZhdWx0fSBhbmQge0BsaW5rICNoYXNGaXhlZH0uCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlZmF1bHRUZXh0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBvciBmaXhlZCB2YWx1ZSBhcyBhIHN0cm9uZ2x5LXR5cGVkIHZhbHVlLAotICAgICAqIGlmIGl0IGlzIGNvbnNpc3RlbnQuIElmIGl0IGlzIG5vdCBjb25zaXN0ZW50LAotICAgICAqIHRoZW4gcmV0dXJucyBudWxsLgotICAgICAqIFNlZSB7QGxpbmsgI2hhc0RlZmF1bHR9IGFuZCB7QGxpbmsgI2hhc0ZpeGVkfS4KLSAgICAgKi8KLSAgICBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVN0cmluZ0VudW1FbnRyeS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVN0cmluZ0VudW1FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTBmZjU2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFTdHJpbmdFbnVtRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogRGVzY3JpYmVzIGEgY29kZS1nZW5lcmF0ZWQgc3RyaW5nIGVudW1lcmF0aW9uCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRTdHJpbmdFbnVtRW50cmllcwotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFTdHJpbmdFbnVtRW50cnkKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgZW51bWVyYXRlZCBzdHJpbmcgdmFsdWUKLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBbiBpbnRlZ2VyIHRvIHJlcHJlc2VudCB0aGlzIGNob2ljZSBpbiB0aGUgZW51bWVyYXRpb24KLSAgICAgKi8gCi0gICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2FwaXRhbGl6ZWQgbmFtZSB0byB1c2UgZm9yIHRoZSBlbnVtZXJhdGlvbiBjb25zdGFudCBuYW1lCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW51bU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ3MTZmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNjaGVtYSB0eXBlLgotICogPHA+Ci0gKiBTY2hlbWFUeXBlIGlzIHRoZSBtZXRhZGF0YSAidHlwZSIgY2xhc3MgZm9yIHtAbGluayBYbWxPYmplY3R9LCBhbmQgaXQgcGxheXMgdGhlCi0gKiBhbmFsb2dvdXMgcm9sZSBmb3Ige0BsaW5rIFhtbE9iamVjdH0gdGhhdCB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfSBwbGF5cyBmb3IKLSAqIHtAbGluayBqYXZhLmxhbmcuT2JqZWN0fS4KLSAqIDxwPgotICogRXZlcnkgWE1MIEJlYW4gY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGV0b24gU2NoZW1hVHlwZSBvYmplY3QKLSAqIG9idGFpbmFibGUgYnkgQ2xhc3NOYW1lLnR5cGUgKGUuZy4sIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXIjdHlwZX0pLCBhbmQKLSAqIGV2ZXJ5IFhNTCBCZWFuIGluc3RhbmNlIGhhcyBhbiBhY3R1YWwgU2NoZW1hVHlwZSwgb2J0YWluYWJsZSBieQotICoge0BsaW5rIFhtbE9iamVjdCNzY2hlbWFUeXBlfS4gIFRoZSBDbGFzc05hbWUudHlwZSBhbmQgc2NoZW1hVHlwZSgpIG1lY2hhbmlzbXMgYXJlCi0gKiBhbmFsb2dvdXMgdG8gdGhlIG9yZGluYXJ5IEphdmEgQ2xhc3NOYW1lLmNsYXNzIGFuZCBvYmouZ2V0Q2xhc3MoKSBtZWNoYW5pc21zLgotICogPHA+Ci0gKiBBbGwgc2NoZW1hIHR5cGVzIGFyZSByZXByZXNlbnRlZCBieSBhIFNjaGVtYVR5cGUsIHRoaXMgaW5jbHVkZXMgYWxsIHR5cGVzCi0gKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgYnVpbHQtaW4gb3IgdXNlci1kZWZpbmVkLCBjb21waWxlZCBvcgotICogdW5jb21waWxlZCwgc2ltcGxlIG9yIGNvbXBsZXguCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uLCBhIGNvbXBpbGVkIFhNTCBCZWFuIHR5cGUgc3lzdGVtIGluY2x1ZGVzIHNwZWNpYWwgImRvY3VtZW50IiBzY2hlbWEgdHlwZXMKLSAqIGVhY2ggcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgY29udGFpbmluZyBub3RoaW5nIGJ1dCBhIHNpbmdsZSBlbGVtZW50IGZvciBlYWNoCi0gKiBnbG9iYWwgZWxlbWVudCwgYW5kIHNwZWNpYWwgImF0dHJpYnV0ZSIgc2NoZW1hIHR5cGVzIGVhY2ggcmVwcmVzZW50aW5nCi0gKiBhIGZyYWdtZW50IGNvbnRhaW5pbmcgbm90aGluZyBidXQgYSBzaW5nbGUgZ2xvYmFsIGF0dHJpYnV0ZSBmb3IgZ2xvYmFsCi0gKiBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIERvIG5vdCBjb25mdXNlIFNjaGVtYSBUeXBlcyB3aXRoIG90aGVyIHR5cGVzIG9mIFNjaGVtYSBDb21wb25lbnRzIHN1Y2ggYXMKLSAqIHtAbGluayBTY2hlbWFHbG9iYWxFbGVtZW50IEdsb2JhbCBFbGVtZW50c30sIHtAbGluayBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgR2xvYmFsIEF0dHJpYnV0ZXN9LAotICoge0BsaW5rIFNjaGVtYU1vZGVsR3JvdXAgTmFtZWQgTW9kZWwgR3JvdXBzfSwgb3Ige0BsaW5rIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIEF0dHJpYnV0ZSBHcm91cHN9LgotICogU2NoZW1hVHlwZSByZXByZXNlbnRzIGEgVHlwZSBjb21wb25lbnQsIG5vdCBhbnkgb2YgdGhlIG90aGVyIGtpbmRzIG9mIGNvbXBvbmVudHMuCi0gKiBUaGVyZSBhcmUgZGlmZmVyZW50IGtpbmRzIG9mIG1ldGFkYXRhIG9iamVjdHMgZm9yIHRoZSBkaWZmZXJlbnQgU2NoZW1hIGNvbXBvbmVudHMuIAotICogPHA+Ci0gKiBUaGUgc3BhY2Ugb2YgU2NoZW1hVHlwZXMgaXMgZGl2aWRlZCBhcyBmb2xsb3dzOgotICogCi0gKiA8dWw+Ci0gKiA8bGk+Rmlyc3QsIHRoZXJlIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlIGFuZCB0aGUgdW5pdmVyc2FsCi0gKiAgICAgc3VidHlwZS4gIFRoZXNlIGFyZSB7QGxpbmsgWG1sT2JqZWN0I3R5cGV9Ci0gKiAgICAgKGNvcnJlc3BvbmRpbmcgdG8geHM6YW55VHlwZSkgYW5kIHtAbGluayBYbWxCZWFucyNOT19UWVBFfSwKLSAqICAgICByZXNwZWN0aXZlbHkuICBUaGUgZmlyc3QgdHlwZSBpcyBhIGJhc2UgdHlwZSBvZiBhbGwgb3RoZXIKLSAqICAgICB0eXBlcy4gIFRoZSBvdGhlciB0eXBlIGluZGljYXRlcyB0aGUgYWJzZW5jZSBvZiB0eXBlIGluZm9ybWF0aW9uCi0gKiAgICAgYW5kLCBhdCBsZWFzdCBpbiBzZXQtdGhlb3JldGljIHRlcm1zLCBpcyBhIHN1YnR5cGUgb2YgYWxsIG90aGVyIHR5cGVzLgotICogPGxpPlRoZXJlIGlzIGFub3RoZXIgdW5pdmVyc2FsIGJhc2UgdHlwZSB0aGF0IGlzIHRoZSBiYXNlIHR5cGUKLSAqICAgICBmb3IgYWxsIHNpbXBsZSB0eXBlcy4gIFRoaXMgaXMgdGhlIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlI3R5cGV9LAotICogICAgIGNvcnJlc3BvbmRpbmcgdG8geHM6YW55U2ltcGxlVHlwZS4gICBPbmx5IFhtbE9iamVjdC50eXBlIGFuZAotICogICAgIFhtbEFueVNpbXBsZVR5cGUudHlwZSByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHtAbGluayAjaXNVUlR5cGV9LCBhbmQKLSAqICAgICBvbmx5IFhtbEJlYW5zLk5PX1RZUEUgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3Ige0BsaW5rICNpc05vVHlwZX0uCi0gKiA8bGk+VGhlIHR3byAic3BlY2lhbCIga2luZHMgb2YgdHlwZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIHRoYXQKLSAqICAgICBkbyBub3QgZm9ybWFsbHkgZXhpc3QgaW4gdGhlIGFjdHVhbCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBhcmUKLSAqICAgICBkb2N1bWVudCB0eXBlcyBhbmQgZ2xvYmFsIGF0dHJpYnV0ZSB0eXBlcyAoY29ycmVzcG9uZGluZyB0bwotICogICAgIGRvY3VtZW50cyB0aGF0IGNvbnRhaW4gYSBnbG9iYWwgZWxlbWVudCwgb3IgZnJhZ21lbnRzIHRoYXQKLSAqICAgICBjb250YWluIGEgZ2xvYmFsIGF0dHJpYnV0ZSkuICBUaGV5IGNhbiBiZSBkZXRlY3RlZCB1c2luZwotICogICAgIHtAbGluayAjaXNEb2N1bWVudFR5cGV9IGFuZCB7QGxpbmsgI2lzQXR0cmlidXRlVHlwZX0uIE90aGVyCi0gKiAgICAgdGhhbiB0aGVpciBhbm9ueW1pdHkgKGxhY2sgb2YgYSB0eXBlIG5hbWUpIGFuZCB0aGVpciBhcHBlYXJhbmNlCi0gKiAgICAgb25seSBhdCB0aGUgcm9vdCBvZiBhbiBpbnN0YW5jZSwgdGhleSBhcmUgb3RoZXJ3aXNlIGp1c3QgbGlrZQotICogICAgIG9yZGluYXJ5IGNvbXBsZXggdHlwZXMuCi0gKiA8bGk+U2ltcGxlIHR5cGVzIGNhbiBiZSBkZXRlY3RlZCB1c2luZyB7QGxpbmsgI2lzU2ltcGxlVHlwZX0uCi0gKiAgICAgQ29tcGxleCB0eXBlcyBhcmUgY29uc2RlcmVkIHRvIGJlIGFsbCB0aGUgdHlwZXMgdGhhdCBhcmUKLSAqICAgICBub3Qgc2ltcGxlLgotICogPGxpPlNpbXBsZSB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHRocmVlIHZhcmlldGllczogYXRvbWljIHR5cGVzLAotICogICAgIGxpc3QgdHlwZXMsIGFuZCB1bmlvbiB0eXBlcy4gIFdoaWNoIHZhcmlldHkgb2Ygc2ltcGxlIHR5cGUKLSAqICAgICB5b3UgaGF2ZSBjYW4gYmUgZGlzY292ZXJkIHVzaW5nIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0uCi0gKiAgICAgSXQgd2lsbCByZXR1cm4gZWl0aGVyIHtAbGluayAjQVRPTUlDfSwge0BsaW5rICNMSVNUfSwgb3IKLSAqICAgICB7QGxpbmsgI1VOSU9OfS4KLSAqIDxsaT5BbiB7QGxpbmsgI0FUT01JQ30gc2ltcGxlIHR5cGUgaXMgYWx3YXlzIGJhc2VkIG9uIG9uZSBvZiB0aGUKLSAqICAgICAyMCBidWlsdC1pbiBwcmltaXRpdmUgc2NoZW1hIHR5cGVzLiAgWW91IGNhbiBkZXRlcm1pbmUKLSAqICAgICB0aGUgdW5kZXJseWluZyBwcmltaXRpdmUgdHlwZSBmb3IgYW4gYXRvbWljIHNpbXBsZSB0eXBlCi0gKiAgICAgYnkgY2FsbGluZyB7QGxpbmsgI2dldFByaW1pdGl2ZVR5cGV9LiAgQW4gYXRvbWljIHR5cGUKLSAqICAgICBtYXkgYWRkIGZhY2V0IHJlc3RyaWN0aW9ucyBvbiB0b3Agb2YgdGhlIHByaW1pdGl2ZSB0eXBlLAotICogICAgIGFuZCB0aGVzZSBmYWNldHMgY2FuIGJlIGV4cGxvcmVkIHVzaW5nIHtAbGluayAjZ2V0RmFjZXR9LAotICogICAgIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LCB7QGxpbmsgI21hdGNoUGF0dGVybkZhY2V0fSwKLSAqICAgICB7QGxpbmsgI2dldEVudW1lcmF0aW9uVmFsdWVzfSwgYW5kIHJlbGF0ZWQgbWV0aG9kcy4KLSAqIDxsaT5BIHtAbGluayAjTElTVH0gc2ltcGxlIHR5cGUgaXMgYWx3YXlzIGJhc2VkIG9uIGFub3RoZXIgbm9uLWxpc3QKLSAqICAgICBzaW1wbGUgdHlwZS4gIFRoZSB1bmRlcmx5aW5nIGxpc3QgaXRlbSB0eXBlIGNhbiBiZSBvYnRhaW5lZAotICogICAgIGJ5IHVzaW5nIHtAbGluayAjZ2V0TGlzdEl0ZW1UeXBlfS4KLSAqIDxsaT5BIHtAbGluayAjVU5JT059IHNpbXBsZSB0eXBlIGlzIGFsd2F5cyBjb21wb3NlZCBvdXQgb2YgYSBudW1iZXIgb2YKLSAqICAgICBvdGhlciBzaW1wbGUgdHlwZXMuICBUaGUgZGlyZWN0IG1lbWJlcnMgb2YgdGhlIHVuaW9uIGNhbgotICogICAgIGJlIG9idGFpbmVkIGJ5IHtAbGluayAjZ2V0VW5pb25NZW1iZXJUeXBlc30uICBXaGVuIHVuaW9ucwotICogICAgIGNvbnNpc3Qgb2Ygb3RoZXIgdW5pb25zLCBpdCBpcyB1c2VmdWwgdG8ga25vdyB1c2VmdWwgdG8ga25vdwotICogICAgIHRoZSAibGVhdmVzIG9mIHRoZSB1bmlvbiB0cmVlIiwgc28gdGhlCi0gKiAgICAgc2V0IG9mIG5vbi11bmlvbiB0eXBlcyBtYWtpbmcgdXAgdGhlIHVuaW9uIGNhbiBiZSBvYnRhaW5lZAotICogICAgIGJ5IHtAbGluayAjZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzfS4gIFRoZSBjbG9zdXJlIG9mIHRoZQotICogICAgIGVudGlyZSAidW5pb24gdHJlZSIgaXMge0BsaW5rICNnZXRVbmlvblN1YlR5cGVzfSAodGhpcyBpbmNsdWRlcwotICogICAgIHRoZSB0eXBlIGl0c2VsZikuICBGb3IKLSAqICAgICBzaW1wbGUgdW5pb25zIHRoYXQgZG8gbm90IGNvbnNpc3Qgb2Ygb3RoZXIgdW5pb25zLCBhbGwgdGhyZWUKLSAqICAgICBvZiB0aGVzZSBzZXRzIGFyZSB0aGUgc2FtZS4KLSAqIDxsaT5Db21wbGV4IHR5cGVzIGhhdmUgbmVzdGVkIHN0cnVjdHVyZS4gIFRoZXkgYXJlIGRpdmlkZWQgaW50bwotICogICAgIGZvdXIgY29udGVudCB0eXBlczogZW1wdHkgY29udGVudCwgc2ltcGxlIGNvbnRlbnQsIGVsZW1lbnQtb25seQotICogICAgIGNvbnRlbnQsIGFuZCBtaXhlZCBjb250ZW50LiAgQWxsIGtpbmRzIG9mIGNvbXBsZXggdHlwZXMgbWF5Ci0gKiAgICAgaGF2ZSBhdHRyaWJ1dGVzLiAgVGhlIGNvbnRlbnQgdHlwZSBmb3IgYSBjb21wbGV4IHR5cGUgY2FuCi0gKiAgICAgYmUgZGVybWluZWQgdXNpbmcge0BsaW5rICNnZXRDb250ZW50VHlwZX0uICBUaGlzIHdpbGwgcmV0dXJuCi0gKiAgICAge0BsaW5rICNFTVBUWV9DT05URU5UfSwge0BsaW5rICNTSU1QTEVfQ09OVEVOVH0sCi0gKiAgICAge0BsaW5rICNFTEVNRU5UX0NPTlRFTlR9LCBvciB7QGxpbmsgI01JWEVEX0NPTlRFTlR9LgotICogPGxpPklmIGEgY29tcGxleCB0eXBlIGhhcyB7QGxpbmsgI0VNUFRZX0NPTlRFTlR9LCB0aGUgY29udGVudCBtb2RlbCB3aWxsIGJlIG51bGwuCi0gKiA8bGk+SWYgYSBjb21wbGV4IHR5cGUgaGFzIHtAbGluayAjU0lNUExFX0NPTlRFTlR9LCB0aGVuIGl0IHdpbGwgZXh0ZW5kIHRoZQotICogICAgIHNpbXBsZSB0eXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50LiAgSW4gYWRkaXRpb24sIHRoZSB0eXBlCi0gKiAgICAgbWF5IGltcG9zZSBhZGRpdGlvbmFsIHNpbXBsZSB0eXBlIGZhY2V0IHJlc3RyaWN0aW9uczsgdGhlc2UgY2FuIAotICogICAgIGJlIGRldGVybWluZWQgaW4gdGhlIHNhbWUgd2F5IHRoZXkgYXJlIGZvciBhIHNpbXBsZSB0eXBlLgotICogPGxpPklmIGEgY29tcGxleCB0eXBlIGhhcyB7QGxpbmsgI0VMRU1FTlRfQ09OVEVOVH0gb3Ige0BsaW5rICNNSVhFRF9DT05URU5UfSwgdGhlbgotICogICAgIHRoZSBkZXRhaWxlZCBjb250ZW50IG1vZGVsIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGV4YW1pbmluZwotICogICAgIHRoZSBwYXJ0aWNsZSB0cmVlICh3aGljaCBtYXkgYmUgbnVsbCBmb3IgTUlYRURfQ09OVEVOVCkuCi0gKiAgICAgVGhlIHBhcnRpY2xlIHRyZWUgY2FuIGJlIG9idGFpbmVkIHZpYSB7QGxpbmsgI2dldENvbnRlbnRNb2RlbH0uCi0gKiA8bGk+V2hlbiB3b3JraW5nIHdpdGggYSBjb21wbGV4IHR5cGUsIG1vc3QgdXNlcnMgd2lsbCBmaW5kIGl0Ci0gKiAgICAgc3VmZmljaWVudCB0byBkaXNjb3ZlciB0aGUgc3VtbWFyaXplZCBzaGFwZSBvZiB0aGUgY29udGVudCBtb2RlbAotICogICAgIGFuZCBhdHRyaWJ1dGUgbW9kZWwgdXNpbmcge0BsaW5rICNnZXRFbGVtZW50UHJvcGVydGllc30sCi0gKiAgICAge0BsaW5rICNnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzfSwgYW5kIHJlbGF0ZWQgbWV0aG9kcyByYXRoZXIgdGhhbgotICogICAgIGV4YW1pbmluZyB0aGUgcGFydGljbGUgdHJlZSBhbmQgYXR0cmlidXRlIG1vZGVsIGRpcmVjdGx5LgotICogPC91bD4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyCi0gKiBAc2VlIFhtbE9iamVjdCNzY2hlbWFUeXBlCi0gKiBAc2VlIFNpbXBsZVZhbHVlI2luc3RhbmNlVHlwZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFUeXBlIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgdXNlZCB0byBkZXNjcmliZSB0aGUgdHlwZSBpbiB0aGUgc2NoZW1hLgotICAgICAqIE51bGwgaWYgdGhlIHR5cGUgaXMgYW5vbnltb3VzIChuZXN0ZWQpLCBvciBpZiBpdCBpcyBhIGRvY3VtZW50IHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFFOYW1lIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgc2NoZW1hIGVsZW1lbnQuCi0gICAgICogTnVsbCBmb3IgdG9wLWxldmVsIChuYW1lZCkgdHlwZXMgYW5kIGRvY3VtZW50IHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFGaWVsZCBnZXRDb250YWluZXJGaWVsZCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGlzIGEgZG9jdW1lbnQgdHlwZS4KLSAgICAgKiA8cD4KLSAgICAgKiBEb2N1bWVudCB0eXBlcyBhcmUgZ2VuZXJhdGVkIGZvciBldmVyeSBnbG9iYWwgZWxlbWVudC4gQSBkb2N1bWVudAotICAgICAqIHR5cGUgaXMgYW4gdW5uYW1lZCBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50OgotICAgICAqIHdlIGRlZmluZSB0aGVzZSB0eXBlcywgYmVjYXVzZSB0aGV5IGFyZSB0aGUgdHlwZXMgb2YgdGhlICJkb2N1bWVudHMiCi0gICAgICogd2hpY2ggY29udGFpbiB0aGUgZGVmaW5lZCBnbG9iYWwgZWxlbWVudHMsIGFuZCB0aGV5IGFsbCB0dXJuIGludG8KLSAgICAgKiBKYXZhIHR5cGVzLiAoTmFtZWQgRWxlbWVudG5hbWVEb2N1bWVudC4pCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBpcyBhIGF0dHJpYnV0ZSB0eXBlLgotICAgICAqIDxwPgotICAgICAqIEF0dHJpYnV0ZSB0eXBlcyBhcmUgZ2VuZXJhdGVkIGZvciBldmVyeSBnbG9iYWwgYXR0cmlidXRlLiBBbiBhdHRyaWJ1dGUKLSAgICAgKiB0eXBlIGlzIGFuIHVubmFtZWQgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgZXhhY3RseSBvbmUgYXR0cmlidXRlOgotICAgICAqIHdlIGRlZmluZSB0aGVzZSB0eXBlcywgYmVjYXVzZSB0aGV5IGFyZSB0aGUgdHlwZXMgb2YgdGhlICJhdHRyaWJ1dGUgZG9jdW1lbnRzIgotICAgICAqIHdoaWNoIGNvbnRhaW4gdGhlIGRlZmluZWQgZ2xvYmFsIGF0dHJpYnV0ZSwgYW5kIHRoZXkgYWxsIHR1cm4gaW50bwotICAgICAqIEphdmEgdHlwZXMuIChOYW1lZCBBdHRyaWJ1dGVuYW1lQXR0cmlidXRlLikKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVR5cGUoKTsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgZWxlbWVudCBuYW1lIGlmIHRoaXMgaXMgYSBkb2N1bWVudCB0eXBlLAotICAgICAqIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgcW5hbWUgaWYgdGhpcyBpcyBhIGF0dHJpYnV0ZSB0eXBlLAotICAgICAqIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG91dGVyIHNjaGVtYSB0eXBlLgotICAgICAqIE51bGwgZm9yIHRvcC1sZXZlbCAobmFtZWQpIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldE91dGVyVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGFub255bW91cyB0eXBlIGhhcyBubyBjb3JyZXNwb25kaW5nIEphdmEgdHlwZS4gVHJ1ZSBmb3IKLSAgICAgKiBhbm9ueW1vdXMgdHlwZXMgbmVzdGVkIHdpdGhpbiBzaW1wbGUgdHlwZSByZXN0cmljdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHNjaGVtYSB0eXBlIHdhcyBjb21waWxlZCB0byBoYXZlIGEgY29ycmVzcG9uZGluZwotICAgICAqIEphdmEgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21waWxlZCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiB0aGUgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGdWxsSmF2YU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzaG9ydCB1bnF1YWxmaWllZCBKYXZhIG5hbWUgZm9yIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNob3J0SmF2YU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RnVsbEphdmFJbXBsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNob3J0IHVucXVhbGZpaWVkIEphdmEgbmFtZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBKYXZhIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzY2hlbWEgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSmF2YSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGZvciB0aGlzIHNjaGVtYSB0eXBlLAotICAgICAqIGlmIGFwcGxpY2FibGUgKG9yIG51bGwgaWYgbm90IGFuIGVudW1lcmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0RW51bUphdmFDbGFzcygpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgWHNkIHR5cGUgaXMgYW5vbnltb3VzIChpLmUuLCBub3QgdG9wLWxldmVsKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Fub255bW91c1R5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIGFueSBvZiB0aGUgNDArIGJ1aWx0LWluIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQnVpbHRpblR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIHRoZSBhbnlTaW1wbGVUeXBlIGFuZCBhbnkgcmVzdHJpY3Rpb25zL3VuaW9ucy9saXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYmFzZSByZXN0cmljdGlvbiBvciBleHRlbnNpb24gdHlwZS4gVW5pb25zIGFuZCBsaXN0cwotICAgICAqIHJldHVybiB0aGUgYW55U2ltcGxlVHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRCYXNlVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb21tb24gYmFzZSB0eXBlIHdpdGggdGhlIGdpdmVuIHR5cGUuIFRoZSByZXR1cm5lZAotICAgICAqIHR5cGUgaXMgdGhlIG1vc3Qgc3BlY2lmaWMgZGVjbGFyZWQgYmFzZSB0eXBlIG9mIGJvdGggdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0Q29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGRlcml2ZXMgZnJvbSB0aGlzIHR5cGUgKG9yIGlmCi0gICAgICogaXQgaXMgdGhlIHNhbWUgdHlwZSkuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgWG1sT2JqZWN0LnR5cGUgKHRoZSBhbnlUeXBlKSBpcyBhc3NpZ25hYmxlCi0gICAgICogZnJvbSBhbGwgdHlwZSwgYW5kIHRoZSBYbWxCZWFucy5ub1R5cGUgKHRoZSBhYnNlbmNlIG9mCi0gICAgICogYSB0eXBlKSBpcyBhc3NpZ25hYmxlIHRvIGFsbCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKFNjaGVtYVR5cGUgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgZm9yIHRoZSBkZXJpdmF0aW9uIHR5cGUsIGVpdGhlciAKLSAgICAgKiB7QGxpbmsgI0RUX0VYVEVOU0lPTn0sIHtAbGluayAjRFRfUkVTVFJJQ1RJT059LCB7QGxpbmsgI0RUX05PVF9ERVJJVkVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlcml2YXRpb25UeXBlKCk7Ci0gICAgCi0gICAgLyoqIE5vdCBkZXJpdmVkLiAgVHJ1ZSBmb3IgWG1sT2JqZWN0LnR5cGUgb25seS4gU2VlIHtAbGluayAjZ2V0RGVyaXZhdGlvblR5cGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERUX05PVF9ERVJJVkVEID0gMDsKLSAgICAvKiogRGVyaXZlZCBieSByZXN0cmljdGlvbi4gU2VlIHtAbGluayAjZ2V0RGVyaXZhdGlvblR5cGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERUX1JFU1RSSUNUSU9OID0gMTsKLSAgICAvKiogRGVyaXZlZCBieSBleHRlbnNpb24uIFNlZSB7QGxpbmsgI2dldERlcml2YXRpb25UeXBlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVF9FWFRFTlNJT04gPSAyOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGZvciBidWlsdGluIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQKLSAgICAgKiBmb3IgcXVpY2sgY29tcGFyaXNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgLyoqIE5vdCBhIGJ1aWx0aW4gdHlwZSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9UX0JVSUxUSU4gPSAwOwotICAgIC8qKiB4czphbnlUeXBlLCBha2Ege0BsaW5rIFhtbE9iamVjdCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfQU5ZX1RZUEUgPSAxOwotICAgIAotICAgIC8qKiBUaGUgcHJpbWl0aXZlIHR5cGVzIGhhdmUgY29kZXMgYmV0d2VlbiBCVENfRklSU1RfUFJJTUlUSVZFIGFuZCBCVENfTEFTVF9QUklNSVRJVkUgaW5jbHVzaXZlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0ZJUlNUX1BSSU1JVElWRSA9IDI7Ci0KLSAgICAvKiogeHM6YW55U2ltcGxlVHlwZSwgYWthIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19BTllfU0lNUExFID0gMjsKLQotICAgIC8qKiB4czpib29sZWFuLCBha2Ege0BsaW5rIFhtbEJvb2xlYW4jdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0JPT0xFQU4gPSAzOwotICAgIC8qKiB4czpiYXNlNjRCaW5hcnksIGFrYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5I3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19CQVNFXzY0X0JJTkFSWSA9IDQ7Ci0gICAgLyoqIHhzOmhleEJpbmFyeSwgYWthIHtAbGluayBYbWxCYXNlNjRCaW5hcnkjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0hFWF9CSU5BUlkgPSA1OwotICAgIC8qKiB4czphbnlVUkksIGFrYSB7QGxpbmsgWG1sQW55VVJJI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19BTllfVVJJID0gNjsKLSAgICAvKiogeHM6UU5hbWUsIGFrYSB7QGxpbmsgWG1sUU5hbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1FOQU1FID0gNzsKLSAgICAvKiogeHM6Tk9UQVRJT04sIGFrYSB7QGxpbmsgWG1sTk9UQVRJT04jdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05PVEFUSU9OID0gODsKLSAgICAvKiogeHM6ZmxvYXQsIGFrYSB7QGxpbmsgWG1sRmxvYXQjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0ZMT0FUID0gOTsKLSAgICAvKiogeHM6ZG91YmxlLCBha2Ege0BsaW5rIFhtbERvdWJsZSN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRE9VQkxFID0gMTA7Ci0gICAgLyoqIHhzOmRlY2ltYWwsIGFrYSB7QGxpbmsgWG1sRGVjaW1hbCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfREVDSU1BTCA9IDExOwotICAgIC8qKiB4czpzdHJpbmcsIGFrYSB7QGxpbmsgWG1sU3RyaW5nI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19TVFJJTkcgPSAxMjsKLQotICAgIC8qKiB4czpkdXJhdGlvbiwgYWthIHtAbGluayBYbWxEdXJhdGlvbiN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRFVSQVRJT04gPSAxMzsKLSAgICAvKiogeHM6ZGF0ZVRpbWUsIGFrYSB7QGxpbmsgWG1sRGF0ZVRpbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0RBVEVfVElNRSA9IDE0OwotICAgIC8qKiB4czp0aW1lLCBha2Ege0BsaW5rIFhtbFRpbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1RJTUUgPSAxNTsKLSAgICAvKiogeHM6ZGF0ZSwgYWthIHtAbGluayBYbWxEYXRlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19EQVRFID0gMTY7Ci0gICAgLyoqIHhzOmdZZWFyTW9udGgsIGFrYSB7QGxpbmsgWG1sR1llYXJNb250aCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfR19ZRUFSX01PTlRIID0gMTc7Ci0gICAgLyoqIHhzOmdZZWFyLCBha2Ege0BsaW5rIFhtbEdZZWFyI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX1lFQVIgPSAxODsKLSAgICAvKiogeHM6Z01vbnRoRGF5LCBha2Ege0BsaW5rIFhtbEdNb250aERheSN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfR19NT05USF9EQVkgPSAxOTsKLSAgICAvKiogeHM6Z0RheSwgYWthIHtAbGluayBYbWxHRGF5I3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX0RBWSA9IDIwOwotICAgIC8qKiB4czpnTW9udGgsIGFrYSB7QGxpbmsgWG1sR01vbnRoI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX01PTlRIID0gMjE7Ci0KLSAgICAvKiogVGhlIHByaW1pdGl2ZSB0eXBlcyBoYXZlIGNvZGVzIGJldHdlZW4gQlRDX0ZJUlNUX1BSSU1JVElWRSBhbmQgQlRDX0xBU1RfUFJJTUlUSVZFIGluY2x1c2l2ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MQVNUX1BSSU1JVElWRSA9IDIxOwotCi0gICAgLy8gZGVyaXZlZCBudW1lcmljcwotICAgIC8qKiB4czppbnRlZ2VyLCBha2Ege0BsaW5rIFhtbEludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0lOVEVHRVIgPSAyMjsKLSAgICAvKiogeHM6bG9uZywgYWthIHtAbGluayBYbWxMb25nI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MT05HID0gMjM7Ci0gICAgLyoqIHhzOmludCwgYWthIHtAbGluayBYbWxJbnQjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0lOVCA9IDI0OwotICAgIC8qKiB4czpzaG9ydCwgYWthIHtAbGluayBYbWxTaG9ydCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfU0hPUlQgPSAyNTsKLSAgICAvKiogeHM6Ynl0ZSwgYWthIHtAbGluayBYbWxCeXRlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19CWVRFID0gMjY7Ci0gICAgLyoqIHhzOm5vblBvc2l0aXZlSW50ZWdlciwgYWthIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSID0gMjc7Ci0gICAgLyoqIHhzOk5lZ2F0aXZlSW50ZWdlciwgYWthIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05FR0FUSVZFX0lOVEVHRVIgPSAyODsKLSAgICAvKiogeHM6bm9uTmVnYXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9OX05FR0FUSVZFX0lOVEVHRVIgPSAyOTsKLSAgICAvKiogeHM6cG9zaXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlciN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfUE9TSVRJVkVfSU5URUdFUiA9IDMwOwotICAgIC8qKiB4czp1bnNpZ25lZExvbmcsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1VOU0lHTkVEX0xPTkcgPSAzMTsKLSAgICAvKiogeHM6dW5zaWduZWRJbnQsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRJbnQjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVU5TSUdORURfSU5UID0gMzI7Ci0gICAgLyoqIHhzOnVuc2lnbmVkU2hvcnQsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydCN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19VTlNJR05FRF9TSE9SVCA9IDMzOwotICAgIC8qKiB4czp1bnNpZ25lZEJ5dGUsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1VOU0lHTkVEX0JZVEUgPSAzNDsKLQotICAgIC8vIGRlcml2ZWQgc3RyaW5ncwotICAgIC8qKiB4czpub3JtYWxpemVkU3RyaW5nLCBha2Ege0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmcjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9STUFMSVpFRF9TVFJJTkcgPSAzNTsKLSAgICAvKiogeHM6dG9rZW4sIGFrYSB7QGxpbmsgWG1sVG9rZW4jdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVE9LRU4gPSAzNjsKLSAgICAvKiogeHM6TmFtZSwgYWthIHtAbGluayBYbWxOYW1lI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05BTUUgPSAzNzsKLSAgICAvKiogeHM6TkNOYW1lLCBha2Ege0BsaW5rIFhtbE5DTmFtZSN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19OQ05BTUUgPSAzODsKLSAgICAvKiogeHM6bGFuZ3VhZ2UsIGFrYSB7QGxpbmsgWG1sTGFuZ3VhZ2UjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTEFOR1VBR0UgPSAzOTsKLSAgICAvKiogeHM6SUQsIGFrYSB7QGxpbmsgWG1sSUQjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSUQgPSA0MDsKLSAgICAvKiogeHM6SURSRUYsIGFrYSB7QGxpbmsgWG1sSURSRUYjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSURSRUYgPSA0MTsKLSAgICAvKiogeHM6SURSRUZTLCBha2Ege0BsaW5rIFhtbElEUkVGUyN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19JRFJFRlMgPSA0MjsKLSAgICAvKiogeHM6RU5USVRZLCBha2Ege0BsaW5rIFhtbEVOVElUWSN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19FTlRJVFkgPSA0MzsKLSAgICAvKiogeHM6RU5USVRJRVMsIGFrYSB7QGxpbmsgWG1sRU5USVRJRVMjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRU5USVRJRVMgPSA0NDsKLSAgICAvKiogeHM6Tk1UT0tFTiwgYWthIHtAbGluayBYbWxOTVRPS0VOI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05NVE9LRU4gPSA0NTsKLSAgICAvKiogeHM6Tk1UT0tFTlMsIGFrYSB7QGxpbmsgWG1sTk1UT0tFTlMjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk1UT0tFTlMgPSA0NjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MQVNUX0JVSUxUSU4gPSA0NjsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIGFueVR5cGUgYW5kIGFueVNpbXBsZVR5cGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVUlR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIHRoZSB0eXBlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB0aGUgYWJzZW5jZSBvZiBhIGRldGVybWluZWQgdHlwZS4KLSAgICAgKiBYTUwgT2JqZWN0cyB3aG9zZSB0eXBlIGlzTm9UeXBlKCkgYXJlIG5ldmVyIHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTm9UeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFUeXBlTG9hZGVyIGluIHdoaWNoIHRoaXMgdHlwZSB3YXMgZGVmaW5lZC4KLSAgICAgKiBDb21wbGV4IHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB1c2VkIGluIGV4YWN0bHkgb25lIHNjaGVtYSB0eXBlCi0gICAgICogc3lzdGVtLCBidXQgc2ltcGxlIHR5cGVzIGFyZSBkZWZpbmVkIGluIG9uZSB0eXBlIHN5c3RlbSBhbmQgY2FuCi0gICAgICogYmUgdXNlZCBpbiBhbnkgbnVtYmVyIG9mIHR5cGUgc3lzdGVtcy4gVGhlIG1vc3QgY29tbW9uIGNhc2UgaXMKLSAgICAgKiB0aGUgYnVpbHRpbiB0eXBlcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGJ1aWx0aW4gdHlwZSBzeXN0ZW0KLSAgICAgKiBhbmQgdXNlZCBlbHNld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZW5hbWUgZm9yIHRoZSBYU0QgZmlsZSBmcm9tIHdoaWNoIHRoaXMgdHlwZQotICAgICAqIHdhcyBsb2FkZWQuIEludGVuZGVkIGZvciB1c2Ugd2hlbiBkZWJ1Z2dpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiB0aGlzIHR5cGUgY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkgaW4gaW5zdGFuY2VzICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCi0gICAgLyoqIFRydWUgaWYgb3RoZXIgdHlwZXMgY2Fubm90IGV4dGVuZCB0aGlzIHR5cGUgKG9ubHkgZm9yIGNvbXBsZXggdHlwZXMpICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxFeHRlbnNpb24oKTsKLQotICAgIC8qKiBUcnVlIGlmIG90aGVyIHR5cGVzIGNhbm5vdCByZXN0cmljdCB0aGlzIHR5cGUgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFJlc3RyaWN0aW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiBsaXN0IGRlcml2YXRpb24gb2YgdGhpcyB0eXBlIGlzIHByb2hpYml0ZWQgKG9ubHkgZm9yIHNpbXBsZSB0eXBlcykgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbExpc3QoKTsKLQotICAgIC8qKiBUcnVlIGlmIHVuaW9uIGRlcml2YXRpb24gb2YgdGhpcyB0eXBlIGlzIHByb2hpYml0ZWQgKG9ubHkgZm9yIHNpbXBsZSB0eXBlcykgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFVuaW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiBleHRlbnNpb25zIG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQgZm9yIHRoaXMgdHlwZSAqLwotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrRXh0ZW5zaW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiByZXN0cmljdGlvbnMgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgdGhpcyB0eXBlICovCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tSZXN0cmljdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgI0VNUFRZX0NPTlRFTlR9LCB7QGxpbmsgI1NJTVBMRV9DT05URU5UfSwge0BsaW5rICNFTEVNRU5UX0NPTlRFTlR9LCBvcgotICAgICAqIHtAbGluayAjTUlYRURfQ09OVEVOVH0gZm9yIGNvbXBsZXggdHlwZXMuIEZvciBub25jb21wbGV4IHR5cGVzLCByZXR1cm5zCi0gICAgICoge0BsaW5rICNOT1RfQ09NUExFWF9UWVBFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0gICAgCi0gICAgLyoqIE5vdCBhIGNvbXBsZXggdHlwZS4gIFNlZSB7QGxpbmsgI2dldENvbnRlbnRUeXBlKCl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9DT01QTEVYX1RZUEUgPSAwOwotICAgIC8qKiBFbXB0eSBjb250ZW50LiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFlfQ09OVEVOVCA9IDE7Ci0gICAgLyoqIFNpbXBsZSBjb250ZW50LiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFX0NPTlRFTlQgPSAyOwotICAgIC8qKiBFbGVtZW50LW9ubHkgY29udGVudC4gIFNlZSB7QGxpbmsgI2dldENvbnRlbnRUeXBlKCl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDM7Ci0gICAgLyoqIE1peGVkIGNvbnRlbnQuICBTZWUge0BsaW5rICNnZXRDb250ZW50VHlwZSgpfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVhFRF9DT05URU5UID0gNDsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBTY2hlbWFUeXBlRWxlbWVudFNlcXVlbmNlcn0gb2JqZWN0LCB3aGljaCBjYW4gdGhlbgotICAgICAqIGJlIHVzZWQgdG8gdmFsaWRhdGUgY29tcGxleCBjb250ZW50IGluc2lkZSB0aGlzIGVsZW1lbnQuIFRoaXMgaXMgdXNlZnVsCi0gICAgICogZm9yIGV4YW1wbGUgZm9yIHRyeWluZyBvdXQgZGlmZmVyZW50IG5hbWVzIGFuZCBzZWUgd2hpY2ggb25lIHdvdWxkIGJlCi0gICAgICogdmFsaWQgYXMgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXIgZ2V0RWxlbWVudFNlcXVlbmNlcigpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGFycmF5IG9mIGlubmVyIChhbm9ueW1vdXMpIHR5cGVzIGRlZmluZWQKLSAgICAgKiB3aXRoaW4gdGhpcyB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlW10gZ2V0QW5vbnltb3VzVHlwZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTY2hlbWFQcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIGFuIGVsZW1lbnQgd2l0aGluIHRoaXMKLSAgICAgKiBjb21wbGV4IHR5cGUgYnkgbG9va2luZyB1cCB0aGUgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eSBnZXRFbGVtZW50UHJvcGVydHkoUU5hbWUgZWx0TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgU2NoZW1hUHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHRvIGVsZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eVtdIGdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2NoZW1hUHJvcGVydHkgY29ycmVzcG9uZGluZyB0byBhbiBhdHRyaWJ1dGUgd2l0aGluIHRoaXMKLSAgICAgKiBjb21wbGV4IHR5cGUgYnkgbG9va2luZyB1cCB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVByb3BlcnR5IGdldEF0dHJpYnV0ZVByb3BlcnR5KFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgdG8gYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUHJvcGVydHlbXSBnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgU2NoZW1hUHJvcGVydGllcyB3aXRoaW4gdGhpcyBjb21wbGV4IHR5cGUsCi0gICAgICogZWxlbWVudHMgZm9sbG93ZWQgYnkgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUHJvcGVydHlbXSBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhpcyBjb21wbGV4IHR5cGUsCi0gICAgICogZXhjbHVzaXZlIG9mIHRoZSBiYXNlIHR5cGUgKGlmIGFueSkuCi0gICAgICovCi0gICAgU2NoZW1hUHJvcGVydHlbXSBnZXREZXJpdmVkUHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG1vZGVsIGZvciB0aGlzIGNvbXBsZXggdHlwZSAod2l0aCBzaW1wbGUgb3IgY29tcGxleCBjb250ZW50KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hQXR0cmlidXRlTW9kZWwgZ2V0QXR0cmlidXRlTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0eXBlIHBlcm1pdHMgd2lsZGNhcmQgYXR0cmlidXRlcy4gU2VlIHRoZSBhdHRyaWJ1dGUgbW9kZWwgZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCB3aWxkY2FyZHMgYXJlIGFsbG93ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQXR0cmlidXRlV2lsZGNhcmRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV4IGNvbnRlbnQgbW9kZWwgZm9yIHRoaXMgY29tcGxleCB0eXBlICh3aXRoIGNvbXBsZXggY29udGVudCkuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVBhcnRpY2xlIGdldENvbnRlbnRNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHR5cGUgcGVybWl0cyBlbGVtZW50IHdpbGRjYXJkcy4gU2VlIHRoZSBjb250ZW50IG1vZGVsIGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggd2lsZGNhcmRzIGFyZSBhbGxvd2VkLCBhbmQgd2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzRWxlbWVudFdpbGRjYXJkcygpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGRvY3VtZW50IHR5cGVzLCB0cnVlIGlmIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgdGhlCi0gICAgICogZG9jdW1lbnQgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRTdWJzdGl0dXRpb24oUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBjb21wbGV4IGNvbnRlbnQgbW9kZWwgZm9yIHRoaXMgY29tcGxleCB0eXBlIGlzIGFuICJhbGwiIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0FsbENvbnRlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgcGFydGljbGVzIGhhdmUgc2FtZSBkZWZhdWx0cywgbmlsbGFiaWxpdHksIGV0YywgdGhhdCBhcmUKLSAgICAgKiBpbnZhcmlhbnQgd2hlbiBvcmRlciBjaGFuZ2VzLiBDb21wdXRlZCBvbmx5IGZvciBKYXZhaXplZCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc09yZGVyU2Vuc2l0aXZlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgY2hpbGQgZWxlbWVudCBiYXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lIGFuZAotICAgICAqIGFuIHhzaTp0eXBlIGF0dHJpYnV0ZSAoYW5kIHRoZSB0eXBlIHN5c3RlbSB3aXRoaW4gd2hpY2ggbmFtZXMgYXJlCi0gICAgICogcmVzb2x2ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEVsZW1lbnRUeXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUsIFNjaGVtYVR5cGVMb2FkZXIgd2lsZGNhcmRUeXBlTG9hZGVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgYW4gYXR0cmlidXRlIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQKLSAgICAgKiB0aGUgdHlwZSBzeXN0ZW0gd2l0aGluIHdoaWNoICh3aWxkY2FyZCkgbmFtZXMgYXJlIHJlc29sdmVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEF0dHJpYnV0ZVR5cGUoUU5hbWUgZWx0TmFtZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogU0lNUExFIFRZUEUgTU9ERUwgQkVMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiogeHM6bGVuZ3RoIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTEVOR1RIID0gMDsKLSAgICAvKiogeHM6bWluTGVuZ3RoIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUlOX0xFTkdUSCA9IDE7Ci0gICAgLyoqIHhzOm1heExlbmd0aCBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01BWF9MRU5HVEggPSAyOwotICAgIC8qKiB4czptaW5FeGNsdXNpdmUgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NSU5fRVhDTFVTSVZFID0gMzsKLSAgICAvKiogeHM6bWluSW5jbHVzaXZlIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUlOX0lOQ0xVU0lWRSA9IDQ7Ci0gICAgLyoqIHhzOm1heEluY2x1c2l2ZSBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01BWF9JTkNMVVNJVkUgPSA1OwotICAgIC8qKiB4czptYXhFeGNsdXNpdmUgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NQVhfRVhDTFVTSVZFID0gNjsKLSAgICAvKiogeHM6dG90YWxEaWdpdHMgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9UT1RBTF9ESUdJVFMgPSA3OwotICAgIC8qKiB4czpmcmFjdGlvbkRpZ2l0cyBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX0ZSQUNUSU9OX0RJR0lUUyA9IDg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0JBU0lDX0ZBQ0VUID0gODsKLQotICAgIC8qKiB4czp3aGl0ZVNwYWNlIGZhY2V0IC0gdXNlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9IGluc3RlYWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9XSElURV9TUEFDRSA9IDk7Ci0gICAgLyoqIHhzOnBhdHRlcm4gZmFjZXQgLSB1c2Uge0BsaW5rICNtYXRjaFBhdHRlcm5GYWNldH0gaW5zdGVhZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1BBVFRFUk4gPSAxMDsKLSAgICAvKiogeHM6ZW51bWVyYXRpb24gZmFjZXQgLSB1c2Uge0BsaW5rICNnZXRFbnVtZXJhdGlvblZhbHVlc30gaW5zdGVhZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX0VOVU1FUkFUSU9OID0gMTE7Ci0KLSAgICAvKiogVGhlIGxhc3Qgb3JkaW5hcnkgZmFjZXQgY29kZSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0ZBQ0VUID0gMTE7Ci0gICAgCi0gICAgLyoqIEBzZWUgI29yZGVyZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUkRFUkVEID0gMTI7Ci0gICAgLyoqIEBzZWUgI2lzQm91bmRlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JPVU5ERUQgPSAxMzsKLSAgICAvKiogQHNlZSAjaXNGaW5pdGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DQVJESU5BTElUWSA9IDE0OwotICAgIC8qKiBAc2VlICNpc051bWVyaWMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OVU1FUklDID0gMTU7Ci0gICAgCi0gICAgLyoqIFRoZSBsYXN0IHByb3BlcnR5IGNvZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX1BST1BFUlRZID0gMTU7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmYWNldCwgb3IgbnVsbCBpZgotICAgICAqIG5vbmUgaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBYbWxBbnlTaW1wbGVUeXBlIGdldEZhY2V0KGludCBmYWNldENvZGUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gZmFjZXQgaXMgZml4ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGYWNldEZpeGVkKGludCBmYWNldENvZGUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBvcmRlcmVkLiAgUmV0dXJucyBlaXRoZXIge0BsaW5rICNVTk9SREVSRUR9LAotICAgICAqIHtAbGluayAjUEFSVElBTF9PUkRFUn0sIG9yIHtAbGluayAjVE9UQUxfT1JERVJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgb3JkZXJlZCgpOwotCi0gICAgLyoqIFVub3JkZXJlZC4gU2VlIHtAbGluayAjb3JkZXJlZH0uICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVU5PUkRFUkVEID0gMDsKLSAgICAvKiogUGFydGlhbGx5IG9yZGVyZWQuIFNlZSB7QGxpbmsgI29yZGVyZWR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFBBUlRJQUxfT1JERVIgPSAxOwotICAgIC8qKiBUb3RhbGx5IG9yZGVyZWQuIFNlZSB7QGxpbmsgI29yZGVyZWR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFRPVEFMX09SREVSID0gMjsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgYm91bmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0JvdW5kZWQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgZmluaXRlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmluaXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIG51bWVyaWMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNOdW1lcmljKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZXJlIGFyZSByZWdleCBwYXR0ZXJuIGZhY2VudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNQYXR0ZXJuRmFjZXQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRQYXR0ZXJucygpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4gZmFjZXRzLgotICAgICAqIEFsd2F5cyB0cnVlIGlmIHRoZXJlIGFyZSBubyBwYXR0ZXJuIGZhY2V0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaFBhdHRlcm5GYWNldChTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiB2YWxpZCBvYmplY3RzIGZyb20gdGhlCi0gICAgICogZW51bWVyYXRpb24gZmFjZXQsIG51bGwgaWYgbm8gZW51bWVyYXRpb24gZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgWG1sQW55U2ltcGxlVHlwZVtdIGdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgaXMgYSBzdHJpbmcgZW51bSB3aGVyZSBhbiBpbnRlZ2VyCi0gICAgICogaXMgYXNzaWduZWQgdG8gZWFjaCBlbnVtZXJhdGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N0cmluZ0VudW1WYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgaXMgYSBzdHJpbmcgZW51bWVyYXRpb24sIHJldHVybnMgdGhlIG1vc3QgYmFzaWMgYmFzZSBzY2hlbWEKLSAgICAgKiB0eXBlIHRoYXQgdGhpcyBlbnVlbXJhdGlvbiBpcyBiYXNlZCBvbi4gT3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRCYXNlRW51bVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFNjaGVtYVN0cmluZ0VudW1FbnRyaWVzIGZvciB0aGlzIHR5cGU6IHRoaXMKLSAgICAgKiBhcnJheSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgamF2YSBjb25zdGFudCBuYW1lcyB1c2VkIGZvcgotICAgICAqIGVhY2ggc3RyaW5nIGVudW0gZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGdldFN0cmluZ0VudW1FbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZW51bSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbnVtZXJhdGVkCi0gICAgICogc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hdGNoIG9yIHRoaXMgdHlwZSBpcyBub3QKLSAgICAgKiBhIHN0cmluZyBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hU3RyaW5nRW51bUVudHJ5IGVudW1FbnRyeUZvclN0cmluZyhTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZW51bSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbnVtZXJhdGVkCi0gICAgICogc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hdGNoIG9yIHRoaXMgdHlwZSBpcyBub3QKLSAgICAgKiBhIHN0cmluZyBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtRm9yU3RyaW5nKFN0cmluZyBzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBlbnVtIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW1lcmF0ZWQKLSAgICAgKiBzdHJpbmcsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3IgdGhpcyB0eXBlIGlzIG5vdAotICAgICAqIGEgc3RyaW5nIGVudW1lcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JJbnQoaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBmb3IgYW55IG9mIHRoZSAyMCBwcmltaXRpdmUgdHlwZXMgKHBsdXMgYW55U2ltcGxlVHlwZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc2ltcGxlIHR5cGUgaXMgQVRPTUlDLCBVTklPTiwgb3IgTElTVC4KLSAgICAgKiBSZXR1cm5zIHtAbGluayAjTk9UX1NJTVBMRX0sIHtAbGluayAjQVRPTUlDfSwge0BsaW5rICNVTklPTn0sCi0gICAgICogb3Ige0BsaW5rICNMSVNUfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNpbXBsZVZhcmlldHkoKTsKLSAgICAKLSAgICAvKiogTm90IGEgc2ltcGxlIHR5cGUgb3Igc2ltcGxlIGNvbnRlbnQuIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9TSU1QTEUgPSAwOwotICAgIC8qKiBBdG9taWMgdHlwZS4gIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRPTUlDID0gMTsKLSAgICAvKiogVW5pb24gdHlwZS4gIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5JT04gPSAyOwotICAgIC8qKiBTaW1wbGUgbGlzdCB0eXBlLiAgU2VlIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUID0gMzsKLQotCi0gICAgLyoqCi0gICAgICogRm9yIGF0b21pYyB0eXBlcyBvbmx5OiBnZXQgdGhlIHByaW1pdGl2ZSB0eXBlIHVuZGVybHlpbmcgdGhpcyBvbmUuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgbm90IGFuIGF0b21pYyB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldFByaW1pdGl2ZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBhdG9taWMgbnVtZXJpYyByZXN0cmljdGlvbnMgb2YgZGVjaW1hbCBvbmx5OiB0aGUKLSAgICAgKiBudW1lcmljIHNpemUgY2F0ZWdvcnkuIFRha2VzIGludG8gYWNjb3VudCBtaW4gYW5kIG1heAotICAgICAqIHJlc3RyaWN0aW9ucyBhcyB3ZWxsIGFzIHRvdGFsRGlnaXRzIGFuZCBmcmFjdGlvbkRpZ2l0cwotICAgICAqIGZhY2V0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGVpdGhlciB7QGxpbmsgI05PVF9ERUNJTUFMfSwKLSAgICAgKiB7QGxpbmsgI1NJWkVfQllURX0sIHtAbGluayAjU0laRV9TSE9SVH0sIHtAbGluayAjU0laRV9JTlR9LAotICAgICAqIHtAbGluayAjU0laRV9MT05HfSwge0BsaW5rICNTSVpFX0JJR19JTlRFR0VSfSwgb3IKLSAgICAgKiB7QGxpbmsgI1NJWkVfQklHX0RFQ0lNQUx9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGVjaW1hbFNpemUoKTsKLQotICAgIC8qKiBOb3QgYSBkZWNpbWFsIHJlc3RyaWN0aW9uLiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0RFQ0lNQUwgPSAwOwotICAgIC8qKiBGaXRzIGluIGEgYnl0ZS4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfQllURSA9IDg7Ci0gICAgLyoqIEZpdHMgaW4gYSBzaG9ydC4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfU0hPUlQgPSAxNjsKLSAgICAvKiogRml0cyBpbiBhbiBpbnQuIFNlZSB7QGxpbmsgI2dldERlY2ltYWxTaXplfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFX0lOVCA9IDMyOwotICAgIC8qKiBGaXRzIGluIGEgbG9uZy4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfTE9ORyA9IDY0OwotICAgIC8qKiBGaXRzIGluIGEge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfQklHX0lOVEVHRVIgPSAxMDAwMDAwOyAvLyAibWlsbGlvbnMiCi0gICAgLyoqIEZpdHMgaW4gYSB7QGxpbmsgamF2YS5tYXRoLkJpZ0RlY2ltYWx9LiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9CSUdfREVDSU1BTCA9IDEwMDAwMDE7IC8vICJldmVuIG1vcmUiCi0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0IHRoZSBzaGFsbG93IG1lbWJlciB0eXBlcy4gVGhpcwotICAgICAqIHJldHVybnMgdGhlIGRlY2xhcmVkIG1lbWJlciB0eXBlcyBvZiB0aGUgdW5pb24sIHNvLCBmb3IKLSAgICAgKiBleGFtcGxlIGlmIHRoZSB0eXBlIGNvbnRhaW5zIGFub3RoZXIgdW5pb24sIHRoZSBuZXN0ZWQKLSAgICAgKiBtZW1iZXJzIG9mIHRoYXQgdW5pb24gYXJlIE5PVCByZXR1cm5lZCBoZXJlLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGlzIHR5cGUgaXMgbm90IGEgdW5pb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGVbXSBnZXRVbmlvbk1lbWJlclR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0cyB0aGUgZnVsbCB0cmVlIG9mIG1lbWJlciB0eXBlcy4KLSAgICAgKiBUaGlzIGNvbXB1dGVzIHRoZSBjbG9zdXJlIG9mIHRoZSBzZXQgcmV0dXJuZWQgYnkKLSAgICAgKiBnZXRVbmlvbk1lbWJlclR5cGVzKCksIHNvLCBmb3IgZXhhbXBsZSwgaXQgcmV0dXJucwotICAgICAqIGFsbCB0aGUgdHlwZXMgbmVzdGVkIHdpdGhpbiB1bmlvbnMgb2YgdW5pb25zIGFzIHdlbGwKLSAgICAgKiBhcyB0aGUgdG9wLWxldmVsIG1lbWJlcnM7IHRoZSBzZXQgYWxzbyBpbmNsdWRlcyB0aGUKLSAgICAgKiB0eXBlIGl0c2VsZi4gSWYgeW91IGFyZSBzZWVraW5nIG9ubHkgdGhlIGJhc2ljCi0gICAgICogbm9uLXVuaW9uIGNvbnNpdHVlbnRzLCB1c2UgZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGlzIHR5cGUgaXMgbm90IGEgdW5pb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGVbXSBnZXRVbmlvblN1YlR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0IHRoZSBjb25zdGl0dWVudCBtZW1iZXIgdHlwZXMuIFRoaXMKLSAgICAgKiByZXR1cm5zIG9ubHkgbm9uLXVuaW9uIHR5cGVzLCBzbywgZm9yIGV4YW1wbGUsIGZvciB1bmlvbnMgb2YKLSAgICAgKiB1bmlvbnMsIHRoaXMgcmV0dXJucyB0aGUgZmxhdHRlbmVkIGxpc3Qgb2YgaW5kaXZpZHVhbCBtZW1iZXIKLSAgICAgKiB0eXBlcyB3aXRoaW4gdGhlIGlubmVybW9zdCB1bmlvbnMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZVtdIGdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogRm9yIHVuaW9uIHR5cGVzIG9ubHk6IGdldCB0aGUgbW9zdCBzcGVjaWZpYyBjb21tb24gYmFzZQotICAgICAqIHR5cGUgb2YgdGhlIGNvbnN0aXR1ZW50IG1lbWJlciB0eXBlcy4gTWF5IHJldHVybiBhIFVSIHR5cGUuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYW5vbnltb3VzIHR5cGVzIGRlZmluZWQgaW5zaWRlIGEgdW5pb24gb25seTogZ2V0cwotICAgICAqIHRoZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGRlY2xhcmF0aW9uIG9yZGVyIG9mIHRoaXMKLSAgICAgKiB0eXBlIHdpdGhpbiB0aGUgb3V0ZXIgdW5pb24gdHlwZSwgb3IgemVybyBpZiB0aGlzIGlzCi0gICAgICogbm90IGFwcGxpY2FibGUuIFRoZSBmaXJzdCBhbm9ueW1vdXMgdW5pb24gbWVtYmVyIHdpdGhpbgotICAgICAqIGEgdW5pb24gdHlwZSBpcyBudW1iZXJlZCAiMSIuIFVzZWQgdG8gZGlmZmVyZW50aWF0ZQotICAgICAqIGJldHdlZW4gZGlmZmVyZW50IGFub255bW91cyB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGxpc3QgdHlwZXMgb25seTogZ2V0IHRoZSBpdGVtIHR5cGUuIFRoaXMgaXMgdGhlIGF0b21pYwotICAgICAqIG9yIHVuaW9uIHR5cGUgdGhhdCBpcyB0aGUgdHlwZSBvZiBldmVyeSBlbnRyeSBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyB0eXBlIGlzIG5vdCBhIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igbm9udW5pb24gc2ltcGxlIHR5cGVzOiBnZXQgdGhlIHdoaXRlc3BhY2UgcnVsZS4gVGhpcyBpcwotICAgICAqIGVpdGhlciB7QGxpbmsgI1dTX1BSRVNFUlZFfSwge0BsaW5rICNXU19SRVBMQUNFfSwgb3IKLSAgICAgKiB7QGxpbmsgI1dTX0NPTExBUFNFfS4gUmV0dXJucyB7QGxpbmsgI1dTX1VOU1BFQ0lGSUVEfQotICAgICAqIGZvciB1bmlvbnMgYW5kIGNvbXBsZXggdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaGl0ZVNwYWNlUnVsZSgpOwotCi0gICAgLyoqIFdoaXRlc3BhY2UgcnVsZSB1bnNwZWNpZmllZC4gIFNlZSB7QGxpbmsgI2dldFdoaXRlU3BhY2VSdWxlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19VTlNQRUNJRklFRCA9IDA7Ci0gICAgLyoqIFdoaXRlc3BhY2UgcHJlc2VydmVkLiAgU2VlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1BSRVNFUlZFID0gMTsKLSAgICAvKiogV2hpdGVzcGFjZSByZXBsYWNlZCBieSBvcmRpbmFyeSBzcGFjZS4gIFNlZSB7QGxpbmsgI2dldFdoaXRlU3BhY2VSdWxlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19SRVBMQUNFID0gMjsKLSAgICAvKiogV2hpdGVzcGFjZSBjb2xsYXBzZWQgYW5kIHRyaW1tZWQuICBTZWUge0BsaW5rICNnZXRXaGl0ZVNwYWNlUnVsZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfQ09MTEFQU0UgPSAzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgc2ltcGxlIHR5cGUgdmFsdWUgdGhhdCBkb2VzIG5vdCByZXNpZGUgaW4gYSB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCB2KTsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgdHlwZXMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICAgICAgeyBzdXBlcih0eXBlKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuVFlQRTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFUeXBlIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZSlnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJ1bnMgYSBTY2hlbWFUeXBlLlJlZiBwb2ludGluZyB0byB0aGlzIHNjaGVtYSB0eXBlIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmIGdldFJlZigpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVFbGVtZW50U2VxdWVuY2VyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxOTM0Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwcm9ncmFtYXRpY2FsbHkgdmFsaWRhdGUgdGhlIGNvbnRlbnRzIG9mIGFuCi0gKiBYTUwgZWxlbWVudC5DYWxsIHRvIGJvdGgge0BsaW5rICNuZXh0fSBhbmQge0BsaW5rICNwZWVrfQotICogd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudAotICogd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSBpcyBhbGxvd2VkIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBlbGVtZW50Ci0gKiBjb250ZW50LCB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0IHtAbGluayAjbmV4dH0gd2lsbCBhZHZhbmNlCi0gKiB0aGUgY3VycmVudCBwb3NpdGlvbiwgd2hpbGUge0BsaW5rICNwZWVrfSB3b24ndC4KLSAqCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0RWxlbWVudFNlcXVlbmNlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVR5cGVFbGVtZW50U2VxdWVuY2VyCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXQgdGhlCi0gICAgICogY3VycmVudCBwb3NpdGlvbi4gQWR2YW5jZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gICAgICovCi0gICAgYm9vbGVhbiBuZXh0KFFOYW1lIGVsZW1lbnROYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXQgdGhlCi0gICAgICogY3VycmVudCBwb3NpdGlvbi4gRG9lcyBub3QgYWR2YW5jZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICAgKi8KLSAgICBib29sZWFuIHBlZWsoUU5hbWUgZWxlbWVudE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2VlNTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2VhcmNoYWJsZSBzZXQgb2YgWE1MIFNjaGVtYSBjb21wb25lbnQgZGVmaW5pdGlvbnMuCi0gKiA8cD4KLSAqIFNjaGVtYVR5cGVMb2FkZXIgaXMgc29tZXdoYXQgYW5hbG9nb3VzIHRvIHtAbGluayBqYXZhLmxhbmcuQ2xhc3NMb2FkZXJ9LAotICogYmVjYXVzZSBpdCBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyB7QGxpbmsgU2NoZW1hQ29tcG9uZW50fSBkZWZpbml0aW9ucwotICogYnkgbmFtZSwgeWV0IGl0IGlzIG5vdCByZXNwb25zaWJsZSBmb3IgYmVpbmcgYWJsZSB0byBlbnVtZXJhdGUgYWxsIHRoZQotICogY29tcG9uZW50IGRlZmluaXRvbnMgYXZhaWxhYmxlLiAoSWYgeW91IHdpc2ggdG8gZW51bWVyYXRlIGNvbXBvbmVudAotICogZGVmaW5pdGlvbnMsIHNlZSB7QGxpbmsgU2NoZW1hVHlwZVN5c3RlbX0uKSBUaGVyZSBhcmUgc29tZSB3YXlzIGluIHdoaWNoCi0gKiBTY2hlbWFUeXBlU3lzdGVtcyBhcmUgZGlzc2ltaWxhciBmcm9tIENsYXNzTG9hZGVycywgaG93ZXZlci4KLSAqIFNpbmNlIFhNTCBTY2hlbWEgaGFzIGEgbnVtYmVyIG9mIGluc3RhbmNlLW9yaWVudGVkIHR5cGluZyBtZWNoYW5pc21zCi0gKiAoc3VjaCBhcyB3aWxkY2FyZHMpIHRoYXQgZG8gbm90IGV4aXN0IGluIEphdmEsIGEgU2NoZW1hVHlwZUxvYWRlciBpcwotICogbm90IGFzc29jaWF0ZWQgd2l0aCBhIHR5cGU7IGluc3RlYWQsIGEgU2NoZW1hVHlwZUxvYWRlciBpcyBhc3NvY2lhdGVkCi0gKiB3aXRoIGVhY2ggWE1MIGluc3RhbmNlLgotICogPHA+Ci0gKiBFdmVyeSBYTUwgaW5zdGFuY2UgaXMgbG9hZGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIFNjaGVtYVR5cGVMb2FkZXI7Ci0gKiB0aGUgU2NoZW1hVHlwZUxvYWRlciBmb3IgYW4gaW5zdGFuY2UgaXMgdXNlZCB0byByZXNvbHZlIGFsbCB0eXBlIGRlZmluaXRpb25zCi0gKiB3aXRoaW4gdGhlIGluc3RhbmNlIGFuZCBmb3IgYXBwbHlpbmcgdHlwZS1zZW5zaXRpdmUgbWV0aG9kcyBzdWNoIGFzCi0gKiB7QGxpbmsgWG1sT2JqZWN0I3ZhbGlkYXRlfS4KLSAqIDxwPgotICogTm9ybWFsbHkgdGhlIFNjaGVtYVR5cGVMb2FkZXIgYmVpbmcgdXNlZCBmb3IgYWxsIGluc3RhbmNlcyBpcyB0aGUKLSAqIGNvbnRleHQgdHlwZSBsb2FkZXIgKHRoYXQgaXMsIHRoZSBTY2hlbWFUeXBlTG9hZGVyIHJldHVybmVkIGZyb20KLSAqIHtAbGluayBYbWxCZWFucyNnZXRDb250ZXh0VHlwZUxvYWRlcigpfSkuICBUaGUgY29udGV4dCB0eXBlIGxvYWRlcgotICogY29uc3VsdHMgdGhlIHRocmVhZCdzIGNvbnRleHQgQ2xhc3NMb2FkZXIgKHNlZSB7QGxpbmsgVGhyZWFkI2dldENvbnRleHRDbGFzc0xvYWRlcigpfSkKLSAqIHRvIGZpbmQgc2NoZW1hIHR5cGUgZGVmaW50aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4KLSAqIFRoZSBuZXQgcmVzdWx0IGlzIHRoYXQgeW91IGNhbiB1c2Ugc2NoZW1hIHR5cGVzIHNpbXBseSBieSBwdXR0aW5nCi0gKiB0aGVpciBjb21waWxlZCBzY2hlbWEgSkFScyBvbiB5b3VyIGNsYXNzcGF0aC4KLSAqIElmIHlvdSB3aXNoIHRvIGxvYWQgaW5zdGFuY2VzIHVzaW5nIGEgZGlmZmVyZW50IFNjaGVtYVR5cGVMb2FkZXIsIHRoZW4geW91IG11c3QKLSAqIGNhbGwge0BsaW5rICNwYXJzZX0gbWV0aG9kcyBvbiB0aGUgU2NoZW1hVHlwZUxvYWRlciBpbnN0YW5jZSBleHBsaWNpdGx5Ci0gKiByYXRoZXIgdGhhbiB1c2luZyB0aGUgbm9ybWFsIGNvbnZlbmllbnQgRmFjdG9yeSBtZXRob2RzLgotICogPHA+Ci0gKiBBIFNjaGVtYVR5cGVMb2FkZXIgY2FuIGJlIG9idGFpbmVkIGJ5IGR5bmFtaWNhbGx5IGxvYWRpbmcgWFNEIGZpbGVzCi0gKiB1c2luZyB7QGxpbmsgWG1sQmVhbnMjbG9hZFhzZH0sIG9yIGJ5IGFzc2VtYmxpbmcgb3RoZXIgU2NoZW1hVHlwZUxvYWRlcnMKLSAqIG9yIFNjaGVtYVR5cGVTeXN0ZW1zIG9uIGEgcGF0aCB1c2luZyB7QGxpbmsgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9ufS4KLSAqIAotICogQHNlZSBYbWxCZWFucyNsb2FkWHNkCi0gKiBAc2VlIFhtbEJlYW5zI2dldENvbnRleHRUeXBlTG9hZGVyCi0gKiBAc2VlIFhtbEJlYW5zI3R5cGVMb2FkZXJVbmlvbgotICogQHNlZSBTY2hlbWFUeXBlU3lzdGVtCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVR5cGVMb2FkZXIKLXsKLSAgICAvKiogUmV0dXJucyB0aGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZFR5cGUoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgZG9jdW1lbnQgdHlwZSByb290ZWQgYXQgdGhlIGdpdmVuIGVsZW1lbnQgbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmREb2N1bWVudFR5cGUoUU5hbWUgbmFtZSk7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB0eXBlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZEF0dHJpYnV0ZVR5cGUoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgZ2xvYmFsIGVsZW1lbnQgZGVmaW50aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudCBmaW5kRWxlbWVudChRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoZSBnbG9iYWwgYXR0cmlidXRlIGRlZmludGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBmaW5kQXR0cmlidXRlKFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBtb2RlbCBncm91cCBkZWZpbnRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwIGZpbmRNb2RlbEdyb3VwKFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW50aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAgZmluZEF0dHJpYnV0ZUdyb3VwKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIFRydWUgaWYgdGhlIHR5cGVsb2FkZXIgY29udGFpbnMgYW55IGRlZmluaXRpb25zIGluIHRoZSBnaXZlbiBuYW1lc3BhY2UuICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VEZWZpbmVkKFN0cmluZyBuYW1lc3BhY2UpOwotCi0gICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kVHlwZVJlZihRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZERvY3VtZW50VHlwZVJlZihRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRBdHRyaWJ1dGVUeXBlUmVmKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBmaW5kRWxlbWVudFJlZihRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBmaW5kQXR0cmlidXRlUmVmKFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cC5SZWYgZmluZE1vZGVsR3JvdXBSZWYoUU5hbWUgbmFtZSk7Ci0gICAgCi0gICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLwotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLwotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogRmluZHMgYSB0eXBlIGZvciBhIGdpdmVuIHNpZ25hdHVyZSBzdHJpbmcgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9yU2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUpOwotCi0gICAgLyoqIEZpbmRzIGEgdHlwZSBmb3IgYSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgWE1MIEJlYW4gY2xhc3NuYW1lICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckNsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKTsKLQotICAgIC8qKiBMb2FkcyBvcmlnaW5hbCBYU0Qgc291cmNlIGFzIGEgc3RyZWFtLiAgU2VlIHtAbGluayBTY2hlbWFUeXBlI2dldFNvdXJjZU5hbWV9LiAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTb3VyY2VBc1N0cmVhbShTdHJpbmcgc291cmNlTmFtZSk7Ci0gICAgCi0gICAgLyoqIENvbXBpbGVzIGFuIFhQYXRoICovCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlUGF0aChTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLQotICAgIC8qKiBDb21waWxlcyBhbiBYUXVlcnkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXBpbGVRdWVyeShTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb247Ci0KLSAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IG5ld0luc3RhbmNlICggU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTdHJpbmcgeG1sVGV4dCwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotICAgIC8qKiBQYXJzZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUuICovCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIEZpbGUgZmlsZSwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBVUkwgZmlsZSwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBJbnB1dFN0cmVhbSBqaW9pcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBSZWFkZXIgamlvciwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAgIC8qKiBSZXR1cm5zIGFuIFhtbFNheEhhbmRsZXIgdGhhdCBjYW4gcGFyc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUuICovCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtIHRoYXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIFhNTCBpcyBub3QgdmFsaWQgCi0gICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCi0gICAgICovCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiNmUzZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBBbiBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYgdGhlcmUgaXMgY29ycnVwdGlvbiBvciBhIHZlcnNpb24gbWlzbWF0Y2gKLSAqIGluIGEgY29tcGlsZWQgc2NoZW1hIHR5cGUgc3lzdGVtLgotICovIAotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZXh0ZW5kcyBYbWxSdW50aW1lRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBpbnQgX2NvZGU7Ci0gICAgCi0gICAgLyoqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGZpbGVuYW1lLCBleHRlbnNpb24sIGFuZCBjb2RlICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgaGFuZGxlLCBpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UgKyAiICgiICsgbmFtZSArICIuIiArIGhhbmRsZSArICIpIC0gY29kZSAiICsgY29kZSk7Ci0gICAgICAgIF9jb2RlID0gY29kZTsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgZmlsZW5hbWUsIGV4dGVuc2lvbiwgY29kZSwgYW5kIGNhdXNlICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgaGFuZGxlLCBpbnQgY29kZSwgRXhjZXB0aW9uIGNhdXNlKQotICAgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSArICIgKCIgKyBuYW1lICsgIi4iICsgaGFuZGxlICsgIikgLSBjb2RlICIgKyBjb2RlKTsKLSAgICAgICAgX2NvZGUgPSBjb2RlOwotICAgICAgICBpbml0Q2F1c2UoY2F1c2UpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlLCBnaXZlbiBieSBvbmUgb2YgdGhlIG51bWVyaWMgY29uc3RhbnRzIGluIHRoaXMgY2xhc3MgKi8KLSAgICBwdWJsaWMgaW50IGdldENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb2RlOwotICAgIH0KLQotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1JFU09VUkNFID0gMDsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19NQUdJQ19DT09LSUUgPSAxOwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX01BSk9SX1ZFUlNJT04gPSAyOwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX01JTk9SX1ZFUlNJT04gPSAzOwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX0ZJTEVfVFlQRSA9IDQ7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5SRUNPR05JWkVEX0lOREVYX0VOVFJZID0gNTsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19QUk9QRVJUWV9UWVBFID0gNjsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUxGT1JNRURfQ09OVEVOVF9NT0RFTCA9IDc7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfU0lNUExFX1ZBUklFVFkgPSA4OwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElPX0VYQ0VQVElPTiA9IDk7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RPT19MQVJHRSA9IDEwOwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBRF9QQVJUSUNMRV9UWVBFID0gMTE7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1dSSVRFQUJMRSA9IDEyOwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBRF9IQU5ETEUgPSAxMzsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVNURURfRVhDRVBUSU9OID0gMTQ7Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlU3lzdGVtLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTI3Yjk1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBBIGZpbml0ZSBzZXQgb2YgWE1MIFNjaGVtYSBjb21wb25lbnQgZGVmaW5pdGlvbnMuCi0gKiA8cD4KLSAqIEV2ZXJ5IHtAbGluayBTY2hlbWFDb21wb25lbnR9IHN1Y2ggYXMgYSB7QGxpbmsgU2NoZW1hVHlwZX0sCi0gKiB7QGxpbmsgU2NoZW1hR2xvYmFsRWxlbWVudH0sIHtAbGluayBTY2hlbWFHbG9iYWxBdHRyaWJ1dGV9LAotICoge0BsaW5rIFNjaGVtYU1vZGVsR3JvdXB9LCB7QGxpbmsgU2NoZW1hQXR0cmlidXRlR3JvdXB9LCBvcgotICoge0BsaW5rIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludH0sIGlzIGRlZmluZWQgaW4gZXhhY3RseSBvbmUKLSAqIFNjaGVtYVR5cGVTeXN0ZW0uICAoU2VlIHtAbGluayBTY2hlbWFDb21wb25lbnQjZ2V0VHlwZVN5c3RlbSgpfS4pCi0gKiBBIHNpbmdsZSBTY2hlbWFUeXBlU3lzdGVtIGNhbiBpbmNsdWRlIGRlZmluaXRpb25zCi0gKiBmcm9tIGFueSBudW1iZXIgb2YgbmFtZXNwYWNlczsgb25lIFNjaGVtYVR5cGVTeXN0ZW0gY29uc2lzdHMgc2ltcGx5Ci0gKiBvZiBhIHNldCBvZiBjb21wb25lbnQgZGVmaW5pdGlvbnMgdGhhdCB3ZXJlIGNvbXBpbGVkIHRvZ2V0aGVyLgotICogPHA+Ci0gKiBTaW5jZSBldmVyeSBjb21wb25lbnQgaXMgZGVmaW5lZCBpbiBhIHNpbmdsZSBTY2hlbWFUeXBlU3lzdGVtLCBubwotICogU2NoZW1hVHlwZVN5c3RlbSBvdGhlciB0aGFuIHtAbGluayBYbWxCZWFucyNnZXRCdWlsdGluVHlwZVN5c3RlbSgpfQotICogaW5jbHVkZXMgYW55IG9mIHRoZSB0aGUgYnVpbHQtaW4gdHlwZXMuICBUaGF0IG1lYW5zCi0gKiB5b3UgY2Fubm90IG9yZGluYXJpbHkgbG9hZCBpbnN0YW5jZXMgdXNpbmcgYSBzaW5nbGUKLSAqIFNjaGVtYVR5cGVTeXN0ZW0gYnkgaXRzZWxmLiBJbnN0ZWFkLCB5b3Ugd2lsbCB3YW50IHRvIGNvbWJpbmUgYSBwYXRoIG9mCi0gKiBTY2hlbWFUeXBlU3lzdGVtcyB0b2dldGhlciB1c2luZyB7QGxpbmsgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9ufQotICogdG8gZm9ybSBhIFNjaGVtYVR5cGVMb2FkZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9hZGluZyBpbnN0YW5jZXMuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgY29tcGlsZXMgdGhlIHNjaGVtYSBpbiBteVhTREZpbGUKLSAqIGluIHRoZSBwcmVzZW5jZSBvZiBvbmx5IHRoZSBtaW5pbWFsIGJ1aWx0aW4gdHlwZSBzeXN0ZW0uCi0gKiBUaGUgcmVzdWx0aW5nIFNjaGVtYVR5cGVTeXN0ZW0gPGNvZGU+c3RzPC9jb2RlPiBjb250YWlucyBvbmx5IHRoZSBkZWZpbml0aW9ucwotICogZnJvbSBteVhTRCBmaWxlLiAgSW4gb3JkZXIgdG8gbG9hZCBhbmQgdmFsaWRhdGUgYW4gaW5zdGFuY2Ugd2l0aGluCi0gKiB0aGUgY29udGV4dCBvZiB0aG9zZSB0eXBlcywgd2UgbXVzdCBuZXh0IGNvbnN0cnVjdCBhCi0gKiB7QGxpbmsgU2NoZW1hVHlwZUxvYWRlcn0gPGNvZGU+c3RsPC9jb2RlPiB0aGF0IGNvbnRhaW5zIGJvdGgKLSAqIHRoZSBidWlsdGluIHR5cGUgc3lzdGVtIGFuZCB0aGUgdHlwZXMgZGVmaW5lZCB3aXRoaW4gdGhlIG15WFNEIGZpbGUuCi0gKiA8cHJlPgotICogU2NoZW1hVHlwZVN5c3RlbSBzdHMgPSBYbWxCZWFucy5jb21waWxlWHNkKG5ldyBYbWxPYmplY3RbXQotICogICAgeyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteVhTREZpbGUpIH0sCi0gKiAgICBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLAotICogICAgbnVsbCk7Ci0gKiBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IFhtbEJlYW5zLnR5cGVMb2FkZXJVbmlvbihuZXcgU2NoZW1hVHlwZUxvYWRlcltdCi0gKiAgICB7IHN0cywgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSB9KTsKLSAqIFhtbE9iamVjdCBteWRvYyA9IHN0bC5wYXJzZShpbnN0YW5jZUZpbGUsIG51bGwsIG51bGwpOwotICogU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCB2YWxpZDogIiArIG15ZG9jLnZhbGlkYXRlKCkpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIEFzIHlvdSBjYW4gc2VlLCBmb3Igd29ya2luZyB3aXRoIGluc3RhbmNlcywgeW91IHR5cGljYWxseSB3YW50IHRvCi0gKiB3b3JrIHdpdGggYSBTY2hlbWFUeXBlTG9hZGVyIGNvbnN0cnVjdGVkIGZyb20gYSBwYXRoIHJhdGhlciB0aGFuCi0gKiBhIHNvbGl0YXJ5IFNjaGVtYVR5cGVTeXN0ZW0uICBTZWUge0BsaW5rIFhtbEJlYW5zI2xvYWRYc2R9IGZvcgotICogYSBjb252ZW5pZW50IGFsdGVybmF0aXZlIHRvIHtAbGluayBYbWxCZWFucyNjb21waWxlWHNkfS4KLSAqIDxwPgotICogQSBTY2hlbWFUeXBlU3lzdGVtIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGVudW1lcmF0ZSB0aGUgZXhhY3Qgc2V0Ci0gKiBvZiBjb21wb25lbnQgZGVmaW5pdGlvbnMgZGVyaXZlZCBmcm9tIGEgc2V0IG9mIFhTRCBmaWxlcywgZm9yIGV4YW1wbGUsCi0gKiB3aGVuIHlvdSBhcmUgYW5hbHl6aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgWFNEIGZpbGVzIHRoZW1zZWx2ZXMuCi0gKiBIZXJlIGlzIGhvdyB0byB1c2UgYSBTY2hlbWFUeXBlU3lzdGVtIHRvIGluc3BlY3QgYSBzZXQgb2Ygc2NoZW1hCi0gKiBkZWZpbml0aW9uczoKLSAqIDxvbD4KLSAqIDxsaT5GaXJzdCwgdXNlIHtAbGluayBYbWxCZWFucyNjb21waWxlWHNkfSB0byBjb21waWxlIGFueSBudW1iZXIKLSAqICAgICBvZiBzY2hlbWEgZmlsZXMuICBJZiB0aGUgc2NoZW1hIGZpbGVzIGFyZSB2YWxpZCwgcmVzdWx0IHdpbGwKLSAqICAgICBiZSBhIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCBjb250YWlucyBhbGwgdGhlIGNvbXBvbmVudCBkZWZpbml0aW9ucwotICogICAgIGZyb20gdGhvc2UgZmlsZXMuICBJdCB3aWxsIGNvbnRhaW4gbm8gb3RoZXIgY29tcG9uZW50IGRlZmluaXRpb25zLgotICogPGxpPkFsdGVybmF0aXZlbHksIGNhbGwge0BsaW5rIFNjaGVtYUNvbXBvbmVudCNnZXRUeXBlU3lzdGVtfSBvbgotICogICAgIGEgcHJlY29tcGlsZWQgc2NoZW1hIGNvbXBvbmVudCB0byBkaXNjb3ZlciB0aGUgU2NoZW1hVHlwZVN5c3RlbQotICogICAgIHdpdGhpbiB3aGljaCB0aGF0IGNvbXBvbmVudCB3YXMgb3JpZ2luYWxseSBjb21waWxlZC4KLSAqIDxsaT5PbmNlIHlvdSBoYXZlIGEgU2NoZW1hVHlwZVN5c3RlbSwgY2FsbDoKLSAqICAgPHVsPgotICogICA8bGk+IHtAbGluayAjZ2xvYmFsVHlwZXMoKX0gZm9yIGFsbCB0aGUgZ2xvYmFsIHR5cGUgZGVmaW5pdGlvbnMuCi0gKiAgIDxsaT4ge0BsaW5rICNnbG9iYWxFbGVtZW50cygpfSBmb3IgYWxsIHRoZSBnbG9iYWwgZWxlbWVudCBkZWZpbml0aW9ucy4KLSAqICAgPGxpPiB7QGxpbmsgI2dsb2JhbEF0dHJpYnV0ZXMoKX0gZm9yIGFsbCB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4KLSAqICAgPGxpPiB7QGxpbmsgI21vZGVsR3JvdXBzKCl9IGZvciBhbGwgdGhlIG5hbWVkIG1vZGVsIGdyb3VwIGRlZmluaXRpb25zLgotICogICA8bGk+IHtAbGluayAjYXR0cmlidXRlR3JvdXBzKCl9IGZvciBhbGwgdGhlIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9ucy4KLSAqICAgPC91bD4KLSAqIDxsaT5JbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHNwZWNpYWwgdHlwZXMgZ2VuZXJhdGVkIGZvciBYTUwgQmVhbnMgdGhhcmUKLSAqICAgICBhcmUgbm90IGZvcm1hbGx5IHBhcnQgb2YgdGhlIFNjaGVtYSBzcGVjaWZpY2F0aW9uOgotICogICA8dWw+Ci0gKiAgIDxsaT4ge0BsaW5rICNkb2N1bWVudFR5cGVzKCl9IHJldHVybnMgYWxsIHRoZSBkb2N1bWVudCB0eXBlcy4KLSAqICAgPGxpPiB7QGxpbmsgI2F0dHJpYnV0ZVR5cGVzKCl9IHJldHVybnMgYWxsIHRoZSBhdHRyaWJ1dGUgdHlwZXMuCi0gKiAgIDwvdWw+Ci0gKiA8L29sPgotICogCi0gKiA8cD4KLSAqIEEgZG9jdW1lbnQgdHlwZSBpcyBhIHR5cGUgdGhhdCBjb250YWlucyBhIHNpbmdsZSBnbG9iYWwgZWxlbWVudDsgdGhlcmUKLSAqIGlzIG9uZSBkb2N1bWVudCB0eXBlIGZvciBlYWNoIGdsb2JhbCBlbGVtZW50IGRlZmluaXRpb24gaW4gYQotICogU2NoZW1hVHlwZVN5c3RlbS4gIEluIGFuIGluc3RhbmNlIGRvY3VtZW50LCBvbmx5IHRoZSByb290IFhtbE9iamVjdAotICogY2FuIGhhdmUgYSBkb2N1bWVudCB0eXBlIGFzIGl0cyB0eXBlLgotICogPHA+Ci0gKiBTaW1pbGFybHksIGFuIGF0dHJpYnV0ZSB0eXBlIGlzIGEgdHlwZSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGdsb2JhbAotICogYXR0cmlidXRlLCBhbmQgdGhlcmUgaXMgb25lIGF0dHJpYnV0ZSB0eXBlIGZvciBlYWNoIGdsb2JhbCBhdHRyaWJ1dGUKLSAqIGRlZmluaXRpb24gaW4gYSBTY2hlbWFUeXBlU3lzdGVtLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHJvb3QKLSAqIFhtbE9iamVjdCByZXByZXNlbnRpbmcgYSBmcmFnbWVudCB3aG9zZSB0eXBlIGlzIGFuIGF0dHJpYnV0ZSB0eXBlLAotICogYnV0IGF0dHJpYnV0ZSB0eXBlcyBhcmUgcHJlc2VudCBtYWlubHkgZm9yIHN5bW1ldHJ5IGFuZCB0byBzaW1wbGlmeQotICogY29kZSBzdWNoIGFzIHRoZSB0eXBlLXRyZWUtd2Fsa2luZyBjb2RlIGJlbG93LgotICogPHA+Ci0gKiBUaGUgZ2xvYmFsIGNvbXBvbmVudCBtZXRob2RzIGFib3ZlIG9ubHkgcHJvdmlkZSBhIHZpZXcgb2YgdGhlIHRvcC1sZXZlbAotICogY29tcG9uZW50cyBvZiBhIFNjaGVtYVR5cGVTeXN0ZW0gYW5kIGRvIG5vdCBpbmNsdWRlIGFueSBuZXN0ZWQKLSAqIGRlZmluaXRpb25zLiAgVG8gdmlldyBhbGwgdGhlIG5lc3RlZCBkZWZpbml0aW9ucywgeW91IHdpbGwgd2FudCB0bwotICogdHJhdmVyc2UgdGhlIGVudGlyZSB0cmVlIG9mIHtAbGluayBTY2hlbWFUeXBlfSBkZWZpbnRpb25zIHdpdGhpbiBhCi0gKiBTY2hlbWFUeXBlU3lzdGVtIGJ5IGV4YW1pbmluZyB0aGUge0BsaW5rIFNjaGVtYVR5cGUjZ2V0QW5vbnltb3VzVHlwZXMoKX0KLSAqIHdpdGhpbiBlYWNoIHtAbGluayBTY2hlbWFUeXBlfSByZWN1cnNpdmVseS4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgY29kZSBpcyBhIHN0YW5kYXJkIHRyZWV3YWxrIHRoYXQgdmlzaXRzIGV2ZXJ5Ci0gKiB7QGxpbmsgU2NoZW1hVHlwZX0gaW4gdGhlIFNjaGVtYVR5cGVTeXN0ZW0gb25jZSwgaW5jbHVkaW5nIG5lc3RlZAotICogZGVmaW5pdGlvbnMuCi0gKiA8cHJlPgotICogTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gKiBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5kb2N1bWVudFR5cGVzKCkpKTsKLSAqIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAqIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmdsb2JhbFR5cGVzKCkpKTsKLSAqIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2VlblR5cGVzLnNpemUoKTsgaSsrKQotICogewotICogICAgIFNjaGVtYVR5cGUgc1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICogICAgIFN5c3RlbS5vdXQucHJpbmxudCgiVmlzaXRpbmcgIiArIHNUeXBlLnRvU3RyaW5nKCkpOwotICogICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBAc2VlIFNjaGVtYVR5cGUgCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIgCi0gKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAqIEBzZWUgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9uCi0gKiBAc2VlIFhtbEJlYW5zI2dldEJ1aWx0aW5UeXBlU3lzdGVtCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVR5cGVTeXN0ZW0gZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB0eXBlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVbXSBnbG9iYWxUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBnbG9iYWxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBncm91cHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gYXR0cmlidXRlR3JvdXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBhIHR5cGUgc3lzdGVtIChyZXNvbHZlcyBhbGwgaGFuZGxlcyB3aXRoaW4gdGhlIHR5cGUgc3lzdGVtKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGVzIGEgdHlwZSwgZWxlbWVudCwgb3IgYXR0cmlidXRlIHVzaW5nIHRoZSBoYW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudCByZXNvbHZlSGFuZGxlKFN0cmluZyBoYW5kbGUpOwotCi0gICAgLyoqCi0gICAgICogTG9jYXRlcyBhIHR5cGUsIGVsZW1lbnQsIG9yIGF0dHJpYnV0ZSB1c2luZyB0aGUgaGFuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JIYW5kbGUoU3RyaW5nIGhhbmRsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc2xvYWRlciB1c2VkIGJ5IHRoaXMgbG9hZGVyIGZvciByZXNvbHZpbmcgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGlzIHR5cGUgdG8gYSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVRvRGlyZWN0b3J5KEZpbGUgY2xhc3NEaXIpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NpbXBsZVZhbHVlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2ltcGxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1NDk0YS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2ltcGxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogQWxsIFhtbE9iamVjdCBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIGNvZXJjZWQgdG8gU2ltcGxlVmFsdWUuCi0gKiBGb3IgYW55IGdpdmVuIHNjaGVtYSB0eXBlLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb252ZXJzaW9uCi0gKiBtZXRob2RzIHdpbGwgd29yay4gIE90aGVycyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAqIDxwPgotICogU2ltcGxlVmFsdWUgaXMgdXNlZnVsIGZvciBkZWNsYXJpbmcgdmFyaWFibGVzIHdoaWNoIGNhbiBob2xkCi0gKiBtb3JlIHRoYW4gb25lIHNpbWlsYXIgc2NoZW1hIHR5cGUgdGhhdCBtYXkgbm90IGhhcHBlbiB0bwotICogaGF2ZSBhIGNvbW1vbiBYTUwgYmFzZSB0eXBlLCBmb3IgZXhhbXBsZSwgdHdvIGxpc3QgdHlwZXMsCi0gKiBvciB0d28gdW5yZWxhdGVkIGludGVnZXIgcmVzdHJpY3Rpb25zIHRoYXQgaGFwcGVuIHRvIGZpdAotICogaW50byBhbiBpbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2ltcGxlVmFsdWUgZXh0ZW5kcyBYbWxPYmplY3QKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgc2FtZSBhcyBnZXRTY2hlbWFUeXBlIHVubGVzcyB0aGlzIGlzIGEgdW5pb24gaW5zdGFuY2UKLSAgICAgKiBvciBuaWwgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogRm9yIHVuaW9ucywgdGhpcyByZXR1cm5zIHRoZSBub24tdW5pb24gY29uc2l0dWVudCB0eXBlIG9mCi0gICAgICogdGhpcyBpbnN0YW5jZS4gVGhpcyB0eXBlIG1heSBjaGFuZ2UgaWYgc2V0dGVycyBhcmUgY2FsbGVkCi0gICAgICogdGhhdCBjYXVzZSB0aGUgaW5zdGFuY2UgdG8gY2hhbmdlIHRvIGFub3RoZXIgY29uc3RpdHVlbnQKLSAgICAgKiB0eXBlIG9mIHRoZSB1bmlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgbmlsIHZhbHVlcywgdGhpcyByZXR1cm5zIG51bGwuCi0gICAgICovCi0gICAgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9LiAqLwotICAgIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uICovCi0gICAgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlLiAqLwotICAgIHB1YmxpYyBieXRlIGdldEJ5dGVWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHNob3J0LiAqLwotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydFZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGFuIGludC4gKi8KLSAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgbG9uZy4gKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0uICovCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9LiAqLwotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWxWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGZsb2F0LiAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgZG91YmxlLiAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqLwotICAgIGJ5dGVbXSBnZXRCeXRlQXJyYXlWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlfS4gKi8KLSAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGdldEVudW1WYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfS4gKi8KLSAgICBEYXRlIGdldERhdGVWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0uICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259LiAqLwotICAgIEdEdXJhdGlvbiBnZXRHRHVyYXRpb25WYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0uICovCi0gICAgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiBmcmllbmRseSBKYXZhIG9iamVjdHMgKFN0cmluZywgSW50ZWdlciwgQnl0ZSwgU2hvcnQsIExvbmcsIEJpZ0ludGVnZXIsIERlY2ltYWwsIEZsb2F0LCBEb3VibGUsIGJ5dGVbXSwgQ2FsZW5kYXIsIEdEdXJhdGlvbikuICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2YgWG1sQW55U2ltcGxlVHlwZSBvYmplY3RzLiAqLwotICAgIExpc3QgeGdldExpc3RWYWx1ZSgpOwotCi0gICAgLyoqIFJldHVybnMgYSB1bmlvbiB2YWx1ZSBhcyBhIGl0cyBuYXR1cmFsIGZyaWVuZGx5IEphdmEgb2JqZWN0IChTdHJpbmcsIEludGVnZXIsIEJ5dGUsIFNob3J0LCBMb25nLCBCaWdJbnRlZ2VyLCBEZWNpbWFsLCBGbG9hdCwgRG91YmxlLCBieXRlW10sIENhbGVuZGFyLCBHRHVyYXRpb24pLiAqLwotICAgIE9iamVjdCBnZXRPYmplY3RWYWx1ZSgpOwotCi0gICAgLy8gZm9sbG93aW5nIGFyZSBzaW1wbGUgdHlwZSB2YWx1ZSBzZXR0ZXJzCi0KLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfS4gKi8KLSAgICB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uICovCi0gICAgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2KTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBieXRlLiAqLwotICAgIHZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgc2hvcnQuICovCi0gICAgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHYpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBpbnQuICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgbG9uZy4gKi8KLSAgICB2b2lkIHNldExvbmdWYWx1ZShsb25nIHYpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfS4gKi8KLSAgICB2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShCaWdJbnRlZ2VyIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9LiAqLwotICAgIHZvaWQgc2V0QmlnRGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBmbG9hdC4gKi8KLSAgICB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgZG91YmxlLiAqLwotICAgIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCi0gICAgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nRW51bUFic3RyYWN0QmFzZX0uICovCi0gICAgdm9pZCBzZXRFbnVtVmFsdWUoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9LiAqLwotICAgIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9LiAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259LiAqLwotICAgIHZvaWQgc2V0R0R1cmF0aW9uVmFsdWUoR0R1cmF0aW9uIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfS4gKi8KLSAgICB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0uICovCi0gICAgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcmJpdHJhcnkge0BsaW5rIE9iamVjdH0uICovCi0gICAgdm9pZCBzZXRPYmplY3RWYWx1ZShPYmplY3Qgb2JqKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0U3RyaW5nVmFsdWV9Ci0gICAgICovCi0gICAgU3RyaW5nIHN0cmluZ1ZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBib29sZWFuLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJvb2xlYW5WYWx1ZX0KLSAgICAgKi8KLSAgICBib29sZWFuIGJvb2xlYW5WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgYnl0ZS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCeXRlVmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBzaG9ydC4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYW4gaW50LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGxvbmcuICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TG9uZ1ZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJpZ0ludGVnZXJWYWx1ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCaWdEZWNpbWFsVmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBmbG9hdC4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRGbG9hdFZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0RG91YmxlVmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKi8KLSAgICBieXRlW10gYnl0ZUFycmF5VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRFbnVtVmFsdWV9Ci0gICAgICovCi0gICAgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0RGF0ZVZhbHVlfQotICAgICAqLwotICAgIERhdGUgZGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0R1cmF0aW9uVmFsdWV9Ci0gICAgICovCi0gICAgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFFOYW1lVmFsdWV9Ci0gICAgICovCi0gICAgUU5hbWUgcU5hbWVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIGZyaWVuZGx5IEphdmEgb2JqZWN0cyAoU3RyaW5nLCBJbnRlZ2VyLCBCeXRlLCBTaG9ydCwgTG9uZywgQmlnSW50ZWdlciwgRGVjaW1hbCwgRmxvYXQsIERvdWJsZSwgYnl0ZVtdLCBDYWxlbmRhciwgR0R1cmF0aW9uKS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICovCi0gICAgTGlzdCBsaXN0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiBYbWxBbnlTaW1wbGVUeXBlIG9iamVjdHMuICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TGlzdFZhbHVlfQotICAgICAqLwotICAgIExpc3QgeGxpc3RWYWx1ZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB1bmlvbiB2YWx1ZSBhcyBhIGl0cyBuYXR1cmFsIGZyaWVuZGx5IEphdmEgb2JqZWN0IChTdHJpbmcsIEludGVnZXIsIEJ5dGUsIFNob3J0LCBMb25nLCBCaWdJbnRlZ2VyLCBEZWNpbWFsLCBGbG9hdCwgRG91YmxlLCBieXRlW10sIENhbGVuZGFyLCBHRHVyYXRpb24pLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldE9iamVjdFZhbHVlfQotICAgICAqLwotICAgIE9iamVjdCBvYmplY3RWYWx1ZSgpOwotCi0gICAgLy8gZm9sbG93aW5nIGFyZSBzaW1wbGUgdHlwZSB2YWx1ZSBzZXR0ZXJzCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFN0cmluZ1ZhbHVlfQotICAgICAqLwotICAgIHZvaWQgc2V0KFN0cmluZyBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRCb29sZWFuVmFsdWV9Ci0gICAgICovCi0gICAgdm9pZCBzZXQoYm9vbGVhbiB2KTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJ5dGUuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJ5dGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYnl0ZSB2KTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHNob3J0LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRTaG9ydFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChzaG9ydCB2KTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBpbnQuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBsb25nLgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRMb25nVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGxvbmcgdik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0uCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJpZ0ludGVnZXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQmlnSW50ZWdlciBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJpZ0RlY2ltYWxWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQmlnRGVjaW1hbCBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgZmxvYXQuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEZsb2F0VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGZsb2F0IHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgZG91YmxlLgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXREb3VibGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoZG91YmxlIHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Qnl0ZUFycmF5VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGJ5dGVbXSBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ0VudW1BYnN0cmFjdEJhc2V9LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRFbnVtVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0uCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoRGF0ZSBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0R1cmF0aW9ufS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0R1cmF0aW9uVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEdXJhdGlvblNwZWNpZmljYXRpb24gb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0uCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFFOYW1lVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KFFOYW1lIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0uCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoTGlzdCBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGFyYml0cmFyeSB7QGxpbmsgT2JqZWN0fS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0T2JqZWN0VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgb2JqZWN0U2V0KE9iamVjdCBvYmopOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1N0cmluZ0VudW1BYnN0cmFjdEJhc2UuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TdHJpbmdFbnVtQWJzdHJhY3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmFkOGIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1N0cmluZ0VudW1BYnN0cmFjdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGNvZGUtZ2VuZXJhdGVkIHN0cmluZyBlbnVtZXJhdGlvbiB2YWx1ZSBjbGFzc2VzLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIGFyZSBpbnRlbmRlZCB0byBiZSBmaW5hbCB0eXBlcyB3aXRoIGEgZmluaXRlIHNldCBvZgotICogc2luZ2xldG9uIGluc3RhbmNlcy4gIEVhY2ggaW5zdGFuY2UgaGFzIGEgc3RyaW5nIHZhbHVlLCB3aGljaAotICogaXQgcmV0dXJucyB2aWEge0BsaW5rICN0b1N0cmluZ30sIGFuZCBhbiBpbnQgdmFsdWUgZm9yIHRoZSBwdXJwb3NlCi0gKiBvZiBzd2l0Y2hpbmcgaW4gY2FzZSBzdGF0ZW1lbnRzLCByZXR1cm5lZCB2aWEge0BsaW5rICNpbnRWYWx1ZX0uCi0gKiA8cD4KLSAqIEVhY2ggc3ViY2xhc3MgbWFuYWdlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nRW51bUFic3RyYWN0QmFzZS5UYWJsZX0sCi0gKiB3aGljaCBob2xkcyBhbGwgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZXMgZm9yIHRoZSBzdWJjbGFzcy4gQSBUYWJsZQotICogY2FuIHJldHVybiBhIHNpbmdsZXRvbiBpbnN0YW5jZSBnaXZlbiBhIFN0cmluZyBvciBhbiBpbnRlZ2VyIGNvZGUuCi0gKi8gCi1wdWJsaWMgY2xhc3MgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3N0cmluZzsKLSAgICBwcml2YXRlIGludCBfaW50OwotCi0gICAgLyoqCi0gICAgICogU2luZ2xldG9uIGluc3RhbmNlcyBzaG91bGQgb25seSBiZSBjcmVhdGVkIGJ5IHN1YmNsYXNzZXMuCi0gICAgICovIAotICAgIHByb3RlY3RlZCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlKFN0cmluZyBzLCBpbnQgaSkKLSAgICAgICAgeyBfc3RyaW5nID0gczsgX2ludCA9IGk7IH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7IHJldHVybiBfc3RyaW5nOyB9Ci0gICAgLyoqIFJldHVybnMgYW4gaW50IGNvZGUgdGhhdCBjYW4gYmUgdXNlZCBmb3Igc3dpdGNoIHN0YXRlbWVudHMgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGludFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gX2ludDsgfQotICAgIC8qKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgb2YgdGhlIHVuZGVybHlpbmcgc3RyaW5nICovCi0gICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zdHJpbmcuaGFzaENvZGUoKTsgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBtYW5hZ2Ugc2luZ2xldG9uIGluc3RhbmNlcyBvZiBlbnVtZXJhdGlvbnMuCi0gICAgICogRWFjaCBzdWJjbGFzcyBvZiBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGhhcyBhbiBpbnN0YW5jZQotICAgICAqIG9mIGEgdGFibGUgdG8gaG9sZCB0aGUgc2luZ2xldG9uIGluc3RhbmNlcy4KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUYWJsZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBNYXAgX21hcDsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IF9saXN0OwotICAgICAgICBwdWJsaWMgVGFibGUoU3RyaW5nRW51bUFic3RyYWN0QmFzZVtdIGFycmF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBfbWFwID0gbmV3IEhhc2hNYXAoYXJyYXkubGVuZ3RoKTsKLSAgICAgICAgICAgIF9saXN0ID0gbmV3IEFycmF5TGlzdChhcnJheS5sZW5ndGggKyAxKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX21hcC5wdXQoYXJyYXlbaV0udG9TdHJpbmcoKSwgYXJyYXlbaV0pOwotICAgICAgICAgICAgICAgIGludCBqID0gYXJyYXlbaV0uaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoX2xpc3Quc2l6ZSgpIDw9IGopCi0gICAgICAgICAgICAgICAgICAgIF9saXN0LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICBfbGlzdC5zZXQoaiwgYXJyYXlbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyB0aGUgc2luZ2xldG9uIGZvciBhIHtAbGluayBTdHJpbmd9LCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGZvclN0cmluZyhTdHJpbmcgcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmdFbnVtQWJzdHJhY3RCYXNlKV9tYXAuZ2V0KHMpOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gZm9yIGFuIGludCBjb2RlLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGZvckludChpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPCAwIHx8IGkgPiBfbGlzdC5zaXplKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xpc3QuZ2V0KGkpOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBsYXN0IHZhbGlkIGludCBjb2RlICh0aGUgZmlyc3QgaXMgMTsgemVybyBpcyBub3QgdXNlZCkuICovCi0gICAgICAgIHB1YmxpYyBpbnQgbGFzdEludCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbGlzdC5zaXplKCkgLSAxOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1hNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTdlMDQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1hNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIGV4Y2VwdGlvbiB0aHJvd24gZnJvbSBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gKiAKLSAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtCi0gKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBYTUxTdHJlYW1FeGNlcHRpb24KLXsKLSAgICBwdWJsaWMgWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbiAoIFhtbEVycm9yIHhtbEVycm9yICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB4bWxFcnJvci50b1N0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBfeG1sRXJyb3IgPSB4bWxFcnJvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sRXJyb3IgZ2V0WG1sRXJyb3IgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3htbEVycm9yOwotICAgIH0KLQotICAgIHByaXZhdGUgWG1sRXJyb3IgX3htbEVycm9yOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlTaW1wbGVUeXBlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55U2ltcGxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGFlNmVhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlTaW1wbGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNTaW1wbGVfVHlwZV9EZWZpbml0aW9uIj54czphbnlTaW1wbGVUeXBlPC9hPiB0eXBlLgotICogPHA+Ci0gKiBBbGwgc2ltcGxlIHR5cGVzIGFyZSBjb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4gCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFueVNpbXBsZVR5cGUgZXh0ZW5kcyBYbWxPYmplY3QKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9hbnlTaW1wbGVUeXBlIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0U3RyaW5nVmFsdWV9Ci0gICAgICoqLwotICAgIFN0cmluZyBzdHJpbmdWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI3NldFN0cmluZ1ZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9Ci0gICAgICoqLwotICAgIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfQotICAgICAqKi8KLSAgICB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBzKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2FueXRoaW5nJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2FueXRoaW5nJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVVSSS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIzNDNmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2FueVVSSSI+eHM6YW55VVJJPC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4gCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFueVVSSSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9hbnlVUkkiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEFueVVSSX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQW55VVJJfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQW55VVJJfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sQW55VVJJfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2h0dHA6Ly93d3cudzMub3JnLyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtodHRwOi8vd3d3LnczLm9yZy8mbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJhc2U2NEJpbmFyeS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJhc2U2NEJpbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWE0ZTNmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCYXNlNjRCaW5hcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jhc2U2NEJpbmFyeSI+eHM6YmFzZTY0QmluYXJ5PC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIGJ5dGUgYXJyYXkuIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxCYXNlNjRCaW5hcnkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYmFzZTY0QmluYXJ5Iik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEJ5dGVBcnJheVZhbHVlfQotICAgICAqKi8KLSAgICBieXRlW10gYnl0ZUFycmF5VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYnl0ZVtdIGJhKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqKi8KLSAgICBieXRlW10gZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKi8KLSAgICB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBiYSk7Ci0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7VkdocGN5QnpkSEpwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1ZHaHBjeUJ6ZEhKcCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmVhbnMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCZWFucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjdmNzhhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCZWFucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIFByb3ZpZGVzIGFuIGFzc29ydG1lbnQgb2YgdXRpbGl0aWVzCi0gKiBmb3IgbWFuYWdpbmcgWE1MIEJlYW4gdHlwZXMsIHR5cGUgc3lzdGVtcywgUU5hbWVzLCBwYXRocywKLSAqIGFuZCBxdWVyaWVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sQmVhbnMKLXsKLSAgICAvKioKLSAgICAgKiBUaHJlYWQgbG9jYWwgUU5hbWUgY2FjaGUgZm9yIGdlbmVyYWwgdXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWwgX3RocmVhZExvY2FsTG9hZGVyUU5hbWVDYWNoZSA9Ci0gICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lQ2FjaGUoIDMyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdGhyZWFkIGxvY2FsIFFOYW1lQ2FjaGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lQ2FjaGUgZ2V0UU5hbWVDYWNoZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoUU5hbWVDYWNoZSkgX3RocmVhZExvY2FsTG9hZGVyUU5hbWVDYWNoZS5nZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW5zIGEgbmFtZSBmcm9tIHRoZSB0aHJlYWQgbG9jYWwgUU5hbWVDYWNoZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UU5hbWUgKCBTdHJpbmcgbG9jYWxQYXJ0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZUNhY2hlKCkuZ2V0TmFtZSggIiIsICBsb2NhbFBhcnQgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW5zIGEgbmFtZSBmcm9tIHRoZSB0aHJlYWQgbG9jYWwgUU5hbWVDYWNoZQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRRTmFtZSAoIFN0cmluZyBuYW1lc3BhY2VVcmksIFN0cmluZyBsb2NhbFBhcnQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFFOYW1lQ2FjaGUoKS5nZXROYW1lKCBuYW1lc3BhY2VVcmksICBsb2NhbFBhcnQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX2dldENvbnRleHRUeXBlTG9hZGVyTWV0aG9kID0gYnVpbGRHZXRDb250ZXh0VHlwZUxvYWRlck1ldGhvZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfZ2V0QnVpbHRpblNjaGVtYVR5cGVTeXN0ZW1NZXRob2QgPSBidWlsZEdldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9nZXROb1R5cGVNZXRob2QgPSBidWlsZEdldE5vVHlwZU1ldGhvZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfdHlwZUxvYWRlckJ1aWxkZXJNZXRob2QgPSBidWlsZFR5cGVMb2FkZXJCdWlsZGVyTWV0aG9kKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9jb21waWxhdGlvbk1ldGhvZCA9IGJ1aWxkQ29tcGlsYXRpb25NZXRob2QoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFJ1bnRpbWVFeGNlcHRpb24gY2F1c2VkRXhjZXB0aW9uKFJ1bnRpbWVFeGNlcHRpb24gZSwgVGhyb3dhYmxlIGNhdXNlKQotICAgIHsKLSAgICAgICAgZS5pbml0Q2F1c2UoY2F1c2UpOwotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxFeGNlcHRpb24gd3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgZSkKLSAgICB7Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgWG1sRXhjZXB0aW9uKQotICAgICAgICAgICAgcmV0dXJuIChYbWxFeGNlcHRpb24pIGU7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBYbWxFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGJ1aWxkR2V0Q29udGV4dFR5cGVMb2FkZXJNZXRob2QoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVMb2FkZXJJbXBsIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZ2V0Q29udGV4dFR5cGVMb2FkZXIiLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIFNjaGVtYVR5cGVMb2FkZXJJbXBsOiB2ZXJpZnkgdGhhdCB4YmVhbi5qYXIgaXMgb24gdGhlIGNsYXNzcGF0aCIpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIGJ1aWxkR2V0QnVpbHRpblNjaGVtYVR5cGVTeXN0ZW1NZXRob2QoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZ2V0IiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbTogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgYnVpbGRHZXROb1R5cGVNZXRob2QoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZ2V0Tm9UeXBlIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbTogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBidWlsZFR5cGVMb2FkZXJCdWlsZGVyTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyByZXNvdXJjZUxvYWRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5SZXNvdXJjZUxvYWRlciIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVMb2FkZXJJbXBsIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiYnVpbGQiLCBuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGVMb2FkZXJbXS5jbGFzcywgcmVzb3VyY2VMb2FkZXJDbGFzcywgQ2xhc3NMb2FkZXIuY2xhc3MgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgU2NoZW1hVHlwZUxvYWRlckltcGw6IHZlcmlmeSB0aGF0IHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIiksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgYnVpbGRDb21waWxhdGlvbk1ldGhvZCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVN5c3RlbUltcGwiLCBmYWxzZSwgWG1sQmVhbnMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkuZ2V0TWV0aG9kKCJmb3JTY2hlbWFYbWwiLCBuZXcgQ2xhc3NbXSB7IFhtbE9iamVjdFtdLmNsYXNzLCBTY2hlbWFUeXBlTG9hZGVyLmNsYXNzLCBYbWxPcHRpb25zLmNsYXNzIH0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIFNjaGVtYVR5cGVTeXN0ZW1JbXBsOiB2ZXJpZnkgdGhhdCB4YmVhbi5qYXIgaXMgb24gdGhlIGNsYXNzcGF0aCIpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGFuIFhQYXRoLCByZXR1cm5pbmcgYSBTdHJpbmcgZXF1YWwgdG8gdGhhdCB3aGljaCB3YXMgcGFzc2VkLAotICAgICAqIGJ1dCB3aG9zZSBpZGVudGl0eSBpcyB0aGF0IG9mIG9uZSB3aGljaCBoYXMgYmVlbiBwcmVjb21waWxlZCBhbmQgY2FjaGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBpbGVQYXRoICggU3RyaW5nIHBhdGhFeHByICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVQYXRoKCBwYXRoRXhwciwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhbiBYUGF0aCwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKLSAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZDsgCi0gICAgICogdGFrZXMgYW4gb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHRleHQgdGhhdCBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgY29udGV4dCBub2RlLgotICAgICAqIFRoZSBkZWZhdWx0IGlzICJ0aGlzIiwgYXMgaW4gIiR0aGlzIi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBwYXRoLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjYWxsIAotICAgICAqIHRoZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRYcXVlcnlDdXJyZW50Tm9kZVZhcihTdHJpbmcpIFhtbE9wdGlvbnMuc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKX0KLSAgICAgKiBtZXRob2QgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgbmFtZSBmb3IgdGhlIGV4cHJlc3Npb24gCi0gICAgICogdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRleHQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUGF0aCAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRleHRUeXBlTG9hZGVyKCkuY29tcGlsZVBhdGgoIHBhdGhFeHByLCBvcHRpb25zICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGFuIFhRdWVyeSwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKLSAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVRdWVyeSggcXVlcnlFeHByLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGFuIFhRdWVyeSwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKLSAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZDsKLSAgICAgKiB0YWtlcyBhbiBvcHRpb24gZm9yIHNwZWNpZnlpbmcgdGV4dCB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dCBub2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgb3B0aW9ucyAgT3B0aW9ucyBmb3IgdGhlIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjYWxsIAotICAgICAqIHRoZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRYcXVlcnlDdXJyZW50Tm9kZVZhcihTdHJpbmcpIFhtbE9wdGlvbnMuc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKX0KLSAgICAgKiBtZXRob2QgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgbmFtZSBmb3IgdGhlIGV4cHJlc3Npb24gCi0gICAgICogdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRleHQgbm9kZSBhbmQgdGhlCi0gICAgICoge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5VmFyaWFibGVzKE1hcCkgWG1sT3B0aW9ucy5zZXRYcXVlcnlWYXJpYWJsZXMoTWFwKX0KLSAgICAgKiBtZXRob2QgdG8gbWFwIGV4dGVybmFsIHZhcmlhYmxlIG5hbWVzIHRvIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5jb21waWxlUXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTY2hlbWFUeXBlTG9hZGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbnRleHQKLSAgICAgKiBDbGFzc0xvYWRlci4gVGhpcyBpcyB0aGUgU2NoZW1hVHlwZUxvYWRlciB0aGF0IGlzIHVzZWQgdG8gYXNzaWduCi0gICAgICogc2NoZW1hIHR5cGVzIHRvIFhNTCBkb2N1bWVudHMgYnkgZGVmYXVsdC4gVGhlIFNjaGVtYVR5cGVMb2FkZXIgaXMKLSAgICAgKiBhbHNvIGNvbnN1bHRlZCB0byByZXNvbHZlIHdpbGRjYXJkcyBhbmQgeHNpOnR5cGUgYXR0cmlidXRlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgInBhcnNlIiBtZXRob2RzIG9mIFhtbEJlYW5zIGFsbCBkZWxlZ2F0ZSB0byB0aGUKLSAgICAgKiAicGFyc2VJbnN0YW5jZSIgbWV0aG9kcyBvZiB0aGUgY29udGV4dCB0eXBlIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgZ2V0Q29udGV4dFR5cGVMb2FkZXIoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcilfZ2V0Q29udGV4dFR5cGVMb2FkZXJNZXRob2QuaW52b2tlKG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBidWlsdGluIHR5cGUgc3lzdGVtLiBUaGlzIFNjaGVtYVR5cGVTeXN0ZW0gY29udGFpbnMKLSAgICAgKiBvbmx5IHRoZSA0NiBidWlsdGluIHR5cGVzIGRlZmluZWQgYnkgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbSlfZ2V0QnVpbHRpblNjaGVtYVR5cGVTeXN0ZW1NZXRob2QuaW52b2tlKG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uZ2V0KCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcgdGhlIFhNTAotICAgICAqIHNjaGVtYSBkZWZpbml0aW9ucyBwYXNzZWQuCi0gICAgICogPHA+Ci0gICAgICogSnVzdCBsaWtlIGNvbXBpbGVUeXBlU3lzdGVtLCBidXQgdXNlcyB0aGUgY29udGV4dCB0eXBlIGxvYWRlciBmb3IKLSAgICAgKiBsaW5raW5nLCBhbmQgcmV0dXJucyBhIHVuaW9uZWQgdHlwZWxvYWRlciB0aGF0IGlzIHN1aXRhYmxlIGZvcgotICAgICAqIGNyZWF0aW5nIGluc3RhbmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgbG9hZFhzZChYbWxPYmplY3RbXSBzY2hlbWFzKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbG9hZFhzZChzY2hlbWFzLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcgdGhlIFhNTAotICAgICAqIHNjaGVtYSBkZWZpbml0aW9ucyBwYXNzZWQgaW4gPGVtPnNjaGVtYXM8L2VtPi48L3A+Ci0gICAgICogCi0gICAgICogPHA+VGhpcyBpcyBqdXN0IGxpa2UgY29tcGlsZVR5cGVTeXN0ZW0sIGJ1dCB1c2VzIHRoZSBjb250ZXh0IHR5cGUgbG9hZGVyIGZvcgotICAgICAqIGxpbmtpbmcsIGFuZCByZXR1cm5zIGEgdW5pb25lZCB0eXBlbG9hZGVyIHRoYXQgaXMgc3VpdGFibGUgZm9yCi0gICAgICogY3JlYXRpbmcgaW5zdGFuY2VzLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5Vc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgb25lIG9yIGJvdGggb2YgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgICogCi0gICAgICogPHVsPgotICAgICAqIDxsaT5BIGNvbGxlY3Rpb24gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBhbiBlcnJvciBsaXN0ZW5lciBkdXJpbmcKLSAgICAgKiBjb21waWxhdGlvbiwgYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXJ9LjwvbGk+Ci0gICAgICogPGxpPldoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgbm90IGJlIGRvbmUgd2hlbiBidWlsZGluZyB0aGUgU2NoZW1hVHlwZVN5c3RlbSwKLSAgICAgKiBhcyBkZXNjcmliZWQgaW4ge0BsaW5rIFhtbE9wdGlvbnMjc2V0Q29tcGlsZU5vVmFsaWRhdGlvbn0uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzY2hlbWFzIFRoZSBzY2hlbWEgZGVmaW5pdGlvbnMgZnJvbSB3aGljaCB0byBidWlsZCB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtLgotICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3BlY2lmeWluZyBhbiBlcnJvciBsaXN0ZW5lciBhbmQvb3IgdmFsaWRhdGlvbiBiZWhhdmlvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgbG9hZFhzZChYbWxPYmplY3RbXSBzY2hlbWFzLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHN0cyA9Ci0gICAgICAgICAgICAgICAgKFNjaGVtYVR5cGVTeXN0ZW0pCi0gICAgICAgICAgICAgICAgICAgIF9jb21waWxhdGlvbk1ldGhvZC5pbnZva2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgT2JqZWN0W10geyBzY2hlbWFzLCBnZXRDb250ZXh0VHlwZUxvYWRlcigpLCBvcHRpb25zIH0pOwotCi0gICAgICAgICAgICBpZiAoc3RzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIHR5cGVMb2FkZXJVbmlvbigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNjaGVtYVR5cGVMb2FkZXJbXSB7IHN0cywgZ2V0Q29udGV4dFR5cGVMb2FkZXIoKSB9ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGFjY2VzcyB0byBTY2hlbWFUeXBlTG9hZGVySW1wbC5mb3JTY2hlbWFYbWwoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyB3cmFwcGVkRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcgdGhlIFhNTAotICAgICAqIHNjaGVtYSBkZWZpbml0aW9ucyBwYXNzZWQuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoZSBYbWxPYmplY3RzIHBhc3NlZCBpbiBzaG91bGQgYmUgdzNjICZsdDtzY2hlbWEmZ3Q7IGVsZW1lbnRzIHdob3NlIHR5cGUKLSAgICAgKiBpcyBvcmcudzNjLngyMDAxLnhtbFNjaGVtYS5TY2hlbWEuIChUaGF0IGlzLCBzY2hlbWEgZWxlbWVudHMgaW4KLSAgICAgKiB0aGUgWE1MIG5hbWVzcGFjZSBodHRwOi8vd3d3LnczYy5vcmcvMjAwMS9YTUxTY2hlbWEuKSAgQWxzbwotICAgICAqIG9yZy53M2MueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50IGlzIHBlcm1pdHRlZC48L3A+Ci0gICAgICogCi0gICAgICogPHA+VGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyBhIFNjaGVtYVR5cGVMb2FkZXIgd2hpY2ggd2lsbCBiZQotICAgICAqIGNvbnN1bHRlZCBmb3IgYWxyZWFkeS1jb21waWxlZCBzY2hlbWEgdHlwZXMgd2hpY2ggbWF5IGJlIGxpbmtlZAotICAgICAqIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGdpdmVuIHNjaGVtYXMuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoZSBTY2hlbWFUeXBlU3lzdGVtIHRoYXQgaXMgcmV0dXJuZWQgc2hvdWxkIGJlIGNvbWJpbmVkCi0gICAgICogKHZpYSB7QGxpbmsgI3R5cGVMb2FkZXJVbmlvbn0pIHdpdGggdGhlIHR5cGVwYXRoIHR5cGVsb2FkZXIgaW4gb3JkZXIKLSAgICAgKiB0byBjcmVhdGUgYSB0eXBlbG9hZGVyIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNyZWF0aW5nIGFuZCB2YWxpZGF0aW5nCi0gICAgICogaW5zdGFuY2VzLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5Vc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgICogCi0gICAgICogPHVsPgotICAgICAqIDxsaT5BIGNvbGxlY3Rpb24gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBhbiBlcnJvciBsaXN0ZW5lciBkdXJpbmcKLSAgICAgKiBjb21waWxhdGlvbiwgYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXJ9LjwvbGk+Ci0gICAgICogPGxpPldoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgbm90IGJlIGRvbmUgd2hlbiBidWlsZGluZyB0aGUgU2NoZW1hVHlwZVN5c3RlbSwKLSAgICAgKiBhcyBkZXNjcmliZWQgaW4ge0BsaW5rIFhtbE9wdGlvbnMjc2V0Q29tcGlsZU5vVmFsaWRhdGlvbn0uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzY2hlbWFzIFRoZSBzY2hlbWEgZGVmaW5pdGlvbnMgZnJvbSB3aGljaCB0byBidWlsZCB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtLgotICAgICAqIEBwYXJhbSB0eXBlcGF0aCBUaGUgcGF0aCB0byBhbHJlYWR5LWNvbXBpbGVkIHNjaGVtYSB0eXBlcyBmb3IgbGlua2luZyB3aGlsZSBwcm9jZXNzaW5nLgotICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3BlY2lmeWluZyBhbiBlcnJvciBsaXN0ZW5lciBhbmQvb3IgdmFsaWRhdGlvbiBiZWhhdmlvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gY29tcGlsZVhzZChYbWxPYmplY3RbXSBzY2hlbWFzLCBTY2hlbWFUeXBlTG9hZGVyIHR5cGVwYXRoLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlcGF0aCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBzdXBwbHkgYSBTY2hlbWFUeXBlTG9hZGVyIGZvciBjb21waWxldGltZSBsaW5raW5nIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbSlfY29tcGlsYXRpb25NZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IHNjaGVtYXMsIHR5cGVwYXRoLCBvcHRpb25zIH0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGFjY2VzcyB0byBTY2hlbWFUeXBlTG9hZGVySW1wbC5mb3JTY2hlbWFYbWwoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IHdyYXBwZWRFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBhIGxpc3Qgb2YgdHlwZUxvYWRlcnMuIFRoZSByZXR1cm5lZAotICAgICAqIFNjaGVtYVR5cGVMb2FkZXIgc2VhcmNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgU2NoZW1hVHlwZUxvYWRlcnMKLSAgICAgKiBpbiBvcmRlciBmcm9tIGZpcnN0IHRvIGxhc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIHR5cGVMb2FkZXJVbmlvbihTY2hlbWFUeXBlTG9hZGVyW10gdHlwZUxvYWRlcnMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGVMb2FkZXJzLmxlbmd0aCA9PSAxKQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTG9hZGVyc1swXTsKLQotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlTG9hZGVyKV90eXBlTG9hZGVyQnVpbGRlck1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHt0eXBlTG9hZGVycywgbnVsbCwgbnVsbH0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGw6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNjaGVtYVR5cGVMb2FkZXIgdGhhdCBzZWFyY2hlcyBmb3IgY29tcGlsZWQgc2NoZW1hIHR5cGVzCi0gICAgICogaW4gdGhlIGdpdmVuIENsYXNzTG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlciB0eXBlTG9hZGVyRm9yQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcilfdHlwZUxvYWRlckJ1aWxkZXJNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7bnVsbCwgbnVsbCwgbG9hZGVyfSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGFjY2VzcyB0byBTY2hlbWFUeXBlTG9hZGVySW1wbDogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24oIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFUeXBlIGZyb20gYSBjb3JyZXNwb25kaW5nIFhtbE9iamVjdCBzdWJjbGFzcywKLSAgICAgKiBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzcyhDbGFzcyBjKQotICAgIHsKLSAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCAhWG1sT2JqZWN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYykpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQgdHlwZUZpZWxkID0gYy5nZXRGaWVsZCgidHlwZSIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodHlwZUZpZWxkID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSl0eXBlRmllbGQuZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlIGdldE5vVHlwZSgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlKV9nZXROb1R5cGVNZXRob2QuaW52b2tlKG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgU2NoZW1hVHlwZSBvYmplY3QgZ2l2ZW4gdG8gYW4gWG1sT2JqZWN0IGluc3RhbmNlIHdoZW4KLSAgICAgKiBubyB0eXBlIGNhbiBiZSBkZXRlcm1pbmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBOT19UWVBFIGlzIHRoZSB1bml2ZXJzYWwgZGVyaXZlZCB0eXBlLiAgVGhhdCBpcywgaXQgaXMKLSAgICAgKiBkZXJpdmVkIGZyb20gYWxsIG90aGVyIHNjaGVtYSB0eXBlcywgYW5kIG5vIGluc3RhbmNlcyBvZiB0aGUKLSAgICAgKiBOT19UWVBFIGFyZSB2YWxpZC4gKEl0IGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZSBhbnlUeXBlLAotICAgICAqIHdoaWNoIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlIGZyb20gd2hpY2ggYWxsIG90aGVyIHR5cGVzCi0gICAgICogY2FuIGJlIGRlcml2ZWQsIGFuZCBvZiB3aGljaCBhbGwgaW5zdGFuY2VzIGFyZSB2YWxpZC4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlIE5PX1RZUEUgPSBnZXROb1R5cGUoKTsKLQotICAgIHByaXZhdGUgWG1sQmVhbnMgKCApIHsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJvb2xlYW4uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZWM5MTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJvb2xlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jvb2xlYW4iPnhzOmJvb2xlYW48L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gSmF2YSBib29sZWFuLiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQm9vbGVhbiBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ib29sZWFuIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYm9vbGVhbgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0Qm9vbGVhblZhbHVlfQotICAgICAqKi8KLSAgICBib29sZWFuIGJvb2xlYW5WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJvb2xlYW4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI3NldEJvb2xlYW5WYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYm9vbGVhbiB2KTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBib29sZWFuICovCi0gICAgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYm9vbGVhbiAqLwotICAgIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJvb2xlYW59LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJvb2xlYW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJvb2xlYW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEJvb2xlYW59IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7dHJ1ZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDt0cnVlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJ5dGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCeXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZWI5NjEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJ5dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2J5dGUiPnhzOmJ5dGU8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gSmF2YSBieXRlLiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQnl0ZSBleHRlbmRzIFhtbFNob3J0Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYnl0ZSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEJ5dGVWYWx1ZX0KLSAgICAgKiovCi0gICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYnl0ZQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qnl0ZVZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXQoYnl0ZSBzKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlICovCi0gICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSBzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJ5dGV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEJ5dGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDYWxlbmRhci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbENhbGVuZGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmNlMjguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbENhbGVuZGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIEFuIFhNTCBTY2hlbWEgY29tcGF0aWJsZSBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIEdyZWdvcmlhbkNhbGVuZGFyfS4KLSAqIFhtbENhbGVuZGFyIG1vZGlmaWVzIHNldmVyYWwga2V5IGRldGFpbHMgaW4gdGhlIGJlaGF2aW9yIG9mCi0gKiBHcmVnb3JpYW5DYWxlbmRhciB0byBtYWtlIGl0IG1vcmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIFhNTCBkYXRlcy4KLSAqIDxwPgotICogSXQgaXMgZWFzeSB0byBjb252ZXJ0IGJldHdlZW4gWG1sQ2FsZW5kYXIgYW5kIHtAbGluayBHRGF0ZX0sIG9yIHRvCi0gKiBwYXJzZSBvciBlbWl0IGFuIFhtbENhbGVuZGFyIHVzaW5nIGEgc3RhbmRhcmQgWE1MIFNjaGVtYQotICogbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAqIDxvbD4KLSAqIDxsaT4KLSAqIFRvIG1hdGNoIFhNTCBTY2hlbWEgZGF0ZXMsIHRoaXMgWG1sQ2FsZW5kYXIgaXMgYSBmdWxseSBwcm9sZXB0aWMKLSAqIEdyZWdvcmlhbiBjYWxlbmRhciBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGF0IEdyZWdvcmlhbiBjYWxlbmRhcgotICogcnVsZXMgYXJlIGFwcGxpZWQgYmFja3dhcmRzIGluIHRpbWUgYXMgaWYgdGhleSBoYWQgYWx3YXlzIGJlZW4gaW4KLSAqIGVmZmVjdCwgYWN0dWFsIGhpc3RvcmljYWwgY2lyY3Vtc3RhbmNlcyBjb25jZXJuaW5nIHRoZSBvYnNlcnZhbmNlCi0gKiBvZiB0aGUgMTU4MiBkZWNyZWUgb2YgUG9wZSBHcmVnb3J5IFhJSUkgbm90d2l0aHN0YW5kaW5nLgotICogPC9saT4KLSAqIDxsaT4KLSAqIEluIG9yZGVyIHRvIGJldHRlciBzdXBwb3J0IHBhcnRpYWxseS1zcGVjaWZpZWQgZGF0ZXMgZm9yIFhNTCBTY2hlbWEsCi0gKiB0aGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgc3RhYmxlIGdldChmaWVsZCkgbWV0aG9kCi0gKiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgaW5zdGFuY2UgaWYgeW91IGFyZSBhY2Vzc2luZyBhIGZpZWxkIHJpZ2h0Ci0gKiBhZnRlciBpdCB3YXMgZXhwbGljaXRseSBzZXQ6IGEgc2V0IGZvbGxvd2VkIGJ5IGEgZ2V0IHdpbGwgYWx3YXlzCi0gKiByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYW5kIHdpbGwgbm90IGZpbGwgaW4gYW55IG90aGVyIGZpZWxkcy4gSG93ZXZlciwKLSAqIGlmIHlvdSBnZXQgYSBmaWVsZCB0aGF0IHdhcyBub3QgZXhwbGljaXRseSBzZXQsIHRoZW4gYWxsIHRoZSBmaWVsZHMKLSAqIGFyZSBzdGlsbCBhdXRvbWF0aWNhbGx5IGZpbGxlZCBhbmQgbm9ybWFsaXplZCBmb3IgeW91LCBqdXN0IGxpa2UgYQotICogcmVndWxhciBHcmVnb3JpYW5DYWxlbmRhci4gSWYgeW91IHdpc2ggdG8gZm9yY2UgdGhlIGNvbXBsZXRpb24gYW5kCi0gKiBkZWZhdWx0aW5nIG9mIGFsbCB0aGUgZmllbGRzICh3aXRob3V0IGh1bnRpbmcgdG8gZ2V0IG9uZSB0aGF0IGhhcHBlbnMKLSAqIHRvIGJlIHVuc2V0KSwgeW91IGNhbiBhbHdheXMgZG8gc28gYnkgY2FsbGluZyBnZXRUaW1lKCkuCi0gKiA8L2xpPgotICogPGxpPgotICogV2hlbiBhIHllYXIgaXMgdW5zcGVjaWZpZWQgYW5kIG5lZWRzIHRvIGJlIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5Ci0gKiAoZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBhIC5nZXQgb3IgLmdldFRpbWUgbWV0aG9kIGFzIGRpc2N1c3NlZCBhYm92ZSksCi0gKiB0aGUgeWVhciBpcyBkZWZhdWx0ZWQgdG8geWVhciAwIChhbHNvIGtub3duIGFzIDEgQkMpLiAgVGhpcyBpcyBkaWZmZXJlbnQKLSAqIGZyb20ge0BsaW5rIEdyZWdvcmlhbkNhbGVuZGFyfSwgd2hpY2ggY2hvb3NlcyAxOTcwLiBUaGUgcmVhc29uIDAgaXMgcHJlZmVyYWJsZQotICogaXMgdGhhdCBpdCBpcyBhIGxlYXAgeWVhciBhbmQgc28gaXQgcGVybWl0cyB0aGUgZGF0ZSAtLTItMjkgdG8gYmUgc3BlY2lmaWVkCi0gKiBzdGFibHkuIEEgZGlmZmVyZW50IGRlZmF1bHQgeWVhciBjYW4gYmUgY2hvc2VuIHZpYSB0aGUgc3RhdGljIG1ldGhvZAotICoge0BsaW5rICNzZXREZWZhdWx0WWVhcihpbnQpIFhtbENhbGVuZGFyLnNldERlZmF1bHRZZWFyKCl9LCBvciBieSBzZXR0aW5nIHRoZSAKLSAqIHN5c3RlbSBwcm9wZXJ0eSAidXNlci5kZWZhdWx0eWVhciIuIElmIHlvdSBkbyBjaGFuZ2UgdGhpcyB2YWx1ZSwgeW91IHNob3VsZCAKLSAqIHBpY2sgYW5vdGhlciBsZWFwIHllYXIgc3VjaCBhcyAyMDAwIGFuZCBhdm9pZCBub24tbGVhcCB5ZWFycyBzdWNoIGFzIDE5MDAuCi0gKiA8L2xpPgotICogPGxpPgotICogV2hlbiBjb25zdHJ1Y3RpbmcgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhbiBYTUwgU2NoZW1hCi0gKiBmb3JtYXR0ZWQgZGF0ZSBvciB0aW1lIHN0cmluZyBvciBHRGF0ZSBvYmplY3QsIHRoZSB0aW1lem9uZQotICogZm9yIHRoZSBjYWxlbmRhciBpcyB0YWtlbiBmcm9tIHRoZSBzdHJpbmcgaWYgaXQgaXMgcHJlc2VudCwgb3IKLSAqIHRha2VuIHRvIGJlIHtAbGluayBqYXZhLnV0aWwuVGltZVpvbmUjZ2V0RGVmYXVsdCgpIFRpbWVab25lLmdldERlZmF1bHQoKX0gaWYgbm90LgotICogPHA+Ci0gKiAgICAgRm9yIGV4YW1wbGUsIHRoZSBYTUwgdGltZXpvbmUgIloiIGlzIHRyYW5zbGF0ZWQgdG8gIkdNVCI7Ci0gKiAgICAgdGhlIFhNTCB0aW1lem9uZSAiKzA1OjAwIiBpcyB0cmFuc2xhdGVkIHRvICJHTVQrMDU6MDAiLgotICogPC9wPgotICogPC9saT4KLSAqIDxsaT4KLSAqIEZpbmFsbHksIHRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSBTdHJpbmcgY29uc3RydWN0b3IgYW5kIGEKLSAqIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgY29tcGx5IHdpdGggdGhlIFhNTCBTY2hlbWEgY29udmVudGlvbnMKLSAqIGZvciBmb3JtYXR0aW5nIGEgZGF0ZS4gSWYgb25seSBhIHN1YnNldCBvZiBmaWVsZHMgaGF2ZSBiZWVuCi0gKiBleHBsaWNpdGx5IHNldCwgdG9TdHJpbmcoKSBwcm9kdWNlcyBhIHN0cmluZyB3aXRoIHRoZSBwcm9wZXIgc3Vic2V0Ci0gKiBvZiBpbmZvcm1hdGlvbi4KLSAqIDwvbGk+Ci0gKiA8L29sPgotICovIAotcHVibGljIGNsYXNzIFhtbENhbGVuZGFyIGV4dGVuZHMgR3JlZ29yaWFuQ2FsZW5kYXIKLXsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZvciBhIHN0YW5kYXJkIFhNTAotICAgICAqIHNjaGVtYSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCi0gICAgICogCi0gICAgICogVGhlIHBhcnNlciBhY2NlcHRzIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0gICAgICogCi0gICAgICogWVlZWS1NTS1ERFRoaDptbTpzcyAgICAgICAgICAtIGRhdGVUaW1lCi0gICAgICogWVlZWS1NTS1ERCAgICAgICAgICAgICAgICAgICAtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIGhoOm1tOnNzICAgICAgICAgIC0gdGltZQotICAgICAqIFlZWVkgICAgICAgICAgICAgICAgICAgICAgICAgLSBnWWVhcgotICAgICAqICAgIC0tTU0gICAgICAgICAgICAgICAgICAgICAgLSBnTW9udGgKLSAgICAgKiAgICAgIC0tLUREICAgICAgICAgICAgICAgICAgIC0gZ0RheQotICAgICAqIAotICAgICAqIFRoZSBwYXJzZXIgYWN0dWFsbHkgYWNjZXB0cyBhbGwgMTYgY29tYmluYXRpb25zIG9mIHN1YnNldHMgb2YKLSAgICAgKiBmaWVsZHMgKFksIE0sIEQsIFQpIHVzaW5nIHRoZSBzYW1lIHNjaGVtZSwgZXZlbiBmb3IgY29tYmluYXRpb25zCi0gICAgICogdGhhdCBhcmUgbm90IGRlZmluZWQgYXMgdHlwZXMgaW4gdGhlIHNjaGVtYSBzcGVjLCBzdWNoIGFzCi0gICAgICogeWVhciwgZGF5LCBhbmQgdGltZToKLSAgICAgKiAKLSAgICAgKiBZWVlZLS1ERFRoaDptbTpzcyAgICAgICAgICAgIC0gW2V2ZXJ5dGhpbmcgYnV0IG1vbnRoIHNwZWNpZmllZF0KLSAgICAgKiAKLSAgICAgKiBJbiB0aGUgc3RyaW5nLCBlYWNoIGZpZWxkIG11c3QgYmUgcGFkZGVkIHRvIGl0cyBmdWxsIHdpZHRoLCBmb3IKLSAgICAgKiBleGFtcGxlLCBKYW51YXJ5IG11c3QgYmUgLS0wMSwgbm90IGp1c3QgLS0xLgotICAgICAqIAotICAgICAqIEluIHBhcnRpY3VsYXIsIGEgeWVhciBtdXN0IGJlIHBhZGRlZCB0byBhdCBsZWFzdCBmb3VyIGRpZ2l0cywgc28KLSAgICAgKiAiOTgiIGlzIG5vdCBhIHZhbGlkIHllYXIsIGFsdGhvdWdoICIxOTk4IiBhbmQgIjAwOTgiIGFyZSBib3RoIHZhbGlkCi0gICAgICogeWVhcnMsIHVuYW1iaWd1b3VzbHkgMTkgY2VudHVyaWVzIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIuICBBIHllYXIKLSAgICAgKiBtYXkgYWxzbyBiZSBwcmVjZWRlZCBieSBhIG1pbnVzIHN5bWJvbDogMDAwMCBpcyAxIEJDIGFuZCAtMDAwMSBpcwotICAgICAqIDIgQkMuCi0gICAgICoKLSAgICAgKiBGaW5hbGx5IGEgdGltZXpvbmUgaXMgYWx3YXlzIGFsbG93ZWQgKHlldCBvcHRpb25hbCkgYXQgdGhlIGVuZC4KLSAgICAgKiBUaW1lem9uZXMgbXVzdCBiZSBlaXRoZXIgIloiIChVVEMsIHdoaWNoIHdlIHRyYW5zbGF0ZSB0byBHTVQpLAotICAgICAqIG9yIHNpbXBsZSBvZmZzZXRzIGZyb20gVVRDIGluIHRoZSByYW5nZSAiLTE0OjAwIiB0byAiKzE0OjAwIiwKLSAgICAgKiBmb3IgZXhhbXBsZTogIjE0OjMwOjAwLTA1OjAwIiBzcGVjaWZpZXMgMjozMCBQTSBpbiB0aGUKLSAgICAgKiBhZnRlcm5vb24gYXQgVVRDLTA1OjAwLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBFU1QuCi0gICAgICogCi0gICAgICogSWYgYSB0aW1lem9uZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBUaW1lWm9uZSBpcyB1c2VkLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoU3RyaW5nIHhtbFNjaGVtYURhdGVTdHJpbmcpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRGF0ZSh4bWxTY2hlbWFEYXRlU3RyaW5nKSk7IC8vIHVzZSBHRGF0ZSB0byBwYXJzZQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZyb20gYSBHRGF0ZS4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgbm90IGNvbXBsZXRlZCwgeW91IGNhbiByb3VuZC10cmlwIHRvIGFuCi0gICAgICogZXF1aXZhbGVudCBHRGF0ZSBieSB3cml0aW5nICJuZXcgR0RhdGUobmV3IFhtbENhbGVuZGFyKGdkYXRlKSkiLgotICAgICAqIEhvd2V2ZXIsIGlmIHlvdSBhY2Nlc3MgYW55IG9mIHRoZSB1bnNldCBmaWVsZHMgb2YgdGhlIGNhbGVuZGFyLCBhbGwKLSAgICAgKiB0aGUgZmllbGRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4sIHNvIHBhcnRpYWwgZGF0ZXMKLSAgICAgKiB3aXRob3V0IHRpbWV6b25lcyBvciBvdGhlciBmaWVsZHMgd2lsbCBub3Qgcm91bmQtdHJpcCBhZnRlciBhY2Nlc3MuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxDYWxlbmRhcihHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMoR0RhdGUudGltZVpvbmVGb3JHRGF0ZShkYXRlKSwgZGF0ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgWG1sQ2FsZW5kYXIoVGltZVpvbmUgdHosIEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgc3VwZXIodHopOwotICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYwotICAgICAgICBjbGVhcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRhdGUuaGFzWWVhcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgeSA9IGRhdGUuZ2V0WWVhcigpOwotICAgICAgICAgICAgaWYgKHkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5FUkEsIEdyZWdvcmlhbkNhbGVuZGFyLkFEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRVJBLCBHcmVnb3JpYW5DYWxlbmRhci5CQyk7Ci0gICAgICAgICAgICAgICAgeSA9IDEgLSB5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0KENhbGVuZGFyLllFQVIsIHkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkYXRlLmhhc01vbnRoKCkpCi0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuTU9OVEgsIGRhdGUuZ2V0TW9udGgoKSAtIDEpOyAvLyBub3RlISEKLSAgICAgICAgaWYgKGRhdGUuaGFzRGF5KCkpCi0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBkYXRlLmdldERheSgpKTsKLSAgICAgICAgaWYgKGRhdGUuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGRhdGUuZ2V0SG91cigpKTsKLSAgICAgICAgICAgIHNldChDYWxlbmRhci5NSU5VVEUsIGRhdGUuZ2V0TWludXRlKCkpOwotICAgICAgICAgICAgc2V0KENhbGVuZGFyLlNFQ09ORCwgZGF0ZS5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBpZiAoZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQotICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgZGF0ZS5nZXRNaWxsaXNlY29uZCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lWm9uZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQsIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgKiAxMDAwICogNjAgKiAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSAqIDYwICsgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKSk7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCwgMCk7IC8vIG5vdGUhISAgaWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiBHcmVnb3JpYW5DYWxlbmRhciB3aWxsIHBpY2sgdXAgRFNUIGZyb20gdGhlIHRpbWUgem9uZQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhIERhdGUuCi0gICAgICogCi0gICAgICogVGhlIGRlZmF1bHQgVGltZVpvbmUgaXMgdXNlZCBmb3IgY29tcHV0aW5nIHRoZSB2YXJpb3VzIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgdGhpcyhUaW1lWm9uZS5nZXREZWZhdWx0KCksIG5ldyBHRGF0ZShkYXRlKSk7Ci0gICAgICAgIGNvbXBsZXRlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCi0gICAgICogdGhlIGRlZmF1bHQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICB0aGlzKFRpbWVab25lLmdldERlZmF1bHQoKSwgbmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLCBtb250aCwgZGF5LAotICAgICAqIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwgZnJhY3Rpb25hbCBzZWNvbmRzLCBpbgotICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24sCi0gICAgICAgICAgICBpbnQgdHpTaWduLAotICAgICAgICAgICAgaW50IHR6SG91ciwKLSAgICAgICAgICAgIGludCB0ek1pbnV0ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiwgdHpTaWduLCB0ekhvdXIsIHR6TWludXRlKSk7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gdGltZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBVbmxpa2UgdGhlIEdyZWdvcmlhbkNhbGVuZGFyIGltcGxlbWVudGF0aW9uLCB0aGUgZ2V0KCkgZG9lcyBub3QKLSAgICAgKiBmb3JjZSBhIGNvbXBsZXRlIG9mIGFsbCBmaWVsZHMuICBJZiB5b3Ugd2lzaCB0byBmb3JjZSBhIGNvbXBsZXRpb24KLSAgICAgKiBvZiBhbGwgdGhlIGZpZWxkcywgY2FsbCBnZXRUaW1lKCkgZmlyc3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXQoaW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgaWYgKCFpc1NldChmaWVsZCkgfHwgaXNUaW1lU2V0KQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldChmaWVsZCk7IC8vIGZvcmNlcyBhIGNvbXBsZXRlCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbEdldChmaWVsZCk7IC8vIGRvZXMgbm90IGZvcmNlIGEgY29tcGxldGUuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBpbnN0YW5jZSB3aXRoIG5vIGZpZWxkcyBzZXQuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxDYWxlbmRhcigpCi0gICAgewotICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYwotICAgICAgICBjbGVhcigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVmYXVsdFllYXIgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERUZBVUxUX1lFQVIgPSAwOyAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHllYXIgdGhhdCBpcyB1c2VkIHdoZW4gbm8geWVhciBpcyBzcGVjaWZpZWQuCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRZZWFyKCkKLSAgICB7Ci0gICAgICAgIGlmIChkZWZhdWx0WWVhciA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHllYXJzdHJpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGVmYXVsdHllYXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoeWVhcnN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IEludGVnZXIucGFyc2VJbnQoeWVhcnN0cmluZyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IERFRkFVTFRfREVGQVVMVF9ZRUFSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHRZZWFyID0gREVGQVVMVF9ERUZBVUxUX1lFQVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRZZWFyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHllYXIgdG8gYmUgdXNlZCB3aGVuIG5vIHllYXIgaXMgc3BlY2lmaWVkLgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFllYXIoaW50IHllYXIpCi0gICAgewotICAgICAgICBkZWZhdWx0WWVhciA9IHllYXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyBHcmVnb3JpYW5DYWxlbmRhci5jb21wdXRlVGltZSB0byBhcHBseSBhIGRpZmZlcmVudAotICAgICAqIGRlZmF1bHQgeWVhci4gIChJdCBtdXN0IGJlIGEgbGVhcCB5ZWFyLikKLSAgICAgKi8gCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVRpbWUoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB1bnNldFllYXIgPSAhaXNTZXQoWUVBUik7Ci0gICAgICAgIGlmICh1bnNldFllYXIpCi0gICAgICAgICAgICBzZXQoWUVBUiwgZ2V0RGVmYXVsdFllYXIoKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5jb21wdXRlVGltZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVuc2V0WWVhcikKLSAgICAgICAgICAgICAgICBjbGVhcihZRUFSKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZSBfYmVnaW5uaW5nT2ZUaW1lID0gbmV3IERhdGUoTG9uZy5NSU5fVkFMVUUpOwotICAgIAotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgWG1sQ2FsZW5kYXIgdXNpbmcgYSBzdGFuZGFyZCBYTUwgU2NoZW1hCi0gICAgICogZm9ybWF0LCBhcyBkZXNjcmliZWQgaW4gWG1sQ2FsZW5kYXIoU3RyaW5nIHMpLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChuZXcgR0RhdGUodGhpcykpLnRvU3RyaW5nKCk7IC8vIHVzZSBHRGF0ZSB0byBwcmludAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzRkYTM0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NzIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHBvc2l0aW9uIGJldHdlZW4gdHdvIGxvZ2ljYWwgdG9rZW5zIGluIGFuIFhNTCBkb2N1bWVudC4gCi0gKiAKLSAqIFRoZSB0b2tlbnMgdGhlbXNlbHZlcyBhcmUgbm90IGV4cG9zZWQgYXMgb2JqZWN0cywgYnV0IHRoZWlyIHR5cGUgYW5kIHByb3BlcnRpZXMKLSAqIGFyZSBkaXNjb3ZlcmFibGUgdGhyb3VnaCBtZXRob2RzIG9uIHRoZSBjdXJzb3IuICBJbiBwYXJ0aWN1bGFyLCB0aGUgZ2VuZXJhbAotICogY2F0ZWdvcnkgb2YgdG9rZW4gaXMgcmVwcmVzZW50ZWQgYnkgYSB7QGxpbmsgWG1sQ3Vyc29yLlRva2VuVHlwZSBUb2tlblR5cGV9Ljxici8+PGJyLz4KLSAqIAotICogWW91IHVzZSBhbiBYbWxDdXJzb3IgaW5zdGFuY2UgdG8gbmF2aWdhdGUgdGhyb3VnaCBhbmQgbWFuaXB1bGF0ZSBhbiBYTUwgCi0gKiBpbnN0YW5jZSBkb2N1bWVudC4gCi0gKiBPbmNlIHlvdSBvYnRhaW4gYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIGNyZWF0ZSBhIGN1cnNvciB0byByZXByZXNlbnQgCi0gKiBhIHNwZWNpZmljIHBsYWNlIGluIHRoZSBYTUwuIEJlY2F1c2UgeW91IGNhbiB1c2UgYSBjdXJzb3Igd2l0aCBvciAKLSAqIHdpdGhvdXQgYSBzY2hlbWEgY29ycmVzcG9uZGluZyB0byB0aGUgWE1MLCBjdXJzb3JzIGFyZSBhbiBpZGVhbCAKLSAqIHdheSB0byBoYW5kbGUgWE1MIHdpdGhvdXQgYSBzY2hlbWEuIFlvdSBjYW4gY3JlYXRlIGEgbmV3IGN1cnNvciBieQotICogY2FsbGluZyB0aGUge0BsaW5rIFhtbFRva2VuU291cmNlI25ld0N1cnNvcigpIG5ld0N1cnNvcn0gbWV0aG9kIAotICogZXhwb3NlZCBieSBhbiBvYmplY3QgcmVwcmVzZW50aW5nCi0gKiB0aGUgWE1MLCB3aGV0aGVyIGl0IHdhcyBwYXJzZWQgaW50byBhIHN0cm9uZyB0eXBlIGNvbXBpbGVkIGZyb20gCi0gKiBzY2hlbWEgb3IgYW4ge0BsaW5rIFhtbE9iamVjdCBYbWxPYmplY3R9IChhcyBpbiB0aGUgbm8tc2NoZW1hIGNhc2UpLjxici8+PGJyLz4KLSAqIAotICogV2l0aCBhbiBYbWxDdXJzb3IsIHlvdSBjYW4gYWxzbzogPGJyLz48YnIvPgotICogCi0gKiA8dWw+Ci0gKiA8bGk+RXhlY3V0ZSBYUXVlcnkgYW5kIFhQYXRoIGV4cHJlc3Npb25zIGFnYWluc3QgdGhlIFhNTCB3aXRoIHRoZQotICogZXhlY1F1ZXJ5IGFuZCBzZWxlY3RQYXRoIG1ldGhvZHMuPC9saT4KLSAqIAotICogPGxpPkVkaXQgYW5kIHJlc2hhcGUgdGhlIGRvY3VtZW50IGJ5IGluc2VydGluZywgbW92aW5nLCBjb3B5aW5nLCBhbmQgcmVtb3ZpbmcKLSAqIFhNTC48L2xpPgotICogCi0gKiA8bGk+SW5zZXJ0IGJvb2ttYXJrcyB0aGF0ICJzdGljayIgdG8gdGhlIFhNTCBhdCB0aGUgY3Vyc29yJ3MKLSAqIHBvc2l0aW9uIGV2ZW4gaWYgdGhlIGN1cnNvciBvciBYTUwgbW92ZXMuPC9saT4KLQotICogPGxpPkdldCBhbmQgc2V0IHZhbHVlcyBmb3IgY29udGFpbmVycyAoZWxlbWVudHMgYW5kIHdob2xlIGRvY3VtZW50cyksCi0gKiBhdHRyaWJ1dGVzLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgYW5kIGNvbW1lbnRzLjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBBIGN1cnNvciBtb3ZlcyB0aHJvdWdoIFhNTCBieSBtb3ZpbmcgcGFzdCB0b2tlbnMuIEEKLSAqIHRva2VuIHJlcHJlc2VudHMgYSBjYXRlZ29yeSBvZiBYTUwgbWFya3VwLCBzdWNoIGFzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LCAKLSAqIGl0cyBlbmQsIGFuIGF0dHJpYnV0ZSwgY29tbWVudCwgYW5kIHNvIG9uLiBYbWxDdXJzb3IgbWV0aG9kcyBzdWNoIGFzCi0gKiB0b05leHRUb2tlbiwgdG9OZXh0U2libGluZywgdG9QYXJlbnQsIGFuZCBzbyBvbiBtb3ZlIHRoZSBjdXJzb3IgCi0gKiBhbW9uZyB0b2tlbnMuIEVhY2ggdG9rZW4ncyBjYXRlZ29yeSBpcyBvZiBhIHBhcnRpY3VsYXIgPGVtPnR5cGU8L2VtPiwgcmVwcmVzZW50ZWQgCi0gKiBieSBvbmUgb2YgdGhlIG5pbmUgdHlwZXMgZGVmaW5lZCBieSB0aGUge0BsaW5rIFhtbEN1cnNvci5Ub2tlblR5cGUgVG9rZW5UeXBlfSBjbGFzcy4gPGJyLz48YnIvPgotICogCi0gKiBXaGVuIHlvdSBnZXQgYSBuZXcgY3Vyc29yIGZvciBhIHdob2xlIGluc3RhbmNlIGRvY3VtZW50LCB0aGUgY3Vyc29yIGlzCi0gKiBpbnRpYWxseSBsb2NhdGVkIGJlZm9yZSB0aGUgU1RBUlRET0MgdG9rZW4uIFRoaXMgdG9rZW4sIHdoaWNoIGhhcyBubyBhbmFsb2d5Ci0gKiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24sIGlzIHByZXNlbnQgaW4gdGhpcyBsb2dpY2FsIG1vZGVsIG9mIFhNTAotICogc28gdGhhdCB5b3UgbWF5IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGRvY3VtZW50IGFzIGEgd2hvbGUKLSAqIGFuZCB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQuIFRlcm1pbmF0aW5nIHRoZSBkb2N1bWVudCBpcyBhbiBFTkRET0MKLSAqIHRva2VuLiBUaGlzIHRva2VuIGlzIGFsc28gbm90IHBhcnQgb2YgdGhlIFhNTCBzcGVjaWZpY2F0aW9uLiBBIGN1cnNvciAKLSAqIGxvY2F0ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgdG9rZW4gaXMgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBkb2N1bWVudC4gCi0gKiBJdCBpcyBub3QgcG9zc2libGUgdG8gcG9zaXRpb24gdGhlIGN1cnNvciBhZnRlciB0aGUgRU5ERE9DIHRva2VuLiAKLSAqIFRodXMsIHRoZSBTVEFSVERPQyBhbmQgRU5ERE9DIHRva2VucyBhcmUgZWZmZWN0aXZlbHkgImJvb2tlbmRzIiBmb3IgdGhlIGNvbnRlbnQgb2YgCi0gKiB0aGUgZG9jdW1lbnQuPGJyLz48YnIvPgotICogCi0gKiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgWE1MLCBpZiB5b3Ugd2VyZSB0aGUgbmF2aWdhdGUgYSBjdXJzb3IKLSAqIHRocm91Z2ggdGhlIFhNTCBkb2N1bWVudCB1c2luZyB0b05leHRUb2tlbigpLCB0aGUgbGlzdCBvZiB0b2tlbiB0eXBlcyB0aGF0IAotICogZm9sbG93cyByZXByZXNlbnRzIHRoZSB0b2tlbiBzZXF1ZW5jZSB5b3Ugd291bGQgZW5jb3VudGVyLiA8YnIvPjxici8+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAmbHQ7c2FtcGxlIHg9J3knJmd0OwotICogICAgICZsdDt2YWx1ZSZndDtmb28mbHQ7L3ZhbHVlJmd0OwotICogJmx0Oy9zYW1wbGUmZ3Q7Ci0gKiA8L3ByZT4KLSAqIAotICogU1RBUlRET0MgPGJyLz4KLSAqIFNUQVJUIChzYW1wbGUpIDxici8+Ci0gKiBBVFRSICh4PSd5JykgPGJyLz4KLSAqIFRFWFQgKCJcbiAgICAiKSA8YnIvPgotICogU1RBUlQgKHZhbHVlKSA8YnIvPgotICogVEVYVCAoImZvbyIpIDxici8+Ci0gKiBFTkQgKHZhbHVlKSA8YnIvPgotICogVEVYVCAoIlxuIikgPGJyLz4KLSAqIEVORCAoc2FtcGxlKTxici8+Ci0gKiBFTkRET0MgPGJyLz48YnIvPgotICoKLSAqIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgdG9rZW5zIGF2YWlsYWJsZSwgaGFzTmV4dFRva2VuKCkgcmV0dXJucwotICogZmFsc2UgYW5kIHRvTmV4dFRva2VuKCkgcmV0dXJucyB0aGUgc3BlY2lhbCB0b2tlbiB0eXBlIE5PTkUgYW5kIGRvZXMgbm90IG1vdmUKLSAqIHRoZSBjdXJzb3IuCi0gKiA8YnIvPjxici8+Ci0gKiAKLSAqIFRoZSB7QGxpbmsgI2N1cnJlbnRUb2tlblR5cGUoKSBjdXJyZW50VG9rZW5UeXBlKCl9IG1ldGhvZCAKLSAqIHdpbGwgcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSB0b2tlbiB0aGF0IGlzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJzb3IuIAotICogWW91IGNhbiBhbHNvIHVzZSBhIG51bWJlciBvZiBjb252ZW5pZW5jZSBtZXRob2RzIHRoYXQgdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIAotICogdG9rZW4gdHlwZS4gVGhlc2UgaW5jbHVkZSB0aGUgbWV0aG9kcyBpc1N0YXJ0KCksIAotICogaXNTdGFydGRvYygpLCBpc1RleHQoKSwgaXNBdHRyKCksIGFuZCBzbyBvbi4gRWFjaCByZXR1cm5zIGEgYm9vbGVhbiAKLSAqIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdG9rZW4gdGhhdCBmb2xsb3dzIHRoZSBjdXJzb3IgaXMgdGhlIHR5cGUgCi0gKiBpbiBxdWVzdGlvbi4gCi0gKiA8YnIvPjxici8+Ci0gKiAKLSAqIEEgZmV3IG90aGVyIG1ldGhvZHMgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHRva2VuIGlzIG9mIGEga2luZCB0aGF0IG1heSBpbmNsdWRlIAotICogbXVsdGlwbGUgdG9rZW4gdHlwZXMuIFRoZSBpc0FueUF0dHIoKSBtZXRob2QsIGZvciBleGFtcGxlLCByZXR1cm5zIHRydWUgaWYKLSAqIHRoZSB0b2tlbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGN1cnNvciBpcyBhbnkga2luZCBvZiBhdHRyaWJ1dGUsIAotICogaW5jbHVkaW5nIHRob3NlIG9mIHRoZSBBVFRSIHRva2VuIHR5cGUgYW5kIHhtbG5zIGF0dHJpYnV0ZXMuCi0gKiA8YnIvPjxici8+Ci0gKiAKLSAqIExlZ2l0aW1hdGUgc2VxdWVuY2VzIG9mIHRva2VucyBmb3IgYW4gWE1MIGRvY3VtZW50IGFyZSBkZXNjcmliZWQKLSAqIGJ5IHRoZSBmb2xsb3dpbmcgQmFja3VzLU5hdXIgRm9ybSAoQk5GKTogPGJyLz4KLSAqIAotICogPHByZT4KLSAqICZsdDtkb2MmZ3Q7IDo6PSBTVEFSVERPQyAmbHQ7YXR0cmlidXRlcyZndDsgJmx0O2NvbnRlbnQmZ3Q7IEVORERPQwotICogJmx0O2VsZW1lbnQmZ3Q7IDo6PSBTVEFSVCAmbHQ7YXR0cmlidXRlcyZndDsgJmx0O2NvbnRlbnQmZ3Q7IEVORAotICogJmx0O2F0dHJpYnV0ZXMmZ3Q7IDo6PSAoIEFUVFIgfCBOQU1FU1BBQ0UgKSAqCi0gKiAmbHQ7Y29udGVudCZndDsgOjo9ICggQ09NTUVOVCB8IFBST0NJTlNUIHwgVEVYVCB8ICZsdDtlbGVtZW50Jmd0OyApICoKLSAqIDwvcHJlPgotICogCi0gKiBOb3RlIHRoYXQgYSBsZWdpdGltYXRlIHNlcXVlbmNlIGlzIFNUQVJURE9DIEVORERPQywgdGhlIHJlc3VsdCBvZiAKLSAqIGNyZWF0aW5nIGEgYnJhbmQgbmV3IGluc3RhbmNlIG9mIGFuIGVtcHR5IGRvY3VtZW50LiBBbHNvIG5vdGUgdGhhdCAKLSAqIGF0dHJpYnV0ZXMgbWF5IG9ubHkgZm9sbG93IGNvbnRhaW5lciB0b2tlbnMgKFNUQVJURE9DIG9yIFNUQVJUKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEN1cnNvciBleHRlbmRzIFhtbFRva2VuU291cmNlCi17Ci0gICAgLyoqCi0gICAgICogQW4gZW51bWVyYXRpb24gdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGFuIFhNTCB0b2tlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRva2VuVHlwZQotICAgIHsKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoICkgeyByZXR1cm4gX25hbWU7ICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgb25lIG9mIHRoZSBJTlRfIHZhbHVlcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGludFZhbHVlICggKSB7IHJldHVybiBfdmFsdWU7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBObyB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9OT05FICAgICAgPSAwOwotICAgICAgICAvKiogVGhlIHN0YXJ0LWRvY3VtZW50IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1NUQVJURE9DICA9IDE7Ci0gICAgICAgIC8qKiBUaGUgZW5kLWRvY3VtZW50IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX0VORERPQyAgICA9IDI7Ci0gICAgICAgIC8qKiBUaGUgc3RhcnQtZWxlbWVudCB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9TVEFSVCAgICAgPSAzOwotICAgICAgICAvKiogVGhlIGVuZC1lbGVtZW50IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX0VORCAgICAgICA9IDQ7Ci0gICAgICAgIC8qKiBUaGUgdGV4dCB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9URVhUICAgICAgPSA1OwotICAgICAgICAvKiogVGhlIGF0dHJpYnV0ZSB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9BVFRSICAgICAgPSA2OwotICAgICAgICAvKiogVGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9OQU1FU1BBQ0UgPSA3OwotICAgICAgICAvKiogVGhlIGNvbW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfQ09NTUVOVCAgID0gODsKLSAgICAgICAgLyoqIFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1BST0NJTlNUICA9IDk7Ci0gICAgICAgIAotICAgICAgICAvKiogVHJ1ZSBpZiBubyB0b2tlbi4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOb25lICAgICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gTk9ORTsgICAgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIHN0YXJ0LWRvY3VtZW50IHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ZG9jICAoICkgeyByZXR1cm4gdGhpcyA9PSBTVEFSVERPQzsgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgZW5kLWRvY3VtZW50IHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZGRvYyAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBFTkRET0M7ICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgc3RhcnQtZWxlbWVudCB0b2tlbi4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdGFydCAgICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gU1RBUlQ7ICAgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIGVuZC1lbGVtZW50IHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZCAgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBFTkQ7ICAgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgdGV4dCB0b2tlbi4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUZXh0ICAgICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gVEVYVDsgICAgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIGF0dHJpYnV0ZSB0b2tlbi4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyICAgICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gQVRUUjsgICAgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0b2tlbi4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2UgKCApIHsgcmV0dXJuIHRoaXMgPT0gTkFNRVNQQUNFOyB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIGNvbW1lbnQgdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudCAgICggKSB7IHJldHVybiB0aGlzID09IENPTU1FTlQ7ICAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2NpbnN0ICAoICkgeyByZXR1cm4gdGhpcyA9PSBQUk9DSU5TVDsgIH0KLQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyBzdGFydC1kb2N1bWVudCBvciBzdGFydC1lbGVtZW50IHRva2VuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyICggKSB7IHJldHVybiB0aGlzID09IFNUQVJURE9DICB8fCB0aGlzID09IFNUQVJUOyB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIGVuZC1kb2N1bWVudCBvciBlbmQtZWxlbWVudCB0b2tlbiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaCAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBFTkRET0MgICAgfHwgdGhpcyA9PSBFTkQ7ICAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyBhdHRyaWJ1dGUgb3IgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQW55QXR0ciAgICggKSB7IHJldHVybiB0aGlzID09IE5BTUVTUEFDRSB8fCB0aGlzID09IEFUVFI7ICB9Ci0KLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gbm8tdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBOT05FICAgICAgPSBuZXcgVG9rZW5UeXBlKCAiTk9ORSIsICAgICAgSU5UX05PTkUgICAgICApOwotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBzdGFydC1kb2N1bWVudCB0b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIFNUQVJURE9DICA9IG5ldyBUb2tlblR5cGUoICJTVEFSVERPQyIsICBJTlRfU1RBUlRET0MgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIHN0YXJ0LWRvY3VtZW50IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgRU5ERE9DICAgID0gbmV3IFRva2VuVHlwZSggIkVORERPQyIsICAgIElOVF9FTkRET0MgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gc3RhcnQtZWxlbWVudCB0b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIFNUQVJUICAgICA9IG5ldyBUb2tlblR5cGUoICJTVEFSVCIsICAgICBJTlRfU1RBUlQgICAgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIGVuZC1lbGVtZW50IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgRU5EICAgICAgID0gbmV3IFRva2VuVHlwZSggIkVORCIsICAgICAgIElOVF9FTkQgICAgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gdGV4dCB0b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIFRFWFQgICAgICA9IG5ldyBUb2tlblR5cGUoICJURVhUIiwgICAgICBJTlRfVEVYVCAgICAgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIGF0dHJpYnV0ZSB0b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIEFUVFIgICAgICA9IG5ldyBUb2tlblR5cGUoICJBVFRSIiwgICAgICBJTlRfQVRUUiAgICAgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIE5BTUVTUEFDRSA9IG5ldyBUb2tlblR5cGUoICJOQU1FU1BBQ0UiLCBJTlRfTkFNRVNQQUNFICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIGNvbW1lbnQgdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBDT01NRU5UICAgPSBuZXcgVG9rZW5UeXBlKCAiQ09NTUVOVCIsICAgSU5UX0NPTU1FTlQgICApOwotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgUFJPQ0lOU1QgID0gbmV3IFRva2VuVHlwZSggIlBST0NJTlNUIiwgIElOVF9QUk9DSU5TVCAgKTsKLQotICAgICAgICBwcml2YXRlIFRva2VuVHlwZSAoIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgIF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWFsbG9jYXRlcyByZXNvdXJjZXMgbmVlZGVkIHRvIG1hbmFnZSB0aGUgY3Vyc29yLCByZW5kZXJpbmcgdGhpcyBjdXJzb3IKLSAgICAgKiBpbm9wZXJhYmxlLiBCZWNhdXNlIGN1cnNvcnMgYXJlIG1hbmFnZWQgYnkgYSBtZWNoYW5pc20gd2hpY2ggc3RvcmVzIHRoZSAKLSAgICAgKiBYTUwsIHNpbXBseSBsZXR0aW5nIGEgY3Vyc29yIGdvIG91dCBvZiBzY29wZSBhbmQgaGF2aW5nIHRoZSBnYXJiYWdlIGNvbGxlY3RvcgotICAgICAqIGF0dGVtcHQgdG8gcmVjbGFpbSBpdCBtYXkgbm90IHByb2R1Y2UgZGVzaXJhYmxlIHBlcmZvcm1hbmNlLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIFNvLCBleHBsaWNpdGx5IGRpc3Bvc2luZyBhIGN1cnNvciBhbGxvd3MgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24KLSAgICAgKiB0byByZWxlYXNlIGl0cyByZXNwb25zaWJpbGl0eSBvZiBtYWludGFpbmluZyBpdHMgcG9zaXRpb24uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogQWZ0ZXIgYSBjdXJzb3IgaGFzIGJlZW4gZGlzcG9zZWQsIGl0IG1heSBub3QgYmUgdXNlZCBhZ2Fpbi4gIEl0IGNhbgotICAgICAqIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBvciBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB1c2VkIGFmdGVyCi0gICAgICogZGlzcG9zYWwuPGJyLz48YnIvPgotICAgICAqLwotCi0gICAgdm9pZCBkaXNwb3NlICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgbW92ZVRvIGN1cnNvci4gIGlmIHRoZQotICAgICAqIG1vdmVUbyBjdXJzb3IgaXMgaW4gYSBkaWZmZXJlbnQgZG9jdW1lbnQgZnJvbSB0aGlzIGN1cnNvciwgdGhpcyBjdXJzb3IKLSAgICAgKiB3aWxsIG5vdCBiZSBtb3ZlZCwgYW5kIGZhbHNlIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbW92ZVRvICBUaGUgY3Vyc29yIGF0IHRoZSBsb2NhdGlvbiB0byB3aGljaCB0aGlzIGN1cnNvcgotICAgICAqIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3IgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQ3Vyc29yICggWG1sQ3Vyc29yIG1vdmVUbyApOwotICAgIAotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoaXMgY3Vyc29yIG9uIGFuIGludGVybmFsIHN0YWNrIG9mIHNhdmVkCi0gICAgICogcG9zaXRpb25zIChpbmRlcGVuZGVudCBvZiBzZWxlY3Rpb24pLiBUaGlzIGxvY2F0aW9uIG1heSBiZSByZXN0b3JlZAotICAgICAqIGxhdGVyIGJ5IGNhbGxpbmcgdGhlIHBvcCgpIG1ldGhvZC4KLSAgICAgKi8KLQotICAgIHZvaWQgcHVzaCAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyB0aGUgY3Vyc29yIGxvY2F0aW9uIG1vc3QgcmVjZW50bHkgc2F2ZWQgd2l0aCB0aGUgcHVzaCgpIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZXJlIHdhcyBhIGxvY2F0aW9uIHRvIHJlc3RvcmU7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHBvcCAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIFhQYXRoIGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgWE1MIHRoYXQgdGhpcyAKLSAgICAgKiBjdXJzb3IgaXMgaW4uICBUaGUgY3Vyc29ycyBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UuICBUbyBuYXZpZ2F0ZSB0byB0aGUKLSAgICAgKiBzZWxlY3Rpb25zLCB1c2UgaGFzTmV4dFNlbGVjdGlvbiBhbmQgdG9OZXh0U2VsZWN0aW9uIChzaW1pbGFyIHRvCi0gICAgICogamF2YS51dGlsLkl0ZXJhdG9yKS48YnIvPjxici8+Ci0gICAgICogCi0gICAgICogVGhlIHJvb3QgcmVmZXJyZWQgdG8gYnkgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIGdpdmVuIGFzIAotICAgICAqIGEgZG90LiBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgcGF0aCBleHByZXNzaW9uOgotICAgICAqIDxwcmU+Ci0gICAgICogY3Vyc29yLnNlbGVjdFBhdGgoIi4vcHVyY2hhc2Utb3JkZXIvbGluZS1pdGVtW3ByaWNlIDw9IDIwLjAwXSIpOwotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIEBwYXJhbSAgcGF0aCAgVGhlIHBhdGggZXhwcmVzc2lvbiB0byBleGVjdXRlLgotICAgICAqIEB0aHJvd3MgIFhtbFJ1bnRpbWVFeGNlcHRpb24gIElmIHRoZSBxdWVyeSBleHByZXNzaW9uIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBzZWxlY3RQYXRoICggU3RyaW5nIHBhdGggKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFBhdGggZXhwcmVzc2lvbiBhZ2FpbnN0IHRoZSBYTUwgdGhhdCB0aGlzIAotICAgICAqIGN1cnNvciBpcyBpbi4gVGhlIGN1cnNvcidzIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZS4gIFRvIG5hdmlnYXRlIHRvIHRoZQotICAgICAqIHNlbGVjdGlvbnMsIHVzZSBoYXNOZXh0U2VsZWN0aW9uIGFuZCB0b05leHRTZWxlY3Rpb24gKHNpbWlsYXIgdG8KLSAgICAgKiBqYXZhLnV0aWwuSXRlcmF0b3IpLjxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBUaGUgcm9vdCByZWZlcnJlZCB0byBieSB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZ2l2ZW4gYXMgCi0gICAgICogYSBkb3QuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBwYXRoIGV4cHJlc3Npb246Ci0gICAgICogPHByZT4KLSAgICAgKiBjdXJzb3Iuc2VsZWN0UGF0aCgiLi9wdXJjaGFzZS1vcmRlci9saW5lLWl0ZW1bcHJpY2UgPD0gMjAuMDBdIik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBwYXRoICBUaGUgcGF0aCBleHByZXNzaW9uIHRvIGV4ZWN1dGUuCi0gICAgICogQHBhcmFtICBvcHRpb25zICBPcHRpb25zIGZvciB0aGUgcXVlcnkuIEZvciBleGFtcGxlLCB5b3UgY2FuIGNhbGwgCi0gICAgICogdGhlIHtAbGluayBYbWxPcHRpb25zI3NldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZykgWG1sT3B0aW9ucy5zZXRYcXVlcnlDdXJyZW50Tm9kZVZhcihTdHJpbmcpfQotICAgICAqIG1ldGhvZCB0byBzcGVjaWZ5IGEgcGFydGljdWxhciBuYW1lIGZvciB0aGUgcXVlcnkgZXhwcmVzc2lvbiAKLSAgICAgKiB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dCBub2RlLgotICAgICAqIEB0aHJvd3MgIFhtbFJ1bnRpbWVFeGNlcHRpb24gIElmIHRoZSBxdWVyeSBleHByZXNzaW9uIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBzZWxlY3RQYXRoICggU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIG5leHQgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IHNlbGVjdGlvbjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaGFzTmV4dFNlbGVjdGlvbiAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhpcyBjdXJzb3IgdG8gdGhlIG5leHQgbG9jYXRpb24gaW4gdGhlIHNlbGVjdGlvbiwgCi0gICAgICogaWYgYW55LiBTZWUgdGhlIHNlbGVjdFBhdGgoKSBhbmQgYWRkVG9TZWxlY3Rpb24oKSBtZXRob2RzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0U2VsZWN0aW9uICggKTsKLSAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlIHNlbGVjdGlvbi4gCi0gICAgICogSWYgaSBpcyBsZXNzIHRoYW4gemVybyBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlbGVjdGlvbgotICAgICAqIGNvdW50LCB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAgICAqICAKLSAgICAgKiBTZWUgYWxzbyB0aGUgc2VsZWN0UGF0aCgpIGFuZCBhZGRUb1NlbGVjdGlvbigpIG1ldGhvZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtICBpICBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgbG9jYXRpb24uCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9TZWxlY3Rpb24gKCBpbnQgaSApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvdW50IG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gU2VlIGFsc28gdGhlIHNlbGVjdFBhdGgoKSAKLSAgICAgKiBhbmQgYWRkVG9TZWxlY3Rpb24oKSBtZXRob2RzLgotICAgICAqIAotICAgICAqIFlvdSBtYXkgZXhwZXJpZW5jZSBiZXR0ZXIgcGVyZm9ybWFuY2UgaWYgeW91IHVzZSB0aGUgaXRlcmF0aW9uCi0gICAgICogbW9kZWwgdXNpbmcgdGhlIHRvTmV4dFNlbGVjdGlvbiBtZXRob2QsIHJhdGhlciB0aGFuIAotICAgICAqIHRoZSBpbmRleGluZyBtb2RlbCB1c2luZyB0aGUgZ2V0U2VsZWN0aW9uQ291bnQgYW5kIAotICAgICAqIHRvU2VsZWN0aW9uIG1ldGhvZHMuCi0gICAgICogCi0gICAgICogQHJldHVybiAgQSBudW1iZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgICovCi0KLSAgICBpbnQgZ2V0U2VsZWN0aW9uQ291bnQgKCApOwotCi0gICAgCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgY3Vyc29yIHRvIHRoZSBzZWxlY3Rpb24uICAKLSAgICAgKiBTZWUgYWxzbyB0aGUgc2VsZWN0UGF0aCgpIG1ldGhvZC4gWW91IGNhbiB1c2UgdGhpcyBhcyBhbiAKLSAgICAgKiBhbHRlcm5hdGl2ZSB0byBjYWxsaW5nIHRoZSBzZWxlY3RQYXRoIG1ldGhvZCB3aGVuIHlvdSB3YW50Ci0gICAgICogdG8gZGVmaW5lIHlvdXIgb3duIHNlbGVjdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgYWRkVG9TZWxlY3Rpb24gKCApOwotICAgIAotICAgIC8qKgotICAgICAqIENsZWFycyB0aGlzIGN1cnNvcidzIHNlbGVjdGlvbiwgYnV0IGRvZXMgbm90IG1vZGlmeSB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0gICAgdm9pZCBjbGVhclNlbGVjdGlvbnMgKCApOyAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgYm9va21hcmsuICBJZiB0aGUKLSAgICAgKiBib29rbWFyayBpcyBpbiBhIGRpZmZlcmVudCBkb2N1bWVudCBmcm9tIHRoaXMgY3Vyc29yIG9yIGlmIHRoZSAKLSAgICAgKiBib29rbWFyayBpcyBvcnBoYW5lZCwgdGhpcyBjdXJzb3IKLSAgICAgKiB3aWxsIG5vdCBiZSBtb3ZlZCwgYW5kIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBib29rbWFyayAgVGhlIGJvb2ttYXJrIGF0IHRoZSBsb2NhdGlvbiB0byB3aGljaCB0aGlzCi0gICAgICogY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3IgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQm9va21hcmsgKCBYbWxCb29rbWFyayBib29rbWFyayApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhpcyBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uIGFmdGVyIGl0cyBjdXJyZW50IHBvc2l0aW9uCi0gICAgICogd2hlcmUgYSBib29rbWFyayB3aXRoIHRoZSBnaXZlbiBrZXkgZXhpc3RzLiAgUmV0dXJucyBmYWxzZSBpZiBubwotICAgICAqIHN1Y2ggYm9va21hcmsgZXhpc3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSAga2V5ICBUaGUga2V5IGhlbGQgYnkgdGhlIG5leHQgYm9va21hcmsgYXQgdGhlIGxvY2F0aW9uIHRvIAotICAgICAqIHdoaWNoIHRoaXMgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICBUaGUgbmV4dCBjb3JyZXNwb25kaW5nIGJvb2ttYXJrLCBpZiBpdCBleGlzdHM7IG51bGwgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBuZXh0IGJvb2ttYXJrIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICovCi0KLSAgICBYbWxCb29rbWFyayB0b05leHRCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgbG9jYXRpb24gYmVmb3JlIGl0cyBjdXJyZW50IHBvc2l0aW9uCi0gICAgICogd2hlcmUgYSBib29rbWFyayB3aXRoIHRoZSBnaXZlbiBrZXkgZXhpc3RzLiAgUmV0dXJucyBmYWxzZSBpZiBubwotICAgICAqIHN1Y2ggYm9va21hcmsgZXhpc3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSAga2V5ICBUaGUga2V5IGhlbGQgYnkgdGhlIHByZXZpb3VzIGJvb2ttYXJrIGF0IHRoZSBsb2NhdGlvbiB0byAKLSAgICAgKiB3aGljaCB0aGlzIGN1cnNvciBzaG91bGQgYmUgbW92ZWQuCi0gICAgICogQHJldHVybiAgVGhlIHByZXZpb3VzIGNvcnJlc3BvbmRpbmcgYm9va21hcmssIGlmIGl0IGV4aXN0czsgbnVsbCBpZiAKLSAgICAgKiB0aGVyZSBpcyBubyBwcmV2aW91cyBib29rbWFyayB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqLwotCi0gICAgWG1sQm9va21hcmsgdG9QcmV2Qm9va21hcmsgKCBPYmplY3Qga2V5ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0b2tlbi4gTmFtZXMgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIFNUQVJULCBBVFRSLCBOQU1FU1BBQ0Ugb3IgUFJPQ0lOU1QuIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubwotICAgICAqIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHRva2VuLiBGb3IgU1RBUlQgYW5kIEFUVFIsIHRoZSAKLSAgICAgKiBuYW1lIHJldHVybmVkIGlkZW50aWZpZXMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgb3IgYXR0cmlidXRlLiAKLSAgICAgKiBGb3IgTkFNRVNQQUNFLCB0aGUgbG9jYWwgcGFydCBvZiB0aGUgbmFtZSBpcyB0aGUgcHJlZml4LCB3aGlsZSAKLSAgICAgKiB0aGUgVVJJIGlzIHRoZSBuYW1lc3BhY2UgZGVmaW5lZC4gRm9yIFBST0NJTlNULCB0aGUgbG9jYWwgcGFydCAKLSAgICAgKiBpcyB0aGUgdGFyZ2V0IGFuZCB0aGUgdXJpIGlzICIiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIFRoZSBuYW1lIG9mIHRoZSBYTUwgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbjsgbnVsbCBpZiB0aGVyZQotICAgICAqIGlzIG5vIG5hbWUuCi0gICAgICovCi0KLSAgICBRTmFtZSBnZXROYW1lICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBTVEFSVCwgTkFNRVNQQUNFLAotICAgICAqIEFUVFIgb3IgUFJPQ0lOU1QuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmV3IG5hbWUgZm9yIHRoZSBjdXJyZW50IHRva2VuLgotICAgICAqLwotCi0gICAgdm9pZCBzZXROYW1lICggUU5hbWUgbmFtZSApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBVUkkgaW5kaWNhdGVkIGJ5IHRoZSBnaXZlbiBwcmVmaXguIFRoZSBjdXJyZW50Ci0gICAgICogY29udGV4dCBtdXN0IGJlIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MuIE5hbWVzcGFjZSBwcmVmaXggbWFwcGluZ3MKLSAgICAgKiBhcmUgcXVlcmllZCBmb3IgdGhlIG1hcHBpbmdzIGRlZmluZWQgYXQgdGhlIGN1cnJlbnQgY29udGFpbmVyIGZpcnN0LAotICAgICAqIHRoZW4gcGFyZW50cyBhcmUgcXVlcmllZC4gVGhlIHByZWZpeCBjYW4gYmUgIiIgb3IgbnVsbCB0byBpbmRpY2F0ZQotICAgICAqIGEgc2VhcmNoIGZvciB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuICBUbyBjb25mb3JtIHdpdGggdGhlCi0gICAgICogWE1MIHNwZWMsIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB3aWxsIHJldHVybiB0aGUgbm8tbmFtZXNwYWNlICgiIikKLSAgICAgKiBpZiBpdCBpcyBub3QgbWFwcGVkLjxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBxdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkb2N1bWVudC4gV2hlbiB0aGUgCi0gICAgICogZG9jdW1lbnQgaXMgcGVyc2lzdGVkLCB0aGUgc2F2aW5nIG1lY2hhbmlzbSBtYXkgc3ludGhlc2l6ZSBuYW1lc3BhY2VzIAotICAgICAqIChuczEsIG5zMiwgYW5kIHNvIG9uKSBmb3IgdGhlIHB1cnBvc2VzIG9mIHBlcnNpc3RlbmNlLiBUaGVzZSBuYW1lcGFjZXMgYXJlIAotICAgICAqIG9ubHkgcHJlc2VudCBpbiB0aGUgc2VyaWFsaXplZCBmb3JtLCBhbmQgYXJlIG5vdCByZWZsZWN0ZWQgYmFjayBpbnRvIAotICAgICAqIHRoZSBkb2N1bWVudCBiZWluZyBzYXZlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHByZWZpeCAgVGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSByZXF1ZXN0ZWQgbmFtZXNwYWNlLgotICAgICAqIEByZXR1cm4gIFRoZSBVUkkgZm9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcmVmaXggaWYgaXQKLSAgICAgKiBleGlzdHM7IG90aGVyd2lzZSwgbnVsbC4KLSAgICAgKi8KLSAgICBTdHJpbmcgbmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByZWZpeCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIGEgbmFtZXNwYWNlIFVSSS4gIFRoZQotICAgICAqIGN1cnJlbnQgY29udGV4dCBtdXN0IGJlIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MuICBJZiB0aGVyZSBpcyBhbgotICAgICAqIGV4aXN0aW5nIHByZWZpeCB0aGF0IGluZGljYXRlcyB0aGUgVVJJIGluIHRoZSBjdXJyZW50IGNvbnRleHQsIHRoYXQKLSAgICAgKiBwcmVmaXggbWF5IGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgbmV3IHByZWZpeCBmb3IgdGhlIFVSSSB3aWxsIGJlCi0gICAgICogZGVmaW5lZCBieSBhZGRpbmcgYW4geG1sbnMgYXR0cmlidXRlIHRvIHRoZSBjdXJyZW50IGNvbnRhaW5lciBvciBhCi0gICAgICogcGFyZW50IGNvbnRhaW5lci4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBxdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkb2N1bWVudC4gV2hlbiB0aGUgCi0gICAgICogZG9jdW1lbnQgaXMgcGVyc2lzdGVkLCB0aGUgc2F2aW5nIG1lY2hhbmlzbSBtYXkgc3ludGhlc2l6ZSBuYW1lc3BhY2VzIAotICAgICAqIChuczEsIG5zMiwgYW5kIHNvIG9uKSBmb3IgdGhlIHB1cnBvc2VzIG9mIHBlcnNpc3RlbmNlLiBUaGVzZSBuYW1lcGFjZXMgYXJlIAotICAgICAqIG9ubHkgcHJlc2VudCBpbiB0aGUgc2VyaWFsaXplZCBmb3JtLCBhbmQgYXJlIG5vdCByZWZsZWN0ZWQgYmFjayBpbnRvIAotICAgICAqIHRoZSBkb2N1bWVudCBiZWluZyBzYXZlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWVzcGFjZVVSSSAgVGhlIG5hbWVzcGFjZSBVUkkgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkCi0gICAgICogcHJlZml4LgotICAgICAqIEByZXR1cm4gIFRoZSBwcmVmaXggY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFVSSSBpZiBpdCBleGlzdHM7IAotICAgICAqIG90aGVyd2lzZSwgYSBuZXdseSBnZW5lcmF0ZWQgcHJlZml4LgotICAgICAqLwotICAgIFN0cmluZyBwcmVmaXhGb3JOYW1lc3BhY2UgKCBTdHJpbmcgbmFtZXNwYWNlVVJJICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyB0byB0aGUgc3BlY2lmaWVkIG1hcCwgYWxsIHRoZSBuYW1lc3BhY2VzIGluIHNjb3BlIGF0IHRoZSBjb250YWluZXIKLSAgICAgKiB3aGVyZSB0aGlzIGN1cnNvciBpcyBwb3NpdGlvbmVkLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIAotICAgICAqIGNvbnRhaW5lciB0b2tlbnMgb25seS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGFkZFRvVGhpcyAgVGhlIE1hcCB0byBhZGQgdGhlIG5hbWVzcGFjZXMgdG8uCi0gICAgICovCi0KLSAgICB2b2lkIGdldEFsbE5hbWVzcGFjZXMgKCBNYXAgYWRkVG9UaGlzICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJvbmdseS10eXBlZCBYbWxPYmplY3QgYXQgdGhlIGN1cnJlbnQgU1RBUlQsCi0gICAgICogU1RBUlRET0MsIG9yIEFUVFIuIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBUaGUgc3Ryb25nbHktdHlwZWQgb2JqZWN0IGNhbiBiZSBjYXN0IHRvIHRoZSBzdHJvbmdseS10eXBlZAotICAgICAqIFhCZWFuIGludGVyZmFjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBYTUwgU2NoZW1hIFR5cGUgZ2l2ZW4KLSAgICAgKiBieSByZXN1bHQuZ2V0U2NoZW1hVHlwZSgpLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIElmIGEgbW9yZSBzcGVjaWZpYyB0eXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCBhbiBYbWxPYmplY3QKLSAgICAgKiB3aG9zZSBzY2hlbWEgdHlwZSBpcyBhbnlUeXBlIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIHN0cm9uZ2x5LXR5cGVkIG9iamVjdCBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudCBsb2NhdGlvbjsKLSAgICAgKiBudWxsIGlmIHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIG5vdCBhIFNUQVJULCBTVEFSVERPQywgb3IgQVRUUi4KLSAgICAgKi8KLQotICAgIFhtbE9iamVjdCBnZXRPYmplY3QgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uIEJ5IGRlZmluaXRpb24sIHRoZSBjdXJyZW50Ci0gICAgICogdG9rZW4gaXMgdGhlIHRva2VuIGltbWVkaWF0ZWx5IHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yLiAKLSAgICAgKiBJZiB5b3UncmUgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0LCBiZWZvcmUgYSBjaGFyYWN0ZXIsIHlvdSBnZXQgVEVYVC4KLSAgICAgKiBZb3UgY2FuJ3QgZGl2ZSBpbnRvIHRoZSB0ZXh0IG9mIGFuIEFUVFIsIENPTU1FTlQgb3IgUFJPQ0lOU1QuPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIEFzIGFuIGFsdGVybmF0aXZlLCBpdCBtYXkgYmUgbW9yZSBjb252ZW5pZW50IGZvciB5b3UgdG8gdXNlIG9uZSBvZiB0aGUgCi0gICAgICogbWV0aG9kcyB0aGF0IHRlc3QgZm9yIGEgcGFydGljdWxhciB0b2tlbiB0eXBlLiBUaGVzZSBpbmNsdWRlIHRoZSBtZXRob2RzIAotICAgICAqIGlzU3RhcnQoKSwgaXNTdGFydGRvYygpLCBpc1RleHQoKSwgaXNBdHRyKCksIGFuZCBzbyBvbi4gRWFjaCByZXR1cm5zIGEgYm9vbGVhbiAKLSAgICAgKiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRva2VuIHRoYXQgZm9sbG93cyB0aGUgY3Vyc29yIGlzIHRoZSB0eXBlIAotICAgICAqIGluIHF1ZXN0aW9uLiAKLSAgICAgKiA8YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuICBUaGUgVG9rZW5UeXBlIGluc3RhbmNlIGZvciB0aGUgdG9rZW4gYXQgdGhlIGN1cnNvcidzIGN1cnJlbnQKLSAgICAgKiBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIFRva2VuVHlwZSBjdXJyZW50VG9rZW5UeXBlICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgU1RBUlRET0MgdG9rZW4gdHlwZSwgbWVhbmluZyAKLSAgICAgKiBhdCB0aGUgdmVyeSByb290IG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBTVEFSVERPQyB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc1N0YXJ0ZG9jICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYW4gRU5ERE9DIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICogYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYW4gRU5ERE9DIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzRW5kZG9jICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBTVEFSVCB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGp1c3QgYmVmb3JlIGFuIGVsZW1lbnQncyBzdGFydC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBTVEFSVCB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc1N0YXJ0ICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYW4gRU5EIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYW4gZWxlbWVudCdzIGVuZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYW4gRU5EIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzRW5kICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB0aGlzIHRva2VuIGlzIGEgVEVYVCB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGp1c3QgYmVmb3JlIG9yIGluc2lkZSB0ZXh0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFRFWFQgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNUZXh0ICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYW4gQVRUUiB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGp1c3QgYmVmb3JlIGFuIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYW4gQVRUUiB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0F0dHIgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIE5BTUVTUEFDRSB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGp1c3QgYmVmb3JlIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIE5BTUVTUEFDRSB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc05hbWVzcGFjZSAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgQ09NTUVOVCB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGp1c3QgYmVmb3JlIGEgY29tbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBDT01NRU5UIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzQ29tbWVudCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgUFJPQ0lOU1QgdG9rZW4gdHlwZSwgbWVhbmluZyAKLSAgICAgKiBqdXN0IGJlZm9yZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgUFJPQ0lOU1QgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNQcm9jaW5zdCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgY29udGFpbmVyIHRva2VuLiBUaGUgU1RBUlRET0MgYW5kIFNUQVJUIAotICAgICAqIHRva2VuIHR5cGVzIGFyZSBjb250YWluZXJzLiBDb250YWluZXJzLCBpbmNsdWRpbmcgZG9jdW1lbnRzIGFuZCBlbGVtZW50cywKLSAgICAgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnQgbW9kZWwuIEluIG90aGVyIHdvcmRzLCBhIGRvY3VtZW50IGFuZCBhbiBlbGVtZW50IAotICAgICAqIG1heSBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzLiBGb3IgZXhhbXBsZSwgYSBkb2N1bWVudCBtYXkgY29udGFpbiBhdHRyaWJ1dGVzIAotICAgICAqIG9yIHRleHQsIHdpdGhvdXQgYW55IGNoaWxkIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIGNvbnRhaW5lciB0b2tlbjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNDb250YWluZXIgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIGZpbmlzaCB0b2tlbi4gQSBmaW5pc2ggdG9rZW4gY2FuIGJlIGFuIEVORERPQwotICAgICAqIG9yIEVORCB0b2tlbiB0eXBlLgotCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgZmluaXNoIHRva2VuOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0ZpbmlzaCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGFueSBhdHRyaWJ1dGUuIFRoaXMgaW5jbHVkZXMgYW4gQVRUUiB0b2tlbiB0eXBlIGFuZAotICAgICAqIHRoZSBOQU1FU1BBQ0UgdG9rZW4gdHlwZSBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3VycmVudCBjdXJzb3IgaXMgYXQgYW55IGF0dHJpYnV0ZTsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNBbnlBdHRyICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBwcmV2aW91cyB0b2tlbi4gQnkgZGVmaW5pdGlvbiwgdGhlIHByZXZpb3VzCi0gICAgICogdG9rZW4gaXMgdGhlIHRva2VuIGltbWVkaWF0ZWx5IHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgeW91J3JlIGluIHRoZSBtaWRkbGUgb2YgdGV4dCwgYWZ0ZXIgYSBjaGFyYWN0ZXIsIHlvdSBnZXQgVEVYVC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgVG9rZW5UeXBlIGluc3RhbmNlIGZvciB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSAKLSAgICAgKiB0b2tlbiBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudCBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIFRva2VuVHlwZSBwcmV2VG9rZW5UeXBlICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZXJlIGlzIGEgbmV4dCB0b2tlbi4gV2hlbiB0aGlzIGlzIGZhbHNlLCBhcyB3aGVuIHRoZSBjdXJzb3IgaXMKLSAgICAgKiBhdCB0aGUgRU5ERE9DIHRva2VuLCB0aGUgdG9OZXh0VG9rZW4oKSBtZXRob2QgcmV0dXJucyBOT05FIGFuZCBkb2VzIG5vdCAKLSAgICAgKiBtb3ZlIHRoZSBjdXJzb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGVyZSBpcyBhIG5leHQgdG9rZW47IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGhhc05leHRUb2tlbiAoICk7Ci0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyB0b2tlbi4gV2hlbiB0aGlzIGlzIGZhbHNlLCB0b1ByZXZUb2tlbgotICAgICAqIHJldHVybnMgTk9ORSBhbmQgZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyB0b2tlbjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaGFzUHJldlRva2VuICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHRva2VuLiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIHRva2VucyAKLSAgICAgKiBhdmFpbGFibGUsIGhhc05leHRUb2tlbiByZXR1cm5zIGZhbHNlIGFuZCB0b05leHRUb2tlbigpIHJldHVybnMgCi0gICAgICogTk9ORSBhbmQgZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yLiBSZXR1cm5zIHRoZSB0b2tlbiB0eXBlIAotICAgICAqIG9mIHRoZSB0b2tlbiB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciB1cG9uIGEgc3VjY2Vzc2Z1bCBtb3ZlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIFRoZSB0b2tlbiB0eXBlIGZvciB0aGUgbmV4dCB0b2tlbiBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsKLSAgICAgKiBvdGhlcndpc2UsIE5PTkUuCi0gICAgICovCi0KLSAgICBUb2tlblR5cGUgdG9OZXh0VG9rZW4gKCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgdG9rZW4uIFdoZW4gdGhlcmUgaXMgbm8KLSAgICAgKiBwcmV2aW91cyB0b2tlbiwgcmV0dXJucyBOT05FLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgdG9rZW4KLSAgICAgKiB0byB0aGUgbGVmdCBvZiB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIHRva2VuIHR5cGUgZm9yIHRoZSBwcmV2aW91cyB0b2tlbiBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsKLSAgICAgKiBvdGhlcndpc2UsIE5PTkUuCi0gICAgICovCi0KLSAgICBUb2tlblR5cGUgdG9QcmV2VG9rZW4gKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IHRva2VuIGluIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50Ci0gICAgICogU1RBUlQgb3IgU1RBUlRET0MuIFRoYXQgaXMsIHRoZSBmaXJzdCB0b2tlbiBhZnRlciBhbGwgQVRUUiBhbmQgTkFNRVNQQUNFCi0gICAgICogdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNUQVJULjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIElmIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCBhIFNUQVJUIG9yIFNUQVJURE9DLCB0aGUgY3Vyc29yIGlzIG5vdAotICAgICAqIG1vdmVkIGFuZCBOT05FIGlzIHJldHVybmVkLiBJZiB0aGUgY3VycmVudCBTVEFSVCBvciBTVEFSVERPQwotICAgICAqIGhhcyBubyBjb250ZW50LCB0aGUgY3Vyc29yIGlzIG1vdmVkIHRvIHRoZSBFTkQgb3IgRU5ERE9DIHRva2VuLjxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgbmV3IGN1cnJlbnQgdG9rZW4gdHlwZS4KLSAgICAgKi8KLQotICAgIFRva2VuVHlwZSB0b0ZpcnN0Q29udGVudFRva2VuICggKTsKLQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgRU5EIG9yIEVORERPQyB0b2tlbiBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgICAqIGN1cnJlbnQgU1RBUlQgb3IgU1RBUlRET0MsIGFuZCByZXR1cm5zIEVORCBvciBFTkRET0MuIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIElmIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCBhIFNUQVJUIG9yIFNUQVJURE9DLCB0aGUgY3Vyc29yIGlzIG5vdAotICAgICAqIG1vdmVkIGFuZCBOT05FIGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIFRoZSBuZXcgY3VycmVudCB0b2tlbiB0eXBlLgotICAgICAqLwotCi0gICAgVG9rZW5UeXBlIHRvRW5kVG9rZW4gKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgZm9yd2FyZCBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBhbmQKLSAgICAgKiBzdG9wcyBhdCB0aGUgbmV4dCBub24tVEVYVCB0b2tlbi4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLSAgICAgKiBhY3R1YWxseSBtb3ZlZCBhY3Jvc3MsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICAKLSAgICAgKiA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPi4gSWYgdGhlcmUgaXMgbm8gZnVydGhlciB0ZXh0LCBvciBpZiAKLSAgICAgKiB0aGVyZSBpcyBubyB0ZXh0IGF0IGFsbCwgcmV0dXJucyB6ZXJvLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIE5vdGUgdGhpcyBkb2VzIG5vdCBkaXZlIGludG8gYXR0cmlidXRlIHZhbHVlcywgY29tbWVudCBjb250ZW50cywKLSAgICAgKiBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGNvbnRlbnRzLCBldGMuLCBidXQgb25seSBjb250ZW50IHRleHQuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogWW91IGNhbiBwYXNzIG1heENoYXJhY3RlckNvdW50ICZsdDsgMCB0byBtb3ZlIG92ZXIgYWxsIHRoZSB0ZXh0IHRvIHRoZSAKLSAgICAgKiByaWdodC4gVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRvTmV4dFRva2VuLCBidXQgcmV0dXJucyB0aGUgYW1vdW50IAotICAgICAqIG9mIHRleHQgbW92ZWQgb3Zlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJ5IHdoaWNoCi0gICAgICogdGhlIGN1cnNvciBzaG91bGQgYmUgbW92ZWQuCi0gICAgICogQHJldHVybiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBieSB3aGljaCB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgCi0gICAgICogMCBpZiB0aGUgY3Vyc29yIHdhcyBub3QgbW92ZWQuCi0gICAgICovCi0KLSAgICBpbnQgdG9OZXh0Q2hhciAoIGludCBtYXhDaGFyYWN0ZXJDb3VudCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgYmFja3dhcmRzIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBnaXZlbi4gIEhhcwotICAgICAqIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIHRvIHRoZSB7QGxpbmsgI3RvTmV4dENoYXIoaW50KSB0b05leHRDaGFyfSBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtICBtYXhDaGFyYWN0ZXJDb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnkgd2hpY2gKLSAgICAgKiB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJ5IHdoaWNoIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyAKLSAgICAgKiAwIGlmIHRoZSBjdXJzb3Igd2FzIG5vdCBtb3ZlZC4KLSAgICAgKi8KLQotICAgIGludCB0b1ByZXZDaGFyICggaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCwgb3IgcmV0dXJucwotICAgICAqIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgaXMgbm8gbmV4dCBzaWJsaW5nCi0gICAgICogZWxlbWVudC4gKEJ5IGRlZmluaXRpb24gdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgaXMgdGhlIHNhbWUKLSAgICAgKiBhcyB0aGUgcG9zaXRpb24gb2YgaXRzIFNUQVJUIHRva2VuLikKLSAgICAgKgotICAgICAqIElmIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCBzIFNUQVJULCB0aGUgY3Vyc29yIHdpbGwgYmUgCi0gICAgICogbW92ZWQgdG8gdGhlIG5leHQgU1RBUlQgd2l0aG91dCBtb3Zpbmcgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGUgCi0gICAgICogY3VycmVudCBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudCwgb3IgcmV0dXJucwotICAgICAqIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgc2libGluZwotICAgICAqIGVsZW1lbnQuIChCeSBkZWZpbml0aW9uIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IGlzIHRoZSBzYW1lCi0gICAgICogYXMgdGhlIHBvc2l0aW9uIG9mIGl0cyBTVEFSVCB0b2tlbi4pCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9QcmV2U2libGluZyAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvciBTVEFSVERPQywgb3IgcmV0dXJucwotICAgICAqIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgaXMgbm8gcGFyZW50Ljxici8+PGJyLz4KLSAgICAgKgotICAgICAqIFdvcmtzIGlmIHlvdSdyZSBpbiBhdHRyaWJ1dGVzIG9yIGNvbnRlbnQuIFJldHVybnMgZmFsc2Ugb25seSBpZiBhdAotICAgICAqIFNUQVJURE9DLiBOb3RlIHRoYXQgdGhlIHBhcmVudCBvZiBhbiBFTkQgdG9rZW4gaXMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBTVEFSVCB0b2tlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBmYWxzZSBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBTVEFSVERPQwotICAgICAqIHRva2VuLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b1BhcmVudCAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50LCBvciByZXR1cm5zIGZhbHNlIGFuZAotICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudCBjaGlsZHJlbi4gPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgdGhlIGN1cnNvciBpcyBub3QgY3VycmVudGx5IGluIGFuIGVsZW1lbnQsIGl0IG1vdmVzIGludG8gdGhlIAotICAgICAqIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIG5leHQgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0ZpcnN0Q2hpbGQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3QgZWxlbWVudCBjaGlsZCwgb3IgcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnQgY2hpbGRyZW4uCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9MYXN0Q2hpbGQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIGluIAotICAgICAqIG5vIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIGN1cnNvciB0by4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0NoaWxkICggU3RyaW5nIG5hbWUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgCi0gICAgICogc3BlY2lmaWVkIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWVzcGFjZSAgVGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIGN1cnNvciAKLSAgICAgKiB0by4KLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdG8uCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9DaGlsZCAoIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQ2hpbGQgKCBRTmFtZSBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBjaGlsZCBlbGVtZW50IHNwZWNpZmllZCBieSA8ZW0+aW5kZXg8L2VtPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGluZGV4ICBUaGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIG9mIGNoaWxkIAotICAgICAqIGVsZW1lbnRzLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQ2hpbGQgKCBpbnQgaW5kZXggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBzcGVjaWZpZWQgPGVtPmluZGV4PC9lbT4gY2hpbGQgZWxlbWVudCBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIG5hbWUsIHdoZXJlIHRoYXQgZWxlbWVudCBpcyB0aGUgLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGNoaWxkIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgotICAgICAqIEBwYXJhbSAgaW5kZXggIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2Ugb2YgY2hpbGQKLSAgICAgKiBlbGVtZW50cy4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0NoaWxkICggUU5hbWUgbmFtZSwgaW50IGluZGV4ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIGluIG5vCi0gICAgICogbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBTdHJpbmcgbmFtZSApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgc2libGluZyBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgbmFtZSAKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWVzcGFjZSAgVGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIGN1cnNvcgotICAgICAqIHRvLgotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSApOwotCi0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBxdWFsaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIGN1cnNvciB0by4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b05leHRTaWJsaW5nICggUU5hbWUgbmFtZSApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgYXR0cmlidXRlIG9mIHRoaXMgZWxlbWVudCwgb3IKLSAgICAgKiByZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogYXR0cmlidXRlcy4gVGhlIG9yZGVyIG9mIGF0dHJpYnV0ZXMgaXMgYXJiaXRyYXJ5LCBidXQgc3RhYmxlLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKLSAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGEgU1RBUlQgb3IgU1RBUlRET0MgZm9yIHRoaXMgbWV0aG9kIHRvCi0gICAgICogc3VjY2VlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0ZpcnN0QXR0cmlidXRlICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0IGF0dHJpYnV0ZSBvZiB0aGlzIGVsZW1lbnQsIG9yCi0gICAgICogcmV0dXJucyBmYWxzZSBhbmQgZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGFyZSBubwotICAgICAqIGF0dHJpYnV0ZXMuIFRoZSBvcmRlciBvZiBhdHRyaWJ1dGVzIGlzIGFyYml0cmFyeSwgYnV0IHN0YWJsZS48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiB4bWxucyBhdHRyaWJ1dGVzIChuYW1lc3BhY2UgZGVjbGFyYXRpb25zKSBhcmUgbm90IGNvbnNpZGVyZWQgCi0gICAgICogYXR0cmlidXRlcyBieSB0aGlzIGZ1bmN0aW9uLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIFRoZSBjdXJzb3IgbXVzdCBiZSBvbiBhIFNUQVJUIG9yIFNUQVJURE9DIGZvciB0aGlzIG1ldGhvZAotICAgICAqIHRvIHN1Y2NlZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9MYXN0QXR0cmlidXRlICggKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgc2libGluZyBhdHRyaWJ1dGUsIG9yIHJldHVybnMKLSAgICAgKiBmYWxzZSBhbmQgZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGlzIG5vIG5leHQKLSAgICAgKiBzaWJsaW5nIGF0dHJpYnV0ZS4gVGhlIG9yZGVyIG9mIGF0dHJpYnV0ZXMgaXMgYXJiaXRyYXJ5LCBidXQgc3RhYmxlLjxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiB4bWxucyBhdHRyaWJ1dGVzIChuYW1lc3BhY2UgZGVjbGFyYXRpb25zKSBhcmUgbm90IGNvbnNpZGVyZWQgCi0gICAgICogYXR0cmlidXRlcyBieSB0aGlzIGZ1bmN0aW9uLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIFRoZSBjdXJzb3IgbXVzdCBiZSBvbiBhbiBhdHRyaWJ1dGUgZm9yIHRoaXMgbWV0aG9kIHRvIHN1Y2NlZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0QXR0cmlidXRlICggKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIHNpYmxpbmcgYXR0cmlidXRlLCBvciByZXR1cm5zCi0gICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBwcmV2aW91cwotICAgICAqIHNpYmxpbmcgYXR0cmlidXRlLiBUaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBpcyBhcmJpdHJhcnksIGJ1dCBzdGFibGUuPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKLSAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGFuIGF0dHJpYnV0ZSBmb3IgdGhpcyBtZXRob2QgdG8gc3VjY2VlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b1ByZXZBdHRyaWJ1dGUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFdoZW4gYXQgYSBTVEFSVCBvciBTVEFSVERPQywgcmV0dXJucyB0aGUgYXR0cmlidXRlIHRleHQgZm9yIHRoZSBnaXZlbgotICAgICAqIGF0dHJpYnV0ZS4gV2hlbiBub3QgYXQgYSBTVEFSVCBvciBTVEFSVERPQyBvciB0aGUgYXR0cmlidXRlIGRvZXMgbm90Ci0gICAgICogZXhpc3QsIHJldHVybnMgbnVsbC4gIAotICAgICAqIAotICAgICAqIEBwYXJhbSAgYXR0ck5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUgaXMgcmVxdWVzdGVkLgotICAgICAqIEByZXR1cm4gIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpZiBpdCBoYXMgb25lOyBvdGhlcndpc2UsIG51bGwuCi0gICAgICovCi0KLSAgICBTdHJpbmcgZ2V0QXR0cmlidXRlVGV4dCAoIFFOYW1lIGF0dHJOYW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiBhdCBhIFNUQVJUIG9yIFNUQVJURE9DLCBzZXRzIHRoZSBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGdpdmVuCi0gICAgICogYXR0cmlidXRlLiBXaGVuIG5vdCBhdCBhIFNUQVJUIG9yIFNUQVJURE9DIHJldHVybnMgZmFsc2UuCi0gICAgICogSWYgdGhlIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdCwgb25lIGlzIGNyZWF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBhdHRyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyBiZWluZyBzZXQuCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBuZXcgdmFsdWUgd2FzIHNldDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gc2V0QXR0cmlidXRlVGV4dCAoIFFOYW1lIGF0dHJOYW1lLCBTdHJpbmcgdmFsdWUgKTsKLSAgCi0gICAgLyoqCi0gICAgICogV2hlbiBhdCBhIFNUQVJUIG9yIFNUQVJURE9DLCByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIHdhcyByZW1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUgKCBRTmFtZSBhdHRyTmFtZSApOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGV4dCB2YWx1ZSBvZiB0aGUgY3VycmVudCBkb2N1bWVudCwgZWxlbWVudCwgYXR0cmlidXRlLAotICAgICAqIGNvbW1lbnQsIHByb2NpbnN0IG9yIHRleHQgdG9rZW4uIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIFdoZW4gZ2V0dGluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBlbGVtZW50LCBub24tdGV4dCBjb250ZW50IHN1Y2gKLSAgICAgKiBhcyBjb21tZW50cyBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYXJlIGlnbm9yZWQgYW5kIHRleHQgaXMgY29uY2F0ZW5hdGVkLgotICAgICAqIEZvciBlbGVtZW50cyB0aGF0IGhhdmUgbmVzdGVkIGVsZW1lbnQgY2hpbGRyZW4sIHRoaXMKLSAgICAgKiByZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgdGV4dCBvZiBhbGwgbWl4ZWQgY29udGVudCBhbmQgdGhlCi0gICAgICogdGV4dCBvZiBhbGwgdGhlIGVsZW1lbnQgY2hpbGRyZW4sIHJlY3Vyc2luZyBpbiBmaXJzdC10by1sYXN0Ci0gICAgICogZGVwdGhmaXJzdCBvcmRlci48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBGb3IgYXR0cmlidXRlcywgdGhpcyByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogRm9yIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgdGhpcyByZXR1cm5zIHRoZSB0ZXh0IGNvbnRlbnRzIAotICAgICAqIG9mIHRoZSBjb21tZW50IG9yIFBJLCBub3QgaW5jbHVkaW5nIHRoZSBkZWxpbWl0aW5nIHNlcXVlbmNlcyAmbHQ7IS0tIC0tJmd0OywgJmx0Oz8gPyZndDsuCi0gICAgICo8YnIvPjxici8+Ci0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IGEgU1RBUlQsIFNUQVJURE9DLCBURVhULCBBVFRSLCBDT01NRU5ULCBvcgotICAgICAqIFBST0NJTlNULCB0aGlzIHJldHVybnMgbnVsbC4gVGhlIHZhbHVlIG9mIGFuIGVtcHR5IHRhZyBpcyB0aGUKLSAgICAgKiBlbXB0eSBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIHRleHQgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdG9rZW4sIGlmIHRoZSB0b2tlbidzIHR5cGUgaXMKLSAgICAgKiBTVEFSVCwgU1RBUlRET0MsIFRFWFQsIEFUVFIsIENPTU1FTlQsIG9yIFBST0NJTlNUOyBudWxsIGlmIHRoZSB0eXBlIGlzCi0gICAgICogRU5ELCBFTkRET0MsIE5PTkUsIG9yIE5BTUVTUEFDRS4KLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXRUZXh0VmFsdWUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgdGV4dCB2YWx1ZSBvZiB0aGUgY3VycmVudCBkb2N1bWVudCwgZWxlbWVudCwgYXR0cmlidXRlLAotICAgICAqIGNvbW1lbnQsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gb3IgdGV4dCB0b2tlbiwgY291bnRpbmcgcmlnaHQgZnJvbSAKLSAgICAgKiB0aGlzIGN1cnNvcidzIGxvY2F0aW9uIHVwIHRvIDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+LAotICAgICAqIGFuZCBjb3BpZXMgdGhlIHJldHVybmVkIHRleHQgaW50byA8ZW0+cmV0dXJuZWRDaGFyczwvZW0+LiA8YnIvPjxici8+Ci0gICAgICogCi0gICAgICogV2hlbiBnZXR0aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGVsZW1lbnQsIG5vbi10ZXh0IGNvbnRlbnQgc3VjaAotICAgICAqIGFzIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUgaWdub3JlZCBhbmQgdGV4dCBpcyBjb25jYXRlbmF0ZWQuCi0gICAgICogRm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBuZXN0ZWQgZWxlbWVudCBjaGlsZHJlbiwgdGhpcwotICAgICAqIHJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCB0ZXh0IG9mIGFsbCBtaXhlZCBjb250ZW50IGFuZCB0aGUKLSAgICAgKiB0ZXh0IG9mIGFsbCB0aGUgZWxlbWVudCBjaGlsZHJlbiwgcmVjdXJzaW5nIGluIGZpcnN0LXRvLWxhc3QKLSAgICAgKiBkZXB0aGZpcnN0IG9yZGVyLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBhdHRyaWJ1dGVzLCB0aGlzIHJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZS48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBGb3IgY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCB0aGlzIHJldHVybnMgdGhlIHRleHQgY29udGVudHMgCi0gICAgICogb2YgdGhlIGNvbW1lbnQgb3IgUEksIG5vdCBpbmNsdWRpbmcgdGhlIGRlbGltaXRpbmcgc2VxdWVuY2VzICZsdDshLS0gLS0mZ3Q7LCAmbHQ7PyA/Jmd0Oy4KLSAgICAgKiA8YnIvPjxici8+Ci0gICAgICogCi0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgRU5ELCBFTkRET0MsIG9yIE5BTUVTUEFDRSwgdGhpcyByZXR1cm5zIDAuIAotICAgICAqIFRoZSB2YWx1ZSBvZiBhbiBlbXB0eSB0YWcgaXMgdGhlIGVtcHR5IHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHJldHVybmVkQ2hhcnMgIEEgY2hhcmFjdGVyIGFycmF5IHRvIGhvbGQgdGhlIHJldHVybmVkIGNoYXJhY3RlcnMuCi0gICAgICogQHBhcmFtICBvZmZzZXQgIFRoZSBwb3NpdGlvbiB3aXRoaW4gcmV0dXJuZWRDaGFycyB0byB3aGljaCB0aGUgZmlyc3Qgb2YgdGhlIAotICAgICAqIHJldHVybmVkIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGNvcGllZC4KLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAotICAgICAqIGxvY2F0aW9uIHRvIGNvcHkuCi0gICAgICogQHJldHVybiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQ7IDAgaWYgbm8gY2hhcmFjdGVycyAKLSAgICAgKiB3ZXJlIGNvcGllZC4KLSAgICAgKi8KLQotICAgIGludCBnZXRUZXh0VmFsdWUgKCBjaGFyW10gcmV0dXJuZWRDaGFycywgaW50IG9mZnNldCwgaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyBvZiB0aGUgY3VycmVudCBURVhUIHRva2VuLiAgSWYgdGhlIGN1cnJlbnQgdG9rZW4KLSAgICAgKiBpcyBub3QgVEVYVCwgcmV0dXJucyAiIi4gIElmIGluIHRoZSBtaWRkbGUgb2YgYSBURVhUIHRva2VuLCByZXR1cm5zCi0gICAgICogdGhvc2UgY2hhcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3Igb2YgdGhlIFRFWFQgdG9rZW4uCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCB0ZXh0OyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGN1cnJlbnQgdG9rZW4gdHlwZSBpcwotICAgICAqIG5vdCBURVhULgotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGV4dCB2YWx1ZSBvZiB0aGUgWE1MIGF0IHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gaWYgdGhhdCBYTUwncwotICAgICAqIHRva2VuIHR5cGUgaXMgU1RBUlQsIFNUQVJURE9DLCBBVFRSLCBDT01NRU5UIG9yIFBST0NJTlNULiA8YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBGb3IgZWxlbWVudHMgdGhhdCBoYXZlIG5lc3RlZCBjaGlsZHJlbiB0aGlzIGZpcnN0IHJlbW92ZXMgYWxsCi0gICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgYW5kIHJlcGxhY2VzIGl0IHdpdGggdGhlIGdpdmVuIHRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0ZXh0ICBUaGUgdGV4dCB0byB1c2UgYXMgYSBuZXcgdmFsdWUuCi0gICAgICogQHRocm93cyAgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAgSWYgdGhlIHRva2VuIHR5cGUgYXQgdGhpcwotICAgICAqIGN1cnNvcidzIGxvY2F0aW9uIGlzIG5vdCBTVEFSVCwgU1RBUlRET0MsIEFUVFIsIENPTU1FTlQgb3IKLSAgICAgKiBQUk9DSU5TVC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFRleHRWYWx1ZSAoIFN0cmluZyB0ZXh0ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGV4dCB2YWx1ZSBvZiB0aGUgWE1MIGF0IHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gKGlmIHRoYXQgWE1MJ3MKLSAgICAgKiB0b2tlbiB0eXBlIGlzIFNUQVJULCBTVEFSVERPQywgQVRUUiwgQ09NTUVOVCBvciBQUk9DSU5TVCkgdG8gdGhlIAotICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFycmF5LiA8YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBGb3IgZWxlbWVudHMgdGhhdCBoYXZlIG5lc3RlZCBjaGlsZHJlbiB0aGlzIGZpcnN0IHJlbW92ZXMgYWxsCi0gICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgYW5kIHJlcGxhY2VzIGl0IHdpdGggdGhlIGdpdmVuIHRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBzb3VyY2VDaGFycyAgQSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgWE1MJ3MgbmV3IHZhbHVlLgotICAgICAqIEBwYXJhbSAgb2Zmc2V0ICBUaGUgcG9zaXRpb24gd2l0aGluIHNvdXJjZUNoYXJzIGZyb20gd2hpY2ggdGhlIGZpcnN0IG9mIAotICAgICAqIHRoZSBzb3VyY2UgY2hhcmFjdGVycyBzaG91bGQgYmUgY29waWVkLgotICAgICAqIEBwYXJhbSAgbGVuZ3RoICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzZXQgYXMgdGhlIFhNTCdzIG5ldwotICAgICAqIHZhbHVlLgotICAgICAqIEB0aHJvd3MgIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSB0b2tlbiB0eXBlIGF0IHRoaXMKLSAgICAgKiBjdXJzb3IncyBsb2NhdGlvbiBpcyBub3QgU1RBUlQsIFNUQVJURE9DLCBBVFRSLCBDT01NRU5UIG9yCi0gICAgICogUFJPQ0lOU1QuCi0gICAgICovCi0gICAgdm9pZCBzZXRUZXh0VmFsdWUgKCBjaGFyW10gc291cmNlQ2hhcnMsIGludCBvZmZzZXQsIGludCBsZW5ndGggKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY2hhcmFjdGVycyB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciB1cCB0byB0aGUgbmV4dCB0b2tlbi4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2hhcnMgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIENvcGllcyBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBudW1iZXIsIGNvdW50aW5nIHJpZ2h0IGZyb20gCi0gICAgICogdGhpcyBjdXJzb3IncyBsb2NhdGlvbiB0byB0aGUgY2hhcmFjdGVyIGF0IDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+LiAgVGhlIAotICAgICAqIHJldHVybmVkIGNoYXJhY3RlcnMgYXJlIGFkZGVkIHRvIDxlbT5yZXR1cm5lZENoYXJzPC9lbT4sIHdpdGggdGhlIGZpcnN0Ci0gICAgICogY2hhcmFjdGVyIGNvcGllZCB0byB0aGUgPGVtPm9mZnNldDwvZW0+IHBvc2l0aW9uLiBUaGUgPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4gCi0gICAgICogcGFyYW1ldGVyIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiA8ZW0+cmV0dXJuZWRDaGFyczwvZW0+IAotICAgICAqIG1pbnVzIDxlbT5vZmZzZXQ8L2VtPi4gQ29waWVzIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIHdoaWNoIGlzIAotICAgICAqIGVpdGhlciA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPiBvciB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIG5leHQgdG9rZW4sIAotICAgICAqIHdoaWNoZXZlciBpcyBsZXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgcmV0dXJuZWRDaGFycyAgQSBjaGFyYWN0ZXIgYXJyYXkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gIG9mZnNldCAgVGhlIHBvc2l0aW9uIHdpdGhpbiByZXR1cm5lZENoYXJzIGF0IHdoaWNoIHRoZSBmaXJzdCBvZiB0aGUgCi0gICAgICogcmV0dXJuZWQgY2hhcmFjdGVycyBzaG91bGQgYmUgYWRkZWQuCi0gICAgICogQHBhcmFtICBtYXhDaGFyYWN0ZXJDb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWZ0ZXIgdGhpcyBjdXJzb3IncyAKLSAgICAgKiBsb2NhdGlvbiB0byByZXR1cm4uCi0gICAgICogQHJldHVybiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyByZXR1cm5lZDsgMCBpZiBubyBjaGFyYWN0ZXJzIAotICAgICAqIHdlcmUgcmV0dXJuZWQgb3IgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IFRFWFQuIAotICAgICAqLwotCi0gICAgaW50IGdldENoYXJzICggY2hhcltdIHJldHVybmVkQ2hhcnMsIGludCBvZmZzZXQsIGludCBtYXhDaGFyYWN0ZXJDb3VudCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIFNUQVJURE9DIHRva2VuLCB3aGljaCBpcyB0aGUgCi0gICAgICogcm9vdCBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0KLSAgICB2b2lkIHRvU3RhcnREb2MgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIEVORERPQyB0b2tlbiwgd2hpY2ggaXMgdGhlIGVuZAotICAgICAqIG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLQotICAgIHZvaWQgdG9FbmREb2MgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIHNwZWNpZmllZCBjdXJzb3IgaXMgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMKLSAgICAgKiB0aGlzIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGN1cnNvciAgVGhlIGN1cnNvciB0aGF0IG1heSBiZSBpbiB0aGUgc2FtZSBkb2N1bWVudAotICAgICAqIGFzIHRoaXMgY3Vyc29yLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjdXJzb3IgaXMgaW4gdGhlIHNhbWUgZG9jdW1lbnQ7Ci0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNJblNhbWVEb2N1bWVudCAoIFhtbEN1cnNvciBjdXJzb3IgKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjdXJzb3IgaXMgYmVmb3JlLCAKLSAgICAgKiBhZnRlciwgb3IgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMgdGhlIHNwZWNpZmllZCBjdXJzb3IuIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiA8Y29kZT5hLmNvbXBhcmVQb3NpdGlvbihiKSA8IDA8L2NvZGU+IG1lYW5zIGEgaXMgdG8gdGhlIGxlZnQgb2YgYi48YnIvPgotICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpID09IDA8L2NvZGU+IG1lYW5zIGEgaXMgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMgYi48YnIvPgotICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpID4gMDwvY29kZT4gbWVhbnMgYSBpcyB0byB0aGUgcmlnaHQgb2YgYi48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBUaGUgc29ydCBvcmRlciBvZiBjdXJzb3JzIGluIHRoZSBkb2N1bWVudCBpcyB0aGUgdG9rZW4gb3JkZXIuCi0gICAgICogRm9yIGV4YW1wbGUsIGlmIGN1cnNvciAiYSIgaXMgYXQgYSBTVEFSVCB0b2tlbiBhbmQgdGhlIGN1cnNvciAiYiIKLSAgICAgKiBpcyBhdCBhIHRva2VuIHdpdGhpbiB0aGUgY29udGVudHMgb2YgdGhlIHNhbWUgZWxlbWVudCwgdGhlbgotICAgICAqIGEuY29tcGFyZVBvc2l0aW9uKGIpIHdpbGwgcmV0dXJuIC0xLCBtZWFuaW5nIHRoYXQgdGhlIHBvc2l0aW9uCi0gICAgICogb2YgYSBpcyBiZWZvcmUgYi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGN1cnNvciAgVGhlIGN1cnNvciB3aG9zZSBwb3NpdGlvbiBzaG91bGQgYmUgY29tcGFyZWQKLSAgICAgKiB3aXRoIHRoaXMgY3Vyc29yLgotICAgICAqIEByZXR1cm4gIDEgaWYgdGhpcyBjdXJzb3IgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBjdXJzb3I7IDAgaWYgCi0gICAgICogdGhpcyBjdXJzb3IgaXMgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMgdGhlIHNwZWNpZmllZCBjdXJzb3I7IAotICAgICAqIC0xIGlmIHRoaXMgY3Vyc29yIGlzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGN1cnNvci4KLSAgICAgKiBAdGhyb3dzICBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgc3BlY2lmaWVkCi0gICAgICogY3Vyc29yIGlzIG5vdCBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcyB0aGlzIGN1cnNvci4KLSAgICAgKi8KLQotICAgIGludCBjb21wYXJlUG9zaXRpb24gKCBYbWxDdXJzb3IgY3Vyc29yICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgbGVmdCBvZiAob3IgYmVmb3JlKQotICAgICAqIHRoZSBzcGVjaWZpZWQgY3Vyc29yLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcyAKLSAgICAgKiA8Y29kZT5hLmNvbXBhcmVQb3NpdGlvbihiKSAmbHQ7IDAgPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAotICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgbGVmdCBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogY3Vyc29yOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0xlZnRPZiAoIFhtbEN1cnNvciBjdXJzb3IgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgY3Vyc29yIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzCi0gICAgICogdGhlIHNwZWNpZmllZCBjdXJzb3IuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIAotICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpID09IDAgPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAotICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIGN1cnNvciBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGN1cnNvcjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNBdFNhbWVQb3NpdGlvbkFzICggWG1sQ3Vyc29yIGN1cnNvciApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhpcyBjdXJzb3IgaXMgdG8gdGhlIHJpZ2h0IG9mIChvciBhZnRlcikKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGN1cnNvci4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXMgCi0gICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgJmd0OyAwIDwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGN1cnNvciAgVGhlIGN1cnNvciB3aG9zZSBwb3NpdGlvbiBzaG91bGQgYmUgY29tcGFyZWQKLSAgICAgKiB3aXRoIHRoaXMgY3Vyc29yLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyBjdXJzb3IgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjdXJzb3I7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzUmlnaHRPZiAoIFhtbEN1cnNvciBjdXJzb3IgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIFhRdWVyeSBleHByZXNzaW9uIGFnYWluc3QgdGhlIFhNTCB0aGlzCi0gICAgICogY3Vyc29yIGlzIGluLiA8YnIvPjxici8+Ci0gICAgICogCi0gICAgICogVGhlIHF1ZXJ5IG1heSBiZSBhIFN0cmluZyBvciBhIGNvbXBpbGVkIHF1ZXJ5LiBZb3UgY2FuIHByZWNvbXBpbGUKLSAgICAgKiBhbiBYUXVlcnkgZXhwcmVzc2lvbiB1c2luZyB0aGUgWG1sQmVhbnMuY29tcGlsZVF1ZXJ5IG1ldGhvZC4gPGJyLz48YnI+Ci0gICAgICogCi0gICAgICogVGhlIHJvb3QgcmVmZXJyZWQgdG8gYnkgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIGdpdmVuIGFzIAotICAgICAqIGEgZG90LiBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgcGF0aCBleHByZXNzaW9uOgotICAgICAqIDxwcmU+Ci0gICAgICogWG1sQ3Vyc29yIHJlc3VsdHMgPSBjdXJzb3IuZXhlY1F1ZXJ5KCJwdXJjaGFzZS1vcmRlci9saW5lLWl0ZW1bcHJpY2UgJmx0Oz0gMjAuMDBdIik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBxdWVyeSAgVGhlIFhRdWVyeSBleHByZXNzaW9uIHRvIGV4ZWN1dGUuCi0gICAgICogQHJldHVybiAgQSBjdXJzb3IgY29udGFpbmluZyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuCi0gICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAgKi8KLQotICAgIFhtbEN1cnNvciBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIFhRdWVyeSBleHByZXNzaW9uIGFnYWluc3QgdGhlIFhNTCB0aGlzCi0gICAgICogY3Vyc29yIGlzIGluLCBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCBvcHRpb25zLiA8YnIvPjxici8+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBxdWVyeSAgVGhlIFhRdWVyeSBleHByZXNzaW9uIHRvIGV4ZWN1dGUuCi0gICAgICogQHBhcmFtICBvcHRpb25zICBPcHRpb25zIGZvciB0aGUgcXVlcnkuIEZvciBleGFtcGxlLCB5b3UgY2FuIGNhbGwgCi0gICAgICogdGhlIHtAbGluayBYbWxPcHRpb25zI3NldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZykgWG1sT3B0aW9ucy5zZXRYcXVlcnlDdXJyZW50Tm9kZVZhcihTdHJpbmcpfQotICAgICAqIG1ldGhvZCB0byBzcGVjaWZ5IGEgcGFydGljdWxhciBuYW1lIGZvciB0aGUgcXVlcnkgZXhwcmVzc2lvbiAKLSAgICAgKiB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dCBub2RlLgotICAgICAqIEB0aHJvd3MgIFhtbFJ1bnRpbWVFeGNlcHRpb24gIElmIHRoZSBxdWVyeSBleHByZXNzaW9uIGlzIGludmFsaWQuCi0gICAgICovCi0KLSAgICBYbWxDdXJzb3IgZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5LCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIGRjb3VtZW50IGF0IGEgcGFydGljdWxhciBwb2ludAotICAgICAqIGluIHRpbWUuICBJdCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGRvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQKLSAgICAgKiBzaW5jZSB0aGF0IHBvaW50IGluIHRpbWUuCi0gICAgICovCi0gICAgaW50ZXJmYWNlIENoYW5nZVN0YW1wCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZG9jdW1lbnQgYXNzb2lhdGVkIHdpdGggdGhpcyBDaGFuZ2VTdGFtcAotICAgICAgICAgKiBoYXMgYmVlbiBhbHRlcmVkIHNpbmNlIHRoZSBDaGFuZ2VTdGFtcCBoYWQgYmVlbiBjcmVhdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZCAoICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY2hhbmdlIHN0YW1wIGZvciB0aGUgZG9jdW1lbnQgdGhlIGN1cnJlbnQgY3Vyc29yIGlzIGluLiAKLSAgICAgKiBUaGlzIGNoYW5nZSBzdGFtcCBjYW4gYmUgcXVlcmllZCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUgdG8gZmluZCBvdXQKLSAgICAgKiBpZiB0aGUgZG9jdW1lbnQgaGFzIGNoYW5nZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIGNoYW5nZSBzdGFtcCBmb3IgdGhlIGRvY3VtZW50IHRoZSBjdXJyZW50IGN1cnNvciBpcyBpbi4KLSAgICAgKi8KLSAgICBDaGFuZ2VTdGFtcCBnZXREb2NDaGFuZ2VTdGFtcCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3ViY2xhc3NlcyBvZiBYbWxCb29rbWFyayBjYW4gYmUgdXNlZCB0byBhbm5vdGF0ZSBhbiBYTUwgZG9jdW1lbnQuCi0gICAgICogVGhpcyBjbGFzcyBpcyBhYnN0cmFjdCB0byBwcmV2ZW50IHBhcnRpZXMgZnJvbSBpbmFkdmVydGVudGx5IAotICAgICAqIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcnMnIGJvb2ttYXJrcyB3aXRob3V0IGV4cGxpY2l0bHkKLSAgICAgKiBzaGFyaW5nIGEgYm9va21hcmsgY2xhc3MuCi0gICAgICovCi0KLSAgICBhYnN0cmFjdCBjbGFzcyBYbWxCb29rbWFyawotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBzdHJvbmdseS1yZWZlcmVuY2VkIGJvb2ttYXJrLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBYbWxCb29rbWFyayAoICkgeyB0aGlzKCBmYWxzZSApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIGJvb2ttYXJrLgotICAgICAgICAgKiBAcGFyYW0gd2VhayB0cnVlIGlmIHRoZSBkb2N1bWVudCdzIHJlZmVyZW5jZSB0byB0aGUgYm9va21hcmsgc2hvdWxkIGJlIGEgV2Vha1JlZmVyZW5jZQotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBYbWxCb29rbWFyayAoIGJvb2xlYW4gd2VhayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZWYgPSB3ZWFrID8gbmV3IFdlYWtSZWZlcmVuY2UoIHRoaXMgKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsIHRoZSBjcmVhdGVDdXJzb3IgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBjdXJzb3Igd2hpY2ggaXMKLSAgICAgICAgICogcG9zaXRpb25lZCBhdCB0aGUgc2FtZSBzcGxhY2UgYXMgdGhlIGJvb2ttYXJrLiAgSXQgaXMgbXVjaCBtb3JlCi0gICAgICAgICAqIGVmZmljaWVudCB0byBjYWxsIHRvQm9va21hcmsgb24gYW4gZXhpc3RpbmcgY3Vyc29yIHRoYW4gaXQKLSAgICAgICAgICogaXMgdG8gY3JlYXRlIGEgbmV3IGN1cnNvci4gIEhvd2V2ZXIsIHRvQm9va21hcmsgbWF5IGZhaWwgaWYgdGhlCi0gICAgICAgICAqIGJvb2ttYXJrIGlzIGluIGEgZGlmZmVyZW50IGRvY3VtZW50IHRoYW4gdGhlIGN1cnNvci4gIEl0IGlzCi0gICAgICAgICAqIHVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXMgd2hlcmUgY3JlYXRlQ3Vyc29yIG5lZWRzIHRvIGJlIGNhbGxlZAotICAgICAgICAgKiBvbiB0aGUgYm9va21hcmsuICBTdWJzZXF1ZW50IG5hdmlnYXRpb25zIHRvIGJvb2ttYXJrCi0gICAgICAgICAqIHBvc2l0aW9ucyBzaG91bGQgYXR0ZW1wdCB0byByZXVzZSB0aGUgbGFzdCBjdXJzb3IgdG8KLSAgICAgICAgICogaW1wcm92ZSBwZXJmb3JtYWNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGZpbmFsIFhtbEN1cnNvciBjcmVhdGVDdXJzb3IgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY3VycmVudE1hcmsgPT0gbnVsbCA/IG51bGwgOiBfY3VycmVudE1hcmsuY3JlYXRlQ3Vyc29yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTW92ZXMgdGhlIGdpdmVuIGN1cnNvciB0byB0aGlzIGJvb2ttYXJrLCBhbmQgcmV0dXJucyBpdC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZmluYWwgWG1sQ3Vyc29yIHRvQm9va21hcmsgKCBYbWxDdXJzb3IgYyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjID09IG51bGwgfHwgIWMudG9Cb29rbWFyayggdGhpcyApID8gY3JlYXRlQ3Vyc29yKCkgOiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IGtleSBmb3IgYm9va21hcmtzIGlzIHRoZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzCi0gICAgICAgICAqIHRoZW0uICBUaGlzIHdheSwgbXVsdGlwbGUgcGFydGllcyB1c2luZyBib29rbWFya3MgaW4gdGhlCi0gICAgICAgICAqIHNhbWUgaW5zdGFuY2UgZG9jdW1lbnQgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggZWFjaG90aGVyLgotICAgICAgICAgKiBPbmUgY2FuLCBob3dldmVyLCBvdmVycmlkZSBnZXRLZXkoKSB0byB1c2UgYSBrZXkgb3RoZXIgdGhhbgotICAgICAgICAgKiB0aGUgY2xhc3MuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtYXJrIGlzIHNldCBieSB0aGUgaG9zdCBkb2N1bWVudDsgaXQgaXMgY2FwYWJsZSBvZgotICAgICAgICAgKiByZXR1cm5pbmcgYW4gWG1sQ3Vyc29yIGltcGxlbWVudGF0aW9uIGF0IHRoZSBsb2NhdGlvbiBvZgotICAgICAgICAgKiB0aGUgYm9va21hcmsuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljICAgICAgIFhtbE1hcmsgICBfY3VycmVudE1hcms7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogSWYgbm9uLW51bGwsIHRoZSByZWYgaXMgdXNlZCBieSB0aGUgaG9zdCBkb2N1bWVudAotICAgICAgICAgKiB0byBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgYm9va21hcmsuICBJZiBpdCBpcyBhIHdlYWsKLSAgICAgICAgICogcmVmZXJlbmNlLCB0aGUgaG9zdCBkb2N1bWVudCB3aWxsIG5vdCBwcmV2ZW50IHRoZSBCb29rbWFyawotICAgICAgICAgKiBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBmaW5hbCBSZWZlcmVuY2UgX3JlZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhYnN0cmFjdCB7QGxpbmsgWG1sQ3Vyc29yfSBmYWN0b3J5LgotICAgICAqIEltcGxlbWVudGF0aW9ucyBvZiBYbWxDdXJzb3IgaW1wbGVtZW50IFhtbE1hcmsgdG8gYmUgYWJsZSB0bwotICAgICAqIHJlY29uc3RpdHV0ZSBhIGN1cnNvciBmcm9tIGEgYm9va21hcmsuIFdoZW4gY29udGVudCBtb3ZlcyBiZXR3ZWVuCi0gICAgICogaW1wbGVtZW50YXRpb25zLCB0aGUgWG1sTWFyayBpcyBzZXQgdG8gdGhlIGltcGxtZW50YXRpb24ncyB3aGljaAotICAgICAqIHJlY2lldmVzIHRoZSBuZXcgY29udGVudC4KLSAgICAgKi8KLQotICAgIGludGVyZmFjZSBYbWxNYXJrCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3JlYXRlQ3Vyc29yICggKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgYm9va21hcmsgdG8gdGhlIGRvY3VtZW50IGF0IHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICoKLSAgICAgKiBUaGUgYm9va21hcmsgaXMgYXR0YWNoZWQgdG8gdGhlIHRva2VuIGluIHRoZSB0cmVlIGltbWVkaWF0ZWx5IAotICAgICAqIGFmdGVyIHRoZSBjdXJzb3IuIElmIHRoZSB0cmVlIGlzIG1hbmlwdWxhdGVkIHRvIG1vdmUKLSAgICAgKiB0aGF0IG9iamVjdCB0byBhIGRpZmZlcmVudCBwbGFjZSwgdGhlIGJvb2ttYXJrIG1vdmVzIHdpdGggaXQuCi0gICAgICogSWYgdGhlIHRyZWUgaXMgbWFuaXB1bGF0ZWQgdG8gZGVsZXRlIHRoYXQgdG9rZW4gZnJvbSB0aGUKLSAgICAgKiB0cmVlLCB0aGUgYm9va21hcmsgaXMgb3JwaGFuZWQuIENvcHkgb3BlcmF0aW9ucyBkbyBub3QgY29weQotICAgICAqIGJvb2ttYXJrcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGJvb2ttYXJrICBUaGUgYm9va21hcmsgdG8gc2V0LgotICAgICAqLwotCi0gICAgdm9pZCBzZXRCb29rbWFyayAoIFhtbEJvb2ttYXJrIGJvb2ttYXJrICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBib29rbWFyayB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IAotICAgICAqIGF0IHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24uIElmIHRoZXJlIGlzIG5vIGJvb2ttYXJrIHdob3NlIGtleSBpcyAKLSAgICAgKiBnaXZlbiBieSB0aGUgc3BlY2lmaWVkIGtleSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgbnVsbCBpcyByZXR1cm5lZC4gCi0gICAgICogSWYgdGhlIHtAbGluayBYbWxDdXJzb3IuWG1sQm9va21hcmsjZ2V0S2V5KCkgZ2V0S2V5fSBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4gb24gCi0gICAgICogdGhlIGJvb2ttYXJrLCB0aGVuIHRoZSBib29rbWFyaydzIGNsYXNzIGlzIHVzZWQgYXMgdGhlIGtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGtleSAgVGhlIGtleSBmb3IgdGhlIGJvb2ttYXJrIHRvIHJldHJpZXZlLgotICAgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgYm9va21hcms7IG51bGwgaWYgdGhlcmUgaXMgbm8gYm9va21hcmsKLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqLwotCi0gICAgWG1sQm9va21hcmsgZ2V0Qm9va21hcmsgKCBPYmplY3Qga2V5ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBib29rbWFyayB3aG9zZSBrZXkgaXMgc3BlY2lmaWVkLCBpZiB0aGUgYm9va21hcmsKLSAgICAgKiBleGlzdHMgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGtleSAgVGhlIGZvciB0aGUgYm9va21hcmsgdG8gY2xlYXIuCi0gICAgICovCi0KLSAgICB2b2lkIGNsZWFyQm9va21hcmsgKCBPYmplY3Qga2V5ICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSBib29rbWFya3MgYXQgdGhpcyBsb2NhdGlvbiwgYWRkaW5nIHRoZW0gdG8KLSAgICAgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uIEJvb2ttYXJrcyBoZWxkIGJ5IHdlYWsgcmVmZXJlbmNlcyBhcmUKLSAgICAgKiBhZGRlZCB0byB0aGlzIGNvbGxlY3Rpb24gYXMgV2VhayByZWZlcmVuY2VkIG9iamVjdHMgcG9pbnRpbmcgdG8gdGhlCi0gICAgICogYm9va21hcmsuCi0gICAgICogCi0gICAgICogQHBhcmFtICBsaXN0VG9GaWxsICBUaGUgY29sbGVjdGlvbiB0aGF0IHdpbGwgY29udGFpbiBib29rbWFya3MKLSAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4KLSAgICAgKi8KLQotICAgIHZvaWQgZ2V0QWxsQm9va21hcmtSZWZzICggQ29sbGVjdGlvbiBsaXN0VG9GaWxsICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBYTUwgdGhhdCBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBGb3IgdGhlIFRFWFQsIEFUVFIsIE5BTUVTUEFDRSwgQ09NTUVOVCBhbmQgUFJPQ0lOU1QgdG9rZW5zLCBhIHNpbmdsZSAKLSAgICAgKiB0b2tlbiBpcyByZW1vdmVkLiBGb3IgYSBTVEFSVCB0b2tlbiwgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBhbmQgYWxsIAotICAgICAqIG9mIGl0cyBjb250ZW50cyBhcmUgcmVtb3ZlZC4gRm9yIGFsbCBvdGhlciB0b2tlbnMsIHRoaXMgaXMgYSBuby1vcC4gCi0gICAgICogWW91IGNhbm5vdCByZW1vdmUgYSBTVEFSVERPQy4KLSAgICAgKiAKLSAgICAgKiBUaGUgY3Vyc29ycyBsb2NhdGVkIGluIHRoZSBYTUwgdGhhdCB3YXMgcmVtb3ZlZCBhbGwgY29sbGFwc2UgdG8gdGhlIAotICAgICAqIHNhbWUgbG9jYXRpb24uIEFsbCBib29rbWFya3MgaW4gdGhpcyBYTUwgd2lsbCBiZSBvcnBoYW5lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55dGhpbmcgd2FzIHJlbW92ZWQ7IGZhbHNlIG9ubHkgaWYgdGhlIGN1cnNvciBpcyAKLSAgICAgKiBqdXN0IGJlZm9yZSBFTkQgb3IgRU5ERE9DIHRva2VuLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGN1cnNvciBpcyBhdCBhIAotICAgICAqIFNUQVJURE9DIHRva2VuLgotICAgICAqLwotCi0gICAgYm9vbGVhbiByZW1vdmVYbWwgKCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIFhNTCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGN1cnNvciB0byB0aGUgbG9jYXRpb24KLSAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIDxlbT50b0hlcmU8L2VtPiBjdXJzb3IsIHNoaWZ0aW5nIFhNTCBhdCB0aGF0IGxvY2F0aW9uIAotICAgICAqIHRvIHRoZSByaWdodCB0byBtYWtlIHJvb20uIEZvciB0aGUgVEVYVCwgQVRUUiwgTkFNRVNQQUNFLCAKLSAgICAgKiBDT01NRU5UIGFuZCBQUk9DSU5TVCB0b2tlbnMsIGEgc2luZ2xlIHRva2VuIGlzIG1vdmVkLiBGb3IgYSBzdGFydCB0b2tlbiwgdGhlCi0gICAgICogZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBjb250ZW50cyBhcmUgbW92ZWQuIEZvciBhbGwgb3RoZXIgdG9rZW5zLCB0aGlzCi0gICAgICogaXMgYSBuby1vcC4KLSAgICAgKiAKLSAgICAgKiBUaGUgYm9va21hcmtzIGxvY2F0ZWQgaW4gdGhlIFhNTCB0aGF0IHdhcyBtb3ZlZCBhbHNvIG1vdmUgdG8gdGhlCi0gICAgICogbmV3IGxvY2F0aW9uOyB0aGUgY3Vyc29ycyBkb24ndCBtb3ZlIHdpdGggdGhlIGNvbnRlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkCi0gICAgICogYmUgbW92ZWQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFueXRoaW5nIHdhcyBtb3ZlZDsgZmFsc2Ugb25seSBpZiB0aGUgY3Vyc29yIGlzIAotICAgICAqIGp1c3QgYmVmb3JlIEVORCBvciBFTkRET0MgdG9rZW4uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBtb3ZlWG1sICggWG1sQ3Vyc29yIHRvSGVyZSApOwotICAgIAotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgWE1MIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbgotICAgICAqIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvci4gRm9yIHRoZSBURVhULCBBVFRSLCBOQU1FU1BBQ0UsIAotICAgICAqIENPTU1FTlQgYW5kIFBST0NJTlNUIHRva2VucywgYSBzaW5nbGUgdG9rZW4gaXMgY29waWVkLiAgRm9yIGEgc3RhcnQgdG9rZW4sIAotICAgICAqIHRoZSBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzIGFyZSBjb3BpZWQuIEZvciBhbGwgb3RoZXIgdG9rZW5zLCB0aGlzCi0gICAgICogaXMgYSBuby1vcC4KLSAgICAgKiAKLSAgICAgKiBUaGUgY3Vyc29ycyBhbmQgYm9va21hcmtzIGxvY2F0ZWQgaW4gdGhlIFhNTCB0aGF0IHdhcyBjb3BpZWQgYXJlIGFsc28gY29waWVkIAotICAgICAqIHRvIHRoZSBuZXcgbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkCi0gICAgICogYmUgY29waWVkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgY29waWVkOyBmYWxzZSBpZiB0aGUgdG9rZW4gc3VwcG9ydHMgdGhlIG9wZXJhdGlvbiwKLSAgICAgKiBidXQgbm90aGluZyB3YXMgY29waWVkLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gY29weVhtbCAoIFhtbEN1cnNvciB0b0hlcmUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyIChTVEFSVERPQyBPUiBTVEFSVCkgaW1tZWRpYXRlbHkgYWZ0ZXIKLSAgICAgKiB0aGlzIGN1cnNvci4gRm9yIGFsbCBvdGhlciBzaXR1YXRpb25zLCByZXR1cm5zIGZhbHNlLiBEb2VzCi0gICAgICogbm90IHJlbW92ZSBhdHRyaWJ1dGVzIG9yIG5hbXNwYWNlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55dGhpbmcgd2FzIGNvcGllZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gcmVtb3ZlWG1sQ29udGVudHMgKCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIgKFNUQVJURE9DIE9SIFNUQVJUKSBpbW1lZGlhdGVseSBhZnRlcgotICAgICAqIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIDxlbT50b0hlcmU8L2VtPiBjdXJzb3IuCi0gICAgICogRm9yIGFsbCBvdGhlciBzaXR1YXRpb25zLCByZXR1cm5zIGZhbHNlLiBEb2VzIG5vdCBtb3ZlIGF0dHJpYnV0ZXMgb3IKLSAgICAgKiBuYW1lc3BhY2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgdG9IZXJlICBUaGUgY3Vyc29yIGF0IHRoZSBsb2NhdGlvbiB0byB3aGljaCB0aGUgWE1MIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55dGhpbmcgd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gbW92ZVhtbENvbnRlbnRzICggWG1sQ3Vyc29yIHRvSGVyZSApOwotICAgIAotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciAoU1RBUlRET0MgT1IgU1RBUlQpIGltbWVkaWF0ZWx5IHRvCi0gICAgICogdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvci4KLSAgICAgKiBGb3IgYWxsIG90aGVyIHNpdHVhdGlvbnMsIHJldHVybnMgZmFsc2UuICBEb2VzIG5vdCBjb3B5IGF0dHJpYnV0ZXMgb3IKLSAgICAgKiBuYW1lc3BhY2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgdG9IZXJlICBUaGUgY3Vyc29yIGF0IHRoZSBsb2NhdGlvbiB0byB3aGljaCB0aGUgWE1MIHNob3VsZAotICAgICAqIGJlIGNvcGllZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55dGhpbmcgd2FzIGNvcGllZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvcHlYbWxDb250ZW50cyAoIFhtbEN1cnNvciB0b0hlcmUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlciwgY291bnRpbmcgcmlnaHQgZnJvbSAKLSAgICAgKiB0aGlzIGN1cnNvcidzIGxvY2F0aW9uIHRvIHRoZSBjaGFyYWN0ZXIgYXQgPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4uIFRoZSAKLSAgICAgKiBzcGFjZSByZW1haW5pbmcgZnJvbSByZW1vdmluZyB0aGUgY2hhcmFjdGVycyBjb2xsYXBzZXMgdXAgdG8gdGhpcyBjdXJzb3IuCi0gICAgICogCi0gICAgICogQHBhcmFtICBtYXhDaGFyYWN0ZXJDb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWZ0ZXIgdGhpcyBjdXJzb3IncyAKLSAgICAgKiBsb2NhdGlvbiB0byByZW1vdmUuCi0gICAgICogQHJldHVybiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIGludCByZW1vdmVDaGFycyAoIGludCBtYXhDaGFyYWN0ZXJDb3VudCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgY2hhcmFjdGVycyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGN1cnNvciB0byB0aGUgcG9zaXRpb24gaW1tZWRpYXRlbHkgCi0gICAgICogYWZ0ZXIgdGhlIHNwZWNpZmllZCBjdXJzb3IuIENoYXJhY3RlcnMgYXJlIGNvdW50ZWQgdG8gdGhlIHJpZ2h0IHVwIHRvIHRoZQotICAgICAqIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlci4gWE1MIGFmdGVyIHRoZSBkZXN0aW5hdGlvbiBjdXJzb3IgaXMgCi0gICAgICogc2hpZnRlZCB0byB0aGUgcmlnaHQgdG8gbWFrZSByb29tLiBUaGUgc3BhY2UgcmVtYWluaW5nIGZyb20gbW92aW5nIHRoZSAKLSAgICAgKiBjaGFyYWN0ZXJzIGNvbGxhcHNlcyB1cCB0byB0aGlzIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAotICAgICAqIGxvY2F0aW9uIHRvIG1vdmUuCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgdG8gd2hpY2ggdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgbW92ZWQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgaW50IG1vdmVDaGFycyAoIGludCBtYXhDaGFyYWN0ZXJDb3VudCwgWG1sQ3Vyc29yIHRvSGVyZSApOwotCi0gICAgLyoqCi0gICAgICogQ29waWVzIGNoYXJhY3RlcnMgdG8gdGhlIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgotICAgICAqIENoYXJhY3RlcnMgYXJlIGNvdW50ZWQgdG8gdGhlIHJpZ2h0IHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBudW1iZXIuIAotICAgICAqIFhNTCBhZnRlciB0aGUgZGVzdGluYXRpb24gY3Vyc29yIGlzIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IHRvIG1ha2Ugcm9vbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAotICAgICAqIGxvY2F0aW9uIHRvIGNvcHkuCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgdG8gd2hpY2ggdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGNvcGllZC4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICBpbnQgY29weUNoYXJzICggaW50IG1heENoYXJhY3RlckNvdW50LCBYbWxDdXJzb3IgdG9IZXJlICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgdGV4dCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSB0ZXh0IHRvIGluc2VydC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydENoYXJzICggU3RyaW5nIHRleHQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGFuIGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyAKLSAgICAgKiB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEVsZW1lbnQgKCBRTmFtZSBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGFuIGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyAKLSAgICAgKiB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtICBsb2NhbE5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIGxvY2FsTmFtZSApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgdGhlCi0gICAgICogZWxlbWVudCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUgYW5kIGFzc29jaWF0aW5nIGl0IHdpdGggc3BlY2lmaWVkIG5hbWVzcGFjZSAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBlbGVtZW50J3MgbmFtZXNwYWNlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB1cmkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgYXJvdW5kIHRoaXMgY3Vyc29yLCBnaXZpbmcgdGhlIGVsZW1lbnQgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBxdWFsaWZpZWQgbmFtZS4gQWZ0ZXIgdGhlIGVsZW1lbnQgaXMgaW5zZXJ0ZWQsIHRoaXMgY3Vyc29yIGlzIGJldHdlZW4gaXRzIHN0YXJ0IAotICAgICAqIGFuZCBlbmQuIFRoaXMgY3Vyc29yIGNhbiB0aGVuIGJlIHVzZWQgdG8gaW5zZXJ0IGFkZGl0aW9uYWwgWE1MIGludG8gCi0gICAgICogdGhlIG5ldyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBiZWdpbkVsZW1lbnQgKCBRTmFtZSBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgYXJvdW5kIHRoaXMgY3Vyc29yLCBnaXZpbmcgdGhlIGVsZW1lbnQgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBsb2NhbCBuYW1lLiBBZnRlciB0aGUgZWxlbWVudCBpcyBpbnNlcnRlZCwgdGhpcyBjdXJzb3IgaXMgYmV0d2VlbiBpdHMgc3RhcnQgCi0gICAgICogYW5kIGVuZC4gVGhpcyBjdXJzb3IgY2FuIHRoZW4gYmUgdXNlZCB0byBpbnNlcnQgYWRkaXRpb25hbCBYTUwgaW50byAKLSAgICAgKiB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBsb2NhbE5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBiZWdpbkVsZW1lbnQgKCBTdHJpbmcgbG9jYWxOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgYXJvdW5kIHRoaXMgY3Vyc29yLCBnaXZpbmcgdGhlIGVsZW1lbnQgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBsb2NhbCBuYW1lIGFuZCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLiBBZnRlciB0aGUgZWxlbWVudCAKLSAgICAgKiBpcyBpbnNlcnRlZCwgdGhpcyBjdXJzb3IgaXMgYmV0d2VlbiBpdHMgc3RhcnQgYW5kIGVuZC4gVGhpcyBjdXJzb3IgCi0gICAgICogY2FuIHRoZW4gYmUgdXNlZCB0byBpbnNlcnQgYWRkaXRpb25hbCBYTUwgaW50byB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBsb2NhbE5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHBhcmFtICB1cmkgIFRoZSBVUkkgZm9yIHRoZSBuZXcgZWxlbWVudCdzIG5hbWVzcGFjZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB1cmkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyB0aGUKLSAgICAgKiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUgYW5kIGNvbnRlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSBjb250ZW50IGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRFbGVtZW50V2l0aFRleHQgKCBRTmFtZSBuYW1lLCBTdHJpbmcgdGV4dCApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgdGhlCi0gICAgICogZWxlbWVudCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUgYW5kIGNvbnRlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBsb2NhbE5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHBhcmFtICB0ZXh0ICBUaGUgY29udGVudCBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHRleHQgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIHRoZQotICAgICAqIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lLCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLCAKLSAgICAgKiBhbmQgZ2l2aW5nIGl0IHRoZSBzcGVjaWZpZWQgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBlbGVtZW50J3MgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIGNvbnRlbnQgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB1cmksIFN0cmluZyB0ZXh0ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBhdHRyaWJ1dGUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAotICAgICAqIHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggU3RyaW5nIGxvY2FsTmFtZSApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBhdHRyaWJ1dGUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAotICAgICAqIHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSAgdXJpICBUaGUgVVJJIGZvciB0aGUgbmV3IGF0dHJpYnV0ZSdzIG5hbWVzcGFjZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB1cmkgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgYXR0cmlidXRlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKLSAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBRTmFtZSBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0Ci0gICAgICogdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIE5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgdmFsdWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlICggU3RyaW5nIE5hbWUsIFN0cmluZyB2YWx1ZSApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhbiBhdHRyaWJ1dGUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0Ci0gICAgICogdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB2YWx1ZSwgYW5kIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtICB1cmkgIFRoZSBVUkkgZm9yIHRoZSBuZXcgYXR0cmlidXRlJ3MgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIHZhbHVlICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGFuIGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKLSAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKCBRTmFtZSBuYW1lLCBTdHJpbmcgdmFsdWUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3Vyc29yJ3MgbG9jYXRpb24sIAotICAgICAqIGdpdmluZyBpdCB0aGUgc3BlY2lmaWVkIHByZWZpeCBhbmQgVVJJLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgcHJlZml4ICBUaGUgcHJlZml4IGZvciB0aGUgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICBUaGUgVVJJIGZvciB0aGUgbmFtZXNwYWNlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0TmFtZXNwYWNlICggU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gWE1MIGNvbW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgCi0gICAgICogZ2l2aW5nIGl0IHRoZSBzcGVjaWZpZWQgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSBuZXcgY29tbWVudCdzIGNvbnRlbnQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRDb21tZW50ICggU3RyaW5nIHRleHQgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgCi0gICAgICogZ2l2aW5nIGl0IHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGFuZCB0ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgdGFyZ2V0ICBUaGUgdGFyZ2V0IGZvciB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSBuZXcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbidzIHRleHQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRQcm9jSW5zdCAoIFN0cmluZyB0YXJnZXQsIFN0cmluZyB0ZXh0ICk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlZTZhZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlIj54czpkYXRlPC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgRGF0ZX0sIGFuZCB7QGxpbmsgR0RhdGV9LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbERhdGUgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZGF0ZSIpOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldERhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgRGF0ZSBkYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChEYXRlIGQpOwotCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KLSAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCi0gICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9ICovCi0gICAgRGF0ZSBnZXREYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9ICovCi0gICAgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBkKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRGF0ZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRGF0ZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRGF0ZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sRGF0ZX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2LTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMtMDYtMTQmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZVRpbWUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjdhZWUwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSI+eHM6ZGF0ZVRpbWU8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0sIHtAbGluayBEYXRlfSwgYW5kIHtAbGluayBHRGF0ZX0uCi0gKiAKLSAqIEBzZWUgWG1sQ2FsZW5kYXIKLSAqIEBzZWUgR0RhdGUKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRGF0ZVRpbWUgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZGF0ZVRpbWUiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldERhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgRGF0ZSBkYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChEYXRlIGQpOwotCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KLSAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCi0gICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9ICovCi0gICAgRGF0ZSBnZXREYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9ICovCi0gICAgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBkKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRGF0ZVRpbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGVUaW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGVUaW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbERhdGVUaW1lfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMtMDYtMTRUMTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNi0xNFQxMjowMDowMCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEZWNpbWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjQyYzYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIEJpZ0RlY2ltYWx9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxEZWNpbWFsIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2RlY2ltYWwiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9ICovCi0gICAgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9ICovCi0gICAgdm9pZCBzZXRCaWdEZWNpbWFsVmFsdWUoQmlnRGVjaW1hbCBiZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0QmlnRGVjaW1hbFZhbHVlfQotICAgICAqKi8KLSAgICBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRCaWdEZWNpbWFsVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEJpZ0RlY2ltYWwgYmQpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxEZWNpbWFsfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEZWNpbWFsfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEZWNpbWFsfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxEZWNpbWFsfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQuNTY3ODkmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNC41Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb2N1bWVudFByb3BlcnRpZXMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb2N1bWVudFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViMjY1OC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRG9jdW1lbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYXR0YWNoIGFyYml0cmFyeSBpbmZvcm1hdGlvbiB0byBhbiBYTUwKLSAqIGRvY3VtZW50LiAgSXQgYWxzbyBkZWZpbmVzIHNldmVyYWwgd2VsbC1rbm93biB0eXBlcyBvZgotICogaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgYXR0YWNoZWQgb3IgZm91bmQgb24gYSBkb2N1bWVudC4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IHdhbnRlZCB0byBhc3NvY2lhdGUgYSBmaWxlbmFtZQotICogd2l0aCB0aGUgZG9jdW1lbnQgY29udGFpbmluZyBhbiB4bWwgb2JqZWN0ICJ4b2JqIi4gIFRoaXMKLSAqIGNvdWxkIGJlIGRvbmUgdmlhIHRoZSBmb2xsb3dpbmcgY29kZToKLSAqIDxwPgotICogdG9rZW5Tb3VyY2UuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuc2V0KFhtbERvY3VtZW50UHJvcGVydGllcy5OQU1FLCAiTXlGaWxlbmFtZS54bWwiKTsKLSAqIDxwPgotICogVG8gZmV0Y2ggdGhlIGZpbGVuYW1lIGxhdGVyLCBnaXZlbiBhbiB4b2JqMiBhbnl3aGVyZSBpbiB0aGUKLSAqIHNhbWUgZG9jdW1lbnQsIHlvdSBjYW4gd3JpdGU6Ci0gKiA8cD4KLSAqIGZpbGVuYW1lID0gKFN0cmluZyl0b2tlblNvdXJjZS5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXQoWG1sRG9jdW1lbnRQcm9wZXJ0aWVzLk5BTUUpOwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzCi17Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgWE1MIGRvY3VtZW50IGZpbGUuICBUeXBpY2FsbHkgYSBVUkwsIGJ1dCBtYXkKLSAgICAgKiBiZSBhbnkgU3RyaW5nLgotICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBuYW1lIHRvIHNldAotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXREb2N1bWVudFNvdXJjZU5hbWUKLSAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldFNvdXJjZU5hbWUgKCBTdHJpbmcgc291cmNlTmFtZSApIHsgcHV0KCBTT1VSQ0VfTkFNRSwgc291cmNlTmFtZSApOyB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgWE1MIGRvY3VtZW50IGZpbGUuICBUeXBpY2FsbHkgYSBVUkwsIGJ1dCBtYXkKLSAgICAgKiBiZSBhbnkgU3RyaW5nLgotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXREb2N1bWVudFNvdXJjZU5hbWUKLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIFNPVVJDRV9OQU1FICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSBYTUwgZG9jdW1lbnQuICBTaG91bGQgYmUgYSB2YWxpZAotICAgICAqIFhNTCBlbmNvZGluZyBzdHJpbmcuCi0gICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBJU08gZW5jb2RpbmcgbmFtZQotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXRDaGFyYWN0ZXJFbmNvZGluZwotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldEVuY29kaW5nICggU3RyaW5nIGVuY29kaW5nICkgeyBwdXQoIEVOQ09ESU5HLCBlbmNvZGluZyApOyB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIFhNTCBkb2N1bWVudCwgYXMgYW4gSVNPIGVuY29kaW5nIG5hbWUuCi0gICAgICogQHNlZSBYbWxPcHRpb25zI3NldENoYXJhY3RlckVuY29kaW5nCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcgKCApIHsgcmV0dXJuIChTdHJpbmcpIGdldCggRU5DT0RJTkcgKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFhNTCB2ZXJzaW9uIHN0cmluZyB0byB1c2UgaW4gdGhlICZsdCYjNjM7eG1sJiM2MzsmZ3Q7IGRlY2xhcmF0aW9uLgotICAgICAqIChUaGUgWE1MIHNwZWNpZmljYXRpb24gaXMgcXVpdGUgc3RhYmxlIGF0ICIxLjAiLikKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgWE1MIHZlcnNpb24gc3RyaW5nCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkICAgc2V0VmVyc2lvbiAoIFN0cmluZyB2ZXJzaW9uICkgeyBwdXQoIFZFUlNJT04sIHZlcnNpb24gKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFhNTCB2ZXJzaW9uIHN0cmluZyB1c2VkIGluIHRoZSAmbHQmIzYzO3htbCYjNjM7Jmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIFZFUlNJT04gKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIERPQ1RZUEUgbmFtZSB1c2UgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIGRvY3R5cGVuYW1lIHRoZSBkb2N0eXBlbmFtZQotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldERvY3R5cGVOYW1lICggU3RyaW5nIGRvY3R5cGVuYW1lICkgeyBwdXQoIERPQ1RZUEVfTkFNRSwgZG9jdHlwZW5hbWUgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIERPQ1RZUEUgbmFtZSB1c2VkIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3R5cGVOYW1lICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIERPQ1RZUEVfTkFNRSApOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgRE9DVFlQRSBwdWJsaWMgSUQgdG8gdXNlIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBwdWJsaWNpZCB0aGUgcHVibGljIElECi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkICAgc2V0RG9jdHlwZVB1YmxpY0lkICggU3RyaW5nIHB1YmxpY2lkICkgeyBwdXQoIERPQ1RZUEVfUFVCTElDX0lELCBwdWJsaWNpZCApOyB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRE9DVFlQRSBwdWJsaWMgSUQgdXNlZCBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N0eXBlUHVibGljSWQgKCApIHsgcmV0dXJuIChTdHJpbmcpIGdldCggRE9DVFlQRV9QVUJMSUNfSUQgKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIERPQ1RZUEUgc3lzdGVtIElEIHRvIHVzZSBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gc3lzdGVtaWQgdGhlIHN5c3RlbSBJRAotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldERvY3R5cGVTeXN0ZW1JZCAoIFN0cmluZyBzeXN0ZW1pZCApIHsgcHV0KCBET0NUWVBFX1NZU1RFTV9JRCwgc3lzdGVtaWQgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIERPQ1RZUEUgc3lzdGVtIElEIHVzZWQgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N0eXBlU3lzdGVtSWQgKCApIHsgcmV0dXJuIChTdHJpbmcpIGdldCggRE9DVFlQRV9TWVNURU1fSUQgKTsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVzc2FnZSBkaWdlc3QgdXNlZCB0byBzdW1tYXJpemUgdGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBkaWdlc3QgdGhlIGJ5dGVzIG9mIHRoZSBkaWdlc3QKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0TG9hZE1lc3NhZ2VEaWdlc3QKLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXRNZXNzYWdlRGlnZXN0KCBieXRlW10gZGlnZXN0ICkgeyBwdXQoIE1FU1NBR0VfRElHRVNULCBkaWdlc3QgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZGlnZXN0IHVzZWQgdG8gc3VtbWFyaXplIHRoZSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0TG9hZE1lc3NhZ2VEaWdlc3QKLSAgICAgKi8gCi0gICAgcHVibGljIGJ5dGVbXSBnZXRNZXNzYWdlRGlnZXN0KCApIHsgcmV0dXJuIChieXRlW10pIGdldCggTUVTU0FHRV9ESUdFU1QgKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIG5hbWUgKGEgU3RyaW5nKSBmb3IKLSAgICAgKiB0aGUgc291cmNlIGZyb20gd2hpY2ggdGhlIFhNTCBkb2N1bWVudCB3YXMgbG9hZGVkLgotICAgICAqIFRoaXMgbmFtZSwgaWYgcHJlc2VudCwgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUKLSAgICAgKiBkb2N1bWVudCB3aGVuIHJlcG9ydGluZyB2YWxpZGF0aW9uIG9yIGNvbWlsYXRpb24gZXJyb3JzLgotICAgICAqCi0gICAgICogWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoRmlsZSkgYW5kIFNjaGVtYVR5cGVMb2FkZXIubG9hZEluc3RhbmNlKEZpbGUpCi0gICAgICogYm90aCBhdXRvbWF0aWNhbGx5IHNldCB0aGlzIHZhbHVlIHRvIHRoZSBmaWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTT1VSQ0VfTkFNRSA9IG5ldyBPYmplY3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEb2N1bWVudCBlbmNvZGluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVOQ09ESU5HID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIERvY3VtZW50IHZlcnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWRVJTSU9OID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIERvYyB0eXBlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBET0NUWVBFX05BTUUgPSBuZXcgT2JqZWN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG9jIHR5cGUgcHVibGljIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRE9DVFlQRV9QVUJMSUNfSUQgPSBuZXcgT2JqZWN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG9jIHR5cGUgc3lzdGVtIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRE9DVFlQRV9TWVNURU1fSUQgPSBuZXcgT2JqZWN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU0hBIG1lc3NhZ2UgZGlnZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTUVTU0FHRV9ESUdFU1QgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRhY2hlcyBhIHZhbHVlIHRvIHRoZSByb290IG9mIHRoZSBkb2N1bWVudCBjb250YWluaW5nCi0gICAgICogdGhlIGdpdmVuIHRva2VuIHNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgICBUaGUga2V5OiB0aGVyZSBjYW4gYmUgb25lIHZhbHVlIGZvciBlYWNoIGtleS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGF0dGFjaCB0byB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBwdXQgKCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdmFsdWUgcHJldmlvdXNseSBhdHRhY2hlZCB0byBhIGRvY3VtZW50IHVzaW5nIHNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgICBUaGUga2V5OiB0aGlzIGlzIHRoZSBrZXkgdGhhdCB3YXMgcHJldmlvdXNseQotICAgICAqICAgICAgICAgICAgICBwYXNzZWQgdG8gc2V0IHRvIHN0b3JlIHRoZSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuICAgICAgVGhlIHNhdmVkIHZhbHVlLCBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXQgKCBPYmplY3Qga2V5ICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgdmFsdWUgcHJldmlvdXNseSBhdHRhY2hlZCB0byBhIGRvY3VtZW50IHVzaW5nIHNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgICBUaGUga2V5OiB0aGlzIGlzIHRoZSBrZXkgdGhhdCB3YXMgcHJldmlvdXNseQotICAgICAqICAgICAgICAgICAgICBwYXNzZWQgdG8gc2V0IHRvIHN0b3JlIHRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHJlbW92ZSAoIE9iamVjdCBrZXkgKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvdWJsZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvdWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDY3ZTFiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RvdWJsZSI+eHM6ZG91YmxlPC9hPiB0eXBlLgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBkb3VibGUuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbERvdWJsZSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9kb3VibGUiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlICovCi0gICAgZG91YmxlIGdldERvdWJsZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGRvdWJsZSAqLwotICAgIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldERvdWJsZVZhbHVlfQotICAgICAqKi8KLSAgICBkb3VibGUgZG91YmxlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBkb3VibGUKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RG91YmxlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGRvdWJsZSB2KTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRG91YmxlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxEb3VibGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzLjM0ZSs1NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjMuMzRlKzU3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbER1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTUzZjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbER1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdXJhdGlvbiI+eHM6ZHVyYXRpb248L2E+IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEge0BsaW5rIEdEdXJhdGlvbn0uCi0gKiAKLSAqIEBzZWUgR0R1cmF0aW9uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbER1cmF0aW9uIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2R1cmF0aW9uIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259ICovCi0gICAgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259ICovCi0gICAgdm9pZCBzZXRHRHVyYXRpb25WYWx1ZShHRHVyYXRpb24gZ2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0R1cmF0aW9uVmFsdWV9Ci0gICAgICoqLwotICAgIEdEdXJhdGlvbiBnRHVyYXRpb25WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEdXJhdGlvblZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGdkKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRHVyYXRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbER1cmF0aW9ufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbER1cmF0aW9ufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbER1cmF0aW9ufSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1AxWTJNVDJIJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1AxWTJNVDJIJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRJRVMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVElFUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDUyOTkzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVElFUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUSUVTIj54czpFTlRJVElFUzwvYT4gdHlwZSwKLSAqIGEgbGlzdCB0eXBlLgotICogPHA+Ci0gKiBBIGxpc3QgdHlwZS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRU5USVRJRVMgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfRU5USVRJRVMiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbEVOVElUWX0gdmFsdWVzICoqLwotICAgIExpc3QgeGdldExpc3RWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSAqLwotICAgIHZvaWQgc2V0TGlzdFZhbHVlKExpc3QgbCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCBsaXN0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgWG1sRU5USVRZfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCB4bGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoTGlzdCBsKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRU5USVRJRVN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUSUVTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUSUVTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEVOVElUSUVTfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUWS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWFhZDVkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVFkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSI+eHM6RU5USVRZPC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRU5USVRZIGV4dGVuZHMgWG1sTkNOYW1lCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfRU5USVRZIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxFTlRJVFl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEVOVElUWX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyYmI1Ni4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgYXQgYSBzcGVjaWZpYyBYTUwgbG9jYXRpb24uCi0gKiA8cD4KLSAqIFRoZSBtZXNzYWdlIGNhbiBiZSBhbiBlcnJvciwgd2FybmluZywgb3Igc2ltcGxlIGluZm9ybWF0aW9uLCBhbmQKLSAqIGl0IG1heSBvcHRpb25hbGx5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGxvY2F0aW9uIGluCi0gKiBhbiBYTUwgZG9jdW1lbnQuICBUaGUgY2xhc3MgaW5jbHVkZXMgbWV0aG9kcyBmb3IgZXh0cmFjdGluZwotICogdGhlIGxvY2F0aW9uIGFzIGEgbGluZSBudW1iZXIsIFhtbEN1cnNvciwgb3IgWG1sT2JqZWN0LCBhcwotICogd2VsbCBhcyBmb3Igb2J0YWluaW5nIGFuZCBtZXNzYWdlIGFuZCBzZXZlcml0eSBvZiB0aGUKLSAqIGVycm9yLiAKLSAqIAotICogQHNlZSBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXIKLSAqIEBzZWUgWG1sRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFcnJvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc291cmNlOwotICAgIHByaXZhdGUgaW50ICAgIF9zZXZlcml0eSA9IFNFVkVSSVRZX0VSUk9SOwotICAgIHByaXZhdGUgaW50ICAgIF9saW5lID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgICAgX2NvbHVtbiA9IC0xOwotICAgIHByaXZhdGUgaW50ICAgIF9vZmZzZXQgPSAtMTsKLSAgICAKLSAgICBwcml2YXRlIHRyYW5zaWVudCBYbWxDdXJzb3IgX2N1cnNvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBzcmMgVGhlIG9yaWdpbmFsIFhtbEVycm9yIHRvIGNvcHkuCi0gICAgICovCi0gICAgcHVibGljIFhtbEVycm9yKFhtbEVycm9yIHNyYykKLSAgICB7Ci0gICAgICAgIF9tZXNzYWdlID0gc3JjLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgX3NldmVyaXR5ID0gc3JjLmdldFNldmVyaXR5KCk7Ci0gICAgICAgIF9zb3VyY2UgPSBzcmMuZ2V0U291cmNlTmFtZSgpOwotICAgICAgICBfbGluZSA9IHNyYy5nZXRMaW5lKCk7Ci0gICAgICAgIF9jb2x1bW4gPSBzcmMuZ2V0Q29sdW1uKCk7Ci0gICAgICAgIF9vZmZzZXQgPSBzcmMuZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIF9jdXJzb3IgPSBzcmMuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICogdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhtbEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0LCBYbWxDdXJzb3IgY3Vyc29yKQotICAgIHsKLSAgICAgICAgX21lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBfc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgICAgICAgX3NvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgX2xpbmUgPSBsaW5lOwotICAgICAgICBfY29sdW1uID0gY29sdW1uOwotICAgICAgICBfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBfY3Vyc29yID0gY3Vyc29yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIG5vIGxvY2F0aW9uIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gZm9yTWVzc2FnZShtZXNzYWdlLCBTRVZFUklUWV9FUlJPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIHdpdGggbm8gbG9jYXRpb24gYW5kIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JTb3VyY2UobWVzc2FnZSwgc2V2ZXJpdHksIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCBsb2NhdGVkIGluIHRoZSBnaXZlbiBmaWxlIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JTb3VyY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvckxvY2F0aW9uKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCBzb3VyY2VOYW1lLCAtMSwgLTEsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIGZpbGUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgVVJMIG9yIG90aGVyIG5hbWUgZm9yIHRoZSBmaWxlCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yU291cmNlKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvckxvY2F0aW9uKG1lc3NhZ2UsIHNldmVyaXR5LCBzb3VyY2VOYW1lLCAtMSwgLTEsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgbG9jYXRlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBnaXZlbiBmaWxlIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgMS1iYXNlZCBsaW5lIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIGNvbHVtbiB0aGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSAwLWJhc2UgZmlsZSBjaGFyYWN0ZXIgb2Zmc2V0LCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JMb2NhdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxFcnJvcihtZXNzYWdlLCBTRVZFUklUWV9FUlJPUiwgc291cmNlTmFtZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBnaXZlbiBmaWxlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCi0gICAgICogQHBhcmFtIHNvdXJjZU5hbWUgdGhlIFVSTCBvciBvdGhlciBuYW1lIGZvciB0aGUgZmlsZQotICAgICAqIEBwYXJhbSBsaW5lIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSAxLWJhc2VkIGNvbHVtbiBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIDAtYmFzZSBmaWxlIGNoYXJhY3RlciBvZmZzZXQsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvckxvY2F0aW9uKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2VOYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgaW50IG9mZnNldCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sRXJyb3IobWVzc2FnZSwgc2V2ZXJpdHksIHNvdXJjZU5hbWUsIGxpbmUsIGNvbHVtbiwgb2Zmc2V0LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIHBoeXNjaWFsIGxvY2F0aW9uIGFuZCBYbWxDdXJzb3IuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgVVJMIG9yIG90aGVyIG5hbWUgZm9yIHRoZSBmaWxlCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIDEtYmFzZWQgbGluZSBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIDEtYmFzZWQgY29sdW1uIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgMC1iYXNlIGZpbGUgY2hhcmFjdGVyIG9mZnNldCwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yTG9jYXRpb25BbmRDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0LCBYbWxDdXJzb3IgY3Vyc29yKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxFcnJvcihtZXNzYWdlLCBzZXZlcml0eSwgc291cmNlTmFtZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIGN1cnNvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIGxvY2F0ZWQgYXQgdGhlIFhtbE9iamVjdCwgd2l0aCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSB4b2JqIHRoZSBYbWxPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck9iamVjdChTdHJpbmcgbWVzc2FnZSwgWG1sT2JqZWN0IHhvYmopCi0gICAgewotICAgICAgICByZXR1cm4gZm9yT2JqZWN0KG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCB4b2JqKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgYXQgdGhlIFhtbE9iamVjdC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQotICAgICAqIEBwYXJhbSB4b2JqIHRoZSBYbWxPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck9iamVjdChTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBYbWxPYmplY3QgeG9iaikKLSAgICB7Ci0gICAgICAgIGlmICh4b2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZm9yTWVzc2FnZShtZXNzYWdlLCBzZXZlcml0eSk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHhvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIFhtbEVycm9yIHJlc3VsdCA9IGZvckN1cnNvcihtZXNzYWdlLCBzZXZlcml0eSwgY3VyKTsKLSAgICAgICAgaWYgKGN1ciAhPSBudWxsKQotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgbG9jYXRlZCBhdCB0aGUgWG1sQ3Vyc29yLCB3aXRoIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIFhtbEN1cnNvciBjdXJzb3IpCi0gICAgewotICAgICAgICByZXR1cm4gZm9yQ3Vyc29yKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCBjdXJzb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCB0aGUgWG1sQ3Vyc29yLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgWG1sQ3Vyc29yIGN1cnNvcikKLSAgICB7Ci0gICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmb3JNZXNzYWdlKG1lc3NhZ2UsIHNldmVyaXR5KTsKLQotICAgICAgICAvLyBIdW50IGRvd24gdGhlIGxpbmUvY29sdW1uL29mZnNldAotCi0gICAgICAgIGludCBsaW5lID0gLTE7Ci0gICAgICAgIGludCBjb2x1bW4gPSAtMTsKLSAgICAgICAgaW50IG9mZnNldCA9IC0xOwotICAgICAgICBTdHJpbmcgc291cmNlID0gbnVsbDsKLQotICAgICAgICBzb3VyY2UgPSBjdXJzb3IuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0gY3Vyc29yLm5ld0N1cnNvcigpOwotCi0gICAgICAgIFhtbExpbmVOdW1iZXIgbG4gPQotICAgICAgICAgICAgKFhtbExpbmVOdW1iZXIpIGMuZ2V0Qm9va21hcmsoIFhtbExpbmVOdW1iZXIuY2xhc3MgKTsKLQotICAgICAgICBpZiAobG4gPT0gbnVsbCkKLSAgICAgICAgICAgIGxuID0gKFhtbExpbmVOdW1iZXIpIGMudG9QcmV2Qm9va21hcmsoIFhtbExpbmVOdW1iZXIuY2xhc3MgKTsKLQotICAgICAgICBpZiAobG4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbGluZSA9IGxuLmdldExpbmUoKTsKLSAgICAgICAgICAgIGNvbHVtbiA9IGxuLmdldENvbHVtbigpOwotICAgICAgICAgICAgb2Zmc2V0ID0gbG4uZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjLmRpc3Bvc2UoKTsKLQotICAgICAgICByZXR1cm4gbmV3IFhtbEVycm9yKG1lc3NhZ2UsIHNldmVyaXR5LCBzb3VyY2UsIGxpbmUsIGNvbHVtbiwgb2Zmc2V0LCBjdXJzb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIHByb2R1Y2UgYSBuaWNlbHkgZm9ybWF0dGVkIGZpbGVuYW1lIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXR0ZWRGaWxlTmFtZShTdHJpbmcgcmF3U3RyaW5nLCBVUkkgYmFzZSkKLSAgICB7Ci0gICAgICAgIGlmIChyYXdTdHJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFVSSSB1cmkgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBpdCBsb29rcyBsaWtlIGFuIGFic29sdXRlIFVSSSwgdHJlYXQgaXQgYXMgc3VjaAotICAgICAgICAgICAgdXJpID0gbmV3IFVSSShyYXdTdHJpbmcpOwotCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyZWF0IGl0IGxpa2UgYSBmaWxlbmFtZQotICAgICAgICAgICAgaWYgKCF1cmkuaXNBYnNvbHV0ZSgpKQotICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB1cmkgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9va3MgbGlrZSBhIGZpbGVuYW1lOyBjb252ZXJ0IGl0IHRvIHVyaSBmb3IgcmVsYXRpdml6YXRpb24KLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdXJpID0gbmV3IEZpbGUocmF3U3RyaW5nKS50b1VSSSgpOwotCi0gICAgICAgIGlmIChiYXNlICE9IG51bGwpCi0gICAgICAgICAgICB1cmkgPSBiYXNlLnJlbGF0aXZpemUodXJpKTsKLQotICAgICAgICAvLyBmaWxlbmFtZXMgZ2V0IHRoZWlyIGZpbGU6IHN0cmlwcGVkIG9mZiBhbmQgdGhlaXIgLydzIHR1cm5lZCBpbnRvIFwncyAoTVNET1MpCi0gICAgICAgIGlmICh1cmkuaXNBYnNvbHV0ZSgpID8gdXJpLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwIDoKLSAgICAgICAgICAgIGJhc2UgIT0gbnVsbCAmJiBiYXNlLmlzQWJzb2x1dGUoKSAmJiBiYXNlLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGaWxlKHVyaSkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVycm9yLiBTZWUge0BsaW5rICNnZXRTZXZlcml0eX0uCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVkVSSVRZX0VSUk9SICAgPSAwOwotICAgIC8qKgotICAgICAqIEEgd2FybmluZy4gU2VlIHtAbGluayAjZ2V0U2V2ZXJpdHl9LgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZFUklUWV9XQVJOSU5HID0gMTsKLSAgICAvKioKLSAgICAgKiBBbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuIFNlZSB7QGxpbmsgI2dldFNldmVyaXR5fS4KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWRVJJVFlfSU5GTyAgICA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eS4gIEVpdGhlciB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfS4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCAgICBnZXRTZXZlcml0eSAgICggKSB7IHJldHVybiBfc2V2ZXJpdHk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIHdpdGhvdXQgbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAgICAoICkgeyByZXR1cm4gX21lc3NhZ2U7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkwgKG9yIG90aGVyIG5hbWUpIG9mIHRoZSBmaWxlIHdpdGggdGhlIGVycm9yLCBpZiBhdmFpbGFibGUuCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSAoICkgeyByZXR1cm4gX3NvdXJjZTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCAtMSBpZiBub3QuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgICAgZ2V0TGluZSAgICAgICAoICkgeyByZXR1cm4gX2xpbmU7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCAtMSBpZiBub3QuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgICAgZ2V0Q29sdW1uICAgICAoICkgeyByZXR1cm4gX2NvbHVtbjsgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgLTEgaWYgbm90LgotICAgICAqLyAKLSAgICBwdWJsaWMgaW50ICAgIGdldE9mZnNldCAgICAgKCApIHsgcmV0dXJuIF9vZmZzZXQ7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbG9jYXRpb24gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlLiAgWG1sQ3Vyc29yLmNsYXNzIGFuZAotICAgICAqIFhtbE9iamVjdC5jbGFzcyBjYW4gYmUgcGFzc2VkLCBmb3IgZXhhbXBsZS4gIE51bGwgaWYgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8gCi0gICAgcHVibGljIE9iamVjdCBnZXRMb2NhdGlvbiAoIE9iamVjdCB0eXBlICkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IFhtbEN1cnNvci5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBfY3Vyc29yOwotICAgICAgICBpZiAodHlwZSA9PSBYbWxPYmplY3QuY2xhc3MgJiYgX2N1cnNvciAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9jdXJzb3IuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgYXMgYW4ge0BsaW5rIFhtbEN1cnNvcn0sIG51bGwgaWYKLSAgICAgKiBub3QgYXZhaWxhYmxlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sQ3Vyc29yIGdldEN1cnNvckxvY2F0aW9uICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChYbWxDdXJzb3IpIGdldExvY2F0aW9uKCBYbWxDdXJzb3IuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbG9jYXRpb24gb2YgdGhlIGVycm9yIGFzIGFuIHtAbGluayBYbWxPYmplY3R9LCBudWxsIGlmCi0gICAgICogbm90IGF2YWlsYWJsZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRPYmplY3RMb2NhdGlvbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBnZXRMb2NhdGlvbiggWG1sT2JqZWN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgYSBzdGFuZGFyZCBzdHJpbmcgZm9yIHRoZSBlcnJvciBtZXNzYWdlLCBjb21wbGV0ZSB3aXRoCi0gICAgICogZmlsZW5hbWUgYW5kIGxvY2F0aW9uIG9mZnNldHMgaWYgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gdG9TdHJpbmcoIG51bGwgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9kdWNlcyBhIHN0YW5kYXJkIHN0cmluZyB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLiAgSWYgYSBub24tbnVsbAotICAgICAqIFVSSSBpcyBzdXBwbGllZCwgc291cmNlIG5hbWVzIGFyZSByZWxhdGl2aXplZCBhZ2FpbnN0IHRoZSBnaXZlbgotICAgICAqIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggVVJJIGJhc2UgKQotICAgIHsKLSAgICAgICAgLy8gbW9kaWZpZWQgdG8gY2FyZWZ1bGx5IG1hdGNoIHRoZSBJREUncwotICAgICAgICAvLyB3b3Jrc2hvcC53b3Jrc3BhY2UuYW50LkFudExvZ2dlciByZWdleAotICAgICAgICAvLyB3aGljaCBhbHNvIG1hdGNoZXMgamF2YWMgKGRhdmlkYmF1KQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBTdHJpbmcgc291cmNlID0gZm9ybWF0dGVkRmlsZU5hbWUoZ2V0U291cmNlTmFtZSgpLCBiYXNlKTsKLQotICAgICAgICBpZiAoIHNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCBzb3VyY2UgKTsKLSAgICAgICAgICAgIGludCBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKCBsaW5lIDwgMCApCi0gICAgICAgICAgICAgICAgbGluZSA9IDA7Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggJzonICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIGxpbmUgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggJzonICk7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29sdW1uKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggZ2V0Q29sdW1uKCkgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICc6JyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKCBnZXRTZXZlcml0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTRVZFUklUWV9FUlJPUiAgIDogc2IuYXBwZW5kKCAiZXJyb3I6ICIgKTsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0VWRVJJVFlfV0FSTklORyA6IHNiLmFwcGVuZCggIndhcm5pbmc6ICIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNFVkVSSVRZX0lORk8gOiBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtc2cgPSBnZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCBtc2cgPT0gbnVsbCA/ICI8VW5zcGVjaWZpZWQgbWVzc2FnZT4iIDogbXNnICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzNDc0OC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEEgY2hlY2tlZCBleGNlcHRpb24gdGhhdCBjYW4gYmUgdGhyb3duIHdoaWxlIHByb2Nlc3NpbmcsCi0gKiBwYXJzaW5nLCBvciBjb21waWxpbmcgWE1MLiAgTWF5IGNvbnRhaW4gYW55IG51bWJlciBvZiB7QGxpbmsgWG1sRXJyb3J9Ci0gKiBvYmplY3RzLgotICogPHA+Ci0gKiBAc2VlIFhtbEVycm9yCi0gKiBAc2VlIFhtbFJ1bnRpbWVFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFhtbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0gICAgICAgICAgICAgICkgeyBzdXBlciggbSApOyAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UgYW5kIGEgY2F1c2UuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQgKSB7IHN1cGVyKCBtLCB0ICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGEgY2F1c2UuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBUaHJvd2FibGUgdCAgICAgICAgICAgKSB7IHN1cGVyKCB0ICk7ICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGFuIHtAbGluayBYbWxFcnJvcn0uCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBYbWxFcnJvciBlcnJvciApCi0gICAgewotICAgICAgICB0aGlzKCBlcnJvci50b1N0cmluZygpLCBudWxsLCBlcnJvciApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLCBhIGNhdXNlLCBhbmQgYW4ge0BsaW5rIFhtbEVycm9yfS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCwgWG1sRXJyb3IgZXJyb3IgKQotICAgIHsKLSAgICAgICAgdGhpcyggbSwgdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggZXJyb3IgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSwgYSBjYXVzZSwgYW5kIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgWG1sRXJyb3IgWG1sRXJyb3JzfS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCwgQ29sbGVjdGlvbiBlcnJvcnMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG0sIHQgKTsKLQotICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpCi0gICAgICAgICAgICBfZXJyb3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggbmV3IEFycmF5TGlzdCggZXJyb3JzICkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGFuIHtAbGluayBYbWxSdW50aW1lRXhjZXB0aW9ufS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFhtbFJ1bnRpbWVFeGNlcHRpb24geG1sUnVudGltZUV4Y2VwdGlvbiApCi0gICAgewotICAgICAgICBzdXBlcigKLSAgICAgICAgICAgIHhtbFJ1bnRpbWVFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCB4bWxSdW50aW1lRXhjZXB0aW9uLmdldENhdXNlKCkgKTsKLQotICAgICAgICBDb2xsZWN0aW9uIGVycm9ycyA9IHhtbFJ1bnRpbWVFeGNlcHRpb24uZ2V0RXJyb3JzKCk7Ci0KLSAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKQotICAgICAgICAgICAgX2Vycm9ycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIG5ldyBBcnJheUxpc3QoIGVycm9ycyApICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBYbWxFcnJvciBYbWxFcnJvcnN9IHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24sIGlmIGFueS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEVycm9yIGdldEVycm9yICggKQotICAgIHsKLSAgICAgICAgaWYgKF9lcnJvcnMgPT0gbnVsbCB8fCBfZXJyb3JzLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIChYbWxFcnJvcikgX2Vycm9ycy5nZXQoIDAgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgWG1sRXJyb3IgWG1sRXJyb3JzfSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uLCBpZiBhbnkuCi0gICAgICovIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVycm9ycyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZXJyb3JzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBfZXJyb3JzOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGYWN0b3J5SG9vay5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEZhY3RvcnlIb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTBmOTcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEZhY3RvcnlIb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGhvb2sgZm9yIHRoZSBYTUwgQmVhbiBGYWN0b3J5IG1lY2hhbmlzbS4KLSAqIFByb3ZpZGVkIGZvciBhZHZhbmNlZCB1c2VycyB3aG8gd2lzaCB0byBwcm92aWRlIHRoZWlyIG93bgotICogaW1wbGVtZW50YXRpb24gb2YgdGhlIEZhY3RvcnkucGFyc2UgbWV0aG9kcy4gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwKLSAqIHRvIGRlZmVyIHJlYWRpbmcgWE1MIHN0cmVhbXMgdW50aWwgbmVlZGVkLgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIGhvb2ssIGNhbGwgWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5zZXRIb29rKCksIHBhc3NpbmcKLSAqIHlvdXIgb3duIFhtbEZhY3RvcnlIb29rIGltcGxlbWVudGF0aW9uLiAgVGhlbiBldmVyeSBjYWxsIHRvIGEgRmFjdG9yeQotICogbWV0aG9kIHdpbGwgYmUgZGVsZ2F0ZWQgdG8geW91ciBob29rLgotICoKLSAqIDxwcmU+Ci0gKiBNeUhvb2sgaG9vayA9IG5ldyBNeUhvb2soKTsKLSAqIFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuc2V0SG9vayhob29rKTsKLSAqIC8vIHRoaXMgcmVzdWx0cyBpbiBhIGNhbGwgdG8gaG9vay5wYXJzZSguLi4pCi0gKiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShuZXcgRmlsZSgidGVzdC54bWwiKSk7Ci0gKiA8L3ByZT4KLSAqIAotICogSWYgdGhlIGhvb2sgbmVlZHMgdG8gdHVybiBhcm91bmQgYW5kIGludm9rZSB0aGUgYnVpbHQtaW4gcGFyc2VycywgdGhlbgotICogaXQgc2hvdWxkIGRvIHNvIGJ5IGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBvbiB0aGUgcGFzc2VkCi0gKiBTY2hlbWFUeXBlTG9hZGVyLiAgU2luY2UgU2NoZW1hVHlwZUxvYWRlci5wYXJzZSgpIG1ldGhvZHMgZGVsZWdhdGUKLSAqIHRvIHRoZSByZWdpc3RlcmVkIGhvb2ssIGEgaG9vayB0aGF0IHdpc2hlcyB0byBhY3R1YWxseSBpbnZva2UgdGhlCi0gKiBkZWZhdWx0IHBhcnNlciB3aXRob3V0IGhhdmluZyBpdHNlbGYgY2FsbGVkIGJhY2sgYWdhaW4gc2hvdWxkCi0gKiB1bnJlZ2lzdGVyIGl0c2VsZiBiZWZvcmUgY2FsbGluZyBsb2FkZXIucGFyc2UoKSwgYW5kIHRoZW4gcmUtcmVnaXN0ZXIKLSAqIGl0c2VsZiBhZ2FpbiBhZnRlciB0aGUgY2FsbC4KLSAqIDxwcmU+Ci0gKiB2b2lkIHBhcnNlKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCAuLi4pCi0gKiB7Ci0gKiAgICAgWG1sRmFjdG9yeUhvb2sgcmVtZW1iZXIgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2sobnVsbCk7Ci0gKiAgICAgbG9hZGVyLnBhcnNlKC4uLik7IC8vIGlzbid0IGhvb2tlZC4KLSAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2socmVtZW1iZXIpOwotICogfQotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRmFjdG9yeUhvb2sKLXsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdJbnN0YW5jZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgbmV3SW5zdGFuY2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU3RyaW5nIHhtbFRleHQsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgSW5wdXRTdHJlYW0gamlvaXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIEhvb2tzIEZhY3RvcnkucGFyc2UgY2FsbHMgKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIsIFJlYWRlciBqaW9yLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotICAgIC8qKiBIb29rcyBGYWN0b3J5LnBhcnNlIGNhbGxzICovCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdYbWxTYXhIYW5kbGVyIGNhbGxzICovCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBtYW5hZ2UgdGhlIFhtbEZhY3RvcnlIb29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gICAgICovIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgVGhyZWFkQ29udGV4dAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGhyZWFkSG9vayA9IG5ldyBUaHJlYWRMb2NhbCgpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgaG9vaywgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmFjdG9yeUhvb2sgZ2V0SG9vaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoWG1sRmFjdG9yeUhvb2spdGhyZWFkSG9vay5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBob29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEhvb2soWG1sRmFjdG9yeUhvb2sgaG9vaykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZWFkSG9vay5zZXQoaG9vayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm92aWRlZCB0byBwcmV2ZW50IHVud2FudGVkIGNvbnN0cnVjdGlvbgotICAgICAgICBwcml2YXRlIFRocmVhZENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmxvYXQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWFlOWE4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZmxvYXQiPnhzOmZsb2F0PC9hPiB0eXBlLgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBmbG9hdC4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRmxvYXQgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZmxvYXQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZmxvYXQgKi8KLSAgICBmbG9hdCBnZXRGbG9hdFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGZsb2F0ICovCi0gICAgdm9pZCBzZXRGbG9hdFZhbHVlKGZsb2F0IHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZmxvYXQKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEZsb2F0VmFsdWV9Ci0gICAgICoqLwotICAgIGZsb2F0IGZsb2F0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBmbG9hdAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0RmxvYXRWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoZmxvYXQgdik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxGbG9hdH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRmxvYXR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRmxvYXR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sRmxvYXR9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIuMzRlKzUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIuMzRlKzUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjgxZDNmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dEYXkiPnhzOmdEYXk8L2E+IHR5cGUuCi0gKiBBIGdEYXkgc3BlY2lmaWVzIG9ubHkgYSBkYXktb2YtbW9udGguCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0sIHtAbGluayBHRGF0ZX0sIG9yIGFuIGludC4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxHRGF5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dEYXkiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLwotICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KLSAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMSAqLwotICAgIGludCBnZXRJbnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMSAqLwotICAgIHZvaWQgc2V0SW50VmFsdWUoaW50IHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQotICAgICAqKi8KLSAgICBpbnQgaW50VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoaW50IHYpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sR0RheX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR0RheX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR0RheX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sR0RheX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstLS0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstLS0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGguamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4YjM5MC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aCI+eHM6Z01vbnRoPC9hPiB0eXBlLgotICogQSBnTW9udGggc3BlY2lmaWVzIG9ubHkgYSBtb250aC1vZi15ZWFyLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgR0RhdGV9LCBvciBhbiBpbnQuCi0gKiAKLSAqIEBzZWUgWG1sQ2FsZW5kYXIKLSAqIEBzZWUgR0RhdGUKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sR01vbnRoIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dNb250aCIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTEyICovCi0gICAgaW50IGdldEludFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTEyICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIGludCBpbnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTEyCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEdNb250aH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRofSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRofSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sR01vbnRofSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tMDYmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWYyN2EuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdNb250aERheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnTW9udGhEYXkiPnhzOmdNb250aERheTwvYT4gdHlwZS4KLSAqIEEgZ01vbnRoRGF5IHNwZWNpZmllcyBhIGRheSBvZiBhIHNwZWNpZmljIG1vbnRoIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgeWVhci4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSBvciB7QGxpbmsgR0RhdGV9LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEdNb250aERheSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9nTW9udGhEYXkiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLwotICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KLSAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxHTW9udGhEYXl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdNb250aERheX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdNb250aERheX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEdNb250aERheX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstLTA2LTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tMDYtMTQmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3OTc3NC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXIiPnhzOmdZZWFyPC9hPiB0eXBlLgotICogQSBnWWVhciBzcGVjaWZpZXMgYSBHcmVnb3JpYW4geWVhciAoQUQpLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgR0RhdGV9LCBvciBhbiBpbnQuCi0gKiAKLSAqIEBzZWUgWG1sQ2FsZW5kYXIKLSAqIEBzZWUgR0RhdGUKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sR1llYXIgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZ1llYXIiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLwotICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KLSAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMSAqLwotICAgIGludCBnZXRJbnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMSAqLwotICAgIHZvaWQgc2V0SW50VmFsdWUoaW50IHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQotICAgICAqKi8KLSAgICBpbnQgaW50VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoaW50IHYpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxHWWVhcn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR1llYXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR1llYXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sR1llYXJ9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXJNb250aC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNGJiOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXJNb250aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIj54czpnWWVhck1vbnRoPC9hPiB0eXBlLgotICogQSBnWWVhck1vbnRoIHNwZWNpZmllcyBhIG1vbnRoIGluIGEgc3BlY2lmaWMgeWVhci4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIEdEYXRlfS4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxHWWVhck1vbnRoIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dZZWFyTW9udGgiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLwotICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KLSAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxHWWVhck1vbnRofS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhck1vbnRofSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhck1vbnRofSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHWWVhck1vbnRofSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMtMDYmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwYWY2Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSGV4QmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNoZXhCaW5hcnkiPnhzOmhleEJpbmFyeTwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gYSBieXRlIGFycmF5LiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sSGV4QmluYXJ5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2hleEJpbmFyeSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qnl0ZUFycmF5VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGJ5dGVbXSBiYSk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKiovCi0gICAgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCi0gICAgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gYmEpOwotCi0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sSGV4QmluYXJ5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxIZXhCaW5hcnl9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxIZXhCaW5hcnl9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxIZXhCaW5hcnl9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7Njg2NTZjNmM2ZiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDs2ODY1NmM2YzZmJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzFlMDEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRCI+eHM6SUQ8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIFdoZW4gdmFsaWRhdGVkLCBJRHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuICBBbiBlbGVtZW50Ci0gKiBtYXkgbm90IGhhdmUgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hvc2UgdHlwZSBpcyBJRC4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gYSB7QGxpbmsgU3RyaW5nfS4gCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEIGV4dGVuZHMgWG1sTkNOYW1lCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfSUQiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbElEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJRH0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtuMSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtuMSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmZWQ4Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGIj54czpJRFJFRjwvYT4gdHlwZS4KLSAqIDxwPgotICogV2hlbiB2YWxpZGF0ZWQsIElEUkVGIHZhbHVlcyBtdXN0IG1hdGNoIGFuIElEIHZhbHVlIHRoYXQgaXMgcHJlc2VudCB3aXRoaW4KLSAqIHRoZSBkb2N1bWVudC4gVGhpcyBydWxlIGlzIG9ubHkgdmVyaWZpZWQgd2hlbiBhIHdob2xlIGRvY3VtZW50IGlzIHZhbGlkYXRlZAotICogYXQgb25jZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gYSB7QGxpbmsgU3RyaW5nfS4gCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGIGV4dGVuZHMgWG1sTkNOYW1lCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfSURSRUYiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbElEUkVGfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJRFJFRn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlMWQxNi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUZTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUZTIj54czpJRFJFRlM8L2E+IHR5cGUsCi0gKiBhIGxpc3QgdHlwZS4KLSAqIDxwPgotICogV2hlbiB2YWxpZGF0ZWQsIElEUkVGIHZhbHVlcyBtdXN0IG1hdGNoIGFuIElEIHZhbHVlIHRoYXQgaXMgcHJlc2VudCB3aXRoaW4KLSAqIHRoZSBkb2N1bWVudC4gVGhpcyBydWxlIGlzIG9ubHkgdmVyaWZpZWQgd2hlbiBhIHdob2xlIGRvY3VtZW50IGlzIHZhbGlkYXRlZAotICogYXQgb25jZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gYSB7QGxpbmsgTGlzdH0uIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxJRFJFRlMgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfSURSRUZTIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmd9IHZhbHVlcyAqLwotICAgIExpc3QgZ2V0TGlzdFZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBYbWxJRFJFRn0gdmFsdWVzICovCi0gICAgTGlzdCB4Z2V0TGlzdFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9ICovCi0gICAgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBsKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmd9IHZhbHVlcwotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0TGlzdFZhbHVlfQotICAgICAqKi8KLSAgICBMaXN0IGxpc3RWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBYbWxJRFJFRn0gdmFsdWVzCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIExpc3QgeGxpc3RWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KExpc3QgbCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbElEUkVGU30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSURSRUZTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSURSRUZTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sSURSRUZTfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTY0ZjguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50Ij54czppbnQ8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogTmF0dXJhbGx5LCBjb252ZXJ0aWJsZSB0byBhIEphdmEgaW50LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxJbnQgZXh0ZW5kcyBYbWxMb25nCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfaW50Iik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgKi8KLSAgICBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCAqLwotICAgIHZvaWQgc2V0SW50VmFsdWUoaW50IHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgaW50IGludFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoaW50IHYpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxJbnR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEludH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEludH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEludH0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1NjcmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Mzg2M2YuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50ZWdlciI+eHM6aW50ZWdlcjwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBUaGlzIHR5cGUgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50Ij54czppbnQ8L2E+Ci0gKiBvciBKYXZhIHtAbGluayBJbnRlZ2VyfS4gIFRoaXMgdHlwZSByZXByZXNlbnRzIGFuIGFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlciB3aXRoCi0gKiBhbnkgbnVtYmVyIG9mIGRpZ2l0cywgd2hpbGUgYSBKYXZhIGludCBvciBhbiB4czppbnQgaXMgYSAzMi1iaXQgZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIEphdmEge0BsaW5rIEJpZ0ludGVnZXJ9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxJbnRlZ2VyIGV4dGVuZHMgWG1sRGVjaW1hbAotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2ludGVnZXIiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9ICovCi0gICAgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9ICovCi0gICAgdm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoQmlnSW50ZWdlciBiaSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0QmlnSW50ZWdlclZhbHVlfQotICAgICAqKi8KLSAgICBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRCaWdJbnRlZ2VyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEJpZ0ludGVnZXIgYmkpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxJbnRlZ2VyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJbnRlZ2VyfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMYW5ndWFnZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjM5ZGQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsYW5ndWFnZSI+eHM6bGFuZ3VhZ2U8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIFRoaXMgdHlwZSBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYW4gc3RhbmRhcmQgSVNPIGxhbmd1YWdlIGNvZGUgc3RyaW5nLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIEphdmEge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbExhbmd1YWdlIGV4dGVuZHMgWG1sVG9rZW4KLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9sYW5ndWFnZSIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sTGFuZ3VhZ2V9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbExhbmd1YWdlfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbExhbmd1YWdlfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbExhbmd1YWdlfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2VuLXVzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2VuLXVzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExpbmVOdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMmE0Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlhtbEJvb2ttYXJrOwotCi0vKioKLSAqIEEgc3ViY2xhc3Mgb2YgWG1sQm9va21hcmsgdGhhdCBob2xkcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLSAqIElmIGEgZG9jdW1lbnQgaXMgcGFyc2VkIHdpdGggbGluZSBudW1iZXJzCi0gKiBlbmFibGVkLCB0aGVzZSBib29rbWFya3Mgd2lsbCBiZSBwbGFjZWQgYXQgYXBwcm9wcmlhdGUgbG9jYXRpb25zCi0gKiB3aXRoaW4gdGhlIGRvY3VtZW50LgotICogCi0gKiBAc2VlIFhtbE9wdGlvbnMjc2V0TG9hZExpbmVOdW1iZXJzIAotICovCi1wdWJsaWMgY2xhc3MgWG1sTGluZU51bWJlciBleHRlbmRzIFhtbEJvb2ttYXJrCi17Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpbmUgbnVtYmVyIHdpdGggbm8gY29sdW1uIG9yIG9mZnNldCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBudW1iZXIgLSB0aGUgZmlyc3QgbGluZSBpcyAxCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxMaW5lTnVtYmVyICggaW50IGxpbmUgKSB7IHRoaXMoIGxpbmUsIC0xLCAtMSApOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4gd2l0aCBubyBmaWxlIG9mZnNldCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBudW1iZXIgLSB0aGUgZmlyc3QgbGluZSBpcyAxCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGNvbHVtbiBudW1iZXIgLSB0aGUgZmlyc3QgY29sdW1uIGlzIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTGluZU51bWJlciAoIGludCBsaW5lLCBpbnQgY29sdW1uICkgeyB0aGlzKCBsaW5lLCBjb2x1bW4sIC0xICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbGluZSBudW1iZXIgYW5kIGNvbHVtbiB3aXRoIG5vIGZpbGUgb2Zmc2V0IGluZm9ybWF0aW9uLgotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIG51bWJlciAtIHRoZSBmaXJzdCBsaW5lIGlzIDEKLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgY29sdW1uIG51bWJlciAtIHRoZSBmaXJzdCBjb2x1bW4gaXMgMQotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBmaWxlIGNoYXJhY3RlciBvZmZzZXQgLSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBmaWxlIGlzIDAKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTGluZU51bWJlciAoIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgX2xpbmUgPSBsaW5lOwotICAgICAgICBfY29sdW1uID0gY29sdW1uOwotICAgICAgICBfb2Zmc2V0ID0gb2Zmc2V0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0TGluZSAgICggKSB7IHJldHVybiBfbGluZTsgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uICggKSB7IHJldHVybiBfY29sdW1uOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgMC1iYXNlZCBmaWxlIG9mZnNldCBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bi4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCBnZXRPZmZzZXQgKCApIHsgcmV0dXJuIF9vZmZzZXQ7IH0KLQotICAgIHByaXZhdGUgaW50IF9saW5lLCBfY29sdW1uLCBfb2Zmc2V0OwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMb25nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmQ3YzQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xvbmciPnhzOmxvbmc8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogTmF0dXJhbGx5LCBjb252ZXJ0aWJsZSB0byBhIEphdmEgbG9uZy4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTG9uZyBleHRlbmRzIFhtbEludGVnZXIKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9sb25nIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcgKi8KLSAgICBsb25nIGdldExvbmdWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBsb25nICovCi0gICAgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TG9uZ1ZhbHVlfQotICAgICAqKi8KLSAgICBsb25nIGxvbmdWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0TG9uZ1ZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChsb25nIHYpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxMb25nfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxMb25nfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxMb25nfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxMb25nfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDEzMWUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5DTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSI+eHM6TmFtZTwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPi4KLSAqIDxwPgotICogVGhpcyBraW5kIG9mIHN0cmluZyBpcyB0aGUgc2FtZSBhcyB0aGUgbm9uLWNvbG9uaXplZCBzdHJpbmdzIHRoYXQgYXJlIHVzZWQKLSAqIGZvciBYTUwgbG9jYWxuYW1lcyBhbmQgcHJlZml4ZXMsICJteS1ocmVmLjIiLiAgSXQgaXMganVzdCBhIHBoeXNpY2FsCi0gKiBzdHJpbmcsIGhvd2V2ZXIsIGFuZCBpdCBzaG91bGQgTk9UIGJlIGNvbmZ1c2VkIHdpdGgge0BsaW5rIFhtbFFOYW1lfSwKLSAqIHdoaWNoIGlzIGEgbG9naWNhbCBjb21iaW5hdGlvbiBvZiBsb2NhbG5hbWUgYW5kIG5hbWVzcGFjZSBVUkkuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxOQ05hbWUgZXh0ZW5kcyBYbWxOYW1lCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTkNOYW1lIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOQ05hbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5DTmFtZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5DTmFtZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5DTmFtZX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtNeS1OYW1lJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O015LU5hbWUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDkyZTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU4iPnhzOk5NVE9LRU48L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzdHJpbmciPnhzOnN0cmluZzwvYT4uCi0gKiA8cD4KLSAqIEFuIE5NVE9LRU4gaXMgWE1MJ3MgY2xvc2VzdCBjb25jZXB0IHRvIGFuICJpZGVudGlmaWVyIjsgZm9yIGV4YW1wbGUsCi0gKiBpdCBkb2VzIG5vdCBwZXJtaXQgc3BhY2VzIGFuZCBvbmx5IGxpbWl0ZWQgcHVuY3R1YXRpb24uICBTbyBOTVRPS0VOIGlzCi0gKiBjb21tb25seSB1c2VkIHRvIGRlc2NyaWJlIGEgc2luZ2xlIHRva2VuIG9yIGVudW1lcmF0ZWQgc3RyaW5nIHZhbHVlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTk1UT0tFTiBleHRlbmRzIFhtbFRva2VuCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTk1UT0tFTiIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sTk1UT0tFTn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTk1UT0tFTn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTk1UT0tFTn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTk1UT0tFTn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzYW1wbGUtMS4yJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3NhbXBsZS0xLjImbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTlMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZkMTYzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU5TIj54czpOTVRPS0VOUzwvYT4gdHlwZSwKLSAqIGEgbGlzdCB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgTGlzdH0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5NVE9LRU5TIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX05NVE9LRU5TIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmd9IHZhbHVlcyAqLwotICAgIExpc3QgZ2V0TGlzdFZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBYbWxOTVRPS0VOfSB2YWx1ZXMgKi8KLSAgICBMaXN0IHhnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gKi8KLSAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IGwpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIExpc3QgbGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbE5NVE9LRU59IHZhbHVlcwotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0TGlzdFZhbHVlfQotICAgICAqKi8KLSAgICBMaXN0IHhsaXN0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0TGlzdFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChMaXN0IGwpOwotCi0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5NVE9LRU5TfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOU30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOU30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOTVRPS0VOU30gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzYW1wbGUtMS4xIHNhbXBsZS0xLjIgc2FtcGxlLTEuMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzYW1wbGUtMS4xIHNhbXBsZS0xLjIgc2FtcGxlLTEuMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5PVEFUSU9OLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkNTk1NC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05PVEFUSU9OIj54czpOT1RBVElPTjwvYT4gdHlwZS4KLSAqIDxwPgotICogTk9UQVRJT05zIGFyZSBhIG1lY2hhbmlzbSBpbiBYTUwgU2NoZW1hIHRoYXQgaXMgcHJvdmlkZWQKLSAqIGZvciBwYXJ0aWFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBOT1RBVElPTnMgaW4gRFREcy4gIFhNTCBTY2hlbWEKLSAqIHVzZXJzIHNob3VsZCBhbG1vc3QgbmV2ZXIgaGF2ZSBhbnkgcmVhc29uIHRvIHVzZSB0aGlzIGRhdGEgdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5PVEFUSU9OIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX05PVEFUSU9OIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOT1RBVElPTn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTk9UQVRJT059ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTk9UQVRJT059ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTk9UQVRJT059IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNGY5Yi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSI+eHM6TmFtZTwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPi4KLSAqIDxwPgotICogVGhpcyBraW5kIG9mIHN0cmluZyBpcyB0aGUgc2FtZSBhcyB0aGUgbGV4aWNhbCByZXByZXNlbnRhdGlvbiB1c2VkIGZvciBYTUwgMS4wCi0gKiBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMsIGUuZy4sICJwcmU6YS1iLmNkZWYiLiAgSXQgaXMganVzdCBhIHBoeXNpY2FsCi0gKiBzdHJpbmcsIGhvd2V2ZXIsIGFuZCBpdCBzaG91bGQgTk9UIGJlIGNvbmZ1c2VkIHdpdGgge0BsaW5rIFhtbFFOYW1lfSwKLSAqIHdoaWNoIGlzIGEgbG9naWNhbCBjb21iaW5hdGlvbiBvZiBsb2NhbG5hbWUgYW5kIG5hbWVzcGFjZSBVUkkuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxOYW1lIGV4dGVuZHMgWG1sVG9rZW4KLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9OYW1lIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOYW1lfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOYW1lfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O015Ok5hbWUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7TXk6TmFtZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViZmU2NC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNuZWdhdGl2ZUludGVnZXIiPnhzOm5lZ2F0aXZlSW50ZWdlcjwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBWZXJpZmllZCB0byBiZSBuZWdhdGl2ZSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5lZ2F0aXZlSW50ZWdlciBleHRlbmRzIFhtbE5vblBvc2l0aXZlSW50ZWdlcgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX25lZ2F0aXZlSW50ZWdlciIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LTEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LTEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc4NmNhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25OZWdhdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vbk5lZ2F0aXZlSW50ZWdlciI+eHM6bm9uTmVnYXRpdmVJbnRlZ2VyPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIHplcm8gb3IgcG9zaXRpdmUgd2hlbiB2YWxpZGF0aW5nLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXJ9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxOb25OZWdhdGl2ZUludGVnZXIgZXh0ZW5kcyBYbWxJbnRlZ2VyCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfbm9uTmVnYXRpdmVJbnRlZ2VyIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTY3ZjA5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25Qb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vblBvc2l0aXZlSW50ZWdlciI+eHM6bm9uUG9zaXRpdmVJbnRlZ2VyPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIHplcm8gb3IgbmVnYXRpdmUgd2hlbiB2YWxpZGF0aW5nLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXJ9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxOb25Qb3NpdGl2ZUludGVnZXIgZXh0ZW5kcyBYbWxJbnRlZ2VyCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfbm9uUG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstMTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstMTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vcm1hbGl6ZWRTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkZWJlZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9ybWFsaXplZFN0cmluZyI+eHM6bm9ybWFsaXplZFN0cmluZzwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPi4KLSAqIDxwPgotICogQW4gbm9ybWFsaXplZFN0cmluZyBzaW1wbHkgaXMgYSBzdHJpbmcgd2hlcmUgYWxsIHRoZSBjYXJyaWFnZSByZXR1cm4sCi0gKiBsaW5lZmVlZCwgYW5kIHRhYiBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBub3JtYWxpemVkIChzd2l0Y2hlZCB0bykgb3JkaW5hcnkKLSAqIHNwYWNlIGNoYXJhY3RlcnMuICBVc2Ugbm9ybWFsaXplZFN0cmluZyBmb3IgbG9uZyBzdHJpbmdzIHRvIG1ha2UgdGhlbQotICogaW5zZW5zaXRpdmUgdG8gbGluZSBicmVha2luZy4gIElmIHlvdSB3aXNoIHRvIG9mdGVuIGJlIGluc2Vuc2l0aXZlIHRvCi0gKiBydW5zIG9mIHdoaXRlc3BhY2UgKGFzIGlzIG9mdGVuIHRoZSBjYXNlKSwgdXNlCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Rva2VuIj54czp0b2tlbjwvYT4KLSAqIChha2Ege0BsaW5rIFhtbFRva2VufSkgaW5zdGVhZC4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uICBXaGVuIG9idGFpbmluZyB0aGUgc3RyaW5nVmFsdWUsIHRoZQotICogd2hpdGVzcGFjZS1ub3JtYWxpemVkIHZhbHVlIGlzIHJldHVybmVkLgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxOb3JtYWxpemVkU3RyaW5nIGV4dGVuZHMgWG1sU3RyaW5nCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfbm9ybWFsaXplZFN0cmluZyIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsgc3RyaW5nIHRvIG5vcm1hbGl6ZSAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7IHN0cmluZyB0byBub3JtYWxpemUgJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDI4ZDE4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNrZXktdXJUeXBlIj54czphbnlUeXBlPC9hPiwKLSAqIHRoZSBiYXNlIHR5cGUgZm9yIGFsbCBYTUwgQmVhbnMuCi0gKiA8cD4KLSAqIFNpbmNlIGFsbCBYTUwgU2NoZW1hIHR5cGVzIGFyZSB0cmFuc2xhdGVkIGludG8gY29ycmVzcG9uZGluZyBYTUwgQmVhbgotICogY2xhc3NlcywgYW5kIGFsbCBTY2hlbWEgdHlwZSBkZXJpdmF0aW9uIGNvcnJlc3BvbmRzIHRvIEphdmEgY2xhc3MKLSAqIGluaGVyaXRhbmNlLCB0aGUgZmFjdCB0aGF0IGFsbCBTY2hlbWEgdHlwZXMgZGVyaXZlIGZyb20geHM6YW55VHlwZSBtZWFucwotICogdGhhdCBhbGwgWE1MIEJlYW4gY2xhc3NlcyBkZXJpdmUgZnJvbSBYbWxPYmplY3QuCi0gKiA8cD4KLSAqIE9uIHRoaXMgYmFzZSBjbGFzcyB5b3Ugd2lsbCBmaW5kIGEgbnVtYmVyIG9mIGNvbW1vbiBmYWNpbGl0aWVzIHRoYXQKLSAqIGFsbCBYTUwgQmVhbiBjbGFzc2VzIHByb3ZpZGU6Ci0gKiA8cD4KLSAqIDx1bD4KLSAqIDxsaT5FdmVyeSBYTUwgQmVhbiBjbGFzcyBoYXMgYW4gaW5uZXIgRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgYW5kIHBhcnNpbmcKLSAqICAgICBpbnN0YW5jZXMsIGluY2x1ZGluZyBYbWxPYmplY3QuIFVzZSB7QGxpbmsgWG1sT2JqZWN0LkZhY3Rvcnl9IGl0c2VsZgotICogICAgIHRvIHByb2R1Y2UgdW50eXBlZCBYTUwgdHJlZXMgb3IgWE1MIHRyZWVzIHRoYXQgaW1wbGVtZW50IHNwZWNpZmljCi0gKiAgICAgc3VidHlwZXMgb2YgWG1sT2JqZWN0IGRlcGVuZGluZyBvbiBhIHJlY29nbml6ZWQgcm9vdCBkb2N1bWVudCBlbGVtZW50LgotICogICAgIElmIHlvdSBkZXBlbmQgb24gdGhlIGF1dG9tYXRpYyB0eXBlIGluZmVyZW5jZSwgeW91IHdpbGwgd2FudCB0byB1bmRlcnN0YW5kCi0gKiAgICAgdGhlIHR5cGUgaW5mZXJlbmNlIGlzc3VlcyBkZXNjcmliZWQgYmVsb3cuCi0gKiA8bGk+VG8gd3JpdGUgb3V0IGFuIGFjY3VyYXRlIFhNTCBmaWxlIGZvciB0aGUgWE1MIHRyZWUgdW5kZXIgdGhpcwotICogICAgIFhtbE9iamVjdCwgdXNlIG9uZSBvZiB0aGUge0BsaW5rICNzYXZlfSBtZXRob2RzLAotICogICAgIG9yIHtAbGluayAjbmV3SW5wdXRTdHJlYW19IG9yIHtAbGluayAjbmV3UmVhZGVyfS4KLSAqICAgICBVc2Uge0BsaW5rICN0b1N0cmluZ30gdG8gcHJvZHVjZSBhIHByZXR0eS1wcmludGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICogICAgIFhNTCBzdWJ0cmVlIHVuZGVyIHRoaXMgWE1MIE9iamVjdC4gIElmIHlvdSBzYXZlIGludGVyaW9yIHBvcnRpb25zIG9mCi0gKiAgICAgYW4gWE1MIGRvY3VtZW50LCB5b3Ugd2lsbCB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGlubmVyIGNvbnRlbnRzCi0gKiAgICAgdmVyc3VzIG91dGVyIGNvbnRhaW5lciBpc3N1ZXMgZGVzY3JpYmVkIGJlbG93LgotICogPGxpPkl0IGlzIGFsc28gc2ltcGxlIHRvIGNvcHkgYW4gWG1sT2JqZWN0IGluc3RhbmNlIHRvIG9yIGZyb20gYSBzdGFuZGFyZAotICogICAgIERPTSB0cmVlIG9yIFNBWCBzdHJlYW0uICBVc2Uge0BsaW5rIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKE5vZGUpfSwKLSAqICAgICBmb3IgZXhhbXBsZSwgdG8gbG9hZCBmcm9tIERPTTsgdXNlIHtAbGluayBYbWxPYmplY3QuRmFjdG9yeSNuZXdYbWxTYXhIYW5kbGVyfQotICogICAgIHRvIGxvYWQgZnJvbSBTQVg7IHVzZSB7QGxpbmsgI25ld0RvbU5vZGUoKX0gdG8gc2F2ZSB0byBET007IGFuZCB1c2UgCi0gKiAgICAge0BsaW5rICNzYXZlKG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyLCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIpfQotICogICAgIHRvIHNhdmUgdG8gU0FYLgotICogPGxpPlVzZSB7QGxpbmsgI3ZhbGlkYXRlfSB0byB2YWxpZGF0ZSB0aGUgc3VidHJlZSBvZiBYTUwgdW5kZXIgdGhpcwotICogICAgIFhNTCBPYmplY3QuICBJZiB5b3Ugd2lzaCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uCi0gKiAgICAgYW5kIHJlYXNvbiBmb3IgdmFsaWRhdGlvbiBlcnJvcnMsIHNlZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfSwKLSAqICAgICBhbmQgdXNlIHtAbGluayAjdmFsaWRhdGUoWG1sT3B0aW9ucyl9LgotICogPGxpPlVzZSB7QGxpbmsgI25ld0N1cnNvcn0gdG8gYWNjZXNzIHRoZSBmdWxsIFhNTCBpbmZvc2V0LCBmb3IgZXhhbXBsZSwKLSAqICAgICBpZiB5b3UgbmVlZCB0byBkZXRlcm1pbmUgaW50ZXJsZWF2ZWQgZWxlbWVudCBvcmRlciBvciBtYW5pcHVsYXRlCi0gKiAgICAgYW5ub3RhdGlvbnMsIGNvbW1lbnRzLCBvciBtaXhlZCBjb250ZW50LiAgU2VlIHtAbGluayBYbWxDdXJzb3J9LgotICogPGxpPlVzZSB7QGxpbmsgI3NlbGVjdFBhdGh9IHRvIGZpbmQgb3RoZXIgWG1sT2JqZWN0cyBpbiB0aGUgc3VidHJlZSB1bmRlcm5lYXRoCi0gKiAgICAgdGhpcyBYbWxPYmplY3QgdXNpbmcgcmVsYXRpdmUgWFBhdGhzLiAgKEluIHNlbGVjdFBhdGgsICIuIiBpbmRpY2F0ZXMKLSAqICAgICB0aGUgY3VycmVudCBlbGVtZW50IG9yIGF0dHJpYnV0ZS4pCi0gKiA8L3VsPgotICogPHA+Ci0gKiBUeXBlIGluZmVyZW5jZS4gIFdoZW4gdXNpbmcge0BsaW5rIFhtbE9iamVjdC5GYWN0b3J5fSB0byBwYXJzZSBYTUwgZG9jdW1lbnRzLAotICogdGhlIGFjdHVhbCBkb2N1bWVudCB0eXBlIGlzIG5vdCB7QGxpbmsgWG1sT2JqZWN0I3R5cGV9IGl0c2VsZiwgYnV0IGEgc3VidHlwZQotICogYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBwYXJzZWQgZG9jdW1lbnQuICBJZiB0aGUgcGFyc2VkIGRvY3VtZW50Ci0gKiBjb250YWlucyBhIHJlY29nbml6ZWQgcm9vdCBkb2N1bWVudCBlbGVtZW50LCB0aGVuIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUKLSAqIGxvYWRlZCBpbnN0YW5jZSB3aWxsIGJlIHRoZSBtYXRjaGluZyBEb2N1bWVudCB0eXBlLiAgRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogWG1sT2JqZWN0IHhvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteURvY3VtZW50KTsKLSAqIGlmICh4b2JqIGluc3RhbmNlb2YgTXlPcmRlckRvY3VtZW50KSAvLyBzdGFydHMgdy8gJmx0O215LW9yZGVyJmd0OwotICogewotICogICAgIE15T3JkZXJEb2N1bWVudCBteWRvYyA9IChNeU9yZGVyRG9jdW1lbnQpeG9iajsKLSAqICAgICBpZiAoIXhvYmoudmFsaWRhdGUoKSkKLSAqICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3QgYSB2YWxpZCBteS1vcmRlciBkb2N1bWVudCIpOwotICogfQotICogZWxzZQotICogewotICogICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGEgbXktb3JkZXIgZG9jdW1lbnQiKTsKLSAqIH0KLSAqIDwvcHJlPgotICogRXZlcnkgWE1MIEJlYW4gY2xhc3MgaGFzIGl0cyBvd24gaW5uZXIgRmFjdG9yeSBjbGFzcywKLSAqIHNvIGlmIHlvdSBhY3R1YWxseSBrbm93IGV4YWN0bHkgd2hpY2ggWE1MIEJlYW4gZG9jdW1lbnQgdHlwZQotICogeW91IHdhbnQgdG8gbG9hZCBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgeW91IHNob3VsZCB1c2UgdGhlCi0gKiB0aGUgc3BlY2lmaWMgWE1MIEJlYW4gRmFjdG9yeSBjbGFzcyBpbnN0ZWFkLiBGb3IgZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiBNeU9yZGVyRG9jdW1lbnQgbXlkb2MgPSBNeU9yZGVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShteURvY3VtZW50KTsKLSAqIDwvcHJlPgotICogVGhlIGNvZGUgYWJvdmUgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHBhcnNlZCBkb2N1bWVudAotICogZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgcHJvcGVyIChteS1vcmRlcikgZWxlbWVudC4KLSAqIDxwPgotICogSW5uZXIgdmVyc3VzIG91dGVyLiAgQW4gWG1sT2JqZWN0IHJlcHJlc2VudHMgdGhlCi0gKiA8ZW0+Y29udGVudHM8L2VtPiBvZiBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSwgPGVtPm5vdDwvZW0+IHRoZSBlbGVtZW50Ci0gKiBvciBhdHRyaWJ1dGUgaXRzZWxmLiAgU28gd2hlbiB5b3UgdmFsaWRhdGUgb3Igc2F2ZSBhbiBYbWxPYmplY3QsIHlvdQotICogYXJlIHZhbGlkYXRpbmcgb3Igc2F2aW5nIGl0cyBjb250ZW50cywgbm90IGl0cyBjb250YWluZXIuICBGb3IgZXhhbXBsZSwKLSAqIGlmIHRoZSBYbWxPYmplY3QgcmVwcmVzZW50cyB0aGUgY29udGVudHMgb2YgYW4gZWxlbWVudCB3aGljaCBoYXBwZW5zCi0gKiB0byBpdHNlbGYgYmUgaW4gdGhlIHdyb25nIG9yZGVyIHJlbGF0aXZlIHRvIGl0cyBzaWJsaW5ncywgdmFsaWRhdGUgd2lsbAotICogbm90IGNvbXBsYWluIGFib3V0IHRoZSBtaXNwbGFjZW1lbnQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmCi0gKiBlbGVtZW50cyA8ZW0+d2l0aGluPC9lbT4gdGhlIFhtbE9iamVjdCBhcmUgaW4gdGhlIHdyb25nIG9yZGVyLCB2YWxpZGF0ZQotICogd2lsbCBjb21wbGFpbi4gIFNpbWlsYXJseSwgd2hlbiBzYXZpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIGludGVyaW9yCi0gKiBYbWxPYmplY3QsIGl0IGlzIHRoZSBjb250ZW50cyBvZiBhbiBlbGVtZW50LCBub3QgdGhlIGVsZW1lbnQgaXRzZWxmLAotICogd2hpY2ggaXMgc2F2ZWQgYnkgZGVmYXVsdC4KLSAqIDxwPgotICogUmVhZGluZyBhbmQgd3JpdGluZyBmcmFnbWVudHMuIFdoZW4gcmVhZGluZyBvciB3cml0aW5nIHRoZSBjb250ZW50cyBvZiBhCi0gKiB3aG9sZSBYTUwgZG9jdW1lbnQsIHRoZSBzdGFuZGFyZCBYTUwgcmVwcmVudGF0aW9uIGZvciBhIGRvY3VtZW50IGlzIHVzZWQuCi0gKiBIb3dldmVyLCB0aGVyZSBpcyBubyBzdGFuZGFyZCBjb25jcmV0ZSBYTUwgcmVwcmVzZW50YXRpb24gZm9yICJqdXN0IHRoZQotICogY29udGVudHMiIG9mIGFuIGludGVyaW9yIGVsZW1lbnQgb3IgYXR0cmlidXRlLiBTbyB3aGVuIG9uZSBpcyBuZWVkZWQsCi0gKiB0aGUgdGFnICZsdDt4bWwtZnJhZ21lbnQmZ3Q7IGlzIHVzZWQgdG8gd3JhcCB0aGUgY29udGVudHMuICBUaGlzIHRhZyBpcyB1c2VkCi0gKiBjYW4gYWxzbyBiZSB1c2VkIHRvIGxvYWQganVzdCB0aGUgY29udGVudHMgZm9yIGFuIFhtbE9iamVjdCBkb2N1bWVudCBmcmFnbWVudAotICogb2YgYXJiaXRyYXJ5IHR5cGUuIElmIHlvdSB3aXNoIHRvIHNhdmUgb3V0IHRoZSBYbWxPYmplY3QncyBjb250YWluZXIgZWxlbWVudAotICogYWxvbmcgd2l0aCBpdHMgY29udGVudHMsIHVzZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRTYXZlT3V0ZXJ9LgotICogPHA+Ci0gKiBJbXBsZW1lbnRpbmcgWG1sT2JqZWN0LiAgVGhlIFhNTEJlYW5zIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkKLSAqIGltcGxlbWVudGF0aW9ucyBvZiBYbWxPYmplY3QgLSBpbiBhbG1vc3QgYWxsIGNhc2VzLCB5b3Ugc2hvdWxkIG9ubHkgdXNlCi0gKiB0aGUgaW1wbGVtZW50YXRpb25zIG9mIFhtbE9iamVjdCBwcm92aWRlZCBieSB0aGUgWE1MQmVhbnMgY29tcGlsZXIgaXRzZWxmLgotICogSWYgeW91IG5lZWQgdG8gaW1wbGVtZW50IFhtbE9iamVjdCB5b3Vyc2VsZiwgeW91IHNob3VsZCBzdWJjbGFzcwotICogRmlsdGVyWG1sT2JqZWN0IGluIG9yZGVyIHRvIGRlbGVnYXRlIHRvIGFub3RoZXIgdW5kZXJseWluZyBYbWxPYmplY3QKLSAqIGltcGxlbWVudGF0aW9uLiBUaGlzIHRlY2huaXF1ZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgeW91ciBjb2RlIHVuY2hhbmdlZAotICogd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgWE1MQmVhbnMgdGhhdCBhZGQgYWRkaXRpb25hbCBtZXRob2RzIG9uIFhtbE9iamVjdC4gCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9iamVjdCBleHRlbmRzIFhtbFRva2VuU291cmNlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYW55VHlwZSIpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNjaGVtYSB0eXBlIGZvciB0aGlzIGluc3RhbmNlLiBUaGlzIGlzIGEgcGVybWFuZW50LAotICAgICAqIHVuY2hhbmdpbmcgcHJvcGVydHkgb2YgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdCBhcmUgdmFsaWQKLSAgICAgKiBhY2NvcmluZyB0byBzY2hlbWFUeXBlKCkuCi0gICAgICogPHA+Ci0gICAgICogRG9lcyBhIGRlZXAgdmFsaWRhdGlvbiBvZiB0aGUgZW50aXJlIHN1YnRyZWUgdW5kZXIgdGhlCi0gICAgICogb2JqZWN0LCBidXQgZG9lcyBub3QgdmFsaWRhdGUgdGhlIHBhcmVudHMgb3Igc2libGluZ3MKLSAgICAgKiBvZiB0aGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaXMgaW4gdGhlIGludGVyaW9yIG9mIGFuIHhtbAotICAgICAqIHRyZWUuCi0gICAgICovCi0gICAgYm9vbGVhbiB2YWxpZGF0ZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPkp1c3QgbGlrZSB2YWxpZGF0ZSgpLCBidXQgd2l0aCBvcHRpb25zLjwvcD4KLSAgICAgKiA8cD5JZiB5b3Ugd2lzaCB0byBjb2xsZWN0IGVycm9yIG1lc3NhZ2VzIGFuZCBsb2NhdGlvbnMgd2hpbGUgdmFsaWRhdGluZywKLSAgICAgKiB1c2UgdGhlIHtAbGluayBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXJ9IG1ldGhvZC4gV2l0aCB0aGF0IG1ldGhvZCwKLSAgICAgKiB5b3UgY2FuIHNwZWNpZnkgYW4gb2JqZWN0IGluIHdoaWNoIHRvIHN0b3JlIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gdmFsaWRhdGlvbi4KLSAgICAgKiBUaGUgZm9sbG93aW5nIGlzIGEgc2ltcGxlIGV4YW1wbGUuPC9wPgotICAgICAqIAotICAgICAqIDxwcmU+Ci0gICAgICogLy8gQ3JlYXRlIGFuIFhtbE9wdGlvbnMgaW5zdGFuY2UgYW5kIHNldCB0aGUgZXJyb3IgbGlzdGVuZXIuCi0gICAgICogWG1sT3B0aW9ucyB2YWxpZGF0ZU9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAqIEFycmF5TGlzdCBlcnJvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICogdmFsaWRhdGVPcHRpb25zLnNldEVycm9yTGlzdGVuZXIoZXJyb3JMaXN0KTsKLSAgICAgKiAKLSAgICAgKiAvLyBWYWxpZGF0ZSB0aGUgWE1MLgotICAgICAqIGJvb2xlYW4gaXNWYWxpZCA9IG5ld0VtcC52YWxpZGF0ZSh2YWxpZGF0ZU9wdGlvbnMpOwotICAgICAqIAotICAgICAqIC8vIElmIHRoZSBYTUwgaXNuJ3QgdmFsaWQsIGxvb3AgdGhyb3VnaCB0aGUgbGlzdGVuZXIncyBjb250ZW50cywKLSAgICAgKiAvLyBwcmludGluZyBjb250YWluZWQgbWVzc2FnZXMuCi0gICAgICogaWYgKCFpc1ZhbGlkKQotICAgICAqIHsKLSAgICAgKiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXJyb3JMaXN0LnNpemUoKTsgaSsrKQotICAgICAqICAgICAgewotICAgICAqICAgICAgICAgIFhtbEVycm9yIGVycm9yID0gKFhtbEVycm9yKWVycm9yTGlzdC5nZXQoaSk7Ci0gICAgICogICAgICAgICAgCi0gICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOwotICAgICAqICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZTogIiArIGVycm9yLmdldE1lc3NhZ2UoKSArICJcbiIpOwotICAgICAqICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYXRpb24gb2YgaW52YWxpZCBYTUw6ICIgKyAKLSAgICAgKiAgICAgICAgICAgICAgZXJyb3IuZ2V0Q3Vyc29yTG9jYXRpb24oKS54bWxUZXh0KCkgKyAiXG4iKTsKLSAgICAgKiAgICAgIH0KLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9uIAotICAgICAqIENvbGxlY3Rpb259IGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBib29sZWFuIHZhbGlkYXRlKFhtbE9wdGlvbnMgb3B0aW9ucyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGEgcGF0aC4gIFBhdGggY2FuIGJlIGEgc3RyaW5nIG9yIHByZWNvbXBpbGVkIHBhdGggU3RyaW5nLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwYXRoIG11c3QgYmUgYSByZWxhdGl2ZSBwYXRoLCB3aGVyZSAiLiIgcmVwcmVzZW50cyB0aGUKLSAgICAgKiBlbGVtZW50IG9yIGF0dHJpYnV0ZSBjb250YWluZyB0aGlzIFhtbE9iamVjdCwgYW5kIGl0IG11c3Qgc2VsZWN0Ci0gICAgICogb25seSBvdGhlciBlbGVtZW50cyBvciBhdHRyaWJ1dGVzLiAgSWYgYSBub24tZWxlbWVudCBvciBub24tYXR0cmlidXRlCi0gICAgICogaXMgc2VsZWN0ZWQsIGFuIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcnJheSB0aGF0IGlzIHJldHVybmVkIGNvbnRhaW5zIGFsbCB0aGUgc2VsZWN0ZWQKLSAgICAgKiBYbWxPYmplY3RzLCB3aXRoaW4gdGhlIHNhbWUgZG9jdW1lbnQsIGxpc3RlZCBpbiBkb2N1bWVudAotICAgICAqIG9yZGVyLiAgVGhlIGFjdHVhbCBhcnJheSB0eXBlIG9mIHRoZSByZXN1bHQgaXMgaW5mZXJyZWQKLSAgICAgKiBmcm9tIHRoZSBjbG9zZXN0IGNvbW1vbiBiYXNlIHR5cGUgb2Ygc2VsZWN0ZWQgcmVzdWx0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdXNhZ2UuICBTdXBwb3NlIHdlIGhhdmUgYSBnbG9iYWwKLSAgICAgKiBlbGVtZW50IGRlZmluaXRpb24gZm9yICJvd25lciIgd2hvc2UgdHlwZSBpcyAicGVyc29uIjoKLSAgICAgKiA8cHJlPgotICAgICAqICAgJmx0O3NjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9zYW1wbGUiPgotICAgICAqICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ib3duZXIiIHR5cGU9InBlcnNvbiIvPgotICAgICAqICAgICAgJmx0O2NvbXBsZXhUeXBlIG5hbWU9InBlcnNvbiI+Ci0gICAgICogICAgICAgICBbLi4uXQotICAgICAqICAgICAgJmx0Oy9jb21wbGV4VHlwZT4KLSAgICAgKiAgICZsdDsvc2NoZW1hPgotICAgICAqIDwvcHJlPgotICAgICAqIGFuZCBzdXBwb3NlICJvd25lciIgdGFncyBjYW4gYmUgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlCi0gICAgICogZG9jdW1lbnQuICBUaGVuIHdlIGNhbiB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gZmluZAotICAgICAqIHRoZW0gYWxsOgotICAgICAqIDxwcmU+Ci0gICAgICogaW1wb3J0IG9yZy5vcGVudXJpLnNhbXBsZS5QZXJzb247Ci0gICAgICogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKLSAgICAgKiBbLi4uXQotICAgICAqICAgWG1sT2JqZWN0IHhvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteUZpbGUpOwotICAgICAqICAgUGVyc29uW10gcmVzdWx0czsKLSAgICAgKiAgIHJlc3VsdHMgPSAoUGVyc29uW10peG9iai5zZWxlY3RQYXRoKAotICAgICAqICAgICAgImRlY2xhcmUgbmFtZXNwYWNlIHM9J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvc2FtcGxlJyAiICsKLSAgICAgKiAgICAgICIuLy9zOm93bmVyIik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogTm90aWNlIHRoZSB3YXkgaW4gd2hpY2ggbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhcmUgZG9uZSBpbiBYUGF0aCAyLjAuCi0gICAgICogU2luY2UgWFBhdGggY2FuIG9ubHkgbmF2aWdhdGUgd2l0aGluIGFuIFhNTCBkb2N1bWVudCAtIGl0IGNhbm5vdAotICAgICAqIGNvbnN0cnVjdCBuZXcgWE1MIC0gdGhlIHJlc3VsdGluZyBYbWxPYmplY3RzIGFsbCByZXNpZGUgaW4KLSAgICAgKiB0aGUgc2FtZSBYTUwgZG9jdW1lbnQgYXMgdGhpcyBYbWxPYmplY3QgaXRzZWxmLgotICAgICAqLwotICAgIFhtbE9iamVjdFtdIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApOwotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHBhdGgsIGFwcGx5aW5nIG9wdGlvbnMuCi0gICAgICogCi0gICAgICogQHNlZSAjc2VsZWN0UGF0aChTdHJpbmcpCi0gICAgICovCi0gICAgWG1sT2JqZWN0W10gc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgcXVlcnkuICBRdWVyeSBjYW4gYmUgYSBzdHJpbmcgb3IgcHJlY29tcGlsZWQgcXVlcnkgU3RyaW5nLgotICAgICAqIDxwPgotICAgICAqIEFuIFhRdWVyeSBpcyB2ZXJ5IHNpbWlsYXIgdG8gYW4gWFBhdGgsIGV4Y2VwdCB0aGF0IGl0IGFsc28gcGVybWl0cwotICAgICAqIGNvbnN0cnVjdGlvbiBvZiBuZXcgWE1MLiAgQXMgYSByZXN1bHQsIHRoZSBYbWxPYmplY3RzIHRoYXQgYXJlCi0gICAgICogcmV0dXJuZWQgZnJvbSBleGVjUXVlcnkgYXJlIGluIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnRzLCBzZXBhcmF0ZQotICAgICAqIGZyb20gdGhlIFhtbE9iamVjdCBvbiB3aGljaCB0aGUgcXVlcnkgaXMgZXhlY3V0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ludGF4IGFuZCB1c2FnZSBpcyBvdGhlcndpc2Ugc2ltaWxhciB0byBzZWxlY3RQYXRoLgotICAgICAqIDxwPgotICAgICAqIEBzZWUgI3NlbGVjdFBhdGgoU3RyaW5nKQotICAgICAqLwotICAgIFhtbE9iamVjdFtdIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeSApOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgYSBxdWVyeSB3aXRoIG9wdGlvbnMuCi0gICAgICogCi0gICAgICogVXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAqIAotICAgICAqIDx0YWJsZT4KLSAgICAgKiA8dHI+PHRoPlRvIHNwZWNpZnkgdGhpczwvdGg+PHRoPlVzZSB0aGlzIG1ldGhvZDwvdGg+PC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UaGUgZG9jdW1lbnQgdHlwZSBmb3IgdGhlIHJvb3QgZWxlbWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRUeXBlfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyByZXBsYWNlIHRoZSBkb2N1bWVudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBRTmFtZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgICAgKiAgcmVzdWx0aW5nIGRvY3VtZW50LjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkUmVwbGFjZURvY3VtZW50RWxlbWVudH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSB3aGVuIGNvbnN0cnVjdGluZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBXaGl0ZXNwYWNlfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgY29tbWVudHMgd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwQ29tbWVudHN9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyB3aGVuIGNvbnN0cnVjdGluZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBQcm9jaW5zdHN9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPkEgbWFwIG9mIG5hbWVzcGFjZSBVUkkgc3Vic3RpdHV0aW9ucyB0byB1c2Ugd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5BZGRpdGlvbmFsIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBiZSBhZGRlZCB3aGVuIGNvbnN0cnVjdGluZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXN9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIHRyaW0gdGhlIHVuZGVybHlpbmcgWE1MIHRleHQgYnVmZmVyIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGluZyAKLSAgICAgKiAgYSBkb2N1bWVudCwgcmVzdWx0aW5nIGluIGEgc21hbGxlciBtZW1vcnkgZm9vdHByaW50LjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkVHJpbVRleHRCdWZmZXJ9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPldoZXRoZXIgdmFsdWUgZmFjZXRzIHNob3VsZCBiZSBjaGVja2VkIGFzIHRoZXkgYXJlIHNldC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0VmFsaWRhdGVPblNldH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPC90YWJsZT4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBYUXVlcnkgZXhwcmVzc2lvbi4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGFzIGRlc2NyaWJlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNleGVjUXVlcnkoU3RyaW5nKQotICAgICAqLwotICAgIFhtbE9iamVjdFtdIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeSwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSBzY2hlbWEgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkYXRhIGFuZAotICAgICAqIHJldHVybnMgYSBuZXcgWG1sT2JqZWN0IGluc3RhbmNlIHdob3NlIHNjaGVtYVR5cGUgaXMgdGhlCi0gICAgICogbmV3IHR5cGUuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoZSB0eXBlIGNoYW5nZSBpcyBub3QgYWxsb3dlZC4gQ2VydGFpbgotICAgICAqIHR5cGUgY2hhbmdlcyBtYXkgYmUgcHJvaGliaXRlZCBvbiB0aGUgaW50ZXJpb3Igb2YgYW4geG1sCi0gICAgICogdHJlZSBkdWUgdG8gc2NoZW1hIHR5cGUgc3lzdGVtIGNvbnN0cmFpbnRzICh0aGF0IGlzLCBkdWUKLSAgICAgKiB0byBhIHBhcmVudCBjb250YWluZXIgd2l0aGluIHdoaWNoIHRoZSBuZXdseSBzcGVjaWZpZWQKLSAgICAgKiB0eXBlIGlzIG5vdCBwZXJtaXNzaWJsZSksIGJ1dCB0aGVyZSBhcmUgbm8gY29uc3RyYWludHMKLSAgICAgKiBhdCB0aGUgcm9vdHR5cGUgY2hhbmdlcyBhcmUgbmV2ZXIKLSAgICAgKiBwcm9oaWJpdGVkIGF0IHRoZSByb290IG9mIGFuIHhtbCB0cmVlLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSB0eXBlIGNoYW5nZSBpcyBhbGxvd2VkLCB0aGVuIHRoZSBuZXcgWG1sT2JqZWN0IHNob3VsZAotICAgICAqIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhlIG9sZCBvbmUuIFRoZSBvbGQgWG1sT2JqZWN0IGluc3RhbmNlIGFuZAotICAgICAqIGFueSBvdGhlciBYbWxPYmplY3QgaW5zdGFuY2VzIGluIHRoZSBzdWJ0cmVlIGFyZSBwZXJtYW5lbnRseQotICAgICAqIGludmFsaWRhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIChUaGV5IHdpbGwgcmV0dXJuCi0gICAgICogSW52YWxpZFN0YXRlRXhjZXB0aW9uIGlmIHlvdSB0cnkgdG8gdXNlIHRoZW0uKQotICAgICAqCi0gICAgICogSWYgYSB0eXBlIGNoYW5nZSBpcyBkb25lIG9uIHRoZSBpbnRlcmlvciBvZiBhbiBYbWwKLSAgICAgKiB0cmVlLCB0aGVuIHhzaTp0eXBlIGF0dHJpYnV0ZXMgYXJlIHVwZGF0ZWQgYXMgbmVlZGVkLgotICAgICAqLwotICAgIFhtbE9iamVjdCBjaGFuZ2VUeXBlKFNjaGVtYVR5cGUgbmV3VHlwZSk7Ci0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIG5pbC4gTm90ZSB0aGF0IGluIG9yZGVyIHRvIGJlIG5pbCwKLSAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBpbiBhbiBlbGVtZW50LCBhbmQgdGhlIGVsZW1lbnQgY29udGFpbmluZwotICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIG1hcmtlZCBhcyBuaWxsYWJsZSBpbiB0aGUgc2NoZW1hLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNOaWwoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIHRvIG5pbC4gVGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgdmFsdWUgbXVzdAotICAgICAqIGJlIG1hcmtlZCBhcyBuaWxsYWJsZSBpbiB0aGUgc2NoZW1hLgotICAgICAqLwotICAgIHZvaWQgc2V0TmlsKCk7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWE1MIHN0cmluZyBmb3IgdGhpcyBYTUwgb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJpbmcgaXMgcHJldHR5LXByaW50ZWQuICBJZiB5b3Ugd2FudCBhIG5vbi1wcmV0dHktcHJpbnRlZAotICAgICAqIHN0cmluZywgb3IgaWYgeW91IHdhbnQgdG8gY29udHJvbCBvcHRpb25zIHByZWNpc2VseSwgdXNlIHRoZQotICAgICAqIHhtbFRleHQoKSBtZXRob2RzLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB3aGVuIHByb2R1Y2luZyBYTUwgYW55IG9iamVjdCBvdGhlciB0aGFuIHZlcnkgcm9vdCBvZiB0aGUKLSAgICAgKiBkb2N1bWVudCwgdGhlbiB5b3UgYXJlIGd1YXJhbnRlZWQgdG8gYmUgbG9va2luZyBhdCBvbmx5IGEgZnJhZ21lbnQKLSAgICAgKiBvZiBYTUwsIGkuZS4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLCBhbmQKLSAgICAgKiBhbmQgd2Ugd2lsbCBwcm9kdWNlIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggYW4gPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDs8L2NvZGU+IHRhZy4KLSAgICAgKiBUaGUgWG1sT3B0aW9ucy5zZXRTYXZlT3V0ZXIoKSBvcHRpb24gb24geG1sVGV4dCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlCi0gICAgICogdGhlIGFjdHVhbCBlbGVtZW50IG5hbWUgYWJvdmUgdGhlIG9iamVjdCBpZiB5b3Ugd2lzaC4KLSAgICAgKi8KLSAgICBTdHJpbmcgdG9TdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGltbXV0YWJsZSB2YWx1ZS4gSW1tdXRhYmxlIHZhbHVlcyBkbyBub3QKLSAgICAgKiBoYXZlIGEgcG9zaXRpb24gaW4gYSB0cmVlOyByYXRoZXIsIHRoZXkgYXJlIHN0YW5kLWFsb25lIHNpbXBsZSB0eXBlCi0gICAgICogdmFsdWVzLiBJZiB0aGUgb2JqZWN0IGlzIGltbXV0YWJsZSwgdGhlIGVxdWFscygpIG1ldGhvZHMgdGVzdHMgZm9yCi0gICAgICogdmFsdWUgZXF1YWxpdHksIGFuZCB0aGUgb2JqZWN0IGNhbiBiZSB1c2VkIGFzIHRoZSBrZXkgZm9yIGEgaGFzaC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSW1tdXRhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlL3R5cGUgb2YgdGhpcyBYbWxPYmplY3QgdG8gYmUgYSBjb3B5IG9mIHRoZSBzb3VyY2UKLSAgICAgKiBYbWxPYmplY3QuICBCZWNhdXNlIHRoZSB0eXBlIG9mIHRoZSBzb3VyY2UgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoaXMKLSAgICAgKiB0YXJnZXQsIHRoaXMgWG1sT2JqZWN0IG1heSBiZWNvbWUgZGVmdW5jdC4gIEluIHRoaXMgY2FzZSB0aGUgbmV3Ci0gICAgICogWG1sT2JqZWN0IGlzIHJldHVybmVkLiAgSWYgbm8gdHlwZSBjaGFuZ2UgaGFwcGVucywgdGhlIHNhbWUgdGhpcyB3aWxsIGJlCi0gICAgICogcmV0dXJuZWQuCi0gICAgICovCi0gICAgWG1sT2JqZWN0IHNldChYbWxPYmplY3Qgc3JjT2JqKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoaXMgWG1sT2JqZWN0LiAgVGhlIHJldHVybmVkIG9iamVjdCBoYXMgdGhlCi0gICAgICogc2FtZSB0eXBlIGFzIHRoZSBjdXJyZW50IG9iamVjdCwgYW5kIGhhcyBhbGwgdGhlIGNvbnRlbnQgb2YKLSAgICAgKiB0aGUgWE1MIGRvY3VtZW50IHVuZGVybmVhdGggdGhlIGN1cnJlbnQgb2JqZWN0LiAgTm90ZSB0aGF0Ci0gICAgICogYW55IHBhcnRzIG9mIHRoZSBYTUwgZG9jdW1lbnQgYWJvdmUgb3Igb3V0c2lkZSB0aGlzIFhtbE9iamVjdCBhcmUKLSAgICAgKiBub3QgY29waWVkLgotICAgICAqLwotICAgIFhtbE9iamVjdCBjb3B5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB4bWwgdmFsdWVzIGFyZSBlcXVhbC4gVHdvIGRpZmZlcmVudCBvYmplY3RzCi0gICAgICogKHdoaWNoIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IGVxdWFscyhvYmopID09IGZhbHNlKSBtYXkgb2YKLSAgICAgKiBjb3Vyc2UgaGF2ZSBlcXVhbCB2YWx1ZXMgKHZhbHVlRXF1YWxzKG9iaikgPT0gdHJ1ZSkuCi0gICAgICogPHA+Ci0gICAgICogVXN1YWxseSB0aGlzIG1ldGhvZCBjYW4gYmUgdHJlYXRlZCBhcyBhbiBvcmRpbmFyeSBlcXV2YWxlbmNlCi0gICAgICogcmVsYXRpb24sIGJ1dCBhY3R1YWxseSBpdCBpcyBub3QgaXMgbm90IHRyYW5zaXRpdmUuCi0gICAgICogSGVyZSBpcyBhIHByZWNpc2Ugc3BlY2lmaWNhdGlvbjoKLSAgICAgKiA8cD4KLSAgICAgKiBUaGVyZSBhcmUgdHdvIGNhdGVnb3JpZXMgb2YgWE1MIG9iamVjdDogb2JqZWN0cyB3aXRoIGEga25vd24KLSAgICAgKiBpbnN0YW5jZSB0eXBlLCBhbmQgb2JqZWN0cyB3aG9zZSBvbmx5IGtub3duIHR5cGUgaXMgb25lIG9mIHRoZQotICAgICAqIHVyLXR5cGVzIChlaXRoZXIgQW55VHlwZSBvciBBbnlTaW1wbGVUeXBlKS4gVGhlIGZpcnN0IGNhdGVnb3J5Ci0gICAgICogaXMgY29tcGFyZWQgaW4gdGVybXMgb2YgbG9naWNhbCB2YWx1ZSBzcGFjZXMsIGFuZCB0aGUgc2Vjb25kCi0gICAgICogY2F0ZWdvcnkgaXMgY29tcGFyZWQgbGV4aWNhbGx5LgotICAgICAqIDxwPgotICAgICAqIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHR3byBjYXRlZ29yaWVzLCB2YWx1ZUVxdWFscyBpcyBhIHdlbGwtYmVoYXZlZAotICAgICAqIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiBIb3dldmVyLCB3aGVuIGNvbXBhcmluZyBhbiBvYmplY3Qgb2Yga25vd24KLSAgICAgKiB0eXBlIHdpdGggYW4gb2JqZWN0IHdpdGggdXItdHlwZSwgdGhlIGNvbXBhcmlzb24gaXMgZG9uZSBieSBhdHRlbXB0aW5nCi0gICAgICogdG8gY29udmVydCB0aGUgbGV4aWNhbCBmb3JtIG9mIHRoZSB1ci10eXBlZCBvYmplY3QgaW50byB0aGUgb3RoZXIKLSAgICAgKiB0eXBlLCBhbmQgdGhlbiBjb21wYXJpbmcgdGhlIHJlc3VsdHMuIFVyLXR5cGVkIG9iamVjdHMgYXJlIHRoZXJlZm9yZQotICAgICAqIHRyZWF0ZWQgYXMgbGV4aWNhbCB3aWxkY2FyZHMgYW5kIG1heSBiZSBlcXVhbCB0byBvYmplY3RzIGluIGRpZmZlcmVudAotICAgICAqIHZhbHVlIHNwYWNlcywgZXZlbiB0aG91Z2ggdGhlIG9iamVjdHMgaW4gZGlmZmVyZW50IHZhbHVlIHNwYWNlcyBhcmUKLSAgICAgKiBub3QgZXF1YWwgdG8gZWFjaCBvdGhlci4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIGFueVNpbXBsZVR5cGUgdmFsdWUgIjEiIHdpbGwgY29tcGFyZSBhcyBhbgotICAgICAqIGVxdWFsVmFsdWUgdG8gdGhlIHN0cmluZyAiMSIsIHRoZSBmbG9hdCB2YWx1ZSAiMS4wIiwgdGhlIGRvdWJsZQotICAgICAqIHZhbHVlICIxLjAiLCB0aGUgZGVjaW1hbCAiMSIsIGFuZCB0aGUgR1llYXIgIjEiLCBldmVuIHRob3VnaAotICAgICAqIGFsbCB0aGVzZSBvYmplY3RzIHdpbGwgY29tcGFyZSB1bmVxdWFsIHRvIGVhY2ggb3RoZXIgc2luY2UgdGhleQotICAgICAqIGxpZSBpbiBkaWZmZXJlbnQgdmFsdWUgc3BhY2VzLgotICAgICAqLwotICAgIGJvb2xlYW4gdmFsdWVFcXVhbHMoWG1sT2JqZWN0IG9iaik7Ci0KLSAgICBpbnQgdmFsdWVIYXNoQ29kZSgpOwotCi0gICAgLyoqCi0gICAgICogSW1wZWxlbWVudHMgdGhlIENvbXBhcmFibGUgaW50ZXJmYWNlIGJ5IGNvbXBhcmluZyB0d28gc2ltcGxlCi0gICAgICogeG1sIHZhbHVlcyBiYXNlZCBvbiB0aGVpciBzdGFuZGFyZCBYTUwgc2NoZW1hIG9yZGVyaW5nLgotICAgICAqIFRocm93cyBhIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBubyBzdGFuZGFyZCBvcmRlcmluZyBhcHBsaWVzLAotICAgICAqIG9yIGlmIHRoZSB0d28gdmFsdWVzIGFyZSBpbmNvbXBhcmFibGUgd2l0aGluIGEgcGFydGlhbCBvcmRlci4KLSAgICAgKi8KLSAgICBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmopOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjb21wYXJpc29uIG1ldGhvZCBpcyBzaW1pbGFyIHRvIGNvbXBhcmVUbywgYnV0IHJhdGhlcgotICAgICAqIHRoYW4gdGhyb3dpbmcgYSBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiB0d28gdmFsdWVzIGFyZSBpbmNvbXBhcmFibGUsCi0gICAgICogaXQgcmV0dXJucyB0aGUgbnVtYmVyIDIuIFRoZSByZXN1bHQgY29kZXMgYXJlIC0xIGlmIHRoaXMgb2JqZWN0Ci0gICAgICogaXMgbGVzcyB0aGFuIG9iaiwgMSBpZiB0aGlzIG9iamVjdCBpcyBncmVhdGVyIHRoYW4gb2JqLCB6ZXJvIGlmCi0gICAgICogdGhlIG9iamVjdHMgYXJlIGVxdWFsLCBhbmQgMiBpZiB0aGUgb2JqZWN0cyBhcmUgaW5jb21wYXJhYmxlLgotICAgICAqLwotICAgIGludCBjb21wYXJlVmFsdWUoWG1sT2JqZWN0IG9iaik7Ci0gICAgCi0gICAgLyoqIExFU1NfVEhBTiBpcyAtMS4gU2VlIHtAbGluayAjY29tcGFyZVZhbHVlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IExFU1NfVEhBTiA9IC0xOwotICAgIC8qKiBFUVVBTCBpcyAwLiBTZWUge0BsaW5rICNjb21wYXJlVmFsdWV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVFVQUwgPSAwOwotICAgIC8qKiBHUkVBVEVSX1RIQU4gaXMgMS4gU2VlIHtAbGluayAjY29tcGFyZVZhbHVlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEdSRUFURVJfVEhBTiA9IDE7Ci0gICAgLyoqIE5PVF9FUVVBTCBpcyAyLiBTZWUge0BsaW5rICNjb21wYXJlVmFsdWV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0VRVUFMID0gMjsKLQotICAgIC8qKgotICAgICAqIFN0YXRpYyBmYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzLiAgTm90ZSB0aGF0IGlmCi0gICAgICogYSB0eXBlIGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSBYTUwgYmVpbmcgbG9hZGVkIChmb3IgZXhhbXBsZSwKLSAgICAgKiBieSByZWNvZ25pemluZyB0aGUgZG9jdW1lbnQgZWxlbWVudCBRTmFtZSksIHRoZW4gdGhlIGluc3RhbmNlCi0gICAgICogcmV0dXJuZWQgYnkgYSBmYWN0b3J5IHdpbGwgaGF2ZSB0aGUgaW5mZXJyZWQgdHlwZS4gIE90aGVyd2lzZQotICAgICAqIHRoZSBGYWN0b3J5IHdpbGwgcmV0dXJuZWQgYW4gdW50eXBlZCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3LCBjb21wbGV0ZWx5IGVtcHR5IGluc3RhbmNlLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IG5ld0luc3RhbmNlICggKSB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcsIGNvbXBsZXRlbHkgZW1wdHkgaW5zdGFuY2UsIHNwZWNpZnlpbmcgb3B0aW9ucwotICAgICAgICAgKiBmb3IgdGhlIHJvb3QgZWxlbWVudCdzIGRvY3VtZW50IHR5cGUgYW5kL29yIHdoZXRoZXIgdG8gdmFsaWRhdGUKLSAgICAgICAgICogdmFsdWUgZmFjZXRzIGFzIHRoZXkgYXJlIHNldC48L3A+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBVc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8dGFibGU+Ci0gICAgICAgICAqIDx0cj48dGg+VG8gc3BlY2lmeSB0aGlzPC90aD48dGg+VXNlIHRoaXMgbWV0aG9kPC90aD48L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VGhlIGRvY3VtZW50IHR5cGUgZm9yIHRoZSByb290IGVsZW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXREb2N1bWVudFR5cGV9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPldoZXRoZXIgdmFsdWUgZmFjZXRzIHNob3VsZCBiZSBjaGVja2VkIGFzIHRoZXkgYXJlIHNldC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFZhbGlkYXRlT25TZXR9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPC90YWJsZT4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHNwZWNpZnlpbmcgcm9vdCBkb2N1bWVudCB0eXBlIGFuZC9vciB2YWx1ZSBmYWNldCAKLSAgICAgICAgICogY2hlY2tpbmcuCi0gICAgICAgICAqIEByZXR1cm4gQSBuZXcsIGVtcHR5IGluc3RhbmNlIG9mIFhtbE9iamVjdC48L2xpPgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IG5ld0luc3RhbmNlICggWG1sT3B0aW9ucyBvcHRpb25zICkgewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSB2YWx1ZS4KLSAgICAgICAgICovIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE9iamVjdH0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgbmV3VmFsdWUgKCBPYmplY3Qgb2JqICkgewotICAgICAgICAgIHJldHVybiB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIFN0cmluZ30gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggU3RyaW5nIHMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgU3RyaW5nfSBhcyBYTUwuCi0gICAgICAgICAqIAotICAgICAgICAgKiBVc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8dGFibGU+Ci0gICAgICAgICAqIDx0cj48dGg+VG8gc3BlY2lmeSB0aGlzPC90aD48dGg+VXNlIHRoaXMgbWV0aG9kPC90aD48L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VGhlIGRvY3VtZW50IHR5cGUgZm9yIHRoZSByb290IGVsZW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXREb2N1bWVudFR5cGV9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHBsYWNlIGxpbmUgbnVtYmVyIGFubm90YXRpb25zIGluIHRoZSBzdG9yZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRMaW5lTnVtYmVyc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VG8gcmVwbGFjZSB0aGUgZG9jdW1lbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgUU5hbWUgd2hlbiBwYXJzaW5nLjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFJlcGxhY2VEb2N1bWVudEVsZW1lbnR9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBXaGl0ZXNwYWNlfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgY29tbWVudHMgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBDb21tZW50c308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwUHJvY2luc3RzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5BIG1hcCBvZiBuYW1lc3BhY2UgVVJJIHN1YnN0aXR1dGlvbnMgdG8gdXNlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5BZGRpdGlvbmFsIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBiZSBhZGRlZCB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VG8gdHJpbSB0aGUgdW5kZXJseWluZyBYTUwgdGV4dCBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgcGFyc2luZyAKLSAgICAgICAgICogIGEgZG9jdW1lbnQsIHJlc3VsdGluZyBpbiBhIHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRUcmltVGV4dEJ1ZmZlcn08L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8L3RhYmxlPiAKLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gcGFyc2UuCi0gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgYXMgc3BlY2lmaWVkLgotICAgICAgICAgKiBAcmV0dXJuIEEgbmV3IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBTdHJpbmcgcywgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIG51bGwsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIEZpbGV9IGFzIFhNTC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIEZpbGUgZiApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgbnVsbCwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIEZpbGV9IGFzIFhNTC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIEZpbGUgZiwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEb3dubG9hZHMgdGhlIGdpdmVuIHtAbGluayBqYXZhLm5ldC5VUkx9IGFzIFhNTC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgbnVsbCwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvd25sb2FkcyB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubmV0LlVSTH0gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgbnVsbCwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlY29kZXMgYW5kIHBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBJbnB1dFN0cmVhbSBpcyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlY29kZXMgYW5kIHBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBhcyBYTUwuCi0gICAgICAgICAqIAotICAgICAgICAgKiBVc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8dGFibGU+Ci0gICAgICAgICAqIDx0cj48dGg+VG8gc3BlY2lmeSB0aGlzPC90aD48dGg+VXNlIHRoaXMgbWV0aG9kPC90aD48L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2Ugd2hlbiBwYXJzaW5nIG9yIHdyaXRpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldENoYXJhY3RlckVuY29kaW5nfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UaGUgZG9jdW1lbnQgdHlwZSBmb3IgdGhlIHJvb3QgZWxlbWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldERvY3VtZW50VHlwZX08L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+UGxhY2UgbGluZSBudW1iZXIgYW5ub3RhdGlvbnMgaW4gdGhlIHN0b3JlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZExpbmVOdW1iZXJzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5SZXBsYWNlIHRoZSBkb2N1bWVudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBRTmFtZSB3aGVuIHBhcnNpbmcuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkUmVwbGFjZURvY3VtZW50RWxlbWVudH08L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+U3RyaXAgYWxsIGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcFdoaXRlc3BhY2V9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlN0cmlwIGFsbCBjb21tZW50cyB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcENvbW1lbnRzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5TdHJpcCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBQcm9jaW5zdHN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlNldCBhIG1hcCBvZiBuYW1lc3BhY2UgVVJJIHN1YnN0aXR1dGlvbnMgdG8gdXNlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5TZXQgYWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MgdG8gYmUgYWRkZWQgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRyaW0gdGhlIHVuZGVybHlpbmcgWE1MIHRleHQgYnVmZmVyIGltbWVkaWF0ZWx5IGFmdGVyIHBhcnNpbmcgCi0gICAgICAgICAqICBhIGRvY3VtZW50LCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkVHJpbVRleHRCdWZmZXJ9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPC90YWJsZT4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBJbnB1dFN0cmVhbSBpcywgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgUmVhZGVyfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBSZWFkZXIgciApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgUmVhZGVyfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBSZWFkZXIgciwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gRE9NIHtAbGluayBOb2RlfSBpbnRvIGFuIFhtbE9iamVjdC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIE5vZGUgbm9kZSApIHRocm93cyBYbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCBudWxsLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gRE9NIHtAbGluayBOb2RlfSBpbnRvIGFuIFhtbE9iamVjdC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIE5vZGUgbm9kZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIG51bGwsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvYWRzIHRoZSBnaXZlbiB7QGxpbmsgWE1MSW5wdXRTdHJlYW19IGludG8gYW4gWG1sT2JqZWN0LgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFhNTElucHV0U3RyZWFtIHhpcyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogTG9hZHMgdGhlIGdpdmVuIHtAbGluayBYTUxJbnB1dFN0cmVhbX0gaW50byBhbiBYbWxPYmplY3QuCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggWE1MSW5wdXRTdHJlYW0geGlzLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIG51bGwsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBYbWxTYXhIYW5kbGVyfSB0aGF0IGNhbiBsb2FkIGFuIFhtbE9iamVjdCBmcm9tIFNBWCBldmVudHMuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTYXhIYW5kbGVyIG5ld1htbFNheEhhbmRsZXIgKCApIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdYbWxTYXhIYW5kbGVyKCBudWxsLCBudWxsICk7IH0KLSAgICAgICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhbiB7QGxpbmsgWG1sU2F4SGFuZGxlcn0gdGhhdCBjYW4gbG9hZCBhbiBYbWxPYmplY3QgZnJvbSBTQVggZXZlbnRzLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2F4SGFuZGxlciBuZXdYbWxTYXhIYW5kbGVyICggWG1sT3B0aW9ucyBvcHRpb25zICkgewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1htbFNheEhhbmRsZXIoIG51bGwsIG9wdGlvbnMgKTsgfQotICAgICAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbGlkYXRpbmcge0BsaW5rIFhNTElucHV0U3RyZWFtfSB0aGF0IHRocm93cyBleGNlcHRpb25zIHdoZW4gdGhlIGlucHV0IGlzIG5vdCB2YWxpZC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0gKCBYTUxJbnB1dFN0cmVhbSB4aXMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCBudWxsLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbGlkYXRpbmcge0BsaW5rIFhNTElucHV0U3RyZWFtfSB0aGF0IHRocm93cyBleGNlcHRpb25zIAotICAgICAgICAgKiB3aGVuIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQsIHNwZWNpZnlpbmcgb3B0aW9ucwotICAgICAgICAgKiBmb3IgdGhlIHJvb3QgZWxlbWVudCdzIGRvY3VtZW50IHR5cGUgYW5kL29yIHRoZSBjb2xsZWN0aW9uIG9iamVjdCB0byB1c2UKLSAgICAgICAgICogYXMgYW4gZXJyb3IgbGlzdGVuZXIgd2hpbGUgdmFsaWRhdGluZy48L3A+Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8cD5Vc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT5BIGNvbGxlY3Rpb24gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBhbiBlcnJvciBsaXN0ZW5lciBkdXJpbmcKLSAgICAgICAgICogY29tcGlsYXRpb24sIGFzIGRlc2NyaWJlZCBpbiB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfS48L2xpPgotICAgICAgICAgKiA8bGk+VGhlIGRvY3VtZW50IHR5cGUgZm9yIHRoZSByb290IGVsZW1lbnQsIGFzIGRlc2NyaWJlZCBpbiAKLSAgICAgICAgICoge0BsaW5rIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRUeXBlKFNjaGVtYVR5cGUpfS48L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHhpcyBUaGUgYmFzaXMgZm9yIHRoZSBuZXcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3BlY2lmeWluZyByb290IGRvY3VtZW50IHR5cGUgYW5kL29yIGFuIGVycm9yIGxpc3RlbmVyLgotICAgICAgICAgKiBAcmV0dXJuIEEgbmV3IHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtICggWE1MSW5wdXRTdHJlYW0geGlzLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW5jZXMgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9wdGlvbnMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZjE5MjAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVXNlZCB0byBzdXBwbHkgb3B0aW9ucyBmb3IgbG9hZGluZywgc2F2aW5nLCBhbmQgY29tcGlsaW5nLCBhbmQgdmFsaWRhdGluZy4KLSAqIDxwPgotICogVGhlcmUgYXJlIHR3byBzdHlsZXMgZm9yIHVzaW5nIFhtbE9wdGlvbnM6IG11bHRpbGluZSBzZXR1cCwgYW5kIHNpbmdsZS1saW5lIHVzZS4KLSAqIEhlcmUgYXJlIHR3byBleGFtcGxlcy4gIEZpcnN0LCBtdWx0aWxpbmUgc3R5bGU6Ci0gKiA8cHJlPgotICogWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAqIG9wdHMuc2V0U2F2ZVByZXR0eVByaW50KCk7Ci0gKiBvcHRzLnNldFNhdmVQcmV0dHlQcmludEluZGVudCg0KTsKLSAqIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqLnhtbFRleHQob3B0cykpOwotICogPC9wcmU+Ci0gKiAKLSAqIFRoZSBhbHRlcm5hdGl2ZSBpcyBzaW5nbGUtbGluZSB1c2FnZToKLSAqIDxwcmU+Ci0gKiBTeXN0ZW0ub3V0LnByaW50bG4oeG9iai54bWxUZXh0KAotICogICAgIG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkuc2V0U2F2ZVByZXR0eVByaW50SW5kZW50KDQpKSk7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFhtbE9wdGlvbnMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgTWFwIF9tYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYmxhbmsgWG1sT3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyAoICkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgWG1sT3B0aW9ucywgY29weWluZyB0aGUgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyAoWG1sT3B0aW9ucyBvdGhlcikgewotICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgX21hcC5wdXRBbGwob3RoZXIuX21hcCk7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgLy8KLSAgICAvLyBIYW5keS1kYW5keSBoZWxwZXIgbWV0aG9kcyBmb3Igc2V0dGluZyBzb21lIG9wdGlvbnMKLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgc2F2ZXIgdG8gc2F2ZSBuYW1lc3BhY2UgYXR0cmlidXRlcyBmaXJzdC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVOYW1lc3BhY2VzRmlyc3QoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX05BTUVTUEFDRVNfRklSU1QgKTsgCi0gICAgfQotICAgIC8qKgotICAgICAqIFRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgdGhlIHNhdmVyIHRvIHJlZm9ybWF0IHdoaXRlIHNwYWNlIGZvciBlYXNpZXIgcmVhZGluZy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVQcmV0dHlQcmludCgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfUFJFVFRZX1BSSU5UICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gdXNlZCB3aXRoIDxjb2RlPnNldFNhdmVQcmV0dHlQcmludDwvY29kZT4gdGhpcyBzZXRzIHRoZSBpbmRlbnQKLSAgICAgKiBhbW91bnQgdG8gdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudCBhbW91bnQgdG8gdXNlCi0gICAgICogQHNlZSAjc2V0U2F2ZVByZXR0eVByaW50Ci0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlUHJldHR5UHJpbnRJbmRlbnQoaW50IGluZGVudCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggU0FWRV9QUkVUVFlfUFJJTlRfSU5ERU5ULCBpbmRlbnQgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiB1c2VkIHdpdGggPGNvZGU+c2V0U2F2ZVByZXR0eVByaW50PC9jb2RlPiB0aGlzIHNldHMgdGhlIG9mZnNldAotICAgICAqIGFtb3VudCB0byB1c2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGFtb3VudCB0byB1c2UKLSAgICAgKiBAc2VlICNzZXRTYXZlUHJldHR5UHJpbnQKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVQcmV0dHlQcmludE9mZnNldChpbnQgb2Zmc2V0KSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1BSRVRUWV9QUklOVF9PRkZTRVQsIG9mZnNldCApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHBhcnNpbmcgb3Igd3JpdGluZyBhIGRvY3VtZW50LCB0aGlzIHNldHMgdGhlIGNoYXJhY3RlcgotICAgICAqIGVuY29kaW5nIHRvIHVzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGNoYXJhY3RlciBlbmNvZGluZwotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBDSEFSQUNURVJfRU5DT0RJTkcsIGVuY29kaW5nICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gcGFyc2luZyBhIGRvY3VtZW50LCB0aGlzIHNldHMgdGhlIHR5cGUgb2YgdGhlIHJvb3QKLSAgICAgKiBlbGVtZW50LiBJZiB0aGlzIGlzIHNldCwgdGhlIHBhcnNlciB3aWxsIG5vdCB0cnkgdG8gZ3Vlc3MKLSAgICAgKiB0aGUgdHlwZSBiYXNlZCBvbiB0aGUgZG9jdW1lbnQncyA8Y29kZT5RTmFtZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHJvb3QgZWxlbWVudCdzIGRvY3VtZW50IHR5cGUuCi0gICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0RG9jdW1lbnRUeXBlKFNjaGVtYVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gc2V0KCBET0NVTUVOVF9UWVBFLCB0eXBlICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPlNldHMgYSBjb2xsZWN0aW9uIG9iamVjdCBmb3IgY29sbGVjdGluZyB7QGxpbmsgWG1sRXJyb3J9IG9iamVjdHMgCi0gICAgICogZHVyaW5nIHBhcnNpbmcsIHZhbGlkYXRpb24sIGFuZCBjb21waWxhdGlvbi4gV2hlbiBzZXQsIHRoZSBjb2xsZWN0aW9uIAotICAgICAqIHdpbGwgY29udGFpbiBhbGwgdGhlIGVycm9ycyBhZnRlciB0aGUgb3BlcmF0aW9uIHRha2VzIHBsYWNlLiAgTm90aWNlIHRoYXQKLSAgICAgKiB0aGUgZXJyb3JzIHdpbGwgb25seSBoYXZlIGxpbmUgbnVtYmVycyBpZiB0aGUgZG9jdW1lbnQgd2FzCi0gICAgICogbG9hZGVkIHdpdGggbGluZSBudW1iZXJzIGVuYWJsZWQuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2ltcGxlIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdXNpbmcgYW4gZXJyb3IgbGlzdGVuZXIKLSAgICAgKiBkdXJpbmcgdmFsaWRhdGlvbi48L3A+Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiAvLyBDcmVhdGUgYW4gWG1sT3B0aW9ucyBpbnN0YW5jZSBhbmQgc2V0IHRoZSBlcnJvciBsaXN0ZW5lci4KLSAgICAgKiBYbWxPcHRpb25zIHZhbGlkYXRlT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICogQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgKiB2YWxpZGF0ZU9wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3QpOwotICAgICAqIAotICAgICAqIC8vIFZhbGlkYXRlIHRoZSBYTUwuCi0gICAgICogYm9vbGVhbiBpc1ZhbGlkID0gbmV3RW1wLnZhbGlkYXRlKHZhbGlkYXRlT3B0aW9ucyk7Ci0gICAgICogCi0gICAgICogLy8gSWYgdGhlIFhNTCBpc24ndCB2YWxpZCwgbG9vcCB0aHJvdWdoIHRoZSBsaXN0ZW5lcidzIGNvbnRlbnRzLAotICAgICAqIC8vIHByaW50aW5nIGNvbnRhaW5lZCBtZXNzYWdlcy4KLSAgICAgKiBpZiAoIWlzVmFsaWQpCi0gICAgICogewotICAgICAqICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckxpc3Quc2l6ZSgpOyBpKyspCi0gICAgICogICAgICB7Ci0gICAgICogICAgICAgICAgWG1sRXJyb3IgZXJyb3IgPSAoWG1sRXJyb3IpZXJyb3JMaXN0LmdldChpKTsKLSAgICAgKiAgICAgICAgICAKLSAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7Ci0gICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlOiAiICsgZXJyb3IuZ2V0TWVzc2FnZSgpICsgIlxuIik7Ci0gICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhdGlvbiBvZiBpbnZhbGlkIFhNTDogIiArIAotICAgICAqICAgICAgICAgICAgICBlcnJvci5nZXRDdXJzb3JMb2NhdGlvbigpLnhtbFRleHQoKSArICJcbiIpOwotICAgICAqICAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyBBIGNvbGxlY3Rpb24gdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHtAbGluayBYbWxFcnJvcn0gb2JqZWN0cyAKLSAgICAgKiB2aWEge0BsaW5rIENvbGxlY3Rpb24jYWRkfQotICAgICAqIAotICAgICAqIEBzZWUgWG1sRXJyb3IKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKiBAc2VlIFhtbE9iamVjdCN2YWxpZGF0ZShYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXRMb2FkTGluZU51bWJlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRFcnJvckxpc3RlbmVyIChDb2xsZWN0aW9uIGMpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIEVSUk9SX0xJU1RFTkVSLCBjICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgc2F2ZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbmFtZXNwYWNlIHByZWZpeCBkZWNsYXJhdGlvbnMuCi0gICAgICogVGhlIHNhdmVyIHdpbGwgZG8gdGhpcyBieSBwYXNzaW5nIG92ZXIgdGhlIGRvY3VtZW50IHR3aWNlLCBmaXJzdCB0bwotICAgICAqIGNvbGxlY3QgdGhlIHNldCBvZiBuZWVkZWQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIHRoZW4gc2Vjb25kCi0gICAgICogdG8gYWN0dWFsbHkgc2F2ZSB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZGVjbGFyYXRpb25zIGNvbGxlY3RlZAotICAgICAqIGF0IHRoZSByb290LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUFnZ3Jlc2l2ZU5hbWVzcGFjZXMoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wdGlvbiBjYXVzZXMgdGhlIHNhdmVyIHRvIHdyYXAgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaW4KLSAgICAgKiBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgdG9wIGxldmVsIGVsZW1lbnQKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVTeW50aGV0aWNEb2N1bWVudEVsZW1lbnQgKFFOYW1lIG5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsIG5hbWUgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgc2F2ZXIgd2lsbCB0cnkgdG8gdXNlIHRoZSBkZWZhdWx0Ci0gICAgICogbmFtZXNwYWNlIGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIFVSSS4gSWYgaXQgaXMgbm90IHNldAotICAgICAqIHRoZSBzYXZlciB3aWxsIGFsd2F5cyBjcmVhdGVkIG5hbWVkIHByZWZpeGVzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0VXNlRGVmYXVsdE5hbWVzcGFjZSAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1VTRV9ERUZBVUxUX05BTUVTUEFDRSApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBuYW1lc3BhY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGRlY2xhcmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQotICAgICAqIGZyYWdtZW50IGJlaW5nIHNhdmVkLCB0aGlzIGFsbG93cyB0aG9zZSBtYXBwaW5ncyB0byBiZSBwYXNzZWQKLSAgICAgKiBkb3duIHRvIHRoZSBzYXZlciwgc28gdGhlIHByZWZpeGVzIGFyZSBub3QgcmUtZGVjbGFyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcGxpY2l0TmFtZXNwYWNlcyBhIG1hcCBvZiBwcmVmaXhlcyB0byB1cmlzIHRoYXQgY2FuIGJlCi0gICAgICogIHVzZWQgYnkgdGhlIHNhdmVyIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlSW1wbGljaXROYW1lc3BhY2VzIChNYXAgaW1wbGljaXROYW1lc3BhY2VzKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMsIGltcGxpY2l0TmFtZXNwYWNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIG1hcCBvZiBoaW50cyB0byBwYXNzIHRvIHRoZSBzYXZlciBmb3Igd2hpY2ggcHJlZml4ZXMgdG8gdXNlCi0gICAgICogZm9yIHdoaWNoIG5hbWVzcGFjZSBVUkkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1Z2dlc3RlZFByZWZpeGVzIGEgbWFwIGZyb20gVVJJcyB0byBwcmVmaXhlcwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZVN1Z2dlc3RlZFByZWZpeGVzIChNYXAgc3VnZ2VzdGVkUHJlZml4ZXMpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTLCBzdWdnZXN0ZWRQcmVmaXhlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wdGlvbiBjYXVzZXMgdGhlIHNhdmVyIHRvIGZpbHRlciBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLSAgICAgKiB3aXRoIHRoZSBnaXZlbiB0YXJnZXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsdGVyUHJvY2luc3QgdGhlIG5hbWUgb2YgYSBQcm9jZXNzaW5nIEluc3RydWN0aW9uIHRvIGZpbHRlcgotICAgICAqICAgb24gc2F2ZQotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUZpbHRlclByb2NpbnN0IChTdHJpbmcgZmlsdGVyUHJvY2luc3QpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfRklMVEVSX1BST0NJTlNULCBmaWx0ZXJQcm9jaW5zdCApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHNhdmluZyBhIGZyYWdtZW50LCB0aGlzIG9wdGlvbiBjaGFuZ2VzIHRoZSBxbmFtZSBvZiB0aGUgc3ludGhlc2l6ZWQKLSAgICAgKiByb290IGVsZW1lbnQuICBOb3JtYWxseSAmbHQ7eG1sLWZyYWdtZW50Jmd0OyBpcyB1c2VkLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZVVzZU9wZW5GcmFnICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfVVNFX09QRU5fRlJBR01FTlQgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBzYXZpbmcgYmVnaW5zIG9uIHRoZSBlbGVtZW50IG9yIGl0cyBjb250ZW50cwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZU91dGVyICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfT1VURVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBzYXZpbmcgYmVnaW5zIG9uIHRoZSBlbGVtZW50IG9yIGl0cyBjb250ZW50cwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUlubmVyICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfSU5ORVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgZG9jdW1lbnQgZWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZQotICAgICAqIGdpdmVuIFFOYW1lIHdoZW4gcGFyc2luZy4gIElmIG51bGwgaXMgc3VwcGxpZWQsIHRoZSBkb2N1bWVudCBlbGVtZW50Ci0gICAgICogaXMgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkUmVwbGFjZURvY3VtZW50RWxlbWVudCAoIFFOYW1lIHJlcGxhY2VtZW50ICkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQsIHJlcGxhY2VtZW50ICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgYWxsIGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZAotICAgICAqIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LiAgQ2FuIGJlIHVzZWQgdG8gc2F2ZSBtZW1vcnkgb24gbGFyZ2UKLSAgICAgKiBkb2N1bWVudHMgd2hlbiB5b3Uga25vdyB0aGVyZSBpcyBubyBtaXhlZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdHJpcFdoaXRlc3BhY2UgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9TVFJJUF9XSElURVNQQUNFKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCBhbGwgY29tbWVudHMgYXJlIHN0cmlwcGVkIHdoZW4gcGFyc2luZwotICAgICAqIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0TG9hZFN0cmlwQ29tbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBzZXQoIExPQURfU1RSSVBfQ09NTUVOVFMgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgCi0gICAgICogYXJlIHN0cmlwcGVkIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdHJpcFByb2NpbnN0cyAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX1NUUklQX1BST0NJTlNUUyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIGxpbmUgbnVtYmVyIGFubm90YXRpb25zIGFyZSBwbGFjZWQKLSAgICAgKiBpbiB0aGUgc3RvcmUgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuICBUaGlzIGlzIHBhcnRpY3VsYXJseQotICAgICAqIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHtAbGluayBYbWxFcnJvcn0gb2JqZWN0cyB0byBjb250YWluCi0gICAgICogbGluZSBudW1iZXJzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sRXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkTGluZU51bWJlcnMgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9MSU5FX05VTUJFUlMgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gc2V0cyBhIG1hcCBvZiBuYW1lc3BhY2UgdXJpIHN1YnN0aXR1dGlvbnMgdGhhdCBoYXBwZW4KLSAgICAgKiB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgeW91Ci0gICAgICogaGF2ZSBkb2N1bWVudHMgdGhhdCB1c2Ugbm8gbmFtZXNwYWNlLCBidXQgeW91IHdpc2ggdG8gYXZvaWQKLSAgICAgKiB0aGUgbmFtZSBjb2xsaXNpb24gcHJvYmxlbXMgdGhhdCBvY2N1ciB3aGVuIHlvdSBpbnRyb2R1Y2UKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgd2l0aG91dCBhIHRhcmdldCBuYW1lc3BhY2UuCi0gICAgICogPHA+Ci0gICAgICogQnkgbWFwcGluZyB0aGUgZW1wdHkgc3RyaW5nICIiICh0aGUgYWJzZW5jZSBvZiBhIFVSSSkgdG8gYSBzcGVjaWZpYwotICAgICAqIG5hbWVzcGFjZSwgeW91IGNhbiBmb3JjZSB0aGUgcGFyc2VyIHRvIGJlaGF2ZSBhcyBpZiBhIG5vLW5hbWVzcGFjZQotICAgICAqIGRvY3VtZW50IHdlcmUgYWN0dWFsbHkgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIFRoaXMgYWxsb3dzIHlvdQotICAgICAqIHRvIHR5cGUgdGhlIGluc3RhbmNlIGFjY29yZGluZyB0byBhIHNjaGVtYSBpbiBhIG5vbmVtcHR5IG5hbWVzcGFjZSwKLSAgICAgKiBhbmQgdGhlcmVmb3JlIGF2b2lkIHRoZSBwcm9ibGVtYXRpYyBwcmFjdGljZSBvZiB1c2luZyBzY2hlbWEKLSAgICAgKiBkZWZpbml0aW9ucyB3aXRob3V0IGEgdGFyZ2V0IG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3Vic3ROYW1lc3BhY2VzIGEgbWFwIG9mIGRvY3VtZW50IFVSSXMgdG8gcmVwbGFjZW1lbnQgVVJJcwotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyAoTWFwIHN1YnN0TmFtZXNwYWNlcykgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9TVUJTVElUVVRFX05BTUVTUEFDRVMsIHN1YnN0TmFtZXNwYWNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSB1bmRlcmx5aW5nIHhtbCB0ZXh0IGJ1ZmZlciBpcyB0cmltbWVkCi0gICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgcGFyc2luZyBhIGRvY3VtZW50IHJlc3VsdGluZyBpbiBhIHNtYWxsZXIgbWVtb3J5Ci0gICAgICogZm9vdHByaW50LiAgVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgbG9hZGluZyBhIGxhcmdlIG51bWJlcgotICAgICAqIG9mIHVuY2hhbmdpbmcgZG9jdW1lbnRzIHRoYXQgd2lsbCBzdGF5IGluIG1lbW9yeSBmb3Igc29tZSB0aW1lLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRUcmltVGV4dEJ1ZmZlciAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX1RSSU1fVEVYVF9CVUZGRVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIGJlIGFkZGVkIHdoZW4gcGFyc2luZwotICAgICAqIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5zZXMgYWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXMgKE1hcCBuc2VzKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUywgbnNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgd2hlbiBsb2FkaW5nIGZyb20gYW4gSW5wdXRTdHJlYW0gb3IgRmlsZSwgdGhlbgotICAgICAqIHRoZSBsb2FkZXIgd2lsbCBjb21wdXRlIGEgMTYwLWJpdCBTSEEtMSBtZXNzYWdlIGRpZ2VzdCBvZiB0aGUgWE1MCi0gICAgICogZmlsZSB3aGlsZSBsb2FkaW5nIGl0IGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB2aWEKLSAgICAgKiBYbWxPYmplY3QuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0TWVzc2FnZURpZ2VzdCgpOwotICAgICAqIDxicj4KLSAgICAgKiBUaGUgc2NoZW1hIGNvbXBpbGVyIHVzZXMgbWVzc2FnZSBkaWdlc3RzIHRvIGRldGVjdCBhbmQgZWxpbWluYXRlCi0gICAgICogZHVwbGljYXRlIGltcG9ydGVkIHhzZCBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkTWVzc2FnZURpZ2VzdCAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX01FU1NBR0VfRElHRVNUICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgcmVwcmVzZW50cwotICAgICAqIHRoZSBjdXJyZW50IG5vZGUgaW4gYSBxdWVyeSBleHByZXNzaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YXJOYW1lIFRoZSBuZXcgdmFyaWFibGUgbmFtZSB0byB1c2UgZm9yIHRoZSBxdWVyeS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdCNleGVjUXVlcnkKLSAgICAgKiBAc2VlIFhtbEN1cnNvciNleGVjUXVlcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRYcXVlcnlDdXJyZW50Tm9kZVZhciAoU3RyaW5nIHZhck5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFhRVUVSWV9DVVJSRU5UX05PREVfVkFSLCB2YXJOYW1lICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiBleHRlcm5hbCB2YXJpYWJsZXMgaW4gYW4geHF1ZXJ5Ci0gICAgICogZXhwcmVzc2lvbi4gIFRoZSBrZXlzIG9mIHRoZSBtYXAgYXJlIHRoZSB2YXJpYWJsZSBuYW1lcwotICAgICAqIGluIHRoZSBxdWVyeSB3aXRob3V0IHRoZSAnJCcgcHJlZml4LiAgVGhlIHZhbHVlcyBvZiB0aGUgbWFwCi0gICAgICogYXJlIG9iamVjdHMgYW5kIGNhbiBiZSBhbnkgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIGNsYXNzZXMsCi0gICAgICogU3RyaW5nLCBYbWxPYmplY3QsIG9yIFhtbEN1cnNvci4gVGhlIG1hcHBpbmcgb25seSBhcHBsaWVzIHRvCi0gICAgICogeHF1ZXJ5IGFuZCBoYXMgbm8gZWZmZWN0IG9uIHhwYXRoIGV4cHJlc3Npb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhck1hcCBhIG1hcCBmcm9tIDxjb2RlPlN0cmluZzwvY29kZT5zIHRvIHZhcmlhYmxlIGluc3RhbmNlcy4KLSAgICAgKgotICAgICAqIEBzZWUgWG1sT2JqZWN0I2V4ZWNRdWVyeQotICAgICAqIEBzZWUgWG1sQ3Vyc29yI2V4ZWNRdWVyeQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFhxdWVyeVZhcmlhYmxlcyAoTWFwIHZhck1hcCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggWFFVRVJZX1ZBUklBQkxFX01BUCwgdmFyTWFwICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgb3B0aW9uIHNldHMgdGhlIGRvY3VtZW50IHNvdXJjZSBuYW1lIGludG8gdGhlIHhtbCBzdG9yZQotICAgICAqIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LiAgSWYgYSBkb2N1bWVudCBpcyBwYXJzZWQgZnJvbSBhCi0gICAgICogRmlsZSBvciBVUkksIGl0IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZSBVUkkgb2YgdGhlCi0gICAgICogc291cmNlOyBvdGhlcndpc2UsIGZvciBleGFtcGxlLCB3aGVuIHBhcnNpbmcgYSBTdHJpbmcsCi0gICAgICogeW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc291cmNlIG5hbWUgeW91cnNlbGYuIAotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5sYW5nLlN0cmluZywgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXREb2N1bWVudFNvdXJjZU5hbWUgKFN0cmluZyBkb2N1bWVudFNvdXJjZU5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIERPQ1VNRU5UX1NPVVJDRV9OQU1FLCBkb2N1bWVudFNvdXJjZU5hbWUgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gYWxsb3dzIGZvciA8Y29kZT5RTmFtZTwvY29kZT4gc3Vic3RpdHV0aW9uIGR1cmluZyBzY2hlbWEgY29tcGlsYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWVNYXAgYSBtYXAgZnJvbSA8Y29kZT5RTmFtZTwvY29kZT5zIHRvIHN1YnN0aXR1dGUgPGNvZGU+UU5hbWU8L2NvZGU+cy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRDb21waWxlU3Vic3RpdHV0ZU5hbWVzIChNYXAgbmFtZU1hcCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9TVUJTVElUVVRFX05BTUVTLCBuYW1lTWFwICk7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgb24gdGhlIFNjaGVtYSBYbWxCZWFucwotICAgICAqIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1ZhbGlkYXRpb24gKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19WQUxJREFUSU9OICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIGlzIG5vdAotICAgICAqIGVuZm9yY2VkIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPi4gU2VlCi0gICAgICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNub24tYW1iaWciPkFwcGVuZGl4IEggb2YgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbjwvYT4KLSAgICAgKiBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFVQQSBydWxlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1VwYVJ1bGUgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19VUEFfUlVMRSApOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgcGFydGljbGUgdmFsaWQgKHJlc3RyaWNpdG9uKSBydWxlIGlzIG5vdAotICAgICAqIGVuZm9yY2VkIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPi4gU2VlCi0gICAgICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtcGFydGljbGUtcmVzdHJpY3QiPlNlY3Rpb24gMy45LjYgb2YgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbjwvYT4KLSAgICAgKiBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFBWUiBydWxlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1B2clJ1bGUgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19QVlJfUlVMRSApOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGVuIHRoZSBzY2hlbWEgY29tcGlsZXIgd2lsbCB0cnkgdG8gZG93bmxvYWQKLSAgICAgKiBzY2hlbWFzIHRoYXQgYXBwZWFyIGluIGltcG9ydHMgYW5kIGluY2x1ZGVzIGZyb20gbmV0d29yayBiYXNlZCBVUkxzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVEb3dubG9hZFVybHMgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9ET1dOTE9BRF9VUkxTKTsgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlbiB0aGUgc2NoZW1hIGNvbXBpbGVyIHdpbGwgcGVybWl0IGFuZAotICAgICAqIGlnbm9yZSBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBjb21wb25lbnQgKGVsZW1lbnQsIGF0dHJpYnV0ZSwKLSAgICAgKiB0eXBlLCBldGMpIG5hbWVzIGluIHRoZSBnaXZlbiBuYW1lc3BhY2VzLiAgSWYgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgKiB3aXRoIHRoZSBzYW1lIG5hbWUgYXBwZWFyLCB0aGUgZGVmaW5pdGlvbnMgdGhhdCBoYXBwZW4gdG8gYmUgcHJvY2Vzc2VkCi0gICAgICogbGFzdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1kZWZOYW1lc3BhY2VzIGEgc2V0IG9mIG5hbWVzcGFjZSBVUklzIGFzIFN0cmluZ3MKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8gCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0Q29tcGlsZU1kZWZOYW1lc3BhY2VzKFNldCBtZGVmTmFtZXNwYWNlcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfTURFRl9OQU1FU1BBQ0VTLCBtZGVmTmFtZXNwYWNlcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB3aGVuIGFuIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRoZW4gdmFsdWUKLSAgICAgKiBmYWNldHMgd2lsbCBiZSBjaGVja2VkIG9uIGVhY2ggY2FsbCB0byBhIHNldHRlciBvciBnZXR0ZXIKLSAgICAgKiBtZXRob2Qgb24gaW5zdGFuY2VzIG9mIFhtbE9iamVjdCB3aXRoaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LgotICAgICAqIElmIHRoZSBmYWNldHMgYXJlIG5vdCBzYXRpc2ZpZWQsIHRoZW4gYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcwotICAgICAqIHRocm93biBpbW1lZGlhdGVseS4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgZmluZGluZyBjb2RlIHRoYXQKLSAgICAgKiBpcyBpbnRyb2R1Y2luZyBpbnZhbGlkIHZhbHVlcyBpbiBhbiBYTUwgZG9jdW1lbnQsIGJ1dCBpdAotICAgICAqIHNsb3dzIHBlcmZvcm1hbmNlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFZhbGlkYXRlT25TZXQoKSB7Ci0gICAgICAgIHJldHVybiBzZXQoIFZBTElEQVRFX09OX1NFVCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB3aGVuIGNvbXBpbGluZyBhIHNjaGVtYSwgdGhlbiB0aGUgZ2l2ZW4KLSAgICAgKiBFbnRpdHlSZXNvbHZlciB3aWxsIGJlIGNvbnN1bHRlZCBpbiBvcmRlciB0byByZXNvbHZlIGFueQotICAgICAqIFVSSXMgd2hpbGUgZG93bmxvYWRpbmcgaW1wb3J0ZWQgc2NoZW1hcy4KLSAgICAgKgotICAgICAqIEVudGl0eVJlc29sdmVycyBhcmUgY3VycmVudGx5IG9ubHkgdXNlZCBieSBjb21waWxlWHNkOyB0aGV5Ci0gICAgICogYXJlIG5vdCBjb25zdWx0ZWQgYnkgb3RoZXIgZnVuY3Rpb25zLCBmb3IgZXhhbXBsZSwgcGFyc2UuCi0gICAgICogVGhpcyB3aWxsIGxpa2VseSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gc2V0KCBFTlRJVFlfUkVTT0xWRVIsIHJlc29sdmVyICk7Ci0gICAgfQotCi0KLSAgICAvLwotICAgIC8vIENvbXBsZXRlIHNldCBvZiBYbWxPcHRpb24ncwotICAgIC8vCi0gICAgICAgICAgICAKLSAgICAvLyBUT0RPIC0gQWRkIHNlbGVjdFBhdGggb3B0aW9uIHRvIHRyYWNrIHRoZSBzZWxldGlvbiAoZGVhdWx0IGlzIHRvIGNsZWFuIHNlbGVjdGlvbnMgZmFzdCkuIAotICAgIAotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfTkFNRVNQQUNFU19GSVJTVCAgICAgICAgICAgPSAgIlNBVkVfTkFNRVNQQUNFU19GSVJTVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCA9ICAiU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QUkVUVFlfUFJJTlQgICAgICAgICAgICAgICA9ICAiU0FWRV9QUkVUVFlfUFJJTlQiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCAgICAgICAgPSAgIlNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUICAgICAgICA9ICAiU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyAgICAgID0gICJTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UgICAgICA9ICAiU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyAgICAgICAgPSAgIlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9TVUdHRVNURURfUFJFRklYRVMgICAgICAgICA9ICAiU0FWRV9TVUdHRVNURURfUFJFRklYRVMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRklMVEVSX1BST0NJTlNUICAgICAgICAgICAgPSAgIlNBVkVfRklMVEVSX1BST0NJTlNUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1VTRV9PUEVOX0ZSQUdNRU5UICAgICAgICAgID0gICJTQVZFX1VTRV9PUEVOX0ZSQUdNRU5UIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX09VVEVSICAgICAgICAgICAgICAgICAgICAgID0gICJTQVZFX09VVEVSIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lOTkVSICAgICAgICAgICAgICAgICAgICAgID0gICJTQVZFX0lOTkVSIjsKLSAgICAKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCAgID0gICJMT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9TVFJJUF9XSElURVNQQUNFICAgICAgICAgICA9ICAiTE9BRF9TVFJJUF9XSElURVNQQUNFIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1NUUklQX0NPTU1FTlRTICAgICAgICAgICAgID0gICJMT0FEX1NUUklQX0NPTU1FTlRTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1NUUklQX1BST0NJTlNUUyAgICAgICAgICAgID0gICJMT0FEX1NUUklQX1BST0NJTlNUUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9MSU5FX05VTUJFUlMgICAgICAgICAgICAgICA9ICAiTE9BRF9MSU5FX05VTUJFUlMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTICAgICAgPSAgIkxPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1RSSU1fVEVYVF9CVUZGRVIgICAgICAgICAgID0gICJMT0FEX1RSSU1fVEVYVF9CVUZGRVIiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfQURESVRJT05BTF9OQU1FU1BBQ0VTICAgICAgPSAgIkxPQURfQURESVRJT05BTF9OQU1FU1BBQ0VTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX01FU1NBR0VfRElHRVNUICAgICAgICAgICAgID0gICJMT0FEX01FU1NBR0VfRElHRVNUIjsKLQotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhRVUVSWV9DVVJSRU5UX05PREVfVkFSICAgICAgICAgPSAgIlhRVUVSWV9DVVJSRU5UX05PREVfVkFSIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYUVVFUllfVkFSSUFCTEVfTUFQICAgICAgICAgICAgID0gICJYUVVFUllfVkFSSUFCTEVfTUFQIjsKLQotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9FTkNPRElORyAgICAgICAgICAgICAgPSAgIkNIQVJBQ1RFUl9FTkNPRElORyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTElTVEVORVIgICAgICAgICAgICAgICAgICA9ICAiRVJST1JfTElTVEVORVIiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEUgICAgICAgICAgICAgICAgICAgPSAgIkRPQ1VNRU5UX1RZUEUiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1NPVVJDRV9OQU1FICAgICAgICAgICAgPSAgIkRPQ1VNRU5UX1NPVVJDRV9OQU1FIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX1NVQlNUSVRVVEVfTkFNRVMgICAgICAgID0gICJDT01QSUxFX1NVQlNUSVRVVEVfTkFNRVMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVfTk9fVkFMSURBVElPTiAgICAgICAgICAgPSAgIkNPTVBJTEVfTk9fVkFMSURBVElPTiI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9OT19VUEFfUlVMRSAgICAgICAgICAgICA9ICAiQ09NUElMRV9OT19VUEFfUlVMRSI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9OT19QVlJfUlVMRSAgICAgICAgICAgICA9ICAiQ09NUElMRV9OT19QVlJfUlVMRSI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9ET1dOTE9BRF9VUkxTICAgICAgICAgICA9ICAiQ09NUElMRV9ET1dOTE9BRF9VUkxTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX01ERUZfTkFNRVNQQUNFUyAgICAgICAgID0gICJDT01QSUxFX01ERUZfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfT05fU0VUICAgICAgICAgICAgICAgICA9ICAiVkFMSURBVEVfT05fU0VUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfUkVTT0xWRVIgICAgICAgICAgICAgICAgID0gICJFTlRJVFlfUkVTT0xWRVIiOwotICAgIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBFTVBUWV9PUFRJT05TOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEVNUFRZX09QVElPTlMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBFTVBUWV9PUFRJT05TLl9tYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoRU1QVFlfT1BUSU9OUy5fbWFwKTsKLSAgICB9Ci0KLSAgICAvKiogSWYgcGFzc2VkIG51bGwsIHJldHVybnMgYW4gZW1wdHkgb3B0aW9ucyBvYmplY3QuICBPdGhlcndpc2UsIHJldHVybnMgaXRzIGFyZ3VtZW50LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgWG1sT3B0aW9ucyBtYXNrTnVsbChYbWxPcHRpb25zIG8pIHsKLSAgICAgICAgcmV0dXJuIChvID09IG51bGwpID8gRU1QVFlfT1BUSU9OUyA6IG87Ci0gICAgfQotCi0gICAgCi0gICAgLyoqIFVzZWQgdG8gc2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCAgcHV0ICggT2JqZWN0IG9wdGlvbiAgICAgICAgICAgICAgICkgeyBwdXQoIG9wdGlvbiwgbnVsbCApOyB9Ci0gICAgLyoqIFVzZWQgdG8gc2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCAgcHV0ICggT2JqZWN0IG9wdGlvbiwgT2JqZWN0IHZhbHVlICkgeyBfbWFwLnB1dChvcHRpb24sIHZhbHVlKTsgfQotICAgIC8qKiBVc2VkIHRvIHNldCBhIGdlbmVyaWMgb3B0aW9uICovCi0gICAgcHVibGljIHZvaWQgcHV0ICAoIE9iamVjdCBvcHRpb24sIGludCB2YWx1ZSAgICApIHsgcHV0KCBvcHRpb24sIG5ldyBJbnRlZ2VyKCB2YWx1ZSApICk7IH0KLQotICAgIHByaXZhdGUgWG1sT3B0aW9ucyBzZXQoT2JqZWN0IG9wdGlvbikgICAgICAgICAgICAgICB7IHJldHVybiBzZXQob3B0aW9uLCBudWxsKTsgfQotICAgIHByaXZhdGUgWG1sT3B0aW9ucyBzZXQoT2JqZWN0IG9wdGlvbiwgT2JqZWN0IHZhbHVlKSB7IF9tYXAucHV0KG9wdGlvbiwgdmFsdWUpOyByZXR1cm4gdGhpczt9Ci0gICAgcHJpdmF0ZSBYbWxPcHRpb25zIHNldChPYmplY3Qgb3B0aW9uLCBpbnQgdmFsdWUpICAgIHsgcmV0dXJuIHNldChvcHRpb24sIG5ldyBJbnRlZ2VyKHZhbHVlKSk7IH0KLQotICAgIC8qKiBVc2VkIHRvIHRlc3QgYSBnZW5lcmljIG9wdGlvbiAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc09wdGlvbiAgICggT2JqZWN0IG9wdGlvbiApIHsgcmV0dXJuIF9tYXAuY29udGFpbnNLZXkoIG9wdGlvbiApOyB9Ci0gICAgLyoqIFVzZWQgdG8gZ2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgT2JqZWN0ICBnZXQgICAgICAgICAoIE9iamVjdCBvcHRpb24gKSB7IHJldHVybiBfbWFwLmdldCggb3B0aW9uICk7IH0KLQotICAgIC8qKiBVc2VkIHRvIHRlc3QgYSBnZW5lcmljIG9wdGlvbiBvbiBhbiBvcHRpb25zIG9iamVjdCB0aGF0IG1heSBiZSBudWxsICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3Qgc2FmZUdldChYbWxPcHRpb25zIG8sIE9iamVjdCBvcHRpb24pIHsKLSAgICAgICAgcmV0dXJuIG8gPT0gbnVsbCA/IG51bGwgOiBvLmdldChvcHRpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmQxMzQ4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxQb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciI+eHM6cG9zaXRpdmVJbnRlZ2VyPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIHBvc2l0aXZlIHdoZW4gdmFsaWRhdGluZy4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sUG9zaXRpdmVJbnRlZ2VyIGV4dGVuZHMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfcG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFFOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhYWRjYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIj54czpRTmFtZTwvYT4gdHlwZS4KLSAqIDxwPgotICogQSBRTmFtZSBpcyB0aGUgbG9naWNhbCBjb21iaW5hdGlvbiBvZiBhbiBYTUwgbmFtZXNwYWNlIFVSSSBhbmQgYSBsb2NhbE5hbWUuCi0gKiBBbHRob3VnaCBpbiBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQsIGEgUU5hbWUgYXBwZWFycyBhcyAicHJlZml4OmxvY2FsTmFtZSIsCi0gKiB0aGUgbG9naWNhbCB2YWx1ZSBvZiBhIFFOYW1lIGRvZXMgTk9UIGNvbnRhaW4gYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZQotICogcHJlZml4LCBvbmx5IHRoZSBuYW1lc3BhY2UgVVJJIHRvIHdoaWNoIHRoZSBwcmVmaXggbWFwcy4gIEZvciBleGFtcGxlLAotICogdHdvIFFOYW1lcyAiYTpoZWxsbyIgYW5kICJiOmhlbGxvIiBhcmUgcGVyZmVjdGx5IGVxdWl2YWxlbnQgaWYgImE6IiBpbgotICogdGhlIGZpcnN0IGluc3RhbmNlIG1hcHMgdG8gdGhlIHNhbWUgVVJJIGFzICJiOiIgaW4gdGhlIHNlY29uZCBpbnN0YW5jZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWV9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxRTmFtZSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9RTmFtZSIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9ICovCi0gICAgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9ICovCi0gICAgdm9pZCBzZXRRTmFtZVZhbHVlKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRRTmFtZVZhbHVlfQotICAgICAqKi8KLSAgICBRTmFtZSBxTmFtZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRRTmFtZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFFOYW1lfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxRTmFtZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxRTmFtZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxRTmFtZX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCB4bWxuczp4PSJodHRwOi8vb3BlbnVyaS5vcmcvIiZndDt4OnNhbXBsZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCB4bWxuczp4PSJodHRwOi8vb3BlbnVyaS5vcmcvIiZndDt4OnNhbXBsZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYWY0Y2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQW4gdW5jaGVja2VkIFhNTCBleGNlcHRpb24uCi0gKiBNYXkgY29udGFpbiBhbnkgbnVtYmVyIG9mIHtAbGluayBYbWxFcnJvcn0gb2JqZWN0cy4KLSAqIAotICogQHNlZSBYbWxFcnJvcgotICogQHNlZSBYbWxFeGNlcHRpb24KLSAqLyAKLXB1YmxpYyBjbGFzcyBYbWxSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBTdHJpbmcgbSAgICAgICAgICAgICAgKSB7IHN1cGVyKCBtICk7ICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UgYW5kIGEgY2F1c2UuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0ICkgeyBzdXBlciggbSwgdCApOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYSBjYXVzZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBUaHJvd2FibGUgdCAgICAgICAgICAgKSB7IHN1cGVyKCB0ICk7ICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UsIGEgY2F1c2UsIGFuZCBhIGNvbGxlY3Rpb24gb2YgWG1sRXJyb3JzLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCwgQ29sbGVjdGlvbiBlcnJvcnMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG0sIHQgKTsKLQotICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpCi0gICAgICAgICAgICBfZXJyb3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggbmV3IEFycmF5TGlzdChlcnJvcnMpICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYW4gWG1sRXJyb3IuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggWG1sRXJyb3IgZXJyb3IgKQotICAgIHsKLSAgICAgICAgdGhpcyggZXJyb3IudG9TdHJpbmcoKSwgbnVsbCwgZXJyb3IgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UsIGEgY2F1c2UsIGFuZCBhbiBYbWxFcnJvci4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQsIFhtbEVycm9yIGVycm9yICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIG0sIHQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGVycm9yICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYW4ge0BsaW5rIFhtbEV4Y2VwdGlvbn0uCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggWG1sRXhjZXB0aW9uIHhtbEV4Y2VwdGlvbiApCi0gICAgewotICAgICAgICBzdXBlciggeG1sRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgeG1sRXhjZXB0aW9uLmdldENhdXNlKCkgKTsKLQotICAgICAgICBDb2xsZWN0aW9uIGVycm9ycyA9IHhtbEV4Y2VwdGlvbi5nZXRFcnJvcnMoKTsKLQotICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpCi0gICAgICAgICAgICBfZXJyb3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggbmV3IEFycmF5TGlzdCggZXJyb3JzICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIFhtbEVycm9yfSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiwgaWYgYW55LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXJyb3IgZ2V0RXJyb3IgKCApCi0gICAgewotICAgICAgICBpZiAoX2Vycm9ycyA9PSBudWxsIHx8IF9lcnJvcnMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gKFhtbEVycm9yKSBfZXJyb3JzLmdldCggMCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBYbWxFcnJvciBYbWxFcnJvcnN9IHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLCBpZiBhbnkuCi0gICAgICovIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVycm9ycyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZXJyb3JzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBfZXJyb3JzOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTYXhIYW5kbGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2F4SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE0NWZjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTYXhIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0vKioKLSAqIEEgaG9sZGVyIGZvciBhIFNBWCB7QGxpbmsgQ29udGVudEhhbmRsZXJ9IGFuZCB7QGxpbmsgTGV4aWNhbEhhbmRsZXJ9IHRoYXQgYXJlCi0gKiBjYXBhYmxlIG9mIGxvYWRpbmcgYW4ge0BsaW5rIFhtbE9iamVjdH0gaW5zdGFuY2UuICBPbmNlIGFsbCB0aGUgU0FYIGV2ZW50cyBhcmUgcHVzaGVkCi0gKiB0byB0aGUgaGFuZGxlcnMsIGNhbGwge0BsaW5rICNnZXRPYmplY3QoKX0gdG8gZ2V0IHRoZSBsb2FkZWQgWG1sT2JqZWN0LgotICogCi0gKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I25ld1htbFNheEhhbmRsZXIKLSAqIEBzZWUgU2NoZW1hVHlwZUxvYWRlciNuZXdYbWxTYXhIYW5kbGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2F4SGFuZGxlcgotewotICAgIC8qKgotICAgICAqIFRoZSBDb250ZW50SGFuZGxlciBleHBlY3RpbmcgU0FYIGNvbnRlbnQgZXZlbnRzLgotICAgICAqIEBzZWUgQ29udGVudEhhbmRsZXIKLSAgICAgKi8gCi0gICAgQ29udGVudEhhbmRsZXIgZ2V0Q29udGVudEhhbmRsZXIgKCApOwotICAgIC8qKgotICAgICAqIFRoZSBMZXhpY2FsSGFuZGxlciBleHBlY3RpbmcgU0FYIGxleGljYWwgZXZlbnRzLgotICAgICAqIEBzZWUgTGV4aWNhbEhhbmRsZXIKLSAgICAgKi8gCi0gICAgTGV4aWNhbEhhbmRsZXIgZ2V0TGV4aWNhbEhhbmRsZXIgKCApOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBsb2FkZWQgWG1sT2JqZWN0IGFmdGVyIGFsbCB0aGUgU0FYIGV2ZW50cyBoYXZlIGJlZW4gZmluaXNoZWQgKi8KLSAgICBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNob3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzNjN2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzaG9ydCI+eHM6c2hvcnQ8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogTmF0dXJhbGx5LCBjb252ZXJ0aWJsZSB0byBhIEphdmEgc2hvcnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNob3J0IGV4dGVuZHMgWG1sSW50Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfc2hvcnQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBzaG9ydCAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBzaG9ydAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9Ci0gICAgICoqLwotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCBzKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sU2hvcnR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFNob3J0fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2ltcGxlTGlzdC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNpbXBsZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOTZmOC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2ltcGxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgaW1tdXRhYmxlIHtAbGluayBMaXN0fSByZXR1cm5lZCBmb3IgWE1MIHNpbXBsZSBsaXN0IHZhbHVlcy4KLSAqIAotICogWG1sU2ltcGxlTGlzdCBpbXBsZW1lbnRzIGFuIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIHRoYXQgY29tcGFyZSBsaXN0Ci0gKiBjb250ZW50cywgc28gdHdvIFhtbFNpbXBsZUxpc3RzIGFyZSB0aGUgc2FtZSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUKLSAqIHZhbHVlcyBpbiB0aGUgc2FtZSBvcmRlci4KLSAqLyAKLXB1YmxpYyBjbGFzcyBYbWxTaW1wbGVMaXN0IGltcGxlbWVudHMgTGlzdCwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLQlwcml2YXRlIExpc3QgdW5kZXJseWluZzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGltbXV0YWJsZSBYbWxTaW1wbGVMaXN0IHRoYXQgd3JhcHMgKGRvZXMgbm90IGNvcHkpCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBMaXN0fS4gIEFsbCBub24tbXV0YXRpbmcgbWV0aG9kcyBkZWxlZ2F0ZSB0bwotICAgICAqIHRoZSB1bmRlcmx5aW5nIExpc3QgaW5zdGFuY2UuCi0gICAgICovIAotCXB1YmxpYyBYbWxTaW1wbGVMaXN0KExpc3QgbGlzdCkgICAgIHsgdGhpcy51bmRlcmx5aW5nID0gbGlzdDsgfQotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBsaXN0LiAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIAkJICAgICAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5zaXplKCk7IH0KLSAgICAvKiogVHJ1ZSBpZiB0aGUgbGlzdCBpcyBlbXB0eS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgCSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5pc0VtcHR5KCk7IH0KLSAgICAvKiogVHJ1ZSBpZiB0aGUgbGlzdCBpcyBjb250YWlucyBhbiBvYmplY3QgZXF1YWwgdG8gby4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgICB7IHJldHVybiB1bmRlcmx5aW5nLmNvbnRhaW5zKG8pOyB9Ci0gICAgLyoqIFRydWUgaWYgdGhlIGxpc3QgaXMgY29udGFpbnMgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbCkgeyByZXR1cm4gdW5kZXJseWluZy5jb250YWluc0FsbChjb2xsKTsgfQotICAgIC8qKiBDb3BpZXMgdGhlIGNvbGxlY3Rpb24gdG8gYW4gYXJyYXkuICovCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSAJICAgICAgICB7IHJldHVybiB1bmRlcmx5aW5nLnRvQXJyYXkoKTsgfQotICAgIC8qKiBDb3BpZXMgdGhlIGNvbGxlY3Rpb24gdG8gYW4gYXJyYXkgb2YgYSBzcGVjaWZpZWQgdHlwZS4gKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7IHJldHVybiB1bmRlcmx5aW5nLnRvQXJyYXkoYSk7IH0KLSAgICAKLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgICAgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgICAgICAgICAgICAgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5nZXQoaW5kZXgpOyB9Ci0gICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBVbnN1cHBvcnRlZCBiZWNhdXNlIHRoaXMgbGlzdCBpcyBpbW11dGFibGUuICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSAgICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBSZXR1cm5zIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYW4gb2JqZWN0IGVxdWFsIHRvIG8uICovCi0gICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5pbmRleE9mKG8pOyB9Ci0gICAgLyoqIFJldHVybnMgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGFuIG9iamVjdCBlcXVhbCB0byBvLiAqLwotICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pICAgIHsgcmV0dXJuIHVuZGVybHlpbmcubGFzdEluZGV4T2Yobyk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBSZXR1cm5zIGEgdmlldyBvZiB0aGUgcG9ydGlvbiBvZiB0aGlzIGxpc3QgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGZyb21JbmRleCwgaW5jbHVzaXZlLCBhbmQgdG9JbmRleCwgZXhjbHVzaXZlLiAqLwotICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb20sIGludCB0bykgeyByZXR1cm4gbmV3IFhtbFNpbXBsZUxpc3QodW5kZXJseWluZy5zdWJMaXN0KGZyb20sIHRvKSk7IH0KLQotICAgIC8qKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXIgc2VxdWVuY2UuICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgICB7IAotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkKLSAgICAgICAgeyAKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSB1bmRlcmx5aW5nLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgICAgeyByZXR1cm4gaS5oYXNOZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIAkgICAgeyByZXR1cm4gaS5uZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIGxpc3QgaW4gcHJvcGVyIHNlcXVlbmNlLiAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgCXsgcmV0dXJuIGxpc3RJdGVyYXRvcigwKTsgfQotICAgIC8qKiBSZXR1cm5zIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBsaXN0IGluIHByb3BlciBzZXF1ZW5jZSwgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuICovCi0gICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoZmluYWwgaW50IGluZGV4KQotICAgIHsgCi0gICAgICAgIHJldHVybiBuZXcgTGlzdEl0ZXJhdG9yKCkKLSAgICAgICAgeyAKLSAgICAgICAgICAgIExpc3RJdGVyYXRvciBpID0gdW5kZXJseWluZy5saXN0SXRlcmF0b3IoaW5kZXgpOwotICAgIAotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpICAgIHsgcmV0dXJuIGkuaGFzTmV4dCgpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSAgICAgICAgeyByZXR1cm4gaS5uZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCl7IHJldHVybiBpLmhhc1ByZXZpb3VzKCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSAgICB7IHJldHVybiBpLnByZXZpb3VzKCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgICAgICB7IHJldHVybiBpLm5leHRJbmRleCgpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSAgeyByZXR1cm4gaS5wcmV2aW91c0luZGV4KCk7IH0KLSAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG8pICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nVmFsdWUoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFNpbXBsZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpbykuc3RyaW5nVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIGFsbAotICAgICAqIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gIEZvciBtb3N0IGxpc3RzLCB0aGlzIGlzIGEgdmFsaWQgeG1sIGxleGljYWwKLSAgICAgKiB2YWx1ZSBmb3IgdGhlIGxpc3QuIChUaGUgbm90YWJsZSBleGNlcHRpb24gaXMgYSBsaXN0IG9mIFFOYW1lcy4pCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaW50IHNpemUgPSB1bmRlcmx5aW5nLnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgU3RyaW5nIGZpcnN0ID0gc3RyaW5nVmFsdWUodW5kZXJseWluZy5nZXQoMCkpOwotICAgICAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIGZpcnN0OwotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0cmluZ1ZhbHVlKHVuZGVybHlpbmcuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUd28gWG1sU2ltcGxlTGlzdHMgYXJlIGVxdWFsIGlmIGFsbCB0aGVpciBpdGVtcyBhcmUgZXF1YWwuCi0gICAgICogKFRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcywgYW5kIHRoZSBpdGVtcyBtdXN0IGJlIGluCi0gICAgICogdGhlIHNhbWUgb3JkZXIuKQotICAgICAqLyAKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgeyAKLSAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBYbWxTaW1wbGVMaXN0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBmaW5hbCBYbWxTaW1wbGVMaXN0IHhtbFNpbXBsZUxpc3QgPSAoWG1sU2ltcGxlTGlzdClvOwotICAgICAgICBMaXN0IHVuZGVybHlpbmcyID0geG1sU2ltcGxlTGlzdC51bmRlcmx5aW5nOwotICAgICAgICBpbnQgc2l6ZSA9IHVuZGVybHlpbmcuc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSAhPSB1bmRlcmx5aW5nMi5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7IAotICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSB1bmRlcmx5aW5nLmdldChpKTsKLSAgICAgICAgICAgIE9iamVjdCBpdGVtMiA9IHVuZGVybHlpbmcyLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwgPyBpdGVtMiAhPSBudWxsIDogIWl0ZW0uZXF1YWxzKGl0ZW0yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbWJpbmVzIHRoZSBoYXNoIGNvZGVzIG9mIGFsbCB0aGUgbGlzdCBpdGVtcy4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgeyAKLSAgICAgICAgaW50IHNpemUgPSB1bmRlcmx5aW5nLnNpemUoKTsKLSAgICAgICAgaW50IGhhc2ggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgeyAKLSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gdW5kZXJseWluZy5nZXQoaSk7Ci0gICAgICAgICAgICBoYXNoICo9IDE5OwotICAgICAgICAgICAgaGFzaCArPSBpdGVtLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNmFiMi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzdHJpbmciPnhzOnN0cmluZzwvYT4gdHlwZS4KLSAqIDxwPgotICogQSBiYXNpYyBzdHJpbmcgaW4gWE1MIHNjaGVtYSBpcyBub3Qgd2hpdGVzcGFjZSBub3JtYWxpemVkLiAgSWYgeW91Ci0gKiB3YW50IHlvdXIgc3RyaW5nIHR5cGUgdG8gYmUgaW5zZW5zaXRpdmUgdG8gdmFyaWF0aW9ucyBpbiBydW5zIG9mCi0gKiB3aGl0ZXNwYWNlLCBjb25zaWRlciB1c2luZyAKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iPnhzOnRva2VuPC9hPgotICogKGFrYSB7QGxpbmsgWG1sVG9rZW59KSBpbnN0ZWFkLgotICogVG8gZm9yYmlkIHdoaXRlc3BhY2UgYW5kIHBlcm1pdCBqdXN0IGFscGhhbnVtZXJpYyBhbmQgb3RoZXIKLSAqIGNvbW1vbiBpZGVudGlmaWVyIGNoYXJhY3RlcnMgY29uc2lkZXIKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTiI+eHM6Tk1UT0tFTjwvYT4KLSAqIChha2Ege0BsaW5rIFhtbE5NVE9LRU59KSBpbnN0ZWFkLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sU3RyaW5nIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3N0cmluZyIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sU3RyaW5nfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxTdHJpbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxTdHJpbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxTdHJpbmd9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7IGFyYml0cmFyeSBzdHJpbmcgJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OyBhcmJpdHJhcnkgc3RyaW5nICZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4MTc5Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0aW1lIj54czp0aW1lPC9hPiB0eXBlLgotICogQSBnRGF5IHNwZWNpZmllcyBvbmx5IGEgZGF5LW9mLW1vbnRoLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9IG9yIHtAbGluayBHRGF0ZX0uCi0gKiAKLSAqIEBzZWUgWG1sQ2FsZW5kYXIKLSAqIEBzZWUgR0RhdGUKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sVGltZSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV90aW1lIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KLSAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCi0gICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICBHRGF0ZSBnRGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIGdkKTsKLQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxUaW1lfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxUaW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxUaW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxUaW1lfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyOjAwOjAwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyOjAwOjAwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViODkwNS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Rva2VuIj54czp0b2tlbjwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPi4KLSAqIDxwPgotICogQSB0b2tlbiBpcyBYTUwncyBiZXN0IHJlcHJlc2VudGF0aW9uIGZvciBhICJ3aGl0ZXNwYWNlIGluc2Vuc2l0aXZlIHN0cmluZy4iCi0gKiBBbGwgY2FycmlhZ2UgcmV0dXJucywgbGluZWZlZWRzLCBhbmQgdGFicyBhcmUgY29udmVydGVkIHRvIG9yZGluYXJ5IHNwYWNlCi0gKiBjaGFyYWN0ZXJzIChhcyB3aXRoIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9ybWFsaXplZFN0cmluZyI+eHM6bm9ybWFsaXplZFN0cmluZzwvYT4pLAotICogYW5kIGZ1cnRoZXJtb3JlLCBhbGwgY29udGlndW91cyBydW5zIG9mIHNwYWNlIGFyZSBjb2xsYXBzZWQgdG8gc2luZ2xlIHNwYWNlcywKLSAqIGFuZCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgYXJlIHRyaW1tZWQuCi0gKiA8cD4KLSAqIElmIHlvdSB3YW50IDxjb2RlPiImbmJzcDsmbmJzcDtoaWdoJm5ic3A7Jm5ic3A7cHJpb3JpdHkmbmJzcDsmbmJzcDsiPC9jb2RlPgotICogdG8gYmUgZXF1aXZhbGVudCB0byA8Y29kZT4iaGlnaCBwcmlvcml0eSI8L2NvZGU+LCB5b3Ugc2hvdWxkIGNvbnNpZGVyCi0gKiB1c2luZyB4czp0b2tlbiBvciBhIHN1YnR5cGUgb2YgeHM6dG9rZW4uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHtAbGluayAjc3RyaW5nVmFsdWV9IGlzIG9idGFpbmVkIGZyb20gYW4gWG1sVG9rZW4sIHRoZSBub3JtYWxpemVkLAotICogdHJpbW1lZCwgd2hpdGVzcGFjZSBjb2xsYXBzZWQgdmFsdWUgaXMgcmV0dXJuZWQuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxUb2tlbiBleHRlbmRzIFhtbE5vcm1hbGl6ZWRTdHJpbmcKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV90b2tlbiIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sVG9rZW59LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRva2VufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRva2VufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFRva2VufSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3N0cmluZyB0byBjb2xsYXBzZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzdHJpbmcgdG8gY29sbGFwc2UmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxUb2tlblNvdXJjZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOGNiMzcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgaG9sZGVyIG9mIFhNTCB0aGF0IGNhbiByZXR1cm4gYW4ge0BsaW5rIFhtbEN1cnNvcn0KLSAqIG9yIGNvcHkgaXRzZWxmIHRvIHZhcmlvdXMgbWVkaWEgc3VjaCBhcwotICoge0BsaW5rIFdyaXRlciBXcml0ZXJzfSBvciB7QGxpbmsgRmlsZSBGaWxlc30uCi0gKiBCb3RoIHtAbGluayBYbWxPYmplY3R9Ci0gKiAoYW5kIHRodXMgYWxsIFhNTCBCZWFucykgYW5kIHtAbGluayBYbWxDdXJzb3J9IGFyZQotICogWG1sVG9rZW5Tb3VyY2UgaW1wbGVtZW50YXRpb25zLgotICogCi0gKiBAc2VlIFhtbE9iamVjdAotICogQHNlZSBYbWxDdXJzb3IKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sVG9rZW5Tb3VyY2UKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQuICBJZiBjb25jdXJyZW50Ci0gICAgICogbXVsdGl0aHJlYWRlZCBhY2Nlc3MgdG8gYSBkb2N1bWVudCBpcyByZXF1aXJlZCwgdGhlIGFjY2VzcyBzaG91bGQgc2hvdWxkCi0gICAgICogYmUgcHJvdGVjdGVkIGJ5IHN5bmNocm9uaXppbmcgb24gdGhpcyBtb25pdG9yKCkgb2JqZWN0LiAgVGhlcmUgaXMgb25lCi0gICAgICogbW9uaXRvciBwZXIgWE1MIGRvY3VtZW50IHRyZWUuCi0gICAgICovCi0gICAgT2JqZWN0IG1vbml0b3IoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYbWxEb2N1bWVudFByb3BlcnRpZXMgb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQgdGhpcyB0b2tlbgotICAgICAqIHNvdXJjZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICovCi0gICAgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBYTUwgY3Vyc29yLgotICAgICAqCi0gICAgICogQSBjdXJzb3IgcHJvdmlkZXMgcmFuZG9tIGFjY2VzcyB0byBhbGwgdGhlIHRva2VucyBpbiB0aGUgWE1MCi0gICAgICogZGF0YSwgcGx1cyB0aGUgYWJpbGl0eSB0byBleHRyYWN0IHN0cm9uZ2x5LXR5cGVkIFhtbE9iamVjdHMKLSAgICAgKiBmb3IgdGhlIGRhdGEuIElmIHRoZSBkYXRhIGlzIG5vdCByZWFkLW9ubHksIHRoZSBYTUwgY3Vyc29yCi0gICAgICogYWxzbyBhbGxvd3MgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGF0YS4KLSAgICAgKgotICAgICAqIFVzaW5nIGEgY3Vyc29yIGZvciB0aGUgZmlyc3QgdGltZSB0eXBpY2FsbHkgZm9yY2VzIHRoZSBYTUwKLSAgICAgKiBkb2N1bWVudCBpbnRvIG1lbW9yeS4KLSAgICAgKi8KLSAgICBYbWxDdXJzb3IgbmV3Q3Vyc29yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFhtbElucHV0U3RyZWFtLgotICAgICAqCi0gICAgICogVGhlIHN0cmVhbSBzdGFydHMgYXQgdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50Ci0gICAgICogcG9zaXRpb24gYW5kIGVuZHMgYXQgdGhlIG1hdGNoaW5nIGVuZC10YWcgb3IgZW5kLWRvY3VtZW50LgotICAgICAqCi0gICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCBzdHJlYW0sIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAotICAgICAqIHdoaWxlIHRoZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCwgdGhlIHN0cmVhbSB0aHJvd3MgYQotICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKLSAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKLSAgICAgKiBhbiBhdHRyaWJ1dGUpLgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBzdGFuZGFyZCBYTUwgdGV4dC4KLSAgICAgKgotICAgICAqIFRoZSB0ZXh0IHJldHVybmVkIHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IGNvbnRlbnRzIHN0YXJ0aW5nIGF0Ci0gICAgICogdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IGFuZCBlbmRpbmcgYXQgdGhlIG1hdGNoaW5nCi0gICAgICogZW5kLXRhZyBvciBlbmQtZG9jdW1lbnQuIFRoaXMgaXMgc2FtZSBjb250ZW50IGFzIG5ld1JlYWRlciwgYnV0Ci0gICAgICogaXQgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgc3RyaW5nLgotICAgICAqCi0gICAgICogVGhyb3dzIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgWG1sVG9rZW5Tb3VyY2UgaXMgbm90Ci0gICAgICogcG9zaXRpb25lZCBhdCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgKGUuZy4sIGlmIGl0IGlzIGF0Ci0gICAgICogYW4gYXR0cmlidXRlKS4KLSAgICAgKi8KLSAgICBTdHJpbmcgeG1sVGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzdHJlYW0gY29udGFpbmluZyBzdGFuZGFyZCBYTUwgdGV4dCwgZW5jb2RlZAotICAgICAqIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBUaGUgYnl0ZSBzdHJlYW0gY29udGFpbnMgY29udGVudHMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQKLSAgICAgKiBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdCB0aGUgbWF0Y2hpbmcKLSAgICAgKiBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIFRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgdXNlZAotICAgICAqIGFuZCBhbHNvIGVtaXR0ZWQgaW4gYSBQSSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGEgZmFpbC1mYXN0IHN0cmVhbSwgc28gaWYgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBjaGFuZ2VkCi0gICAgICogd2hpbGUgdGhlIHN0cmVhbSBpcyBiZWluZyByZWFkLCB0aGUgc3RyZWFtIHRocm93cyBhCi0gICAgICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIFRocm93cyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIFhtbFRva2VuU291cmNlIGlzIG5vdAotICAgICAqIHBvc2l0aW9uZWQgYXQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IChlLmcuLCBpZiBpdCBpcyBhdAotICAgICAqIGFuIGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgY2hhcmFjdGVyIHJlYWRlciBjb250YWluaW5nIFhNTCB0ZXh0LgotICAgICAqCi0gICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSByZWFkZXIgcmVwcmVzZW50cyB0aGUgZG9jdW1lbnQgY29udGVudHMKLSAgICAgKiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdAotICAgICAqIHRoZSBtYXRjaGluZyBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIE5vIGVuY29kaW5nIGFubm90YXRpb24KLSAgICAgKiB3aWxsIGJlIG1hZGUgaW4gdGhlIHRleHQgaXRzZWxmLgotICAgICAqCi0gICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCByZWFkZXIsIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAotICAgICAqIHdoaWxlIHRoZSByZWFkZXIgaXMgYmVpbmcgcmVhZCwgdGhlIHJlYWRlciB0aHJvd3MgYQotICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKLSAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKLSAgICAgKiBhbiBhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIFJlYWRlciBuZXdSZWFkZXIoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVzNDIERPTSBOb2RlIGNvbnRhaW5pbmcgdGhlIFhNTAotICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLiAgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIFhNTCwgaXQgaXMKLSAgICAgKiBub3QgYSBsaXZlIHdpdGggdGhlIHVuZGVybHlpbmcgc3RvcmUgb2YgdGhpcyB0b2tlbiBzb3VyY2UuCi0gICAgICogSWYgdGhpcyBpcyB0aGUgZG9jdW1lbnQgbm9kZSwgdGhlbiBhIERvY3VtZW50IGlzIHJldHVybmVkLCBlbHNlCi0gICAgICogYSBEb2N1bWVudEZyYWdtZW50IGlzIHJldHVybmVkLgotICAgICAqLwotICAgIE5vZGUgbmV3RG9tTm9kZSgpOwotCi0vLyAgICAvKioKLS8vICAgICAqIFJldHVybnMgYSBXM0MgRE9NIE5vZGUgY29udGFpbmluZyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgotLy8gICAgICogVGhpcyBpcyBhIGxpdmUgRE9NIG5vZGUsIG5vdCBhIGNvcHkuICBBbnkgY2hhbmdlcyBtYWRlIHRocm91Z2ggdGhpcyBub2RlCi0vLyAgICAgKiBhcmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkIGluIHRoZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlbgotLy8gICAgICogc291cmNlLiAgRGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIHRva2VuIHRoaXMgWG1sVG9rZW5Tb3VyY2UgcmVwcmVzZW50cywKLS8vICAgICAqIGFuIGFwcHJvcHJpYXRlIG5vZGUgd2lsbCBiZSByZXR1cm5lZC4KLS8vICAgICAqLwotLy8gICAgTm9kZSBnZXREb21Ob2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCi0gICAgICogbGV4aWNhbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGggKSB0aHJvd3MgU0FYRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlIHRvIHRoZSBnaXZlbiBGaWxlLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBPdXRwdXRTdHJlYW0gb3MgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogPHA+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+Ci0gICAgICogCi0gICAgICogQHNlZSBYbWxPcHRpb25zCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wdGlvbnMgQW55IG9mIHRoZSBkZXNjcmliZWQgb3B0aW9ucy4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCi0gICAgICovCi0gICAgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKTsKLQotICAgIC8qKgotICAgICAqIEp1c3QgbGlrZSB4bWxUZXh0KCkgYnV0IHdpdGggb3B0aW9ucy4KLSAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMKLSAgICAgKi8KLSAgICBTdHJpbmcgeG1sVGV4dChYbWxPcHRpb25zIG9wdGlvbnMpOwotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICogSnVzdCBsaWtlIG5ld0lucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgYnV0IHdpdGggb3B0aW9ucy4KLSAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMKLSAgICAgKi8KLSAgICBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpOwotICAgIAotICAgIC8qKgotICAgICAqIEp1c3QgbGlrZSBuZXdSZWFkZXIoKSBidXQgd2l0aCBvcHRpb25zLgotICAgICAqIE9wdGlvbnMgbWFwIG1heSBiZSBudWxsLgotICAgICAqIEBzZWUgWG1sT3B0aW9ucwotICAgICAqLwotICAgIFJlYWRlciBuZXdSZWFkZXIoWG1sT3B0aW9ucyBvcHRpb25zKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBKdXN0IGxpa2UgbmV3RG9tTm9kZSgpIGJ1dCB3aXRoIG9wdGlvbnMuCi0gICAgICogT3B0aW9ucyBtYXAgbWF5IGJlIG51bGwuCi0gICAgICogQHNlZSBYbWxPcHRpb25zCi0gICAgICovCi0KLSAgICBOb2RlIG5ld0RvbU5vZGUoWG1sT3B0aW9ucyBvcHRpb25zKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCi0gICAgICogbGV4aWNhbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBTQVhFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIEZpbGUuCi0gICAgICovCi0gICAgdm9pZCBzYXZlICggRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2E3YzUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRCeXRlIj54czp1bnNpZ25lZEJ5dGU8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogVmVyaWZpZWQgdG8gYmUgaW4gdGhlIHJhbmdlIDAuLjI1NSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIEFzIHN1Z2dlc3RlZCBieSBKQVhCLCBjb252ZXJ0aWJsZSB0byBKYXZhIHNob3J0LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxVbnNpZ25lZEJ5dGUgZXh0ZW5kcyBYbWxVbnNpZ25lZFNob3J0Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfdW5zaWduZWRCeXRlIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0ICovCi0gICAgcHVibGljIHNob3J0IGdldFNob3J0VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0U2hvcnRWYWx1ZX0KLSAgICAgKiovCi0gICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBzaG9ydAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRTaG9ydFZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXQoc2hvcnQgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkSW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViMWUyMi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkSW50Ij54czp1bnNpZ25lZEludDwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBWZXJpZmllZCB0byBiZSBpbiB0aGUgcmFuZ2UgMC4uNDI5NDk2NzI5NSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIEphdmEgbG9uZy4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sVW5zaWduZWRJbnQgZXh0ZW5kcyBYbWxVbnNpZ25lZExvbmcKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV91bnNpZ25lZEludCIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBsb25nICovCi0gICAgbG9uZyBnZXRMb25nVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgbG9uZyAqLwotICAgIHZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBsb25nCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldExvbmdWYWx1ZX0KLSAgICAgKiovCi0gICAgbG9uZyBsb25nVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBsb25nCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldExvbmdWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQobG9uZyB2KTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sVW5zaWduZWRJbnR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkSW50fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkSW50fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFVuc2lnbmVkSW50fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1NjcmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGFkOTQyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZExvbmciPnhzOnVuc2lnbmVkTG9uZzwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBWZXJpZmllZCB0byBiZSBpbiB0aGUgcmFuZ2UgMC4uMjxzdXBlcj42NDwvc3VwZXI+LTEgd2hlbiB2YWxpZGF0aW5nLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkTG9uZyBleHRlbmRzIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Vuc2lnbmVkTG9uZyIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sVW5zaWduZWRMb25nfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZExvbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZExvbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkU2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0ZTQ4ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRTaG9ydCI+eHM6dW5zaWduZWRTaG9ydDwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBWZXJpZmllZCB0byBiZSBpbiB0aGUgcmFuZ2UgMC4uNjU1MzUgd2hlbiB2YWxpZGF0aW5nLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIEphdmEgaW50LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxVbnNpZ25lZFNob3J0IGV4dGVuZHMgWG1sVW5zaWduZWRJbnQKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV91bnNpZ25lZFNob3J0Iik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgKi8KLSAgICBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCAqLwotICAgIHZvaWQgc2V0SW50VmFsdWUoaW50IHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgaW50IGludFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoaW50IHYpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbCBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmY3OGMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IndoaXRlIj4KLQotUHJvdmlkZXMgY2xhc3NlcyBmb3IgWE1MIEJlYW5zIHNjaGVtYSwgaW5mb3NldCwgeHBhdGgsIGFuZCB4cXVlcnkgaGFuZGxpbmcuCi0KLTxwPgotVGhlIFhNTCBCZWFucyBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBYTUwgQmVhbnMgPGVtPnNjaGVtYSBjb21waWxlcjwvZW0+LgotVGhlIHNjaGVtYSBjb21waWxlciBwcm9kdWNlcyBYTUwgQmVhbiBjbGFzc2VzIHRoYXQgZXh0ZW5kIGFuZCBpbnRlcmFjdAotd2l0aCB0aGUgYmFzaWMgWE1MIEJlYW4gY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBpbiB0aGlzIHBhY2thZ2UuICBJdCBpcwotYWxzbyBwb3NzaWJsZSB0byB1c2UgWE1MIEJlYW5zIHdpdGhvdXQgdGhlIHNjaGVtYSBjb21waWxlciB0byBtYW5pcHVsYXRlCi1hbmQgdmFsaWRhdGUgWE1MIGluIGEgbGF0ZS1ib3VuZCB3YXkgKHdpdGggbm8gdHlwZXMsIG9yIHdpdGgKLXJ1bnRpbWUtbG9hZGVkIHR5cGVzIG9ubHkpLgotCi08cD4KLVRoaXMgcGFja2FnZSBjb250YWluczoKLTxvbD4KLTxsaT5BbGwgdGhlIGJ1aWx0LWluIFhNTCBCZWFuIGNsYXNzZXMgCi1zdWNoIGFzIHtAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdH0sIHtAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGV9LCBhbmQKLXtAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludH0KLShvbmUgZm9yIGVhY2ggb2YgdGhlIAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNidWlsdC1pbi1kYXRhdHlwZXMiPjQ2IGJ1aWx0LWluIFhNTCBTY2hlbWEgdHlwZXM8L2E+KS4KLTxsaT5TdXBwb3J0IGZvciBmdWxsIFhNTCBpbmZvc2V0LCBYUGF0aCwgYW5kIFhRdWVyeQotKHZpYSB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3J9LCB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Qjc2VsZWN0UGF0aH0gYW5kIHJlbGF0ZWQgbWV0aG9kcykuCi08bGk+U3VwcG9ydCBmb3IgY29tcHV0YXRpb24gdXNpbmcgWE1MIFNjaGVtYSBkYXRhIHR5cGVzICh2aWEgZGF0YXR5cGUKLWNsYXNzZXMgc3VjaCBhcyB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb259KS4KLTxsaT5TdXBwb3J0IGZvciB3b3JraW5nIHdpdGggWE1MIFNjaGVtYSB0eXBlIG1ldGFkYXRhIGl0c2VsZgotKHZpYSB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlfSwge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbX0sIGFuZCByZWxhdGVkIGNsYXNzZXMpLgotPC9vbD4KLQotPHA+Ci1UaGUgcGxhY2UgdG8gYmVnaW4gd2hlbiB3b3JraW5nIHdpdGggdGhlIFhNTCBCZWFucyBBUEkgaXMgdGhlIGZvbGxvd2luZwotZnVuZGFtZW50YWwgY2xhc3NlczoKLQotPG9sPgotPGxpPntAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdH0gaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBYTUwgQmVhbnMuCi08bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0LkZhY3Rvcnl9IGlzIHVzZWQgdG8gbG9hZCBhbmQgY3JlYXRlIFhNTCBCZWFuIGluc3RhbmNlcy4KLUVhY2ggWE1MIEJlYW4gY2xhc3MgaGFzIGl0cyBvd24gbmVzdGVkIGZhY3RvcnkgY2xhc3MuCi08bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yfSBpcyBhbiBlZmZpY2llbnQgdHJlZXdhbGtpbmcgQVBJIGZvciB0aGUgZnVsbCBYTUwgaW5mb3NldC4KLTxsaT57QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlfSBpcyB0aGUgdHlwZSBtZXRhZGF0YSBpbnRlcmZhY2UgZm9yIFhNTCBTY2hlbWEgdHlwZXMKLTxsaT57QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuc30gcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIHV0aWxpdHkgZnVuY3Rpb25zLgotPC9vbD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHNjaGVtYS9zY2hlbWEvWE1MLnhzZCBiL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL1hNTC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNjUzN2MuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHNjaGVtYS9zY2hlbWEvWE1MLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iZW4iPgotCi0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAotICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKLSAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQotICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nIG9yIHhtbDpzcGFjZSBhdHRyaWJ1dGVzCi0gICAgICAgIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotCi0gICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QiLz4KLQotICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLQotICAgICAgICAmbHQ7dHlwZSAuIC4gLj4KLSAgICAgICAgIC4gLiAuCi0gICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8+Ci0KLSAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgotICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCi0gICBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0gICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KLSAgPHhzOnNpbXBsZVR5cGU+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc2NoZW1hL3NjaGVtYS93M2MteG1sLWxpY2Vuc2UuaHRtbCBiL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL3czYy14bWwtbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY0Yjg3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL3czYy14bWwtbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci0gIDx0aXRsZT5XM0MgU29mdHdhcmUgTGljZW5zZTwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9TdHlsZVNoZWV0cy9iYXNlLmNzcyIgLz4KLSAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSA8IS0tCi1oMyN2ZXJzaW9uIHsgbWFyZ2luLXRvcDogLTAuOGVtO30KLS0tPgotICA8L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIj4KLQotPGgxPlczQyBYTUwgTmFtZXNwYWNlIFNjaGVtYTogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIj5odHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Q8L2E+PC9oMT4KLTxkbD4KLSAgICA8ZGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9pcHItbm90aWNlIj5Db3B5cmlnaHQ8L2E+Ci0gICAgICCpIDIwMDEgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvIj5Xb3JsZCBXaWRlIFdlYgotICAgICAgQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cwotICAgICAgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3k8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmVyY2ltLm9yZy8iPkV1cm9wZWFuCi0gICAgICBSZXNlYXJjaCBDb25zb3J0aXVtIGZvciBJbmZvcm1hdGljcyBhbmQgTWF0aGVtYXRpY3M8L2E+LCA8YQotICAgICAgaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbyBVbml2ZXJzaXR5PC9hPikuIEFsbCBSaWdodHMKLSAgICAgIFJlc2VydmVkLiBUaGlzIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIDxhCi0gICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxIj5XM0M8c3VwPq48L3N1cD4KLSAgICAgIFNvZnR3YXJlIExpY2Vuc2U8L2E+IFsxXSBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgICAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgICAgIDxwPlsxXSA8YQotICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMS5odG1sIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxPC9hPjwvcD4KLSAgICA8L2RkPgotPC9kbD4KLQotCi08aHIvPgotCi08aDE+VzNDPHN1cD6uPC9zdXA+IFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRTwvaDE+Ci0KLTxoMyBpZD0idmVyc2lvbiI+PGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzE8L2E+PC9oMz4KLQotPHA+VGhpcyB3b3JrIChhbmQgaW5jbHVkZWQgc29mdHdhcmUsIGRvY3VtZW50YXRpb24gc3VjaCBhcyBSRUFETUVzLCBvciBvdGhlcgotcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcKLWxpY2Vuc2UuIEJ5IG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkKLWFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZwotdGVybXMgYW5kIGNvbmRpdGlvbnMuPC9wPgotCi08cD5QZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCZuYnNwO2ZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAotZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbgotQUxMIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgdGhlcmVvZiwgaW5jbHVkaW5nCi1tb2RpZmljYXRpb25zOjwvcD4KLTxvbD4KLSAgPGxpPlRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUKLSAgICByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay48L2xpPgotICA8bGk+QW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCi0gICAgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIHRoZSA8YQotICAgIGhyZWY9ImNvcHlyaWdodC1zb2Z0d2FyZS1zaG9ydC1ub3RpY2UtMjAwMjEyMzEuaHRtbCI+VzNDIFNvZnR3YXJlIFNob3J0Ci0gICAgTm90aWNlPC9hPiBzaG91bGQgYmUgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKQotICAgIHdpdGhpbiB0aGUgYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGUuPC9saT4KLSAgPGxpPk5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlCi0gICAgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUgVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbQotICAgIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKTwvbGk+Ci08L29sPgotCi08cD5USElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUwotTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFCi1BTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuPC9wPgotCi08cD5DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IKLURPQ1VNRU5UQVRJT04uPC9wPgotCi08cD5UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4KLWFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuCi1wcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQKLWRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuPC9wPgotCi08cD48L3A+Ci0KLTxwPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvcD4KLQotPHA+VGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbiBEZWNlbWJlciAzMQotMjAwMi4gVGhpcyB2ZXJzaW9uIHJlbW92ZXMgdGhlIGNvcHlyaWdodCBvd25lcnNoaXAgbm90aWNlIHN1Y2ggdGhhdCB0aGlzCi1saWNlbnNlIGNhbiBiZSB1c2VkIHdpdGggbWF0ZXJpYWxzIG90aGVyIHRoYW4gdGhvc2Ugb3duZWQgYnkgdGhlIFczQywKLXJlZmxlY3RzIHRoYXQgRVJDSU0gaXMgbm93IGEgaG9zdCBvZiB0aGUgVzNDLCBpbmNsdWRlcyByZWZlcmVuY2VzIHRvIHRoaXMKLXNwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UsIGFuZCByZW1vdmVzIHRoZSBhbWJpZ3VvdXMgZ3JhbnQgb2YKLSJ1c2UiLiBPdGhlcndpc2UsIHRoaXMgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwIj5wcmV2aW91cwotdmVyc2lvbjwvYT4gYW5kIGlzIHdyaXR0ZW4gc28gYXMgdG8gcHJlc2VydmUgdGhlIDxhCi1ocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS9saWNlbnNlLWxpc3QuaHRtbCNHUExDb21wYXRpYmxlTGljZW5zZXMiPkZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5PC9hPiBhbmQgPGEKLWhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvVzNDLnBocCI+T1NJJ3MgY2VydGlmaWNhdGlvbjwvYT4KLXVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2RvY3MvZGVmaW5pdGlvbi5waHAiPk9wZW4gU291cmNlCi1EZWZpbml0aW9uPC9hPi4gUGxlYXNlIHNlZSBvdXIgPGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUSI+Q29weXJpZ2h0IEZBUTwvYT4gZm9yCi1jb21tb24gcXVlc3Rpb25zIGFib3V0IHVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMKLXRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBwYWNrYWdlcyBsaWtlIGxpYnd3dywgQW1heWEsIGFuZCBKaWdzYXcuIE90aGVyCi1xdWVzdGlvbnMgYWJvdXQgdGhpcyBub3RpY2UgY2FuIGJlIGRpcmVjdGVkIHRvIDxhCi1ocmVmPSJtYWlsdG86c2l0ZS1wb2xpY3lAdzMub3JnIj5zaXRlLXBvbGljeUB3My5vcmc8L2E+LjxiciAvPgotJm5ic3A7PC9wPgotPGFkZHJlc3M+Ci0gIEpvc2VwaCBSZWFnbGUgJmx0OzxhCi0gIGhyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZyZndDs8L2E+Ci08L2FkZHJlc3M+Ci0KLTxwPkxhc3QgcmV2aXNlZCBieSBSZWFnbGUgJERhdGU6IDIwMDQvMDQvMTAgMDA6MTc6MTAgJDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRjM2MxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkdsb2JhbExvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3QuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNhdmVyLlhtbElucHV0U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQXR0cjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQmVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkN1cnNvckdvb2JlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuR29vYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Qcm9jaW5zdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuWG1sbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuQ2hhbmdlU3RhbXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG9jdW1lbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBYbWxDdXJzb3IsIENoYW5nZUxpc3RlbmVyCi17Ci0gICAgQ3Vyc29yICggUm9vdCByLCBTcGxheSBzICkgICAgICAgIHsgYXNzZXJ0IHMgIT0gbnVsbDsgX2RhdGEgPSBDdXJzb3JEYXRhLmdldE9uZSggciApOyBzZXQoIHMgKTsgfQotICAgIEN1cnNvciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKSB7IGFzc2VydCBzICE9IG51bGw7IF9kYXRhID0gQ3Vyc29yRGF0YS5nZXRPbmUoIHIgKTsgc2V0KCBzLCBwICk7IH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCk7Ci0gICAgfQotCi0gICAgUm9vdCAgZ2V0Um9vdCAoICkgeyByZXR1cm4gX2RhdGEuX2dvb2Jlci5nZXRSb290KCk7IH0KLQotICAgIFNwbGF5IGdldFNwbGF5ICggKSB7IHJldHVybiBfZGF0YS5fZ29vYmVyLmdldFNwbGF5KCk7IH0KLSAgICBpbnQgICBnZXRQb3MgICAoICkgeyByZXR1cm4gX2RhdGEuX2dvb2Jlci5nZXRQb3MoKTsgfQotICAgIAotICAgIHZvaWQgc2V0ICggU3BsYXkgcywgaW50IHAgKSB7IF9kYXRhLl9nb29iZXIuc2V0KCBzLCBwICk7IH0KLSAgICB2b2lkIHNldCAoIFNwbGF5IHMgICAgICAgICkgeyBfZGF0YS5fZ29vYmVyLnNldCggcywgMCApOyB9Ci0gICAgdm9pZCBzZXQgKCBpbnQgcCAgICAgICAgICApIHsgX2RhdGEuX2dvb2Jlci5zZXQoIHAgKTsgfQotICAgIHZvaWQgc2V0ICggR29vYmVyIGcgICAgICAgKSB7IF9kYXRhLl9nb29iZXIuc2V0KCBnICk7IH0KLQotICAgIGludCBnZXRQb3N0Q2NoICggKQotICAgIHsKLSAgICAgICAgaW50IHAgPSBnZXRQb3MoKTsKLQotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgcGEgPSBzLmdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgYXNzZXJ0IHAgPj0gcGEgfHwgcy5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwID49IHBhID8gcy5nZXRDY2hBZnRlcigpIC0gcCArIHBhIDogcy5nZXRQb3NMZWFmRW5kKCkgLSBwOwotICAgIH0KLSAgICAKLSAgICBpbnQgZ2V0UHJlQ2NoICggKQotICAgIHsKLSAgICAgICAgLy8gVE9ETyAtIHF1aWNrIGFuZCBkaXJ0eSBpbXBsLCBpbXByb3ZlCi0KLSAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotCi0gICAgICAgIGludCBuID0gdG9QcmV2Q2hhciggLTEgKTsKLQotICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotCi0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXNwb3NlZCAoICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0Rpc3Bvc2VkICggQ3Vyc29yIGMgKQotICAgIHsKLSAgICAgICAgaWYgKGMuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkN1cnNvciBoYXMgYmVlbiBkaXNwb3NlZCIgKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbGVhbiBpc0Rpc3Bvc2VkICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kYXRhID09IG51bGw7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBYbWxDdXJzb3IgTWV0aG9kcwotICAgIC8vCi0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RhdGEucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIF9kYXRhID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICghcy5pc1R5cGVhYmxlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBUeXBlIHQgPSBzLmdldFR5cGUoIHIgKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gdC5nZXRYbWxPYmplY3QoKTsKLSAgICAgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdG9DdXJzb3IgKCBYbWxDdXJzb3IgbW92ZVRvICkKLSAgICB7Ci0gICAgICAgIGlmIChtb3ZlVG8gPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIGN1cnNvciIgKTsKLQotICAgICAgICBpZiAobW9uaXRvcigpID09IG1vdmVUby5tb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvQ3Vyc29ySW1wbCggbW92ZVRvICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW92ZVRvLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9DdXJzb3JJbXBsKCBtb3ZlVG8gKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiB0b0N1cnNvckltcGwgKCBYbWxDdXJzb3IgbW92ZVRvICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgCi0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChtb3ZlVG8gaW5zdGFuY2VvZiBDdXJzb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGMgPSAoQ3Vyc29yKSBtb3ZlVG87Ci0KLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoIGMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGMuZ2V0Um9vdCgpICE9IGdldFJvb3QoKSkKLSAgICAgICAgICAgICAgICBjID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzZXQoIGMuX2RhdGEuX2dvb2JlciApOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuZG9jdW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEN1cnNvciBuZXdDdXJzb3IgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHRvQm9va21hcmsgKCBYbWxCb29rbWFyayBibSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChibSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGlmICghKGJtLl9jdXJyZW50TWFyayBpbnN0YW5jZW9mIEFubm90YXRpb24pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIEFubm90YXRpb24gYSA9IChBbm5vdGF0aW9uKSBibS5fY3VycmVudE1hcms7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYS5nZXRSb290KCkgIT0gZ2V0Um9vdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBhLmdldFNwbGF5KCkgIT0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgIHNldCggYSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIHRvTmV4dEJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gY3VycmVudFRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgY3Vyc29yIHBhc3QgdGhlIGN1cnJlbnQgc3BvdCBieSB0aGUgbWluaW11biBhbW91bnQKLSAgICAKLSAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b05leHRDaGFyKCAxICk7Ci0gICAgICAgICAgICAgICAgdHQgPSBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgodHQgPSB0b05leHRUb2tlbigpKS5pc05vbmUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBibSA9IGdldEJvb2ttYXJrKCBrZXkgKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtOwotICAgIAotICAgICAgICAgICAgICAgIGludCBwb3N0Q2NoOwotICAgIAotICAgICAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSAmJiAocG9zdENjaCA9IGdldFBvc3RDY2goKSkgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgZCA9IHBvc3RDY2g7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBtYXJrOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuaXNBbm5vdGF0aW9uKCkgJiYgKGRpc3QgPSBnLmdldFBvcygpIC0gcCkgPiAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPCBkICYmIChtYXJrID0gZy5nZXRCb29rbWFyaygpKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLmdldEtleSgpLmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBtYXJrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkaXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIHAgKyBkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCh0dCA9IHRvTmV4dFRva2VuKCkpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIHRvUHJldkJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gcHJldlRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgLy8gUmV0cmVhdCB0aGUgY3Vyc29yIHBhc3QgdGhlIGN1cnJlbnQgc3BvdCBieSB0aGUgbWluaW11biBhbW91bnQKLSAgICAKLSAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b1ByZXZDaGFyKCAxICk7Ci0gICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0b1ByZXZUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldCggc09yaWcsIHBPcmlnICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEJvb2ttYXJrIGJtID0gZ2V0Qm9va21hcmsoIGtleSApOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgCi0gICAgICAgICAgICAgICAgaW50IHByZUNjaDsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAodHQuaXNUZXh0KCkgJiYgKHByZUNjaCA9IGdldFByZUNjaCgpKSA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBzOwotICAgICAgICAgICAgICAgICAgICBpbnQgICBwOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGdldFNwbGF5KCkucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHMuZ2V0RW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IGQgPSBwcmVDY2g7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBtYXJrOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuaXNBbm5vdGF0aW9uKCkgJiYgKGRpc3QgPSBwIC0gZy5nZXRQb3MoKSkgPiAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPCBkICYmIChtYXJrID0gZy5nZXRCb29rbWFyaygpKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLmdldEtleSgpLmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBtYXJrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkaXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIHAgLSBkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHR0LmlzVGV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG9QcmV2Q2hhciggLTEgKTsKLSAgICAgICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvUHJldlRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0dCA9IHByZXZUb2tlblR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVG9rZW5UeXBlIGN1cnJlbnRUb2tlblR5cGUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldFRva2VuVHlwZSggZ2V0UG9zKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ZG9jICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnRkb2MoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kZG9jICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNFbmRkb2MoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnQgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNTdGFydCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbmQgICAgICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc0VuZCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNUZXh0ICAgICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc1RleHQoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0ciAgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNBdHRyKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZSAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzTmFtZXNwYWNlKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQ29tbWVudCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9jaW5zdCAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc1Byb2NpbnN0KCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lciAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQ29udGFpbmVyKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaCAgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzRmluaXNoKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FueUF0dHIgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQW55QXR0cigpOyB9Ci0gICAgCi0gICAgcHVibGljIFRva2VuVHlwZSBwcmV2VG9rZW5UeXBlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgLy8gVE9ETyAtIHF1aWNrIGFuZCBkaXJ0eSBpbXBsZW1lbnRhdGlvbiwgaW1wcm92ZQotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcE9yaWcgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIFRva2VuVHlwZSB0dDsKLSAgICAKLSAgICAgICAgICAgIGlmICh0b1ByZXZDaGFyKCAxICkgPT0gMSkKLSAgICAgICAgICAgICAgICB0dCA9IFRva2VuVHlwZS5URVhUOwotICAgICAgICAgICAgZWxzZSBpZiAoISh0dCA9IHRvUHJldlRva2VuKCkpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIHR0ID0gY3VycmVudFRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0dDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVG9rZW5UeXBlIHRvTmV4dFRva2VuICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBvcyA9IGdldFNwbGF5KCk7IC8vIE9yaWduYWwgc3BsYXkKLSAgICAgICAgICAgIFNwbGF5IHMgPSBvczsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNSb290KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIExvb2sgc2VlIGlmIHRoZXJlIGlzIGFuIGF0dHIgd2Ugc2hvdWxkIHZpc2l0IGJlZm9yZSB2aXNpdGluZwotICAgICAgICAgICAgICAgIC8vIGFueSBmb2xsb3dpbmcgY29udGVudCBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSB0ID0gcy5uZXh0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCggdCwgMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSdyZSBnb2luZyBpbnRvIHRoZSBjb250ZW50IG9mIHRoaXMgY29udGFpbmVyLiAgRmx1c2gKLSAgICAgICAgICAgICAgICAgICAgLy8gb3V0IGFueSBjYWNoZWQgdHlwZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuZ2V0TWF4UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBwID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHAgPj0gcy5nZXRQb3NBZnRlcigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcCA8IHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHAgIT0gcy5nZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5nZXRQb3NMZWFmRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5nZXRQb3NBZnRlcigpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBhbiBhdHRyIHRvIGEgbm9uIGF0dHIsIHNlZSBpZiB0aGVyZQotICAgICAgICAgICAgLy8gaXMgY29udGVudCBpbiBhIERPQyBvciBCRUdJTiB3aGljaCBuZWVkcyB0byBiZSB2aXNpdGVkIGFmdGVyCi0gICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlcy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBbHNvLCBpZiB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIGFuIGF0dHIgY29udGFpbmVyIChCRUdJTiBvcgotICAgICAgICAgICAgLy8gRE9DKSB0byBhbiBhdHRyLCB3aGVyZSB0aGUgYXR0ciBjb250YWluZXIgaGFzIGludGVyaW9yIGNvbnRlbnQsCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgdmlzaXRlZCB0aGUgYXR0cnMgYW5kIG11c3Qgc2tpcCB0aGVtIG5vdy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBbHNvLCBpZiB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIHBvcyAwIHRvIHBvcyAxIG9uIGFuIGF0dHIKLSAgICAgICAgICAgIC8vIGNvbnRhaW5lciwgd2UgbmVlZCB0byB2aXNpdCBhbnkgYXR0cmlidXRlcyBiZWZvcmUgdmlzaXRpbmcgdGhlCi0gICAgICAgICAgICAvLyBpbnRlcmlvciBjb250ZW50IG9mIHRoZSBhdHRyIGNvbnRhaW5lci4KLSAgICAgICAgICAgIC8vCi0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSAmJiBvcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBvcy5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5hdmlnYXRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgYSBjb250YWluZXIuICBGbHVzaAotICAgICAgICAgICAgICAgICAgICAvLyBvdXQgYW55IGNhY2hlZCB0eXBlIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdC5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0TWF4UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkgJiYgIW9zLmlzQXR0cigpICYmIG9zLmdldE1heFBvcygpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBvcy5pc0NvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzLCBwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRva2VuVHlwZSB0b1ByZXZUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgIC8vIFRPRE8gLSBUaGlzIGNvZGUgaXMgbm90IGFzIGNvbXBhY3QgYXMgaXQgY2FuIGJlLCB0aGVyZSBpcyBzb21lIHJlZHVuZGFuY3kKLSAgICAvLyAtLSByZXRoaW5rIGl0IGxhdGVyIC4uLgotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAxICYmIHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgcCArPSBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMSAmJiBzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMubmV4dFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIHQgPSB0Lm5leHRTcGxheSgpIDsgdC5pc0F0dHIoKSA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0OwotICAgIAotICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCAmJiAhcy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7Ci0gICAgCi0gICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMucHJldlNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ID0gdC5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0LmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXRNYXhQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q2NoQWZ0ZXIoKSA+IDAgPyB0LmdldFBvc0FmdGVyKCkgOiB0LmdldE1heFBvcygpICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHAgPT0gMDsKLSAgICAKLSAgICAgICAgICAgICAgICBTcGxheSB0ID0gcy5wcmV2U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoIXQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBzZXQoIHQsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgICAgIHAgPSBzLmdldENjaEFmdGVyKCkgPiAwID8gcy5nZXRQb3NBZnRlcigpIDogcy5nZXRNYXhQb3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDA7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICFzLmlzUm9vdCgpOwotICAgIAotICAgICAgICAgICAgICAgIGludCBwb3NBZnRlciA9IHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocCA+PSBwb3NBZnRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPiAwOwotICAgICAgICAgICAgICAgICAgICBwID0gcG9zQWZ0ZXIgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc1ZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcCA9IHAgPiAxICYmIHAgPT0gcG9zQWZ0ZXIgLSAxID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzLCBwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0Q2hhcnMgKCBTdHJpbmcgdGV4dCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkgfHwgcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkludmFsaWQgbG9jYXRpb24gZm9yIHRleHQiICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgcyA9IHMucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIHAgPSBzLmdldEVuZFBvcygpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBpbnQgY2NoID0gdGV4dC5sZW5ndGgoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgIHMuaW5zZXJ0Q2hhcnMoIHAsIGdldFJvb3QoKSwgdGV4dCwgMCwgY2NoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTG9jYWxOYW1lICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlFOYW1lIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVMb2NhbE5hbWUgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgbnVsbCIgKTsKLQotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgZW1wdHkiICk7Ci0KLSAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUoIG5hbWUgKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJOYW1lIGlzIG5vdCB2YWxpZCIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUHJlZml4ICggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcmVmaXggaXMgbnVsbCIgKTsKLQotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBpcyBlbXB0eSIgKTsKLQotICAgICAgICBpZiAoU3BsYXkuYmVnaW5zV2l0aFhtbCggbmFtZSApKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBiZWdpbnMgd2l0aCAneG1sJyIgKTsKLQotICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZE5DTmFtZSggbmFtZSApKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBpcyBub3QgdmFsaWQiICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnNlcnQoIG5ldyBBdHRyKCBuYW1lICksIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIG5hbWUsIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSApCi0gICAgewotICAgICAgICBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIG5hbWUsIHVyaSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCBuYW1lLCBudWxsLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoCi0gICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUgKTsKLQotICAgICAgICBpbnNlcnRBdHRyaWJ1dGUoIG5ldyBRTmFtZSggdXJpLCBuYW1lICksIHZhbHVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZSApOwotCi0gICAgICAgIGluc2VydEF0dHJpYnV0ZSggbmFtZSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZSApOwotCi0gICAgICAgIGluc2VydEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnROYW1lc3BhY2UgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVQcmVmaXgoIHByZWZpeCApOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBtYXAgYSBwcmVmaXggdG8gbm8gbmFtZXNwYWNlIiApOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW5zZXJ0KCBuZXcgWG1sbnMoIG5ldyBRTmFtZSggbmFtZXNwYWNlLCBwcmVmaXggKSApLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRDb21tZW50ICggU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGluc2VydCggbmV3IENvbW1lbnQoKSwgdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydFByb2NJbnN0ICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCB0YXJnZXQgKTsgLy8gdXNlZCBiZWN1YXNlICI8P3htbC4uLj8+IGlzIGRpc2FsbG93ZWQKLQotICAgICAgICBpZiAoU3BsYXkuYmVnaW5zV2l0aFhtbCggdGFyZ2V0ICkgJiYgdGFyZ2V0Lmxlbmd0aCgpID09IDMpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiVGFyZ2V0IGJlZ2lucyB3aXRoICd4bWwnIiApOwotICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnNlcnQoIG5ldyBQcm9jaW5zdCggdGFyZ2V0ICksIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudFdpdGhUZXh0KCBuYW1lLCBudWxsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIG5hbWUsIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnRXaXRoVGV4dCggbmFtZSwgbnVsbCwgdGV4dCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnQgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5hbWUsIHVyaSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRFbGVtZW50ICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5hbWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYmVnaW5FbGVtZW50ICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50KCBuYW1lICk7Ci0gICAgICAgIHRvUHJldlRva2VuKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnQoIG5hbWUgKTsKLSAgICAgICAgdG9QcmV2VG9rZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYmVnaW5FbGVtZW50ICggU3RyaW5nIG5hbWUsIFN0cmluZyB1cmkgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudCggbmFtZSwgdXJpICk7Ci0gICAgICAgIHRvUHJldlRva2VuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggUU5hbWUgbmFtZSwgU3RyaW5nIHRleHQgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAKLSAgICAgICAgICAgIEJlZ2luIGIgPSBuZXcgQmVnaW4oIG5hbWUsIG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYi50b2dnbGVJc0xlYWYoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW5zZXJ0KCBiLCB0ZXh0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIG5hbWUsIFN0cmluZyB1cmksIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnRXaXRoVGV4dCggbmV3IFFOYW1lKCB1cmksIG5hbWUgKSwgdGV4dCApOwotICAgIH0KLQotICAgIHZvaWQgaW5zZXJ0ICggU3BsYXkgc0luc2VydCwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNEaXNwb3NlZCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc0luc2VydC5nZXRSb290U2xvdygpID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBzSW5zZXJ0LmdldENjaCgpID09IDA7Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICBzSW5zZXJ0LmFkanVzdENjaCggdmFsdWUubGVuZ3RoKCkgKTsKLQotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotCi0gICAgICAgIHNJbnNlcnQuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggMCwgcywgcCwgZmFsc2UgKTsKLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHMuaW5zZXJ0KCBnZXRSb290KCksIHAsIHNJbnNlcnQsIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSwgdHJ1ZSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzLmluc2VydCggZ2V0Um9vdCgpLCBwLCBzSW5zZXJ0LCBudWxsLCAwLCAwLCB0cnVlICk7Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0VmFsdWUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgcy5pc0ZpbmlzaCgpIHx8IHMuaXNYbWxucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgdGV4dCB2YWx1ZSwgY3VycmVudCB0b2tlbiBjYW4gaGF2ZSBubyB0ZXh0IHZhbHVlIiApOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkuZ2V0VGV4dCggZ2V0Um9vdCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRWYWx1ZSAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLS8vICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotLy8gICAgCi0vLyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotLy8gICAgCi0vLyAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgcy5pc0ZpbmlzaCgpIHx8IHMuaXNYbWxucygpKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgdGV4dCB2YWx1ZSwgY3VycmVudCB0b2tlbiBjYW4gaGF2ZSBubyB0ZXh0IHZhbHVlIiApOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAKLS8vICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkuZ2V0VGV4dCggZ2V0Um9vdCgpICk7Ci0vLyAgICAgICAgfQotCi0gICAgICAgIC8vIEhhY2sgaW1wbCBmb3Igbm93Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcyA9IGdldFRleHRWYWx1ZSgpOwotCi0gICAgICAgIGludCBuID0gcy5sZW5ndGgoKTsKLQotICAgICAgICBpZiAobiA+IGNjaCkKLSAgICAgICAgICAgIG4gPSBjY2g7Ci0KLSAgICAgICAgaWYgKG4gPD0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHMuZ2V0Q2hhcnMoIDAsIG4sIGJ1Ziwgb2ZmICk7Ci0KLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRleHRWYWx1ZSAoIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgaWYgKHAgPiAwIHx8IHMuaXNYbWxucygpIHx8IHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHRleHQgdmFsdWUsIGN1cnJlbnQgdG9rZW4gY2FuIGhhdmUgbm8gdGV4dCB2YWx1ZSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAKLSAgICAgICAgICAgIHMuc2V0VGV4dCggZ2V0Um9vdCgpLCB0ZXh0LCAwLCB0ZXh0ID09IG51bGwgPyAwIDogdGV4dC5sZW5ndGgoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dFZhbHVlICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbiApCi0gICAgewotICAgICAgICBzZXRUZXh0VmFsdWUoIFN0cmluZy5jb3B5VmFsdWVPZiggYnVmLCBvZmYsIGxlbiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnMgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnQgY2NoID0gLTE7Ci0gICAgCi0gICAgICAgICAgICBpbnQgcG9zdENjaCA9IGdldFBvc3RDY2goKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IHBvc3RDY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gcG9zdENjaDsKLSAgICAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3BsYXkoKS5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBnZXRQb3MoKSApLCBjY2ggKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcnMgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGludCBwb3N0Q2NoID0gZ2V0UG9zdENjaCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gcG9zdENjaCkKLSAgICAgICAgICAgICAgICBjY2ggPSBwb3N0Q2NoOwotICAgIAotICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsIHx8IG9mZiA+PSBidWYubGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGggLSBvZmYgPCBjY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gYnVmLmxlbmd0aCAtIG9mZjsKLSAgICAKLSAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICBidWYsIG9mZiwgZ2V0U3BsYXkoKS5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBnZXRQb3MoKSApLCBjY2ggKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29rbWFyayAoIFhtbEJvb2ttYXJrIGFubm90YXRpb24gKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBjbGVhckJvb2ttYXJrKCBhbm5vdGF0aW9uLmdldEtleSgpICk7Ci0gICAgCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSBuZXcgQW5ub3RhdGlvbiggZ2V0Um9vdCgpLCBhbm5vdGF0aW9uICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYS5fa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkFubm90YXRpb24ga2V5IGlzIG51bGwiICk7Ci0gICAgCi0gICAgICAgICAgICBhLnNldCggX2RhdGEuX2dvb2JlciApOwotICAgICAgICAgICAgYW5ub3RhdGlvbi5fY3VycmVudE1hcmsgPSBhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIGdldEJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gU3BsYXkuQU5OT1RBVElPTiAmJiBnLmdldFBvcygpID09IHApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZzsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgWG1sQm9va21hcmsgeGEgPSBhLmdldFhtbEJvb2ttYXJrKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh4YSAhPSBudWxsICYmIGEuX2tleS5lcXVhbHMoIGtleSApKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJCb29rbWFyayAoIE9iamVjdCBrZXkgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgZm9yICggR29vYmVyIGcgPSBzLmZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gcy5uZXh0R29vYmVyKCBnICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChnLmdldEtpbmQoKSA9PSBTcGxheS5BTk5PVEFUSU9OICYmIGcuZ2V0UG9zKCkgPT0gcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYSA9IChBbm5vdGF0aW9uKSBnOwotICAgIAotICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayB4YSA9IGEuZ2V0WG1sQm9va21hcmsoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhhICE9IG51bGwgJiYgYS5fa2V5LmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBudWxsLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRBbGxCb29rbWFya1JlZnMgKCBDb2xsZWN0aW9uIGxpc3RUb0ZpbGwgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGxpc3RUb0ZpbGwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gU3BsYXkuQU5OT1RBVElPTiAmJiBnLmdldFBvcygpID09IHApCi0gICAgICAgICAgICAgICAgICAgIGxpc3RUb0ZpbGwuYWRkKCAoKEFubm90YXRpb24pIGcpLmdldFhtbEJvb2ttYXJrKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCAhZ2V0U3BsYXkoKS5pc1Jvb3QoKSB8fCBnZXRQb3MoKSA9PSAwOwotICAgICAgICAgICAgcmV0dXJuICFnZXRTcGxheSgpLmlzUm9vdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJldlRva2VuICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotCi0gICAgICAgICAgICByZXR1cm4gIWdldFNwbGF5KCkuaXNEb2MoKSB8fCBnZXRQb3MoKSA+IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgY2FzZSBTcGxheS5BVFRSIDoKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuUFJPQ0lOU1QgOgotICAgICAgICAgICAgICAgIHJldHVybiBzLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiTmFtZSBpcyBudWxsIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhKHMuaXNCZWdpbigpIHx8IHMuaXNBdHRyKCkgfHwgcy5pc1Byb2NpbnN0KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IG5hbWUgaGVyZTogIiArIGN1cnJlbnRUb2tlblR5cGUoKSApOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHMuaXNQcm9jaW5zdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlUHJlZml4KCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2NpbnN0IG5hbWUgbXVzdCBoYXZlIG5vIFVSSSIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUHJlZml4KCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAKLSAgICAgICAgICAgIHMuc2V0TmFtZSggZ2V0Um9vdCgpLCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCB0b05leHRDaGFyICggaW50IGNjaCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGludCBtYXhDY2ggPSBnZXRQb3N0Q2NoKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAobWF4Q2NoID09IDAgfHwgY2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBtYXhDY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gbWF4Q2NoOwotICAgIAotICAgICAgICAgICAgYXNzZXJ0IHAgKyBjY2ggPD0gcy5nZXRFbmRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwICsgY2NoID09IHMuZ2V0RW5kUG9zKCkpCi0gICAgICAgICAgICAgICAgdG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXQoIHAgKyBjY2ggKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHRvUHJldkNoYXIgKCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgc1RleHQgPSBzOyAgLy8gVGhlIHNwbGF5IGFuZCBwb3Mgd2hlcmUgdGhlIHRleHQgZXhpc3RzCi0gICAgICAgICAgICBpbnQgICBwVGV4dCA9IHA7Ci0gICAgICAgICAgICBpbnQgICBtYXhDY2ggPSAwOyAvLyBNYXggY2hhcnMgdG8gbW92ZSBvdmVyCi0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcy5pc0RvYygpICYmICFzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc1RleHQgPSBzLnByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcFRleHQgPSBzVGV4dC5nZXRFbmRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgbWF4Q2NoID0gc1RleHQuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzTGVhZigpICYmIHAgPD0gcy5nZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGRDY2ggPSBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgICAgICAgICAgICAgIHAgKz0gZENjaDsKLSAgICAgICAgICAgICAgICBwVGV4dCA9IHA7Ci0gICAgICAgICAgICAgICAgbWF4Q2NoID0gcCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWF4Q2NoID0gcCAtIHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBwVGV4dCA8PSBzVGV4dC5nZXRFbmRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChtYXhDY2ggPT0gMCB8fCBjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IG1heENjaCkKLSAgICAgICAgICAgICAgICBjY2ggPSBtYXhDY2g7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHNUZXh0LCBwVGV4dCAtIGNjaCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIGNjaDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRvRW5kRG9jICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgc2V0KCBnZXRSb290KCksIDAgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRvU3RhcnREb2MgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIGdldFJvb3QoKS5fZG9jLCAwICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVG9rZW5UeXBlIHRvRmlyc3RDb250ZW50VG9rZW4gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7Ci0gICAgCi0gICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoKCkgPiAwIHx8IHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgc2V0KCAxICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0KCBzLm5leHROb25BdHRyU3BsYXkoKSwgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUb2tlblR5cGUgdG9FbmRUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgIGlmIChzLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHNldCggcy5nZXRQb3NMZWFmRW5kKCkgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXQoIHMuZ2V0RmluaXNoU3BsYXkoKSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvUGFyZW50ICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwICYmIHMuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHMuZ2V0Q29udGFpbmVyKCBwICksIDAgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpLm5leHRTcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTGVhZigpICYmIHAgPD0gcy5nZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGZvciAoIDsgIXMuaXNCZWdpbigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHNldCggcywgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b05leHRTaWJsaW5nICggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvTmV4dFNpYmxpbmcoIG5ldyBRTmFtZSggbmFtZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b05leHRTaWJsaW5nKCBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgbmFtZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZ2luYWwgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcE9yaWdpbmFsID0gZ2V0UG9zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0b05leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChnZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzZXQoIHNPcmlnaW5hbCwgcE9yaWdpbmFsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiB0b1ByZXZTaWJsaW5nICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkgfHwgcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgIHMgPSBzLnByZXZTcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMDsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIDw9IHMuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCggMCApOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHNldCggcywgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNwbGF5IGdldFN0YXJ0ICggKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpIHx8IGdldFBvcygpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2goKTsKLQotICAgICAgICAgICAgaWYgKHRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzID0gbnVsbDsKLQotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0ZpcnN0Q2hpbGQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gdG9DaGlsZCggKFFOYW1lKSBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZCAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b0NoaWxkKCBuZXcgUU5hbWUoIG5hbWUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGQgKCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gdG9DaGlsZCggbmV3IFFOYW1lKCBuYW1lc3BhY2UsIG5hbWUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGQgKCBRTmFtZSBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRSb290KCkuZmluZE50aEJlZ2luKCBnZXRTdGFydCgpLCBuYW1lLCBudWxsLCAwICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIHNldCggcywgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggaW50IG4gKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvQ2hpbGQoIG51bGwsIG4gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggUU5hbWUgbmFtZSwgaW50IG4gKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4oIGdldFN0YXJ0KCksIG5hbWUsIG51bGwsIG4gKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgc2V0KCBzLCAwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvTGFzdENoaWxkICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXNPcmlnaW5hbC5pc0NvbnRhaW5lcigpIHx8IHBPcmlnaW5hbCAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghdG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAoIXRvRW5kVG9rZW4oKS5pc05vbmUoKSAmJiB0b1ByZXZTaWJsaW5nKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHNPcmlnaW5hbCwgcE9yaWdpbmFsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvRmlyc3RBdHRyaWJ1dGUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZ2luYWwgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcE9yaWdpbmFsID0gZ2V0UG9zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc09yaWdpbmFsLmlzQ29udGFpbmVyKCkgfHwgcE9yaWdpbmFsICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IHNPcmlnaW5hbC5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9MYXN0QXR0cmlidXRlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXNPcmlnaW5hbC5pc0NvbnRhaW5lcigpIHx8IHBPcmlnaW5hbCAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IGxhc3ROb3JtYWxBdHRyID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBzT3JpZ2luYWwubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgICAgICBsYXN0Tm9ybWFsQXR0ciA9IHM7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAobGFzdE5vcm1hbEF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoIGxhc3ROb3JtYWxBdHRyLCAwICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHNPcmlnaW5hbCwgcE9yaWdpbmFsICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b05leHRBdHRyaWJ1dGUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9QcmV2QXR0cmlidXRlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgZm9yICggcyA9IHMucHJldlNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMucHJldlNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVGV4dCAoIFFOYW1lIGF0dHJOYW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJBdHRyIG5hbWUgaXMgbnVsbCIgKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKS5nZXRBdHRyKCBhdHRyTmFtZSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHMgPT0gbnVsbCA/IG51bGwgOiBzLmdldFRleHQoIGdldFJvb3QoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0QXR0cmlidXRlVGV4dCAoIFFOYW1lIGF0dHJOYW1lLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkF0dHIgbmFtZSBpcyBudWxsIiApOwotICAgIAotICAgICAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIGF0dHJOYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgIAotICAgICAgICAgICAgcyA9IGdldFNwbGF5KCkuZ2V0QXR0ciggYXR0ck5hbWUgKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBuZXdDdXJzb3IoKTsKLSAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IGF0dHIgYXQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggYy5pc0FueUF0dHIoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYy5pbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIGF0dHJOYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcy5zZXRUZXh0KCBnZXRSb290KCksIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUgKCBRTmFtZSBhdHRyTmFtZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQXR0ciBuYW1lIGlzIG51bGwiICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpLmdldEF0dHIoIGF0dHJOYW1lICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcy5yZW1vdmUoIGdldFJvb3QoKSwgdHJ1ZSApOwotICAgIAotICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlbW92ZUNoYXJzICggaW50IGNjaCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnQgcG9zdENjaCA9IGdldFBvc3RDY2goKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwb3N0Q2NoID09IDAgfHwgY2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBwb3N0Q2NoKQotICAgICAgICAgICAgICAgIGNjaCA9IHBvc3RDY2g7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5yZW1vdmVDaGFycyggZ2V0Um9vdCgpLCBnZXRQb3MoKSwgY2NoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBtb3ZlQ2hhcnMgKCBpbnQgY2NoLCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGlmIChkc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJEZXN0aW5hdGlvbiBpcyBudWxsIiApOwotICAgICAgICAgICAgCi0gICAgICAgIGlmIChtb25pdG9yKCkgPT0gZHN0Lm1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW92ZUNoYXJzSW1wbCggY2NoLCBkc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3ZlQ2hhcnNJbXBsKCBjY2gsIGRzdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgbW92ZUNoYXJzSW1wbCAoIGludCBjY2gsIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotCi0gICAgICAgIGlmIChkc3QgPT0gbnVsbCB8fCAhKGRzdCBpbnN0YW5jZW9mIEN1cnNvcikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCBkZXN0aW5hdGlvbiBjdXJzb3IiICk7Ci0KLSAgICAgICAgQ3Vyc29yIGNEc3QgPSAoQ3Vyc29yKSBkc3Q7Ci0KLSAgICAgICAgY2hlY2tEaXNwb3NlZCggY0RzdCApOwotCi0gICAgICAgIFJvb3QgIHJEc3QgPSBjRHN0LmdldFJvb3QoKTsKLSAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7Ci0KLSAgICAgICAgaWYgKHBEc3QgPT0gMCAmJiAoc0RzdC5pc0RvYygpIHx8IHNEc3QuaXNBdHRyKCkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgZGVzdGluYXRpb24iICk7Ci0KLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBnZXRTcGxheSgpLm1vdmVDaGFycygKLSAgICAgICAgICAgICAgICBnZXRSb290KCksIGdldFBvcygpLCBjY2gsIHJEc3QsIHNEc3QsIHBEc3QsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb3B5Q2hhcnMgKCBpbnQgY2NoLCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGlmIChkc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJEZXN0aW5hdGlvbiBpcyBudWxsIiApOwotICAgICAgICAKLSAgICAgICAgaWYgKGRzdC5tb25pdG9yKCkgPT0gbW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb3B5Q2hhcnNJbXBsKCBjY2gsIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlDaGFyc0ltcGwoIGNjaCwgZHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjb3B5Q2hhcnNJbXBsICggaW50IGNjaCwgWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0KLSAgICAgICAgaWYgKGRzdCA9PSBudWxsIHx8ICEoZHN0IGluc3RhbmNlb2YgQ3Vyc29yKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIGN1cnNvciIgKTsKLQotICAgICAgICBDdXJzb3IgY0RzdCA9IChDdXJzb3IpIGRzdDsKLQotICAgICAgICBjaGVja0Rpc3Bvc2VkKCBjRHN0ICk7Ci0KLSAgICAgICAgUm9vdCAgckRzdCA9IGNEc3QuZ2V0Um9vdCgpOwotICAgICAgICBTcGxheSBzRHN0ID0gY0RzdC5nZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwRHN0ID0gY0RzdC5nZXRQb3MoKTsKLQotICAgICAgICBpZiAocERzdCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0RzdC5pc0RvYygpIHx8IHNEc3QuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgZGVzdGluYXRpb24iICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNEc3QgPSBzRHN0LnByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgIHBEc3QgPSBzRHN0LmdldEVuZFBvcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBnZXRTcGxheSgpLmNvcHlDaGFycyggZ2V0Um9vdCgpLCBnZXRQb3MoKSwgY2NoLCByRHN0LCBzRHN0LCBwRHN0ICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBuYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJOb3Qgb24gYSBjb250YWluZXIiICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gcy5uYW1lc3BhY2VGb3JQcmVmaXgoIHByZWZpeCwgdHJ1ZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmVmaXhGb3JOYW1lc3BhY2UgKCBTdHJpbmcgbnMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKG5zID09IG51bGwgfHwgbnMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiTXVzdCBzcGVjaWZ5IGEgbmFtZXNwYWNlIiApOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8ICFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIk5vdCBvbiBhIGNvbnRhaW5lciIgKTsKLSAgICAKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnByZWZpeEZvck5hbWVzcGFjZSggZ2V0Um9vdCgpLCBucywgbnVsbCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldEFsbE5hbWVzcGFjZXMgKCBNYXAgYWRkVG9UaGlzICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJOb3Qgb24gYSBjb250YWluZXIiICk7Ci0gICAgCi0gICAgICAgICAgICAvLyBEbyB0aGlzIHdpdGggY3Vyc29yIGZvciBub3cuLi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBuZXdDdXJzb3IoKTsKLSAgICAKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNDb250YWluZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBRTmFtZSBjTmFtZSA9IGMuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICggIWMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSAmJiBjLmlzQW55QXR0cigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjLmlzTmFtZXNwYWNlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgICAgPSBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgSSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwcGluZyB3aGljaCBpcyBub3QgZW1wdHkgb24gYSBub24gcm9vdCBjb250YWluZXIgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGluIGEgbmFtZXNwYWNlLiAgVGhpcyB0aGlzIGNhc2UsIEkgZG8gbm90IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1hcHBpbmcgYmVjYXVzZSBpdCBjb3VsZCBub3QgYmUgcGVyc2lzdGVkIG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCAmJiB1cmkubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNOYW1lICE9IG51bGwgJiYgY05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkVG9UaGlzLmNvbnRhaW5zS2V5KCBwcmVmaXggKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb1RoaXMucHV0KCBwcmVmaXgsIHVyaSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGMudG9QYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICggYy50b1BhcmVudCgpICk7Ci0gICAgCi0gICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zOgotICAgICAqCi0gICAgICogICAtMSBpcyB0aGlzIGlzIGxlZnQgb2YgdGhhdAotICAgICAqICAgIDAgaXMgdGhpcyBpcyBsZWZ0IGlzIGF0IHNhbWUgcG9zaXRpb24gYXMgdGhhdAotICAgICAqICAgIDEgaXMgdGhpcyBpcyByaWdodCBvZiB0aGF0Ci0gICAgICovCi0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVQb3NpdGlvbiAoIFhtbEN1cnNvciB4dGhhdCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4dGhhdCA9PSBudWxsIHx8ICEoeHRoYXQgaW5zdGFuY2VvZiBDdXJzb3IpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIHRoYXQgY3Vyc29yIiApOwotICAgIAotICAgICAgICAgICAgQ3Vyc29yIHRoYXQgPSAoQ3Vyc29yKSB4dGhhdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgIAotICAgICAgICAgICAgaWYgKHIgIT0gdGhhdC5nZXRSb290KCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkN1cnNvcnMgbm90IGluIHNhbWUgZG9jdW1lbnQiICk7Ci0gICAgCi0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCB0aGF0ICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBnZXRTcGxheSgpLmNvbXBhcmUoIHIsIGdldFBvcygpLCB0aGF0LmdldFNwbGF5KCksIHRoYXQuZ2V0UG9zKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xlZnRPZiAoIFhtbEN1cnNvciB0aGF0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlUG9zaXRpb24oIHRoYXQgKSA8IDA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQXRTYW1lUG9zaXRpb25BcyAoIFhtbEN1cnNvciB0aGF0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlUG9zaXRpb24oIHRoYXQgKSA9PSAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JpZ2h0T2YgKCBYbWxDdXJzb3IgdGhhdCApCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9uKCB0aGF0ICkgPiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIG5ldyBTYXZlci5JbnB1dFN0cmVhbVNhdmVyKAotICAgICAgICAgICAgICAgICAgICBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld0lucHV0U3RyZWFtKCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIgKCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3UmVhZGVyKCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyICggWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlci5UZXh0UmVhZGVyKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtICggWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgbmV3IFhtbElucHV0U3RyZWFtSW1wbCggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdYTUxJbnB1dFN0cmVhbSggbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIF90b1N0cmluZ09wdGlvbnMgPQotICAgICAgICBidWlsZFByZXR0eU9wdGlvbnMoKTsKLQotICAgIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIGJ1aWxkUHJldHR5T3B0aW9ucyAoICkKLSAgICB7Ci0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfQUdHUkVTU0lWRV9OQU1FU1BBQ0VTICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICk7Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhtbFRleHQoIF90b1N0cmluZ09wdGlvbnMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB4bWxUZXh0ICggICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB4bWxUZXh0KCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dCAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBTYXZlci5UZXh0U2F2ZXIgc2F2ZXI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2F2ZXIgPSBuZXcgU2F2ZXIuVGV4dFNhdmVyKAotICAgICAgICAgICAgICAgICAgICBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNhdmVyLnNhdmVUb1N0cmluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDaGFuZ2VTdGFtcEltcGwgaW1wbGVtZW50cyBDaGFuZ2VTdGFtcAotICAgIHsKLSAgICAgICAgQ2hhbmdlU3RhbXBJbXBsICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgX3ZlcnNpb25TdGFtcCA9IF9yb290LmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdmVyc2lvblN0YW1wICE9IF9yb290LmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUm9vdCBfcm9vdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIF92ZXJzaW9uU3RhbXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDaGFuZ2VTdGFtcCBnZXREb2NDaGFuZ2VTdGFtcCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbmV3IENoYW5nZVN0YW1wSW1wbCggZ2V0Um9vdCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlWG1sICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBwIDwgcy5nZXRFbmRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSAmJiBwID09IHMuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgaW50IGNjaFJlbW92ZSA9IHJlbW92ZUNoYXJzKCBnZXRQb3N0Q2NoKCkgKTsKLSAgICAKLSAgICAgICAgICAgICAgICBhc3NlcnQgY2NoUmVtb3ZlID4gMDsKLSAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNEb2MoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHJlbW92ZSBhIHdob2xlIGRvY3VtZW50LiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBzLnJlbW92ZSggZ2V0Um9vdCgpLCB0cnVlICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlWG1sICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW92ZVhtbEltcGwoIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxJbXBsICggZHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbW92ZVhtbEltcGwgICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZHN0ID09IG51bGwgfHwgIShkc3QgaW5zdGFuY2VvZiBDdXJzb3IpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW4ndCBtb3ZlIHRvIGEgZm9yZWlnbiBkb2N1bWVudCIgKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIEN1cnNvciBjRHN0ID0gKEN1cnNvcikgZHN0OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY2hlY2tEaXNwb3NlZCggY0RzdCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUm9vdCAgckRzdCA9IGNEc3QuZ2V0Um9vdCgpOwotICAgICAgICBTcGxheSBzRHN0ID0gY0RzdC5nZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwRHN0ID0gY0RzdC5nZXRQb3MoKTsKLSAgICAgICAgICAgIAotICAgICAgICBSb290ICByU3JjID0gZ2V0Um9vdCgpOwotICAgICAgICBTcGxheSBzU3JjID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcFNyYyA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgIGlmIChzU3JjLmNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIHBTcmMsIHNEc3QsIHBEc3QsIHRydWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgc1NyYy5tb3ZlQ2hhcnMoCi0gICAgICAgICAgICAgICAgICAgIHJTcmMsIHBTcmMsIGdldFBvc3RDY2goKSwgckRzdCwgc0RzdCwgcERzdCwgZmFsc2UgKSA+IDA7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydCBwU3JjID09IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbW92ZW1lbnQgb2Ygc3R1ZmYgaW50byBpdHNlbGYhICBUaGlzIGNhc2UgaXMgYmFzaWNhbGx5Ci0gICAgICAgIC8vIGEgbm8tb3AKLSAgICAgICAgICAgIAotICAgICAgICBpZiAoclNyYyA9PSByRHN0ICYmIHNEc3QuYmV0d2VlbiggckRzdCwgcERzdCwgc1NyYyApKQotICAgICAgICB7Ci0vLyBUT0RPIC0gSSBtaWdodCBoYXZlIHRvIG9ycGhhbiB0eXBlcyBpbiB0aGUgcmFuZ2UgaGVyZSAuLi4uCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBhc3NlcnQgcFNyYyA9PSAwOwotICAgICAgICAgICAgCi0gICAgICAgIHNTcmMubW92ZSggclNyYywgY0RzdC5nZXRSb290KCksIGNEc3QuZ2V0U3BsYXkoKSwgY0RzdC5nZXRQb3MoKSwgdHJ1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjb3B5WG1sICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29weVhtbEltcGwoIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb3B5WG1sSW1wbCAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsIHx8ICEoZHN0IGluc3RhbmNlb2YgQ3Vyc29yKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQ2FuJ3QgY29weSB0byBhIGZvcmVpZ24gZG9jdW1lbnQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBDdXJzb3IgY0RzdCA9IChDdXJzb3IpIGRzdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNoZWNrRGlzcG9zZWQoIGNEc3QgKTsKLSAgICAgICAgICAgIAotICAgICAgICBTcGxheSBzRHN0ID0gY0RzdC5nZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwRHN0ID0gY0RzdC5nZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHMuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggcCwgc0RzdCwgcERzdCwgdHJ1ZSApKQotICAgICAgICAgICAgcmV0dXJuIGNvcHlDaGFyc0ltcGwoIGdldFBvc3RDY2goKSwgZHN0ICkgPiAwOwotICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydCBwID09IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgc3BsYXkgY29weSBiZWZvcmUgZ2V0dGluZyB0aGUgdGV4dCBiZWNhdXNlIHRoZSBjb3B5Ci0gICAgICAgIC8vIHdpbGwgdmFsaWRhdGUgaW52YWxpZCBjb250ZW50cy92YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgUm9vdCByRHN0ID0gY0RzdC5nZXRSb290KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTcGxheSBjb3B5ID0gcy5jb3B5U3BsYXkoKTsKLQotICAgICAgICBPYmplY3QgdHh0ID0gci5fdGV4dDsKLSAgICAgICAgaW50IGNwID0gci5nZXRDcCggcyApOwotICAgICAgICBpbnQgY2NoID0gY29weS5nZXRDY2hMZWZ0KCkgKyBjb3B5LmdldENjaCgpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFJlbW92ZSB0ZXh0IGFmdGVyIHdoaWNoIG1pZ2h0IGJlIGJldHdlZW4gbGVhZiB2YWx1ZSBhbmQgZmlyc3QgYXR0ciB2YWx1ZQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgaWYgKHMuaXNMZWFmKCkgJiYgcy5nZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gcy5nZXRDY2hWYWx1ZSgpOwotICAgICAgICAgICAgaW50IGNjaEFmdGVyID0gcy5nZXRDY2hBZnRlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2NoVmFsdWUgPT0gMCkKLSAgICAgICAgICAgICAgICBjcCArPSBjY2hBZnRlcjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMubmV4dFNwbGF5KCkuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyIFsgY2NoIF07Ci0gICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggYnVmLCAwLCBjcCwgY2NoVmFsdWUgKTsKLSAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKCBidWYsIGNjaFZhbHVlLCBjcCArIGNjaFZhbHVlICsgY2NoQWZ0ZXIsIGNjaCAtIGNjaFZhbHVlICk7Ci0KLSAgICAgICAgICAgICAgICB0eHQgPSBidWY7Ci0gICAgICAgICAgICAgICAgY3AgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgc0RzdC5pbnNlcnQoIHJEc3QsIHBEc3QsIGNvcHksIHR4dCwgY3AsIGNjaCwgdHJ1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVYbWxDb250ZW50cyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBpbXBsZW1lbnQgdGhpcyB3aXRoIGludGVybmFscwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gdG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICAgICAgYXNzZXJ0ICF0dC5pc05vbmUoKTsKLSAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9ICFpc0ZpbmlzaCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoICFpc0ZpbmlzaCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHJlbW92ZVhtbCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9QYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiByZW1vdmVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoaXNJblNhbWVEb2N1bWVudCggZHN0ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzdC5wdXNoKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzdC5pc0F0U2FtZVBvc2l0aW9uQXMoIHRoaXMgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRzdC5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFkc3QudG9QYXJlbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRzdC5wb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gbW92ZVhtbENvbnRlbnRzICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW92ZVhtbENvbnRlbnRzSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZHN0Lm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW92ZVhtbENvbnRlbnRzSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbW92ZVhtbENvbnRlbnRzSW1wbCAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCFpc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBkc3QgaXMgaW4gc3JjISAgSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBub3RoaW5nIHRvCi0gICAgICAgIC8vIGRvLgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRhaW5zKCBkc3QgKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICBUb2tlblR5cGUgdHQgPSB0b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIG1vdmVkID0gIWlzRmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFtb3ZlWG1sSW1wbCggZHN0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoICFpc0ZpbmlzaCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBtb3ZlWG1sSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0b1BhcmVudCgpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1vdmVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvcHlYbWxDb250ZW50cyAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxDb250ZW50c0ltcGwoIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxDb250ZW50c0ltcGwoIGRzdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvcHlYbWxDb250ZW50c0ltcGwgKCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZHN0IGlzIGluIHNyYyEgIEluIHRoaXMgY2FzZSwgY29weSB0aGUgc3JjIHRvIGEgbmV3Ci0gICAgICAgIC8vIGRvY3VtZW50IGFuZCB0aGVuIG1vdmUgdGhlIGNvcGllZCBjb250ZW50cyB0byB0aGUgZGVzdGluYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRhaW5zKCBkc3QgKSkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQ3Vyc29yIGNUbXAgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjVG1wLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghY29weVhtbENvbnRlbnRzSW1wbCggY1RtcCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNUbXAuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY1RtcC50b1N0YXJ0RG9jKCk7Ci0gICAgICAgICAgICAoKEN1cnNvciljVG1wKS5tb3ZlWG1sQ29udGVudHNJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgIGNUbXAuZGlzcG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBUb2tlblR5cGUgdHQgPSB0b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIGNvcGllZCA9ICFpc0ZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY29weVhtbEltcGwoIGRzdCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNTdGFydCgpKQotICAgICAgICAgICAgICAgICAgICB0b0VuZFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaXNGaW5pc2goKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBjb3B5WG1sSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0b1BhcmVudCgpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvcGllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luU2FtZURvY3VtZW50ICggWG1sQ3Vyc29yIHh0aGF0ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICh4dGhhdCA9PSBudWxsIHx8ICEoeHRoYXQgaW5zdGFuY2VvZiBDdXJzb3IpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIEN1cnNvciB0aGF0ID0gKEN1cnNvcikgeHRoYXQ7Ci0gICAgCi0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCB0aGF0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkgPT0gdGhhdC5nZXRSb290KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXNoICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3N0YWNrID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2RhdGEuX3N0YWNrID0gbmV3IFNlbGVjdGlvbnMoKTsKLSAgICAKLSAgICAgICAgICAgIF9kYXRhLl9zdGFjay5hZGQoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCkgKTsKLSAgICAKLSAgICAgICAgICAgIGdldFJvb3QoKS5yZWdpc3RlckZvckNoYW5nZSggdGhpcyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcG9wICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3N0YWNrID09IG51bGwgfHwgX2RhdGEuX3N0YWNrLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIF9kYXRhLl9zdGFjay5zZXRDdXJzb3IoIHRoaXMsIF9kYXRhLl9zdGFjay5zaXplKCkgLSAxICk7Ci0gICAgCi0gICAgICAgICAgICBfZGF0YS5fc3RhY2sucG9wKCk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvbkNvdW50ICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gX2RhdGEuX3NlbGVjdGlvbnMgPT0gbnVsbCA/IDAgOiBfZGF0YS5fc2VsZWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdG9TZWxlY3Rpb24gKCBpbnQgaSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMgIT0gbnVsbCAmJiBpID49IDAgJiYgX2RhdGEuX3NlbGVjdGlvbnMuc2V0Q3Vyc29yKCB0aGlzLCBpICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gPSBpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRTZWxlY3Rpb24gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoKCk7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFNlbGVjdGlvbiA9IF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uOwotICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvTmV4dFNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcCgpOwotICAgICAgICAgICAgICAgIF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiB0b05leHRTZWxlY3Rpb24gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMgPT0gbnVsbCB8fCBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA8IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGludCBuZXh0U2VsZWN0aW9uID0gX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gKyAxOwotICAgIAotICAgICAgICAgICAgaWYgKCFfZGF0YS5fc2VsZWN0aW9ucy5zZXRDdXJzb3IoIHRoaXMsIG5leHRTZWxlY3Rpb24gKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA9IC0yOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uID0gbmV4dFNlbGVjdGlvbjsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJTZWxlY3Rpb25zICggICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIF9kYXRhLmNsZWFyU2VsZWN0aW9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9TZWxlY3Rpb24gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfZGF0YS5fc2VsZWN0aW9ucyA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9kYXRhLl9zZWxlY3Rpb25zID0gUGF0aC5uZXdTZWxlY3Rpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICAvLyBGb3JjZSBhbnkgc2VsZWN0aW9uIGVuZ2luZSB0byBzZWFyY2ggYWxsLi4uCi0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5zaXplKCk7Ci0gICAgCi0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5hZGQoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCkgKTsKLSAgICAKLSAgICAgICAgICAgIGdldFJvb3QoKS5yZWdpc3RlckZvckNoYW5nZSggdGhpcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNoYW5nZU5vdGlmaWNhdGlvbiAoICkKLSAgICB7Ci0gICAgICAgIGlmICghaXNEaXNwb3NlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5zaXplKCk7ICAvLyBGb3JjZSBhIGZ1bGwgc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMuY3Vyc2lmeSggZ2V0Um9vdCgpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChfZGF0YS5fc3RhY2sgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfZGF0YS5fc3RhY2suY3Vyc2lmeSggZ2V0Um9vdCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKF9kYXRhLl9zZWxlY3Rpb25zID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMgPSBQYXRoLm5ld1NlbGVjdGlvbnMoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5kaXNwb3NlKCk7Ci0gICAgCi0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5pbml0KCAKLSAgICAgICAgICAgICAgICBQYXRoLnNlbGVjdCggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgcGF0aCwgb3B0aW9ucyApICk7Ci0gICAgCi0gICAgICAgICAgICBwdXNoKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMuc2V0Q3Vyc29yKCB0aGlzLCAwICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Um9vdCgpLnJlZ2lzdGVyRm9yQ2hhbmdlKCB0aGlzICk7Ci0gICAgICAgICAgICAgICAgX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA9IC0yOwotICAgIAotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoICkKLSAgICB7Ci0gICAgICAgIHNlbGVjdFBhdGgoIHBhdGgsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEN1cnNvciBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIFBhdGgucXVlcnkoIHRoaXMsIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYbWxDdXJzb3IgZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleGVjUXVlcnkoIHF1ZXJ5LCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdEb21Ob2RlKCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUgKCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFNhdmVyLkRvbVNhdmVyIHNhdmVyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzYXZlciA9IG5ldyBTYXZlci5Eb21TYXZlcigKLSAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgIWlzRnJhZ21lbnQoKSwgb3B0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gc2F2ZXIuZXhwb3J0RG9tKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoKQotICAgIHsKLSAgICAgICAgaWYgKCEgaXNTdGFydGRvYygpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgYm9vbGVhbiBzZWVuRWxlbWVudCA9IGZhbHNlOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0gbmV3Q3Vyc29yKCk7Ci0gICAgICAgIGludCB0b2tlbiA9IGMudG9OZXh0VG9rZW4oKS5pbnRWYWx1ZSgpOwotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIExPT1A6Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTV0lUQ0g6Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9TVEFSVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGMudG9FbmRUb2tlbigpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX1RFWFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBTcGxheS5pc1doaXRlU3BhY2UoYy5nZXRDaGFycygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gYy50b05leHRUb2tlbigpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX0VORERPQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIExPT1A7Ci0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfQVRUUjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9FTkQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9DT01NRU5UOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfUFJPQ0lOU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGMudG9OZXh0VG9rZW4oKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9TVEFSVERPQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIExPT1A7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gISBzZWVuRWxlbWVudDsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGggKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzYXZlKCBjaCwgbGgsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F2ZSggZmlsZSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzYXZlKCBvcywgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBXcml0ZXIgdyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F2ZSggdywgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gdG9kbzogZG9uJ3QgaG9sZCB0aGUgbW9uaXRvciBhbGwgdGhpcyBsb25nLgotICAgICAgICAvLyBJZGVhbGx5LCB3ZSdkIHJlbGVhc2UgdGhlIG1vbml0b3IgZWFjaCB0aW1lIHdlJ3JlIGFib3V0IHRvIGNhbGwgdGhlCi0gICAgICAgIC8vIGNoIG9yIGxoIG9iamVjdHMuICBIb3dldmVyLCB0aGUgc2F2ZXIgY29kZSBpc24ndCBfcXVpdGVfIHN0cnVjdHVyZQotICAgICAgICAvLyBqdXN0IHJpZ2h0IHRvIGRvIHRoYXQuICBTbyBpbnN0ZWFkLCB0aGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgaG9sZAotICAgICAgICAvLyB0aGUgbW9uaXRvciBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlbnRpcmUgU0FYIHNhdmUuCi0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbmV3IFNhdmVyLlNheFNhdmVyKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zLCBjaCwgbGggKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlICggRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmaWxlICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmUoIG9zLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBvcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBPdXRwdXRTdHJlYW0gb3MsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvIG5vdCBob2xkIHRoZSBtb25pdG9yIGZvciB0aGUgZHVyYXRpb24gb2YgYSBzYXZlLgotICAgICAgICAvLyBJbnN0ZWFkLCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlCi0gICAgICAgIC8vIGRvY3VtZW50IGlzIG1vZGlmaWVkIHdoaWxlIHRoZSBzYXZlIGlzIGluIHByb2dyZXNzLiBJZiB0aGUgdXNlcgotICAgICAgICAvLyB3aXNoZXMgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoaXMsIGhlIGNhbiBzeW5jaHJvbml6ZSBvbiB0aGUgbW9uaXRvcgotICAgICAgICAvLyBoaW1zZWxmLgotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ld0lucHV0U3RyZWFtKCBvcHRpb25zICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWyA4MTkyIF07Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSBpcy5yZWFkKCBieXRlcyApOwotCi0gICAgICAgICAgICAgICAgaWYgKG4gPCAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIG9zLndyaXRlKCBieXRlcywgMCwgbiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlICggV3JpdGVyIHcsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVhZGVyIHIgPSBuZXdSZWFkZXIoIG9wdGlvbnMgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbIDgxOTIgXTsKLQotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbiA9IHIucmVhZCggY2hhcnMgKTsKLQotICAgICAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICB3LndyaXRlKCBjaGFycywgMCwgbiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9kYXRhLl9nb29iZXIuZ2V0Um9vdCgpLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAgKCApIHsgX2RhdGEuX2dvb2Jlci5nZXRSb290KCkuZHVtcCgpOyB9Ci0gICAgcHVibGljIHZvaWQgZHVtcCAoIGJvb2xlYW4gdmVyYm9zZSApIHsgX2RhdGEuX2dvb2Jlci5nZXRSb290KCkuZHVtcCggdmVyYm9zZSApOyB9Ci0KLSAgICBpbnRlcmZhY2UgUGF0aEVuZ2luZQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBuZXh0ICggU2VsZWN0aW9ucyBzZWxlY3Rpb25zICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFNlbGVjdGlvbnMKLSAgICB7Ci0gICAgICAgIHZvaWQgaW5pdCAoIFBhdGhFbmdpbmUgcGF0aEVuZ2luZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX3BhdGhFbmdpbmUgPSBwYXRoRW5naW5lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGFkZCAoIFJvb3QgciwgU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggciwgcywgMCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGFkZCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEN1cnNvckdvb2JlciBnID0gbmV3IEN1cnNvckdvb2JlciggciApOwotCi0gICAgICAgICAgICAgICAgZy5zZXQoIHMsIHAgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfY3Vyc29ycy5hZGQoIGcgKTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKF9zcGxheXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2NvdW50ID09IDA7Ci0gICAgICAgICAgICAgICAgX3NwbGF5cyA9IG5ldyBTcGxheSBbIDE2IF07Ci0gICAgICAgICAgICAgICAgX3Bvc2l0aW9ucyA9IG5ldyBpbnQgWyAxNiBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoX2NvdW50ID09IF9zcGxheXMubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5W10gbmV3U3BsYXlzID0gbmV3IFNwbGF5IFsgX2NvdW50ICogMiBdOwotICAgICAgICAgICAgICAgIGludFtdICAgbmV3UG9zaXRpb25zID0gbmV3IGludCBbIF9jb3VudCAqIDIgXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfc3BsYXlzLCAwLCBuZXdTcGxheXMsIDAsIF9jb3VudCApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9wb3NpdGlvbnMsIDAsIG5ld1Bvc2l0aW9ucywgMCwgX2NvdW50ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX3NwbGF5cyA9IG5ld1NwbGF5czsKLSAgICAgICAgICAgICAgICBfcG9zaXRpb25zID0gbmV3UG9zaXRpb25zOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfc3BsYXlzWyBfY291bnQgXSA9IHM7Ci0gICAgICAgICAgICBfcG9zaXRpb25zWyBfY291bnQgXSA9IHA7Ci0KLSAgICAgICAgICAgIF9jb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwb3AgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzaXplKCkgPiAwOwotCi0gICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IF9jdXJzb3JzLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICAgICAgKChDdXJzb3JHb29iZXIpIF9jdXJzb3JzLmdldCggaSApKS5zZXQoIG51bGwsIDAgKTsKLSAgICAgICAgICAgICAgICBfY3Vyc29ycy5yZW1vdmUoIGkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfY291bnQtLTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY3Vyc2lmeSAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsIHx8IF9jb3VudCA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgX2N1cnNvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfY291bnQgOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEN1cnNvckdvb2JlciBnID0gbmV3IEN1cnNvckdvb2JlciggciApOwotCi0gICAgICAgICAgICAgICAgZy5zZXQoIF9zcGxheXNbIGkgXSwgX3Bvc2l0aW9uc1sgaSBdICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2N1cnNvcnMuYWRkKCBnICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9jb3VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9wYXRoRW5naW5lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBfcGF0aEVuZ2luZS5uZXh0KCB0aGlzICkgKQotICAgICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgICAgICAgICBfcGF0aEVuZ2luZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGN1cnJlbnRTaXplICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnNvcnMgIT0gbnVsbCA/IF9jdXJzb3JzLnNpemUoKSA6IF9jb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc2V0Q3Vyc29yICggQ3Vyc29yIGMsIGludCBpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGkgPj0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKCBfcGF0aEVuZ2luZSAhPSBudWxsICYmIGN1cnJlbnRTaXplKCkgPD0gaSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFfcGF0aEVuZ2luZS5uZXh0KCB0aGlzICkpCi0gICAgICAgICAgICAgICAgICAgIF9wYXRoRW5naW5lID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGkgPj0gY3VycmVudFNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgX2N1cnNvcnMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGMuc2V0KCAoQ3Vyc29yR29vYmVyKSBfY3Vyc29ycy5nZXQoIGkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgX2NvdW50OwotICAgICAgICAgICAgICAgIGMuc2V0KCBfc3BsYXlzWyBpIF0sIF9wb3NpdGlvbnNbIGkgXSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZGlzcG9zZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJzb3JzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9jdXJzb3JzLnNpemUoKSA7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgICgoQ3Vyc29yR29vYmVyKSBfY3Vyc29ycy5nZXQoIGkgKSkuc2V0KCBudWxsLCAwICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2N1cnNvcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfY3Vyc29ycyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9jb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUT0RPIC0gY2FjaGUgdW51c2VkIFNlbGVjaXRvbiBvYmplY3RzIGZvciBsYXRlciByZXVzZQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTcGxheVtdIF9zcGxheXM7Ci0gICAgICAgIHByaXZhdGUgaW50W10gICBfcG9zaXRpb25zOwotICAgICAgICBwcml2YXRlIGludCAgICAgX2NvdW50OwotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IF9jdXJzb3JzOwotCi0gICAgICAgIHByaXZhdGUgUGF0aEVuZ2luZSBfcGF0aEVuZ2luZTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBDdXJzb3JEYXRhIF9kYXRhOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9DdXJzb3JEYXRhLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ZDM0MC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotICoNCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkN1cnNvckdvb2JlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi1wdWJsaWMgZmluYWwgY2xhc3MgQ3Vyc29yRGF0YQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDdXJzb3JEYXRhIGdldE9uZSAoIFJvb3QgciApDQotICAgIHsNCi0gICAgICAgIEFycmF5TGlzdCBkYXRhQ2FjaGUgPSAoQXJyYXlMaXN0KSB0bF9DYWNoZWRDdXJzb3JEYXRhLmdldCgpOw0KLQ0KLSAgICAgICAgQ3Vyc29yRGF0YSBjZDsNCi0NCi0gICAgICAgIGlmIChkYXRhQ2FjaGUuc2l6ZSgpID09IDApDQotICAgICAgICAgICAgY2QgPSBuZXcgQ3Vyc29yRGF0YSggciApOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNkID0gKEN1cnNvckRhdGEpIGRhdGFDYWNoZS5yZW1vdmUoIGRhdGFDYWNoZS5zaXplKCkgLSAxICk7DQotICAgICAgICAgICAgY2QuX2dvb2Jlci5zZXQoIHIgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGNkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ3Vyc29yRGF0YSAoIFJvb3QgciApDQotICAgIHsNCi0gICAgICAgIF9nb29iZXIgPSBuZXcgQ3Vyc29yR29vYmVyKCByICk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGxfQ2FjaGVkQ3Vyc29yRGF0YSA9DQotICAgICAgICBuZXcgVGhyZWFkTG9jYWwoKSB7IHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkgeyByZXR1cm4gbmV3IEFycmF5TGlzdCgpOyB9IH07DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlICggKQ0KLSAgICB7DQotICAgICAgICBpZiAoX2dvb2Jlci5nZXRTcGxheSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2xlYXJTZWxlY3Rpb25zKCk7DQotDQotICAgICAgICAgICAgaWYgKF9zdGFjayAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICBfc3RhY2suZGlzcG9zZSgpOw0KLQ0KLSAgICAgICAgICAgIF9nb29iZXIuc2V0KCBudWxsLCAwICk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQXJyYXlMaXN0IGRhdGFDYWNoZSA9IChBcnJheUxpc3QpIHRsX0NhY2hlZEN1cnNvckRhdGEuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKGRhdGFDYWNoZS5zaXplKCkgPCAxMjgpDQotICAgICAgICAgICAgICAgIGRhdGFDYWNoZS5hZGQoIHRoaXMgKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUgKCApDQotICAgIHsNCi0gICAgICAgIFNwbGF5IHMgPSBfZ29vYmVyLmdldFNwbGF5KCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3luY2hyb25pemVkICggX2dvb2Jlci5nZXRSb290KCkgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVsZWFzZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgIHZvaWQgY2xlYXJTZWxlY3Rpb25zICggICkNCi0gICAgew0KLSAgICAgICAgaWYgKF9zZWxlY3Rpb25zICE9IG51bGwpDQotICAgICAgICAgICAgX3NlbGVjdGlvbnMuZGlzcG9zZSgpOw0KLQ0KLSAgICAgICAgX2N1cnJlbnRTZWxlY3Rpb24gPSAtMjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGZpbmFsIEN1cnNvckdvb2JlciBfZ29vYmVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQ3Vyc29yLlNlbGVjdGlvbnMgIF9zdGFjazsNCi0NCi0gICAgcHJvdGVjdGVkIEN1cnNvci5TZWxlY3Rpb25zICBfc2VsZWN0aW9uczsNCi0gICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgICAgICBfY3VycmVudFNlbGVjdGlvbjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9Hb29iZXJzLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0dvb2JlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxNmQxZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0dvb2JlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Hb29iZXI7Ci0KLXB1YmxpYyBjbGFzcyBHb29iZXJzCi17Ci0gICAgR29vYmVyIF9nb29iZXJzOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9KYXhlblhCZWFuc0RlbGVnYXRlLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0pheGVuWEJlYW5zRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkZjU0YS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0pheGVuWEJlYW5zRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEF1dGhvcjogQ2V6YXIgQW5kcmVpIChjZXphci5hbmRyZWkgYXQgYmVhLmNvbSkKLSAqIERhdGU6IE5vdiA2LCAyMDAzCi0gKgotICogSGVscCBjbGFzcyB0byBkZWNvdXBsZSBmcm9tIHhiZWFuX3hwYXRoLmphciBhbmQgamF4ZW4uamFyICh2ZXJzaW9uIHYxLjEgYmV0YTIpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXhlblhCZWFuc0RlbGVnYXRlCi17Ci0gICAgcHJpdmF0ZSBKYXhlblhCZWFuc0RlbGVnYXRlKCkKLSAgICB7fQotCi0gICAgc3RhdGljIFNlbGVjdFBhdGhJbnRlcmZhY2UgY3JlYXRlSW5zdGFuY2UoU3RyaW5nIHhwYXRoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb25zdHJ1Y3Rvcj09bnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEpheGVuWEJlYW5zRGVsZWdhdGUuU2VsZWN0UGF0aEludGVyZmFjZSlfY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHt4cGF0aH0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIExvb3NlIGNvdXBsaW5nIGZ1bmN0aW9uYWxpdHkgd2l0aCB4cXJsLmphcgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgX2NvbnN0cnVjdG9yOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBib29sZWFuIGhhc1RoZUphcnMgPSBmYWxzZTsKLSAgICAgICAgQ2xhc3MgamF4ZW5YUGF0aEltcGwgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZnJvbSBqYXhlbi5qYXIKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoICJvcmcuamF4ZW4uQmFzZVhQYXRoIiApOwotICAgICAgICAgICAgLy8gZnJvbSB4YmVhbl94cGF0aC5qYXIKLSAgICAgICAgICAgIGpheGVuWFBhdGhJbXBsID0gQ2xhc3MuZm9yTmFtZSggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbi5YQmVhbnNYUGF0aEFkdiIgKTsKLQotICAgICAgICAgICAgaGFzVGhlSmFycyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYXNUaGVKYXJzID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBOb0NsYXNzRGVmRm91bmRFcnJvciBlICkKLSAgICAgICAgewotICAgICAgICAgICAgaGFzVGhlSmFycyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RoZUphcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb25zdHJ1Y3RvciA9Ci0gICAgICAgICAgICAgICAgICAgIGpheGVuWFBhdGhJbXBsLmdldENvbnN0cnVjdG9yKCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU2VsZWN0UGF0aEludGVyZmFjZQotICAgIHsKLSAgICAgICAgcHVibGljIExpc3Qgc2VsZWN0UGF0aChPYmplY3Qgbm9kZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9QYXRoLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1NGIxYS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWFBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLkN1cnNvci5QYXRoRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5DdXJzb3IuU2VsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBwcmVjb21waWxlZCBwYXRoIGV4cHJlc3Npb24KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGF0aAotewotICAgIHN0YXRpYyBTZWxlY3Rpb25zIG5ld1NlbGVjdGlvbnMgKCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbnMoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgUGF0aEVuZ2luZSBzZWxlY3QgKAotICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBQYXRoIHBhdGggPSBnZXRQYXRoKCBwYXRoRXhwciwgb3B0aW9ucyApOwotICAgICAgICByZXR1cm4gKHBhdGggPT0gbnVsbCkgPyBudWxsIDogcGF0aC5leGVjdXRlKCByLCBzLCBwLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3VzZVhxcmxGb3JYcGF0aCA9ICJ1c2UgeHFybCBmb3IgeHBhdGgiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3VzZVhiZWFuRm9yWHBhdGggPSAidXNlIHhiZWFuIGZvciB4cGF0aCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBhdGggZ2V0UGF0aCAoIFN0cmluZyBwYXRoRXhwciApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UGF0aCggcGF0aEV4cHIsIGZhbHNlLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBnZXRQYXRoICggU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBnZXRQYXRoKAotICAgICAgICAgICAgICAgIHBhdGhFeHByLAotICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKS5oYXNPcHRpb24oIF91c2VYcXJsRm9yWHBhdGggKSwKLSAgICAgICAgICAgICAgICBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQYXRoIGdldFBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIGJvb2xlYW4geHFybCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBwYXRoID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZCAoIF94YmVhblBhdGhDYWNoZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgheHFybCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gX3hiZWFuUGF0aENhY2hlLmdldCggcGF0aEV4cHIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYXRoID0gX3hxcmxQYXRoQ2FjaGUuZ2V0KCBwYXRoRXhwciApOwotCi0gICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoU3RyID0gZ2V0Q29tcGlsZWRQYXRoKCBwYXRoRXhwciwgeHFybCwgb3B0aW9ucyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhdGggPQotICAgICAgICAgICAgICAgICAgICAocGF0aFN0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA6IGdldFBhdGgoIHBhdGhFeHByLCB4cXJsLCBvcHRpb25zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFBhdGgpIHBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbXBpbGVkUGF0aCAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDb21waWxlZFBhdGgoIHBhdGhFeHByLCBmYWxzZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDdXJyZW50Tm9kZVZhciAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBTdHJpbmcgY3VycmVudE5vZGVWYXIgPSAidGhpcyI7Ci0KLSAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5YUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUiApKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50Tm9kZVZhciA9IChTdHJpbmcpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlhRVUVSWV9DVVJSRU5UX05PREVfVkFSICk7Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCIgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9taXQgdGhlICckJyBwcmVmaXggZm9yIHRoZSBjdXJyZW50IG5vZGUgdmFyaWFibGUiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudE5vZGVWYXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbXBpbGVkUGF0aCAoIFN0cmluZyBwYXRoRXhwciwgYm9vbGVhbiB4cXJsLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgUGF0aCBwYXRoID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7Ci0gICAgICAgIAotICAgICAgICAvLyBlbnN1cmUgb3B0aW9ucyBkb2Vzbid0IGNvbnRhaW4gWFF1ZXJ5IHZhcmlhYmxlIG1hcHBpbmcuCi0gICAgICAgIC8vIHNvbWVkYXkgd2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGluIGFsbCB0aGUgcGF0aGluZyBlbmdpbmVzCi0gICAgICAgIC8vIGJ1dCBmb3Igbm93IGl0IG9ubHkgYXBwbGllcyB0byB0aGUgeHFybC4KLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlhRVUVSWV9WQVJJQUJMRV9NQVAgKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlhtbE9wdGlvbnMuWFFVRVJZX1ZBUklBQkxFX01BUCBpcyBub3QgYWxsb3dlZCBpbiBYUGF0aCBleHByZXNzaW9ucy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjdXJyZW50Tm9kZVZhciA9IGdldEN1cnJlbnROb2RlVmFyKCBvcHRpb25zICk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkICggX3hiZWFuUGF0aENhY2hlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICh4cXJsIHw9IG9wdGlvbnMuaGFzT3B0aW9uKCBfdXNlWHFybEZvclhwYXRoICkpIHx8IHRydWU7Ci0KLSAgICAgICAgICAgIGlmICgheHFybCB8fCBvcHRpb25zLmhhc09wdGlvbiggX3VzZVhiZWFuRm9yWHBhdGggKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gKFBhdGgpIF94YmVhblBhdGhDYWNoZS5nZXQoIHBhdGhFeHByICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFhiZWFuUGF0aEltcGwuY3JlYXRlKCBwYXRoRXhwciwgY3VycmVudE5vZGVWYXIgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgX3hiZWFuUGF0aENhY2hlLnB1dCggcGF0aC5nZXRQYXRoRXhwcigpLCBwYXRoICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYXRoID0gSmF4ZW5QYXRoSW1wbC5jcmVhdGUoIHBhdGhFeHByLCBjdXJyZW50Tm9kZVZhciApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBfeGJlYW5QYXRoQ2FjaGUucHV0KCBwYXRoLmdldFBhdGhFeHByKCksIHBhdGggKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICEgb3B0aW9ucy5oYXNPcHRpb24oIF91c2VYYmVhbkZvclhwYXRoICk7Ci0KLSAgICAgICAgICAgICAgICBwYXRoID0gKFBhdGgpIF94cXJsUGF0aENhY2hlLmdldCggcGF0aEV4cHIgKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYXRoID0gWHFybFBhdGhJbXBsLmNyZWF0ZSggcGF0aEV4cHIsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgX3hxcmxQYXRoQ2FjaGUucHV0KCBwYXRoLmdldFBhdGhFeHByKCksIHBhdGggKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGF0aCA9PSBudWxsID8gbnVsbCA6IHBhdGguZ2V0UGF0aEV4cHIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5Ci0gICAgewotICAgICAgICBQYXRoRW5naW5lICBleGVjdXRlUGF0aCAgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAgICAgWG1sQ3Vyc29yICAgZXhlY3V0ZVF1ZXJ5ICggQ3Vyc29yIGMsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgICAgICBYbWxPYmplY3RbXSBleGVjdXRlUXVlcnkgKCBUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgICAgICBTdHJpbmcgICAgICBnZXRRdWVyeUV4cHIgKCApOwotICAgIH0KLQotLy8gICAgcHVibGljIHN0YXRpYyBRdWVyeSBnZXRRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIgKQotLy8gICAgewotLy8gICAgICAgIHJldHVybiBnZXRRdWVyeSggcXVlcnlFeHByLCBudWxsICk7Ci0vLyAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBRdWVyeSBnZXRRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBPYmplY3QgcXVlcnkgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkICggX3hxcmxRdWVyeUNhY2hlICkKLSAgICAgICAgewotICAgICAgICAgICAgcXVlcnkgPSBfeHFybFF1ZXJ5Q2FjaGUuZ2V0KCBxdWVyeUV4cHIgKTsKLQotICAgICAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyID0gZ2V0Q29tcGlsZWRRdWVyeSggcXVlcnlFeHByLCBvcHRpb25zICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcXVlcnkgPQotICAgICAgICAgICAgICAgICAgICAocXVlcnlTdHIgPT0gbnVsbCkgPyBudWxsIDogZ2V0UXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChRdWVyeSkgcXVlcnk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbXBpbGVkUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgUXVlcnkgcXVlcnkgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkICggX3hxcmxRdWVyeUNhY2hlICkKLSAgICAgICAgewotICAgICAgICAgICAgcXVlcnkgPSAoUXVlcnkpIF94cXJsUXVlcnlDYWNoZS5nZXQoIHF1ZXJ5RXhwciApOwotCi0gICAgICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBxdWVyeSA9IFhxcmxEZWxlZ2F0ZS5jb21waWxlUXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF94cXJsUXVlcnlDYWNoZS5wdXQoIHF1ZXJ5LmdldFF1ZXJ5RXhwcigpLCBxdWVyeSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHF1ZXJ5ID09IG51bGwgPyBudWxsIDogcXVlcnkuZ2V0UXVlcnlFeHByKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYbWxDdXJzb3IgcXVlcnkgKAotICAgICAgICBDdXJzb3IgYywgU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gZ2V0UXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgICAgICByZXR1cm4gKHF1ZXJ5ID09IG51bGwpID8gbnVsbCA6IHF1ZXJ5LmV4ZWN1dGVRdWVyeSggYywgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0W10gcXVlcnkgKAotICAgICAgICBUeXBlIHR5cGUsIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBRdWVyeSBxdWVyeSA9IGdldFF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICAgICAgcmV0dXJuIChxdWVyeSA9PSBudWxsKSA/IG51bGwgOiBxdWVyeS5leGVjdXRlUXVlcnkoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUGF0aEVuZ2luZSBleGVjdXRlICgKLSAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhdGhFeHByICggKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhxcmxQYXRoSW1wbCBleHRlbmRzIFBhdGgKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgWHFybFBhdGhJbXBsICggU3RyaW5nIHBhdGhFeHByLCBRdWVyeSBjb21waWxlZFBhdGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGF0aEV4cHIgPSBwYXRoRXhwcjsKLSAgICAgICAgICAgIF9jb21waWxlZFBhdGggPSBjb21waWxlZFBhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBfcGF0aEV4cHI7Ci0gICAgICAgIHByaXZhdGUgUXVlcnkgIF9jb21waWxlZFBhdGg7Ci0KLSAgICAgICAgc3RhdGljIFBhdGggY3JlYXRlICggU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhxcmxQYXRoSW1wbCgKLSAgICAgICAgICAgICAgICBwYXRoRXhwciwKLSAgICAgICAgICAgICAgICBYcXJsRGVsZWdhdGUuY29tcGlsZVBhdGgoIHBhdGhFeHByLCBvcHRpb25zICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBQYXRoRW5naW5lIGV4ZWN1dGUgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlZFBhdGguZXhlY3V0ZVBhdGgoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoRXhwciAoICkgeyByZXR1cm4gX3BhdGhFeHByOyB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBYYmVhblBhdGhJbXBsIGV4dGVuZHMgUGF0aAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBYYmVhblBhdGhJbXBsICgKLSAgICAgICAgICAgIFhQYXRoIHhwYXRoLCBTdHJpbmcgcGF0aEV4cHIsIFN0cmluZyBjdXJyZW50Tm9kZVZhciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXRoRXhwciA9IHBhdGhFeHByOwotICAgICAgICAgICAgX3hwYXRoID0geHBhdGg7Ci0gICAgICAgICAgICBfY3VycmVudE5vZGVWYXIgPSBjdXJyZW50Tm9kZVZhcjsKLSAgICAgICAgfQotCi0vLyAgICAgICAgICAgIHRyeQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudE5vZGVWYXIgPSAidGhpcyI7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGlmIChYbWxPcHRpb25zLlhRVUVSWV9DVVJSRU5UX05PREVfVkFSLmhhcyggb3B0aW9ucyApKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlVmFyID0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIiQiICsgWG1sT3B0aW9ucy5YUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUi5nZXQoIG9wdGlvbnMgKTsKLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkJCIgKSkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbWl0IHRoZSAnJHAnIHJlZml4IGZvciB0aGUgY3VycmVudCAiICsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGUgdmFyaWFibGUiICk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQYXRoIGNyZWF0ZSAoIFN0cmluZyBwYXRoRXhwciwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFjdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCIgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIG5ldyBYYmVhblBhdGhJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGguY29tcGlsZVhQYXRoKCBwYXRoRXhwciwgY3VycmVudE5vZGVWYXIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhFeHByLCBjdXJyZW50Tm9kZVZhciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYUGF0aC5YUGF0aENvbXBpbGVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGhFeHByICggKSB7IHJldHVybiBfcGF0aEV4cHI7IH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBQYXRoRW5naW5lIGV4ZWN1dGUgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIGJ1aWx0aW4gWFBhdGggZW5naW5lIHdvcmtzIG9ubHkgb24gY29udGFpbmVycy4gIERlbGVnYXRlIHRvCi0gICAgICAgICAgICAvLyB4cXJsIG90aGVyd2lzZS4gIEFsc28sIGlmIHRoZSBwYXRoIGhhZCBhIC8vLiBhdCB0aGUgZW5kLCB0aGUKLSAgICAgICAgICAgIC8vIHNpbXBsZSB4cGF0aCBlbmdpbmUgY2FuJ3QgZG8gdGhlIGdlbmVyYXRlIGNhc2UsIGl0IG9ubHkgaGFuZGxlcwotICAgICAgICAgICAgLy8gYXR0cnMgYW5kIGVsZW1lbnRzLgotCi0gICAgICAgICAgICBpZiAocCAhPSAwIHx8ICFzLmlzQ29udGFpbmVyKCkgfHwgX3hwYXRoLnNhd0RlZXBEb3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgeGJlYW4gcGF0aCBjb21waWxlciBjb3VsZCBjb3VsZCBoYW5kbGUgdGhlIHBhdGgsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgeHFybCBjb21waWxlciBiZXR0ZXIgYmUgYWJsZSB0byEKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCBfcGF0aEV4cHIsIHRydWUsIG51bGwgKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCByLCBzLCBwLCBvcHRpb25zICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJDYW4ndCBjb21waWxlIHBhdGgiLCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFhCZWFuUGF0aEVuZ2luZSggX3hwYXRoLCByLCBzICk7Ci0gICAgICAgIH0KLQotLy8gVE9ETyAtIGJlY2F1c2UgdGhpcyB4cGF0aCBlbmdpbmUgZG9lcyBub3QgdXNlIGEgc2F2ZXIsIGFueSBhdHRyaWJ1dGVzIGluIHRoZQotLy8gcGF0aCB3aGljaCByZWZlciB0byBuYW1lc2FwY2UgYXR0cmlidXRlcyB3aWxsIHJlcXVpcmUgdXMgdG8gcnVuIHRoZSBYUVJMCi0vLyBwYXRoIGVuZ2luZSB3aGljaCBpcyBiYXNlZCBvbiB0aGUgc2F2ZXIuCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWEJlYW5QYXRoRW5naW5lCi0gICAgICAgICAgICBleHRlbmRzIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQgaW1wbGVtZW50cyBQYXRoRW5naW5lCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhCZWFuUGF0aEVuZ2luZSAoIFhQYXRoIHhwYXRoLCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgICAgICAgICAgX2N1cnIgPSBfdG9wID0gczsKLSAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IHIuZ2V0VmVyc2lvbigpOwotCi0gICAgICAgICAgICAgICAgaW5pdCggeHBhdGggKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbmV4dCAoIFNlbGVjdGlvbnMgc2VsZWN0aW9ucyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGluaXRpYWxTaXplID0gc2VsZWN0aW9ucy5jdXJyZW50U2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfcm9vdC5nZXRWZXJzaW9uKCkgIT0gX3ZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCBzZWxlY3Rpb25zICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxTaXplIDwgc2VsZWN0aW9ucy5jdXJyZW50U2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFNwbGF5IGRvQXR0cnMgKCBpbnQgcmV0LCBTcGxheSBzLCBTZWxlY3Rpb25zIHNlbGVjdGlvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgocmV0ICYgQVRUUlMpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yICggcyA9IF9jdXJyLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkgJiYgYXR0ciggcy5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMuYWRkKCBfcm9vdCwgcyApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYWR2YW5jZSAoIFNlbGVjdGlvbnMgc2VsZWN0aW9ucyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9jdXJyID09IF90b3ApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gc3RhcnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCAmIEhJVCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMuYWRkKCBfcm9vdCwgX2N1cnIgKTsKLQotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gZG9BdHRycyggcmV0LCBfY3Vyciwgc2VsZWN0aW9ucyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgocmV0ICYgREVTQ0VORCkgPT0gMCB8fCBfY3Vyci5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBzID09IG51bGwgPyBfY3Vyci5uZXh0Tm9uQXR0clNwbGF5KCkgOiBzOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5nZXRDb250YWluZXIoKSA9PSBfdG9wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZWxlbWVudCggX2N1cnIuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ICYgSElUKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMuYWRkKCBfcm9vdCwgX2N1cnIgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGRvQXR0cnMoIHJldCwgX2N1cnIsIHNlbGVjdGlvbnMgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLmlzTGVhZigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gcyA9PSBudWxsID8gX2N1cnIubmV4dE5vbkF0dHJTcGxheSgpIDogczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChyZXQgJiBERVNDRU5EKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gKChTcGxheS5Db250YWluZXIpIF9jdXJyKS5nZXRGaW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IHMgPT0gbnVsbCA/IF9jdXJyLm5leHROb25BdHRyU3BsYXkoKSA6IHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9jdXJyID0gX2N1cnIubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFJvb3QgIF9yb290OwotICAgICAgICAgICAgcHJpdmF0ZSBsb25nICBfdmVyc2lvbjsKLSAgICAgICAgICAgIHByaXZhdGUgU3BsYXkgX3RvcDsKLSAgICAgICAgICAgIHByaXZhdGUgU3BsYXkgX2N1cnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBfcGF0aEV4cHI7Ci0gICAgICAgIHByaXZhdGUgWFBhdGggIF94cGF0aDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2N1cnJlbnROb2RlVmFyOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSmF4ZW5QYXRoSW1wbCBleHRlbmRzIFBhdGgKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9wYXRoRXhwcjsKLSAgICAgICAgcHJpdmF0ZSBKYXhlblhCZWFuc0RlbGVnYXRlLlNlbGVjdFBhdGhJbnRlcmZhY2UgX3hwYXRoSW1wbDsKLQotICAgICAgICBwcml2YXRlIEpheGVuUGF0aEltcGwgKAotICAgICAgICAgICAgSmF4ZW5YQmVhbnNEZWxlZ2F0ZS5TZWxlY3RQYXRoSW50ZXJmYWNlIHhwYXRoSW1wbCwgU3RyaW5nIHBhdGhFeHByICkKLSAgICAgICAgewotICAgICAgICAgICAgX3hwYXRoSW1wbCA9IHhwYXRoSW1wbDsKLSAgICAgICAgICAgIF9wYXRoRXhwciA9IHBhdGhFeHByOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFBhdGggY3JlYXRlICggU3RyaW5nIHBhdGhFeHByLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIWN1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkIiApOyAvLyBjZXphciByZXZpZXcgd2l0aCBlcmljdmFzCi0KLSAgICAgICAgICAgIEpheGVuWEJlYW5zRGVsZWdhdGUuU2VsZWN0UGF0aEludGVyZmFjZSBpbXBsID0gSmF4ZW5YQmVhbnNEZWxlZ2F0ZS5jcmVhdGVJbnN0YW5jZSggcGF0aEV4cHIgKTsKLSAgICAgICAgICAgIGlmIChpbXBsID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSmF4ZW5QYXRoSW1wbCggaW1wbCAsIHBhdGhFeHByICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGhFeHByICggKSB7IHJldHVybiBfcGF0aEV4cHI7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgUGF0aEVuZ2luZSBleGVjdXRlICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXhlblBhdGhFbmdpbmUoIF94cGF0aEltcGwsIHIsIHMsIHApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF4ZW5QYXRoRW5naW5lCi0gICAgICAgICAgICBleHRlbmRzIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQgaW1wbGVtZW50cyBQYXRoRW5naW5lCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpheGVuUGF0aEVuZ2luZSggSmF4ZW5YQmVhbnNEZWxlZ2F0ZS5TZWxlY3RQYXRoSW50ZXJmYWNlIHhwYXRoSW1wbCwgUm9vdCByLCBTcGxheSBzLCBpbnQgcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2pheGVuWHBhdGhJbXBsID0geHBhdGhJbXBsOwotICAgICAgICAgICAgICAgIF9yb290ID0gcjsKLSAgICAgICAgICAgICAgICBfc3BsYXkgPSBzOwotICAgICAgICAgICAgICAgIF9wID0gcDsKLSAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IHIuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBuZXh0ICggU2VsZWN0aW9ucyBzZWxlY3Rpb25zICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9maXJzdENhbGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIF9maXJzdENhbGwgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGlmIChfcm9vdC5nZXRWZXJzaW9uKCkgIT0gX3ZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIiApOwotCi0gICAgICAgICAgICAgICAgTGlzdCByZXN1bHRzTGlzdDsKLSAgICAgICAgICAgICAgICBDdXJzb3IgY3VyID0gbmV3IEN1cnNvcihfcm9vdCwgX3NwbGF5LCBfcCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0c0xpc3QgPSBfamF4ZW5YcGF0aEltcGwuc2VsZWN0UGF0aChjdXIpOwotCi0gICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaTxyZXN1bHRzTGlzdC5zaXplKCk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEN1cnNvci5YbWxCb29rbWFyayBiID0gKFhtbEN1cnNvci5YbWxCb29rbWFyaylyZXN1bHRzTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5LkFubm90YXRpb24gYW5uID0gKChTcGxheS5Bbm5vdGF0aW9uKWIuX2N1cnJlbnRNYXJrKTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9ucy5hZGQoX3Jvb3QsIGFubi5nZXRTcGxheSgpLCBhbm4uZ2V0UG9zKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIF9yb290ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBfc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgIF9qYXhlblhwYXRoSW1wbCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgSmF4ZW5YQmVhbnNEZWxlZ2F0ZS5TZWxlY3RQYXRoSW50ZXJmYWNlIF9qYXhlblhwYXRoSW1wbDsKLSAgICAgICAgICAgIHByaXZhdGUgUm9vdCAgX3Jvb3Q7Ci0gICAgICAgICAgICBwcml2YXRlIFNwbGF5IF9zcGxheTsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IF9wOwotICAgICAgICAgICAgcHJpdmF0ZSBsb25nICBfdmVyc2lvbjsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfZmlyc3RDYWxsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgX3hxcmxQYXRoQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgX3hiZWFuUGF0aENhY2hlID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIF94cXJsUXVlcnlDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1Jvb3QuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUm9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWEwMGY3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUm9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzOSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkVuY29kaW5nTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5GaW5pc2g7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvY3VtZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnREb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSb290IGV4dGVuZHMgRmluaXNoIGltcGxlbWVudHMgWG1sU3RvcmUKLXsKLSAgICBwdWJsaWMgUm9vdCAoIFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzdXBlciggUk9PVCApOwotCi0gICAgICAgIGFzc2VydCBzdGwgIT0gbnVsbDsKLQotICAgICAgICBfc2NoZW1hVHlwZVN5c3RlbSA9IHN0bDsKLQotICAgICAgICBfbGVmdE9ubHkgPSB0cnVlOwotCi0gICAgICAgIF9wcm9wcyA9IG5ldyBEb2NQcm9wcygpOwotCi0gICAgICAgIF9kb2MgPSBuZXcgRG9jKCB0aGlzLCBudWxsICk7Ci0KLSAgICAgICAgX2xlZnRTcGxheSA9IF9kb2M7Ci0gICAgICAgIF9kb2MuX3BhcmVudFNwbGF5ID0gdGhpczsKLSAgICAgICAgYWRqdXN0Q2RvY0JlZ2luTGVmdCggX2RvYy5nZXRDZG9jQmVnaW4oKSApOwotCi0gICAgICAgIF90ZXh0ID0gbmV3IFRleHQoKTsKLQotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gbnVsbDsKLQotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwotICAgICAgICAKLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKSkKLSAgICAgICAgICAgIHNUeXBlID0gKFNjaGVtYVR5cGUpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKTsKLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHNUeXBlID0gdHlwZTsKLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHNUeXBlID0gWG1sT2JqZWN0LnR5cGU7Ci0KLSAgICAgICAgX3ZhbGlkYXRlT25TZXQgPSBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5WQUxJREFURV9PTl9TRVQgKTsKLQotICAgICAgICBfZmFjdG9yeSA9IChUeXBlU3RvcmVGYWN0b3J5KSBvcHRpb25zLmdldCggVHlwZVN0b3JlRmFjdG9yeS5LRVkgKTsKLQotICAgICAgICBfZG9jLnNldFR5cGUoIHRoaXMsIHNUeXBlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYbWxTdG9yZSBuZXdTdG9yZSAoIFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFJvb3QoIHN0bCwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxEb2N1bWVudFByb3BlcnRpZXMgZG9jdW1lbnRQcm9wZXJ0aWVzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggdGhpcywgX2RvYyApOwotICAgIH0KLQotICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIF9kb2M7IH0KLQotICAgIGJvb2xlYW4gdmFsaWRhdGVPblNldCAoICkgeyByZXR1cm4gX3ZhbGlkYXRlT25TZXQ7IH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgVHlwZSB0ID0gX2RvYy5wZWVrVHlwZSgpOwotCi0gICAgICAgIHJldHVybiB0ID09IG51bGwgPyBudWxsIDogdC5nZXRYbWxPYmplY3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRTY2hlbWFUeXBlTG9hZGVyICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zY2hlbWFUeXBlU3lzdGVtOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNFbXB0eSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbGVmdFNwbGF5ID09IF9kb2MgJiYgX2RvYy5fcmlnaHRTcGxheSA9PSBudWxsICYmIF9kb2MuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNMZWZ0T25seSAoICkgeyByZXR1cm4gX2xlZnRPbmx5OyB9Ci0KLSAgICB2b2lkIGVuc3VyZUVtcHR5ICggKQotICAgIHsKLSAgICAgICAgaWYgKCFpc0VtcHR5KCkpCi0gICAgICAgICAgICBfZG9jLnJlbW92ZUNvbnRlbnQoIHRoaXMsIHRydWUgKTsKLQotICAgICAgICBhc3NlcnQgaXNFbXB0eSgpOwotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLSAgICAgICAgYXNzZXJ0IF9sZWZ0T25seTsKLSAgICAgICAgYXNzZXJ0IGdldENjaExlZnQoKSA9PSAwOwotICAgICAgICBhc3NlcnQgX3RleHQubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IGdldENkb2NCZWdpbkxlZnQoKSA9PSAxOwotICAgICAgICBhc3NlcnQgX2RvYyAhPSBudWxsICYmIF9sZWZ0U3BsYXkgPT0gX2RvYzsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUNjaCAoIFNwbGF5IHMsIGludCBkZWx0YUNjaCApCi0gICAgewotICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0KLSAgICAgICAgaWYgKGRlbHRhQ2NoICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKLQotICAgICAgICAgICAgcy5hZGp1c3RDY2goIGRlbHRhQ2NoICk7Ci0gICAgICAgICAgICBhZGp1c3RDY2hMZWZ0KCBkZWx0YUNjaCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldENwICggU3BsYXkgcyApCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBBIGxlZnQgb25seSB0cmVlIGhhcyB0aGUgbmljZSBwcm9wZXJ0eSB0aGF0IF9jY2hMZWZ0IGlzCi0gICAgICAgIC8vIGFsc28gdGhlIGNwIQotICAgICAgICAvLwotCi0gICAgICAgIGlmICghX2xlZnRPbmx5ICYmIHMgIT0gdGhpcykKLSAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKLQotICAgICAgICByZXR1cm4gcy5nZXRDY2hMZWZ0KCk7Ci0gICAgfQotCi0gICAgaW50IGdldERvY0JlZ2luSW5kZXggKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgbGVmdCBvbmx5IHRyZWUgaGFzIHRoZSBuaWNlIHByb3BlcnR5IHRoYXQgY2RvY0JlZ2luTGVmdCBpcwotICAgICAgICAvLyBhbHNvIHRoZSBwb3MhCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKCFfbGVmdE9ubHkpCi0gICAgICAgICAgICBzLnNwbGF5KCB0aGlzLCB0aGlzICk7Ci0KLSAgICAgICAgcmV0dXJuIHMuZ2V0Q2RvY0JlZ2luTGVmdCgpOwotICAgIH0KLSAgICAKLSAgICBCZWdpbiBmaW5kTnRoQmVnaW4gKCBTcGxheSBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgaW50IG4gKQotICAgIHsKLSAgICAgICAgLy8gb25seSBvbmUgb2YgKHNldCBvciBuYW1lKSBpcyBub3QgbnVsbAotICAgICAgICAvLyBvciBib3RoIGFyZSBudWxsIGZvciBhIHdpbGRjYXJkCi0gICAgICAgIGFzc2VydCAoIG5hbWUgPT0gbnVsbCB8fCBzZXQgPT0gbnVsbCApOwotICAgICAgICBhc3NlcnQgbiA+PSAwOwotCi0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuaXNMZWFmKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpbnQgZGEgPSBfbnRoQ2FjaGVfQS5kaXN0YW5jZSggcGFyZW50LCBuYW1lLCBzZXQsIG4gKTsKLSAgICAgICAgaW50IGRiID0gX250aENhY2hlX0IuZGlzdGFuY2UoIHBhcmVudCwgbmFtZSwgc2V0LCBuICk7Ci0KLSAgICAgICAgQmVnaW4gYiA9Ci0gICAgICAgICAgICBkYSA8PSBkYgotICAgICAgICAgICAgICAgID8gX250aENhY2hlX0EuZmV0Y2goIHBhcmVudCwgbmFtZSwgc2V0LCBuICkKLSAgICAgICAgICAgICAgICA6IF9udGhDYWNoZV9CLmZldGNoKCBwYXJlbnQsIG5hbWUsIHNldCwgbiApOwotCi0gICAgICAgIGlmIChkYSA9PSBkYikKLSAgICAgICAgewotICAgICAgICAgICAgbnRoQ2FjaGUgdGVtcCA9IF9udGhDYWNoZV9BOwotICAgICAgICAgICAgX250aENhY2hlX0EgPSBfbnRoQ2FjaGVfQjsKLSAgICAgICAgICAgIF9udGhDYWNoZV9CID0gdGVtcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIGludCBjb3VudCAoIENvbnRhaW5lciBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZmluZE50aEJlZ2luKCBwYXJlbnQsIG5hbWUsIHNldCwgMCApOwotCi0gICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpbnQgbiA9IDA7Ci0KLSAgICAgICAgZm9yICggOyA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCFzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKHNldCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKHMuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHVwIHN0cm9uZyB0eXBlIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoaXMgc2NoZW1hIHR5cGUgc3lzdGVtLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZXNTYW1lICggUU5hbWUgbjEsIFFOYW1lIG4yICkKLSAgICB7Ci0gICAgICAgIGlmIChuMSA9PSBuMikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChuMSA9PSBudWxsIHx8IG4yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG4xLmdldE5hbWVzcGFjZVVSSSgpID09IG4yLmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKG4xLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgbjIuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gbjEuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCBuMi5nZXROYW1lc3BhY2VVUkkoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROYW1lc3BhY2UgKCBTdHJpbmdCdWZmZXIgc2IsIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCggIjxubyBuYW1lc3BhY2U+IiApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggIlwiIiApOwotICAgICAgICAgICAgc2IuYXBwZW5kKCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICJcIiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFhtbE9iamVjdCBhdXRvVHlwZWREb2N1bWVudCAoCi0gICAgICAgIFNjaGVtYVR5cGUgZmFjdG9yeVR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBUaGUgdHlwZSBpbiB0aGUgb3B0aW9ucyBoYXMgaGlnaGVzdCBwcmVjaWRlbmNlIGJlY2F1c2UgaXQgaXMKLSAgICAgICAgLy8gc3VwcGxpZWQgYnkgdGhlIHVzZXIuCi0gICAgICAgIAotICAgICAgICBTY2hlbWFUeXBlIG92ZXJyaWRlVHlwZSA9Ci0gICAgICAgICAgICAoU2NoZW1hVHlwZSkgWG1sT3B0aW9ucy5zYWZlR2V0KCBvcHRpb25zLCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKTsKLQotICAgICAgICAvLyBwcmVjZWRlbmNlIGlzIGdpdmVuIHRvIHRoZSBvdmVycmlkZSBhYm92ZSBhbGwKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGUgdGhlVHlwZSA9IG92ZXJyaWRlVHlwZTsKLQotICAgICAgICAvLyBEb2N1bWVudCBhbmQgYXR0cmlidXRlIHR5cGVzIGhhdmUgbm8gbmFtZQotICAgICAgICAKLSAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICghZmFjdG9yeVR5cGUuaXNEb2N1bWVudFR5cGUoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWZhY3RvcnlUeXBlLmlzQXR0cmlidXRlVHlwZSgpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGluZmVyIHR5cGUgZnJvbSB4c2k6dHlwZQotICAgICAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBfZG9jLmdldFhzaVR5cGVOYW1lKCB0aGlzICk7Ci0KLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc25pZmZlZFR5cGUgPQotICAgICAgICAgICAgICAgIHR5cGVOYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogX3NjaGVtYVR5cGVTeXN0ZW0uZmluZFR5cGUoIHR5cGVOYW1lICk7Ci0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnlUeXBlLmlzQXNzaWduYWJsZUZyb20oIHNuaWZmZWRUeXBlICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlVHlwZSA9IHNuaWZmZWRUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdG9kbzoKLSAgICAgICAgLy8gdXNlIHRoZSBmb2xsb3dpbmcgd2hlbiBpbXBsZW1lbnRpbmcgc3Vic3QgZ3JvdXBzOgotICAgICAgICAvLyAgICAgZmFjdG9yeVR5cGUgPT0gbnVsbCB8fCBleHBlY3RlZFR5cGUuaXNEb2N1bWVudFR5cGUoKQotCi0gICAgICAgIGlmIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8IGZhY3RvcnlUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGVUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5mZXIgdHlwZSBiYXNlZCBvbiByb290IGVsdAotCi0gICAgICAgICAgICAgICAgUU5hbWUgZG9jRWxlbU5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLnRvRmlyc3RDaGlsZCgpICYmICFjLnRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgZG9jRWxlbU5hbWUgPSBjLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1OYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRoZVR5cGUgPSBfc2NoZW1hVHlwZVN5c3RlbS5maW5kRG9jdW1lbnRUeXBlKCBkb2NFbGVtTmFtZSApOwotCi0gICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGVsdCBpbmhlcml0YW5jZSB3aGVuIGltcGxlbWVudGluZyBzdWJzdCBncm91cHMKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeVR5cGUgIT0gbnVsbCAmJiB0aGVUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBmYWN0b3J5RWxlbU5hbWUgPSBmYWN0b3J5VHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWN0b3J5RWxlbU5hbWUuZXF1YWxzKGRvY0VsZW1OYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWZhY3RvcnlUeXBlLmlzVmFsaWRTdWJzdGl0dXRpb24oZG9jRWxlbU5hbWUpKQotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZG9jRWxlbU5hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhIHZhbGlkICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZmFjdG9yeUVsZW1OYW1lKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2N1bWVudCBvciBhIHZhbGlkIHN1YnN0aXR1dGlvbi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpbmZlciB0eXBlIGJhc2VkIG9uIHJvb3QgYXR0cgotCi0gICAgICAgICAgICAgICAgUU5hbWUgYXR0ck5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLnRvRmlyc3RBdHRyaWJ1dGUoKSAmJiAhYy50b05leHRBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBjLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRoZVR5cGUgPSBfc2NoZW1hVHlwZVN5c3RlbS5maW5kQXR0cmlidXRlVHlwZSggYXR0ck5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNuaWZmaW5nIGRvZXNuJ3Qgc2F5IGFueXRoaW5nOiBhc3N1bWUgdGhlIGV4cGVjdGVkIHR5cGUKLSAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRoZVR5cGUgPSBmYWN0b3J5VHlwZTsKLQotICAgICAgICAvLyBTdGlsbCBub3RoaW5nOiB0aGUgbm8gdHlwZS4KLSAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRoZVR5cGUgPSBYbWxCZWFucy5OT19UWVBFOwotCi0gICAgICAgIC8vIGFzc2lnbiB0eXBlCi0gICAgICAgIF9kb2Muc2V0VHlwZSggdGhpcywgdGhlVHlwZSApOwotCi0gICAgICAgIC8vIHRvZG86IEhhdmUgYSBzaW1pbGFyIGF0dHJpYnV0ZSB0eXBlIGNoZWNrCi0gICAgICAgIGlmIChmYWN0b3J5VHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhlVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgICAgIHZlcmlmeURvY3VtZW50VHlwZSggdGhlVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCkgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRoZVR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgdmVyaWZ5QXR0cmlidXRlVHlwZSggdGhlVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBJZiBhIHR5cGUgd2FzIHBhc3NlZCBpbiwgdXN1YWxseSBmcm9tIGdlbmVyYXRlZCBjb2RlIHdoaWNoIG5lZWRzIHRoZQotICAgICAgICAvLyB0eXBlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYyBiZWNhdXNlIG9mIGEgcGVuZGluZyBjYXN0LCB0aGVuIGNoZWNrCi0gICAgICAgIC8vIHRoZSByZXN1bHRpbmcgdHlwZSBhbmQgdGhyb3cgYSBuaWNlIGV4Y2VwdGlvbi4KLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoZmFjdG9yeVR5cGUgIT0gbnVsbCAmJiAhZmFjdG9yeVR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0aGVUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFjdG9yeSB0eXBlID0gIiArIGZhY3RvcnlUeXBlKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHR5cGUgPSAiICsgdGhlVHlwZSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2V0eXBlIG9mIHRoZSB0eXBlID0gIiArIHRoZVR5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBYbWxFeGNlcHRpb24oICJYTUwgb2JqZWN0IGlzIG5vdCBvZiB0eXBlICIgKyBmYWN0b3J5VHlwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlEb2N1bWVudFR5cGUgKCBRTmFtZSBkb2NFbGVtTmFtZSApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gY3JlYXRlQ3Vyc29yKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy50b0ZpcnN0Q2hpbGQoKSB8fCBjLnRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGRvY0VsZW1OYW1lICkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbm8gZG9jdW1lbnQgZWxlbWVudCIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbXVsdGlwbGUgZG9jdW1lbnQgZWxlbWVudHMiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyggZG9jRWxlbU5hbWUgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggUU5hbWVIZWxwZXIucHJldHR5KCBkb2NFbGVtTmFtZSApICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1OYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyggbmFtZS5nZXRMb2NhbFBhcnQoKSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGRvY3VtZW50IGVsZW1lbnQgbmFtZXNwYWNlIG1pc21hdGNoICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggImV4cGVjdGVkICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZSggc2IsIGRvY0VsZW1OYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZShzYiwgIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lc3BhY2VzU2FtZSggZG9jRWxlbU5hbWUsIG5hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBkb2N1bWVudCBlbGVtZW50IGxvY2FsIG5hbWUgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZXhwZWN0ZWQgIiArIGRvY0VsZW1OYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKyBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGRvY3VtZW50IGVsZW1lbnQgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZ290ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggUU5hbWVIZWxwZXIucHJldHR5KCBuYW1lICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNiICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gWG1sRXJyb3IuZm9yQ3Vyc29yKHNiLnRvU3RyaW5nKCksIGMubmV3Q3Vyc29yKCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUF0dHJpYnV0ZVR5cGUgKCBRTmFtZSBhdHRyTmFtZSApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gY3JlYXRlQ3Vyc29yKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy50b0ZpcnN0QXR0cmlidXRlKCkgfHwgYy50b05leHRBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbm8gYXR0cmlidXRlcyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbXVsdGlwbGUgYXR0cmlidXRlcyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCBhdHRyTmFtZSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiVGhlIGRvY3VtZW50IGlzIG5vdCBhICIgKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCBuYW1lLmdldExvY2FsUGFydCgpICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogYXR0cmlidXRlIG5hbWVzcGFjZSBtaXNtYXRjaCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJleHBlY3RlZCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2UoIHNiLCBhdHRyTmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiIGdvdCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2Uoc2IsICBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZXNwYWNlc1NhbWUoIGF0dHJOYW1lLCBuYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogYXR0cmlidXRlIGxvY2FsIG5hbWUgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZXhwZWN0ZWQgIiArIGF0dHJOYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKyBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGF0dHJpYnV0ZSBlbGVtZW50IG1pc21hdGNoICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggImdvdCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIFFOYW1lSGVscGVyLnByZXR0eSggbmFtZSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzYiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvckN1cnNvcihzYi50b1N0cmluZygpLCBjLm5ld0N1cnNvcigpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGxfU2F4TG9hZGVycyA9Ci0gICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYXhMb2FkZXIgc2wgPSBQaWNjb2xvU2F4TG9hZGVyLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2wgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2wgPSBEZWZhdWx0U2F4TG9hZGVyLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2wgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJDYW4ndCBmaW5kIGFuIFhNTCBwYXJzZXIiICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTYXhMb2FkZXIgZ2V0U2F4TG9hZGVyICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTYXhMb2FkZXIpIHRsX1NheExvYWRlcnMuZ2V0KCk7Ci0gICAgfQotICAgIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGljY29sb1NheExvYWRlciBleHRlbmRzIFNheExvYWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTYXhMb2FkZXIgbmV3SW5zdGFuY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENsYXNzIHBjID0gQ2xhc3MuZm9yTmFtZSggImNvbS5ibHVlY2FzdC54bWwuUGljY29sbyIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBYTUxSZWFkZXIgeHIgPSAoWE1MUmVhZGVyKSBwYy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAgICAgTWV0aG9kIG1fZ2V0RW5jb2RpbmcgICAgID0gcGMuZ2V0TWV0aG9kKCAiZ2V0RW5jb2RpbmciLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIG1fZ2V0VmVyc2lvbiAgICAgID0gcGMuZ2V0TWV0aG9kKCAiZ2V0VmVyc2lvbiIsIG51bGwgKTsKLSAgICAgICAgICAgICAgICBNZXRob2QgbV9nZXRTdGFydExvY2F0b3IgPSBwYy5nZXRNZXRob2QoICJnZXRTdGFydExvY2F0b3IiLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICBMb2NhdG9yIHN0YXJ0TG9jYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChMb2NhdG9yKSBtX2dldFN0YXJ0TG9jYXRvci5pbnZva2UoIHhyLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBpY2NvbG9TYXhMb2FkZXIoIHhyLCBzdGFydExvY2F0b3IsIG1fZ2V0RW5jb2RpbmcsIG1fZ2V0VmVyc2lvbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHBvc3RMb2FkICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgci5fcHJvcHMuc2V0RW5jb2RpbmcoIChTdHJpbmcpIF9tX2dldEVuY29kaW5nLmludm9rZSggX3hyLCBudWxsICkgKTsKLSAgICAgICAgICAgICAgICByLl9wcm9wcy5zZXRWZXJzaW9uICggKFN0cmluZykgX21fZ2V0VmVyc2lvbiAuaW52b2tlKCBfeHIsIG51bGwgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgUGljY29sb1NheExvYWRlciAoCi0gICAgICAgICAgICBYTUxSZWFkZXIgeHIsIExvY2F0b3Igc3RhcnRMb2NhdG9yLCBNZXRob2QgbV9nZXRFbmNvZGluZywgTWV0aG9kIG1fZ2V0VmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCB4ciwgc3RhcnRMb2NhdG9yICk7Ci0KLSAgICAgICAgICAgIF9tX2dldEVuY29kaW5nID0gbV9nZXRFbmNvZGluZzsKLSAgICAgICAgICAgIF9tX2dldFZlcnNpb24gPSBtX2dldFZlcnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1ldGhvZCBfbV9nZXRFbmNvZGluZzsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgX21fZ2V0VmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdFNheExvYWRlciBleHRlbmRzIFNheExvYWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTYXhMb2FkZXIgbmV3SW5zdGFuY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFNheExvYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIERlZmF1bHRTYXhMb2FkZXIgKCBYTUxSZWFkZXIgeHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggeHIsIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNheExvYWRlcgotICAgICAgICBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyLCBMZXhpY2FsSGFuZGxlciwgRXJyb3JIYW5kbGVyLCBFbnRpdHlSZXNvbHZlcgotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIFNheExvYWRlciAoIFhNTFJlYWRlciB4ciwgTG9jYXRvciBzdGFydExvY2F0b3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfeHIgPSB4cjsKLSAgICAgICAgICAgIF9zdGFydExvY2F0b3IgPSBzdGFydExvY2F0b3I7Ci0KLSAgICAgICAgICAgIGlmICh4ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgIHhyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLQotCi0gICAgICAgICAgICAgICAgICAgIHhyLnNldFByb3BlcnR5KCAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyApOwotICAgICAgICAgICAgICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggdGhpcyApOwotICAgICAgICAgICAgICAgICAgICB4ci5zZXRFcnJvckhhbmRsZXIoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0RW50aXR5UmVzb2x2ZXIoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0ICggTG9hZENvbnRleHQgY29udGV4dCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgICAgICBfd2FudExpbmVOdW1iZXJzID0KLSAgICAgICAgICAgICAgICBYbWxPcHRpb25zLm1hc2tOdWxsKAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICkuaGFzT3B0aW9uKCBYbWxPcHRpb25zLkxPQURfTElORV9OVU1CRVJTICkgJiYKLSAgICAgICAgICAgICAgICAgICAgX3N0YXJ0TG9jYXRvciAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9zdExvYWQgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBsb2FkICggUm9vdCByLCBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHIsIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2V0Q29udGV4dCggY29udGV4dCwgb3B0aW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgci5kaXNhYmxlU3RvcmVWYWxpZGF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBfeHIucGFyc2UoIGlucHV0U291cmNlICk7Ci0KLSAgICAgICAgICAgICAgICBwb3N0TG9hZCggciApOwotCi0vLyAgICAgICAgICAgICAgICAvLyBQaWNjb2xvIHNwZWNpZmljIGFjY2VzcyB0byBlbmNvZGluZyBhbmQgdmVyc2lvbgotLy8gICAgICAgICAgICAgICAgX3Byb3BzLnNldEVuY29kaW5nKCBwaWNjb2xvLmdldEVuY29kaW5nKCkgKTsKLS8vICAgICAgICAgICAgICAgIF9wcm9wcy5zZXRWZXJzaW9uKCBwaWNjb2xvLmdldFZlcnNpb24oKSApOwotCi0gICAgICAgICAgICAgICAgY29udGV4dC5maW5pc2goKTsKLQotICAgICAgICAgICAgICAgIHIuYXNzb2NpYXRlU291cmNlTmFtZSggb3B0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYbWxSdW50aW1lRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKLQotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckxvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoIG9wdGlvbnMsIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TGluZU51bWJlcigpLCBlLmdldENvbHVtbk51bWJlcigpLCAtMSApOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIGUsIGVyciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5hYm9ydCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvck1lc3NhZ2UoIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIGUsIGVyciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCByLmVuYWJsZVN0b3JlVmFsaWRhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2F4IENvbnRlbnRIYW5kbGVyCi0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTZXQgY29udGV4dCB0byBudWxsCi0gICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyICh3aGljaCBpcyBoZWxkIGluIFRMUyBmcm9tIGtlZXBpbmcKLSAgICAgICAgICAgIC8vIHRoZSBlbnRpcmUgZG9jdW1lbnQgaW4gbWVtb3J5Ci0gICAgICAgICAgICBfY29udGV4dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQgKAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzICkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBxTmFtZTsKLQotICAgICAgICAgICAgLy8gT3V0IGN1cnJlbnQgcGFyc2VyIChQaWNjb2xvKSBkb2VzIG5vdCBlcnJvciB3aGVuIGEKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBpcyB1c2VkIGFuZCBub3QgZGVmaW5lZC4gIENoZWNrIGZvciB0aGVzZSBoZXJlCi0KLSAgICAgICAgICAgIGlmIChxTmFtZS5pbmRleE9mKCAnOicgKSA+PSAwICYmIG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVXNlIG9mIHVuZGVmaW5lZCBuYW1lc3BhY2UgcHJlZml4OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5zdWJzdHJpbmcoIDAsIHFOYW1lLmluZGV4T2YoICc6JyApICkpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2NvbnRleHQuYmVnaW4oIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJICk7Ci0KLSAgICAgICAgICAgIC8vIEJVR0JVRyAtIGRvIG1vcmUgb2YgdGhlIGZvbGxvd2luZyB0byBnZXQgbGluZSBudW1iZXIgZm9yCi0gICAgICAgICAgICAvLyBhcyBtYW55IHBhcnRzIG9mIHRoZSBYTUwgYXMgd2UgY2FuCi0gICAgICAgICAgICBpZiAoX3dhbnRMaW5lTnVtYmVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgX3N0YXJ0TG9jYXRvci5nZXRMaW5lTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgIF9zdGFydExvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgIC0xICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCwgbGVuID0gYXR0cy5nZXRMZW5ndGgoKSA7IGkgPCBsZW4gOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBhcW4gPSBhdHRzLmdldFFOYW1lKCBpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXFuLmVxdWFscyggInhtbG5zIiApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQueG1sbnMoICIiLCBhdHRzLmdldFZhbHVlKCBpICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXFuLnN0YXJ0c1dpdGgoICJ4bWxuczoiICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYXFuLnN1YnN0cmluZyggNiApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5mb3JNZXNzYWdlKCAiUHJlZml4IG5vdCBzcGVjaWZpZWQiLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGF0dHMuZ2V0VmFsdWUoIGkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZpeCBjYW4ndCBiZSBtYXBwZWQgdG8gbm8gbmFtZXNwYWNlOiAiICsgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQueG1sbnMoIHByZWZpeCwgdXJpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVXJpID0gYXR0cy5nZXRVUkkoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJMb2NhbCA9IGF0dHMuZ2V0TG9jYWxOYW1lKCBpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJMb2NhbC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckxvY2FsID0gYXFuOwotCi0vLyBnaXZlbiB0aGUgZG9jIDxhIHg6eT0neicvPiwgcGljY29sbyB3aWxsIHJlcG9ydCB0aGUgdXJpIG9mIHRoZSB5Ci0vLyBhdHRyaWJ1dGUgYXMgJ3gnISAgQmFkIFBpY2NvbG8uICBUaHVzLCBJIGNhbid0IHBlcmZvcm0gdGhlIHVuZGVmaW5lZAotLy8gcHJlZml4IGNoZWNrIGhlcmUuCi0vLwotLy8gICAgICAgICAgICAgICAgICAgIGlmIChhcW4uaW5kZXhPZiggJzonICkgPj0gMCAmJiBhdHRyVXJpLmxlbmd0aCgpID09IDApCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvciBlcnIgPQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1cnNvclhtbEVycm9yKAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2Ugb2YgdW5kZWZpbmVkIG5hbWVzcGFjZSBwcmVmaXg6ICIgKwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcW4uc3Vic3RyaW5nKCAwLCBhcW4uaW5kZXhPZiggJzonICkgKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICk7Ci0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5hdHRyKCBhdHRyTG9jYWwsIGF0dHJVcmksIGF0dHMuZ2V0VmFsdWUoIGkgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQgKAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lICkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCi0KLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQudGV4dCggY2gsIHN0YXJ0LCBsZW5ndGggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LnRleHQoIGNoLCBzdGFydCwgbGVuZ3RoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb21tZW50ICggY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dC5jb21tZW50KCBjaCwgc3RhcnQsIGxlbmd0aCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEgKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dC5wcm9jaW5zdCggdGFyZ2V0LCBkYXRhICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydERURCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LmRvY3R5cGUoIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRFREICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVycm9yIEhhbmRsaW5nCi0gICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IgKCBTQVhQYXJzZUV4Y2VwdGlvbiBlICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IgKCBTQVhQYXJzZUV4Y2VwdGlvbiBlICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoICJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRocm93IGF3YXkgd2FyaW5ncyBmb3Igbm93Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbnRpdHkgUmVzb2x2ZXIKLSAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwdWJsaWMgaWQgPSAiICsgcHVibGljSWQpOwotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeXN0ZW0gaWQgPSAiICsgc3lzdGVtSWQpOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAiIiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IgKCBMb2NhdG9yIGxvY2F0b3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbG9jYXRvciA9IGxvY2F0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJlZ2luc1dpdGhYbWwoIHByZWZpeCApICYmCi0gICAgICAgICAgICAgICAgISAoICJ4bWwiLmVxdWFscyggcHJlZml4ICkgJiYgX3htbDE5OThVcmkuZXF1YWxzKCB1cmkgKSApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiUHJlZml4IGNhbid0IGJlZ2luIHdpdGggWE1MOiAiICsgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IgKTsKLQotICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWdub3JlZAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nICggU3RyaW5nIHByZWZpeCApIHRocm93cyBTQVhFeGNlcHRpb24ge30KLSAgICAgICAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eSAoIFN0cmluZyBuYW1lICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkgKCBTdHJpbmcgbmFtZSApIHRocm93cyBTQVhFeGNlcHRpb24geyB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eSAoIFN0cmluZyBuYW1lICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIF94cjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgTG9jYXRvciAgICAgX2xvY2F0b3I7Ci0gICAgICAgIHByaXZhdGUgTG9hZENvbnRleHQgX2NvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgX3dhbnRMaW5lTnVtYmVyczsKLSAgICAgICAgcHJpdmF0ZSBMb2NhdG9yICAgICBfc3RhcnRMb2NhdG9yOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIElucHV0U3RyZWFtIGluLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmdPdmVycmlkZSA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoIG9wdGlvbnMsIFhtbE9wdGlvbnMuQ0hBUkFDVEVSX0VOQ09ESU5HICk7Ci0KLSAgICAgICAgaWYgKGVuY29kaW5nT3ZlcnJpZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoIGVuY29kaW5nT3ZlcnJpZGUgKTsKLQotICAgICAgICAgICAgaWYgKGphdmFFbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGphdmFFbmNvZGluZyA9IGVuY29kaW5nT3ZlcnJpZGU7Ci0KLSAgICAgICAgICAgIHJldHVybiBsb2FkWG1sKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluLCBqYXZhRW5jb2RpbmcgKSwgdHlwZSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvYWRYbWwoIG5ldyBJbnB1dFNvdXJjZSggaW4gKSwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIFJlYWRlciByLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbG9hZFhtbCggbmV3IElucHV0U291cmNlKCByICksIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGxvYWRYbWwgKCBJbnB1dFNvdXJjZSBpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaXMuc2V0U3lzdGVtSWQoICJmaWxlOi8vIiApOwotCi0gICAgICAgIGdldFNheExvYWRlcigpLmxvYWQoIHRoaXMsIGlzLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGF1dG9UeXBlZERvY3VtZW50KCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIFN0cmluZyBzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWRlciByID0gbmV3IFN0cmluZ1JlYWRlciggcyApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbG9hZFhtbCggciwgdHlwZSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlN0cmluZ1JlYWRlciBzaG91bGQgbm90IHRocm93IElPRXhjZXB0aW9uIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgeyByLmNsb3NlKCk7IH0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkgeyB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzb2NpYXRlU291cmNlTmFtZSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBTdHJpbmcgc291cmNlTmFtZSA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoCi0gICAgICAgICAgICAgICAgb3B0aW9ucywgWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSApOwotCi0gICAgICAgIGlmIChzb3VyY2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICBfcHJvcHMuc2V0U291cmNlTmFtZSggc291cmNlTmFtZSApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gWG1sU2F4SGFuZGxlciBpcyByZXR1cm5lZCB0byBhIHVzZXIgc28gdGhhdCB1c2VyIG1heSBvYnRhaW4gdGhlIGNvbnRlbnQKLSAgICAvLyBhbmQgbGV4aWNhbCBoYW5kbGVycyB0byBwdXNoIGNvbnRlbnQgYW5kIHRoZW4gZ2V0IHRoZSBYbWxPYmplY3QgYXQgdGhlCi0gICAgLy8gZW5kIG9mIHRoZSBwYXJzZSBwdXNoLgotICAgIC8vCi0KLSAgICBwcml2YXRlIGNsYXNzIFhtbFNheEhhbmRsZXJJbXBsIGV4dGVuZHMgU2F4TG9hZGVyIGltcGxlbWVudHMgWG1sU2F4SGFuZGxlcgotICAgIHsKLSAgICAgICAgWG1sU2F4SGFuZGxlckltcGwgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBpc0VtcHR5KCk7Ci0KLSAgICAgICAgICAgIF9vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgICAgIF90eXBlID0gdHlwZTsKLQotICAgICAgICAgICAgX2NvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIFJvb3QudGhpcywgb3B0aW9ucyApOwotCi0gICAgICAgICAgICBzZXRDb250ZXh0KCBfY29udGV4dCwgb3B0aW9ucyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQgPT0gbnVsbCA/IG51bGwgOiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQgPT0gbnVsbCA/IG51bGwgOiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhtbE9iamVjdCBnZXRPYmplY3QgKCApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIF9jb250ZXh0LmZpbmlzaCgpOwotCi0gICAgICAgICAgICBfY29udGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgIFJvb3QudGhpcy5hc3NvY2lhdGVTb3VyY2VOYW1lKCBfb3B0aW9ucyApOwotCi0gICAgICAgICAgICByZXR1cm4gUm9vdC50aGlzLmF1dG9UeXBlZERvY3VtZW50KCBfdHlwZSwgX29wdGlvbnMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTG9hZENvbnRleHQgX2NvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZSAgX3R5cGU7Ci0gICAgICAgIHByaXZhdGUgWG1sT3B0aW9ucyAgX29wdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3U2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sU2F4SGFuZGxlckltcGwoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHByaXZhdGUgdm9pZCBuZXdQYXJzZVNheCAoIElucHV0U291cmNlIGluLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgTG9hZENvbnRleHQgY29udGV4dCA9IG5ldyBMb2FkQ29udGV4dCggdGhpcywgb3B0aW9ucyApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gSGVscGVyIG9iamVjdCBmb3IgY3JlYXRpbmcgZG9jdW1lbnRzIGluIGEgImxvYWQiIGtpbmRhIHdheQotICAgIC8vCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgTG9hZENvbnRleHQKLSAgICB7Ci0gICAgICAgIExvYWRDb250ZXh0ICggUm9vdCByb290LCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsOwotCi0gICAgICAgICAgICBfb3B0aW9ucyA9IG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIF9xbmFtZUNhY2hlID0gWG1sQmVhbnMuZ2V0UU5hbWVDYWNoZSgpOwotCi0gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5MT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCApOwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZCBSZXBsYWNlIERvY3VtZW50IEVsZW1lbnQ6IEludmFsaWQgbmFtZSwgbG9jYWwgcGFydCBlbXB0eSIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2Rpc2NhcmREb2NFbGVtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBfcmVwbGFjZURvY0VsZW0gPSBuYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfc3RyaXBXaGl0ZXNwYWNlID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX1NUUklQX1dISVRFU1BBQ0UpOwotICAgICAgICAgICAgX3N0cmlwQ29tbWVudHMgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkxPQURfU1RSSVBfQ09NTUVOVFMpOwotICAgICAgICAgICAgX3N0cmlwUHJvY2luc3RzID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX1NUUklQX1BST0NJTlNUUyk7Ci0KLSAgICAgICAgICAgIF9zdWJzdGl0dXRlTmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICAgICAgKE1hcCkgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5MT0FEX1NVQlNUSVRVVEVfTkFNRVNQQUNFUyk7Ci0KLSAgICAgICAgICAgIF9hZGRpdGlvbmFsTmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICAgICAgKE1hcCkgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5MT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUyk7Ci0KLSAgICAgICAgICAgIF9yb290ID0gcm9vdDsKLSAgICAgICAgICAgIF9yb290LmVuc3VyZUVtcHR5KCk7Ci0KLSAgICAgICAgICAgIF9sYXN0Tm9uQXR0ciA9IF9yb290Ll9kb2M7Ci0gICAgICAgICAgICBfbGFzdFNwbGF5ID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKLQotICAgICAgICAgICAgX2Zyb250aWVyID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUm9vdCBnZXRSb290ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3Jvb3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBnZXRDcCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3Jvb3QuaXNMZWZ0T25seSgpOwotICAgICAgICAgICAgYXNzZXJ0IGR2ID4gMCB8fCBzLmdldENwU2xvdygpID09IHMuZ2V0Q2NoTGVmdCgpOwotICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Q2NoTGVmdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkanVzdENjaCAoIFNwbGF5IHMsIGludCBkZWx0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7Ci0KLSAgICAgICAgICAgIHMuYWRqdXN0Q2NoKCBkZWx0YSApOwotCi0gICAgICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYXR0cnMgYWZ0ZXIgdGhpcyBzcGxheSB3aGljaCBuZWVkIHRoZWlyIGNjaExlZnQncwotICAgICAgICAgICAgLy8gdG8gYmUgdXBkYXRlZC4gIFRvIGF2b2lkIHNwbGF5aW5nLCB1cGRhdGUgdGhlbSBieSBoYW5kLgotCi0gICAgICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0F0dHIoKSB8fCBzLmlzUm9vdCgpOwotICAgICAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCggZGVsdGEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOwotCi0gICAgICAgICAgICBfcm9vdC5pbnNlcnRTcGxheSggcywgX3Jvb3QuX2xlZnRTcGxheSApOwotCi0gICAgICAgICAgICBfbGFzdFNwbGF5ID0gczsKLSAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKLQotICAgICAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ciA9IHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0ICggU3BsYXkgcywgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOwotICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoKCkgPT0gMDsKLSAgICAgICAgICAgIGluc2VydCggcyApOwotICAgICAgICAgICAgX3Jvb3QuX3RleHQuaW5zZXJ0KCBnZXRDcCggcyApLCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBhZGp1c3RDY2goIHMsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydCAoIFNwbGF5IHMsIFN0cmluZyB0ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOwotICAgICAgICAgICAgaW5zZXJ0KCBzICk7Ci0gICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoIGdldENwKCBzICksIHRleHQgKTsKLSAgICAgICAgICAgIGFkanVzdENjaCggcywgdGV4dC5sZW5ndGgoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN0cmlwTGVhZGluZ1doaXRlc3BhY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjY2hBZnRlciA9IF9sYXN0Tm9uQXR0ci5nZXRDY2hBZnRlcigpOwotCi0gICAgICAgICAgICBpZiAoY2NoQWZ0ZXIgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjY2ggPSBjY2hBZnRlcjsKLQotICAgICAgICAgICAgICAgIGludCBjcEFmdGVyID0KLSAgICAgICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyLmdldENwRm9yUG9zKAotICAgICAgICAgICAgICAgICAgICAgICAgX3Jvb3QsIF9sYXN0Tm9uQXR0ci5nZXRQb3NBZnRlcigpICk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgb2ZmID0gX3Jvb3QuX3RleHQudW5PYnNjdXJlKCBjcEFmdGVyLCBjY2ggKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIDsgY2NoID4gMCA7IGNjaC0tICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKCBfcm9vdC5fdGV4dC5fYnVmWyBvZmYgKyBjY2ggLSAxIF0pKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGRlbHRhID0gY2NoIC0gY2NoQWZ0ZXI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QuX3RleHQucmVtb3ZlKCBjcEFmdGVyICsgY2NoQWZ0ZXIgKyBkZWx0YSwgLSBkZWx0YSApOwotICAgICAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuYWRqdXN0Q2NoQWZ0ZXIoIGRlbHRhICk7Ci0gICAgICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBkZWx0YSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWJvcnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBzaGl0IG11c3QgaGF2ZSBoaXQgdGhlIGZhbiAuLi4KLQotICAgICAgICAgICAgLy8gQ2xvc2UgYWxsIGVsZW1lbnRzCi0KLSAgICAgICAgICAgIHdoaWxlICggX2Zyb250aWVyICE9IF9yb290Ll9kb2MgKQotICAgICAgICAgICAgICAgIGVuZCgpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmluaXNoICggKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3RyaXBXaGl0ZXNwYWNlKQotICAgICAgICAgICAgICAgIHN0cmlwTGVhZGluZ1doaXRlc3BhY2UoKTsKLQotICAgICAgICAgICAgLy8gVE9ETzogZGVhbCB3aXRoIHVudGVybWluYXRlZCBiZWdpbnMgaGVyZQotCi0gICAgICAgICAgICBpZiAoX2Zyb250aWVyICE9IF9yb290Ll9kb2MpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggIkRvY3VtZW50IG5vdCBlbmRlZCIgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IF9yb290Ll9sZWZ0T25seTsKLQotICAgICAgICAgICAgX2ZpbmlzaGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9yb290OwotICAgICAgICAgICAgX2xhc3RQb3MgPSAwOwotCi0gICAgICAgICAgICBpZiAoX29wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuTE9BRF9UUklNX1RFWFRfQlVGRkVSKSkKLSAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC50cmltKCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYWRkaXRpb25hbCBuYW1lc3BhY2VzLCBhZGQgdGhlbSBub3csIG1ha2luZyBzdXJlIHdlCi0gICAgICAgICAgICAvLyBkb25lIG92ZXIgcmlkZSBleGlzaXRuZyBvbmVzLgotCi0gICAgICAgICAgICBpZiAoX2FkZGl0aW9uYWxOYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IF9yb290Ll9kb2M7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoICFzLmlzUm9vdCgpICYmICFzLmlzQmVnaW4oKSApCi0gICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGkgPQotICAgICAgICAgICAgICAgICAgICAgICAgX2FkZGl0aW9uYWxOYW1lc3BhY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXN1YWxseSwgdGhpcyBpcyB0aGUgcHJlZGVmaW5lZCB4bWwgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCggInhtbCIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX2FkZGl0aW9uYWxOYW1lc3BhY2VzLmdldCggcHJlZml4ICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLm5hbWVzcGFjZUZvclByZWZpeCggcHJlZml4LCBmYWxzZSApID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jvb3QuaW5zZXJ0U2luZ2xlU3BsYXlTYW5zU3BsYXlJbkxlZnRPbmx5VHJlZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbG5zKCBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgcHJlZml4ICkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFib3ZlIGluc2VydCBzaG91bGQgbm90IHNwbGF5IHRoZSB0cmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9yb290LmlzTGVmdE9ubHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRm9yIG1vc3Qgb2YgbG9hZGluZywgSSBkb24ndCBpbnZhbGlkYXRlIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgLy8gdmVyc2lvbiBiZWNhdXNlIG5vdGhpbmcgc2hvdWxkIGJlIHNlbnNpdGl2ZSB0byBpdCB3aGlsZQotICAgICAgICAgICAgLy8gbG9hZGluZy4gIFdoZW4gZmluaXNoZWQgbG9hZGluZywgYnVtcCBpdC4KLQotICAgICAgICAgICAgX3Jvb3QuaW52YWxpZGF0ZVZlcnNpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IF9yb290LmlzTGVmdE9ubHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUU5hbWUgY2hlY2tOYW1lICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdWJzdGl0dXRlTmFtZXNwYWNlcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdWJzdGl0dXRlVXJpID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX3N1YnN0aXR1dGVOYW1lc3BhY2VzLmdldCggdXJpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0ZVVyaSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3FuYW1lQ2FjaGUuZ2V0TmFtZSggc3Vic3RpdHV0ZVVyaSwgbG9jYWwgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIF9xbmFtZUNhY2hlLmdldE5hbWUoIHVyaSwgbG9jYWwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUU5hbWUgY2hlY2tOYW1lICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3Vic3RpdHV0ZU5hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZVVyaSA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICBfc3Vic3RpdHV0ZU5hbWVzcGFjZXMuZ2V0KCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0ZVVyaSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBfcW5hbWVDYWNoZS5nZXROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGVVcmksIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBjaGVja05hbWVBdHRyICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdWJzdGl0dXRlTmFtZXNwYWNlcyAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVVcmkgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBfc3Vic3RpdHV0ZU5hbWVzcGFjZXMuZ2V0KCB1cmkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRlVXJpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcW5hbWVDYWNoZS5nZXROYW1lKCBzdWJzdGl0dXRlVXJpLCBsb2NhbCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gX3FuYW1lQ2FjaGUuZ2V0TmFtZSggdXJpLCBsb2NhbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBjaGVja05hbWVBdHRyICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3Vic3RpdHV0ZU5hbWVzcGFjZXMgIT0gbnVsbCAmJiBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVVcmkgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgX3N1YnN0aXR1dGVOYW1lc3BhY2VzLmdldCggbmFtZS5nZXROYW1lc3BhY2VVUkkoKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGVVcmkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgX3FuYW1lQ2FjaGUuZ2V0TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRlVXJpLCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZG9jdHlwZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yb290Ll9wcm9wcy5zZXREb2N0eXBlTmFtZSggbmFtZSApOwotICAgICAgICAgICAgX3Jvb3QuX3Byb3BzLnNldERvY3R5cGVQdWJsaWNJZCggcHVibGljSUQgKTsKLSAgICAgICAgICAgIF9yb290Ll9wcm9wcy5zZXREb2N0eXBlU3lzdGVtSWQoIHN5c3RlbUlEICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0QmVnaW4gKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UpCi0gICAgICAgICAgICAgICAgc3RyaXBMZWFkaW5nV2hpdGVzcGFjZSgpOwotCi0gICAgICAgICAgICBpZiAoX2Zyb250aWVyLmlzRG9jKCkgJiYgIV9kb2NFbGVtRGlzY2FyZGVkICYmCi0gICAgICAgICAgICAgICAgICAgIChfZGlzY2FyZERvY0VsZW0gfHwgaXNYbWxGcmFnbWVudCggbmFtZSApKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZG9jRWxlbURpc2NhcmRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3JlcGxhY2VEb2NFbGVtID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGNvbnRlbnQgdXAgdG8gbm93IGJlY2F1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50IGVsZW1lbnQgaXMgdG8gYmUgcmVtb3ZlZCwgYW5kIEkgZG9udAotICAgICAgICAgICAgICAgICAgICAvLyB3YW50IHRoYXQgY29udGVudCB0byBtaXggd2l0aCB0aGUgcmVhbCBjb250ZW50LgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QuZW5zdXJlRW1wdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9yb290Ll9kb2M7Ci0gICAgICAgICAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgX2Zyb250aWVyID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuYW1lID0gX3JlcGxhY2VEb2NFbGVtOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnNlcnQoIF9mcm9udGllciA9IG5ldyBCZWdpbiggbmFtZSwgX2Zyb250aWVyICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYmVnaW4gKCBTdHJpbmcgbG9jYWwsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnNlcnRCZWdpbiggY2hlY2tOYW1lKCBsb2NhbCwgdXJpICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYmVnaW4gKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zZXJ0QmVnaW4oIGNoZWNrTmFtZSggbmFtZSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVuZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UpCi0gICAgICAgICAgICAgICAgc3RyaXBMZWFkaW5nV2hpdGVzcGFjZSgpOwotCi0gICAgICAgICAgICBpZiAoX2Zyb250aWVyLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFfZG9jRWxlbURpc2NhcmRlZCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIlRvbyBtYW55IGVuZCBlbGVtZW50cyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2Zyb250aWVyLmlzQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIV9mcm9udGllci5pc0xlYWYoKTsKLQotICAgICAgICAgICAgICAgIGlmIChfbGFzdE5vbkF0dHIgPT0gX2Zyb250aWVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9mcm9udGllcjsKLSAgICAgICAgICAgICAgICAgICAgX2xhc3RQb3MgPSAxICsgX2Zyb250aWVyLmdldENjaCgpOwotICAgICAgICAgICAgICAgICAgICBfZnJvbnRpZXIudG9nZ2xlSXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBfZnJvbnRpZXIuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgX2Zyb250aWVyLmFkanVzdENjaEFmdGVyKCAtIGNjaCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBfZnJvbnRpZXI7Ci0gICAgICAgICAgICAgICAgICAgIEVuZCBlID0gbmV3IEVuZCggYiApOwotICAgICAgICAgICAgICAgICAgICBiLl9lbmQgPSBlOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnQoIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfZnJvbnRpZXIgPSBfZnJvbnRpZXIuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGF0dHIgKCBRTmFtZSBuYW1lLCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zZXJ0KCBuZXcgQXR0ciggY2hlY2tOYW1lQXR0ciggbmFtZSApICksIGJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXR0ciAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc2VydCggbmV3IEF0dHIoIGNoZWNrTmFtZUF0dHIoIG5hbWUgKSApLCB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhdHRyICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnNlcnQoIG5ldyBBdHRyKCBjaGVja05hbWVBdHRyKCBsb2NhbCwgdXJpICkgKSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaXNjYXJkWG1sbnMgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgX2RvY0VsZW1EaXNjYXJkZWQgJiYgX2Zyb250aWVyLmlzRG9jKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIF9vcGVuRnJhZ1VyaSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB4bWxucyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gY2hlY2tOYW1lKCBwcmVmaXgsIHVyaSApOwotCi0gICAgICAgICAgICBpZiAoIWRpc2NhcmRYbWxucyggbmFtZSApKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFhtbG5zKCBuYW1lICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgeG1sbnMgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFtZSA9IGNoZWNrTmFtZSggbmFtZSApOwotCi0gICAgICAgICAgICBpZiAoIWRpc2NhcmRYbWxucyggbmFtZSApKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFhtbG5zKCBuYW1lICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tbWVudCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9zdHJpcENvbW1lbnRzKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IENvbW1lbnQoKSwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjb21tZW50ICggU3RyaW5nIHZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfc3RyaXBDb21tZW50cykKLSAgICAgICAgICAgICAgICBpbnNlcnQoIG5ldyBDb21tZW50KCksIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHByb2NpbnN0ICggU3RyaW5nIHRhcmdldCwgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmlwUHJvY2luc3RzKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFByb2NpbnN0KCB0YXJnZXQgKSwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwcm9jaW5zdCAoIFN0cmluZyB0YXJnZXQsIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmlwUHJvY2luc3RzKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFByb2NpbnN0KCB0YXJnZXQgKSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIHJldHVybnMgdGhlIGNwIHdoZXJlIG5ldyB0ZXh0IHNob3VsZCBnby4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgcHJlVGV4dCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0KLSAgICAgICAgICAgIHJldHVybiBnZXRDcCggX2xhc3ROb25BdHRyICkgKyBfbGFzdE5vbkF0dHIuZ2V0Q2NoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBOZXcgdGV4dCBoYXMgYmVlbiBwbGFjZWQsIGFkanVzdC4uLgotICAgICAgICAvLwotCi0gICAgICAgIHZvaWQgcG9zdFRleHQgKCBpbnQgY3AsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSAmJiBfbGFzdE5vbkF0dHIuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBvZmYgPSBfcm9vdC5fdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKTsKLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggaSA8IGNjaCAmJiBpc1doaXRlU3BhY2UoIF9yb290Ll90ZXh0Ll9idWZbIG9mZiArIGkgXSApICkKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QuX3RleHQucmVtb3ZlKCBjcCwgaSApOwotICAgICAgICAgICAgICAgICAgICBjY2ggLT0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBfbGFzdE5vbkF0dHI7Ci0gICAgICAgICAgICAgICAgX2xhc3RQb3MgPSBfbGFzdE5vbkF0dHIuZ2V0RW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyLmFkanVzdENjaEFmdGVyKCBjY2ggKTsKLQotICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGV4dCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLQotICAgICAgICAgICAgaW50IHN0YXJ0ID0gb2ZmOwotICAgICAgICAgICAgaW50IGVuZCA9IG9mZiArIGNjaDsKLQotICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UgJiYgX2xhc3ROb25BdHRyLmdldENjaEFmdGVyKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIHN0YXJ0IDwgZW5kICYmIGlzV2hpdGVTcGFjZSggYnVmWyBzdGFydCBdICkgKQotICAgICAgICAgICAgICAgICAgICBzdGFydCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2NoVGV4dCA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpZiAoY2NoVGV4dCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9sYXN0Tm9uQXR0cjsKLSAgICAgICAgICAgICAgICBfbGFzdFBvcyA9IF9sYXN0Tm9uQXR0ci5nZXRFbmRQb3MoKTsKLQotICAgICAgICAgICAgICAgIF9yb290Ll90ZXh0Lmluc2VydCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3AoIF9sYXN0Tm9uQXR0ciApICsgX2xhc3ROb25BdHRyLmdldENjaCgpLAotICAgICAgICAgICAgICAgICAgICBidWYsIHN0YXJ0LCBjY2hUZXh0ICk7Ci0KLSAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuYWRqdXN0Q2NoQWZ0ZXIoIGNjaFRleHQgKTsKLSAgICAgICAgICAgICAgICBhZGp1c3RDY2goIF9sYXN0Tm9uQXR0ciwgY2NoVGV4dCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0ZXh0ICggU3RyaW5nIHRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLQotICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGludCBlbmQgPSB0ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSAmJiBfbGFzdE5vbkF0dHIuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggc3RhcnQgPCBlbmQgJiYgaXNXaGl0ZVNwYWNlKCB0ZXh0LmNoYXJBdCggc3RhcnQgKSApICkKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNjaFRleHQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaWYgKGNjaFRleHQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBfbGFzdE5vbkF0dHI7Ci0gICAgICAgICAgICAgICAgX2xhc3RQb3MgPSBfbGFzdE5vbkF0dHIuZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgIGdldENwKCBfbGFzdE5vbkF0dHIgKSArIF9sYXN0Tm9uQXR0ci5nZXRDY2goKSwKLSAgICAgICAgICAgICAgICAgICAgdGV4dCwgc3RhcnQsIGNjaFRleHQgKTsKLQotICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ci5hZGp1c3RDY2hBZnRlciggY2NoVGV4dCApOwotICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBjY2hUZXh0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbm5vdGF0ZXMgdGhlIGxhc3QgdGhpbmcgaW5zZXJ0ZWQKLSAgICAgICAgdm9pZCBhbm5vdGF0ZSAoIFhtbEJvb2ttYXJrIHhtbEJvb2ttYXJrICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEFubm90YXRpb24oIF9yb290LCB4bWxCb29rbWFyayApLgotICAgICAgICAgICAgICAgIHNldCggX2xhc3RTcGxheSwgX2xhc3RQb3MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbGluZU51bWJlckFubm90YXRpb24gKCBpbnQgbGluZSwgaW50IGNvbHVtbiwgaW50IG9mZnNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFubm90YXRlKCBuZXcgWG1sTGluZU51bWJlciggbGluZSwgY29sdW1uLCBvZmZzZXQgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBsaW5lTnVtYmVyQW5ub3RhdGlvbiAoIFhNTEV2ZW50IHhlICkKLSAgICAgICAgewotICAgICAgICAgICAgTG9jYXRpb24gbG9jID0geGUuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKGxvYyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgICAgICBsb2MuZ2V0TGluZU51bWJlcigpLCBsb2MuZ2V0Q29sdW1uTnVtYmVyKCksIC0xICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGphdmVsaW5Bbm5vdGF0aW9uICggWG1sQ3Vyc29yLlhtbEJvb2ttYXJrIGphICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGphICE9IG51bGwpCi0gICAgICAgICAgICAgICBhbm5vdGF0ZSggamEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUm9vdCAgICAgICBfcm9vdDsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgIF9sYXN0Tm9uQXR0cjsKLSAgICAgICAgcHJpdmF0ZSBDb250YWluZXIgIF9mcm9udGllcjsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgIF9sYXN0U3BsYXk7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgICAgICBfbGFzdFBvczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9maW5pc2hlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9kaXNjYXJkRG9jRWxlbTsKLSAgICAgICAgcHJpdmF0ZSBRTmFtZSAgICAgIF9yZXBsYWNlRG9jRWxlbTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9zdHJpcFdoaXRlc3BhY2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICBfc3RyaXBDb21tZW50czsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9zdHJpcFByb2NpbnN0czsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9kb2NFbGVtRGlzY2FyZGVkOwotICAgICAgICBwcml2YXRlIE1hcCAgICAgICAgX3N1YnN0aXR1dGVOYW1lc3BhY2VzOwotICAgICAgICBwcml2YXRlIE1hcCAgICAgICAgX2FkZGl0aW9uYWxOYW1lc3BhY2VzOwotICAgICAgICBwcml2YXRlIFFOYW1lQ2FjaGUgX3FuYW1lQ2FjaGU7Ci0gICAgICAgIHByaXZhdGUgWG1sT3B0aW9ucyBfb3B0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE5vZGVDaGlsZHJlbiAoIE5vZGUgbiwgTG9hZENvbnRleHQgY29udGV4dCApCi0gICAgewotICAgICAgICBmb3IgKCBOb2RlIGMgPSBuLmdldEZpcnN0Q2hpbGQoKSA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldE5leHRTaWJsaW5nKCkgKQotICAgICAgICAgICAgbG9hZE5vZGUoIGMsIGNvbnRleHQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE5vZGUgKCBOb2RlIG4sIExvYWRDb250ZXh0IGNvbnRleHQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoICggbi5nZXROb2RlVHlwZSgpICkKLSAgICAgICAgewotICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6Ci0gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxvYWROb2RlQ2hpbGRyZW4oIG4sIGNvbnRleHQgKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBuLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgbG9jYWxOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZXh0LmJlZ2luKCBsb2NhbE5hbWUsIG4uZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLQotICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKSA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9kZSBhID0gYXR0cnMuaXRlbSggaSApOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGEuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gYS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhLmdldE5vZGVWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvY2FsID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsID0gYS5nZXROb2RlTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5lcXVhbHMoIF94bWxuc1VyaSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInhtbG5zIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC54bWxucyggIiIsIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQueG1sbnMoIGxvY2FsLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmF0dHIoIGxvY2FsLCB1cmksIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2FkTm9kZUNoaWxkcmVuKCBuLCBjb250ZXh0ICk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQuZW5kKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC50ZXh0KCBuLmdldE5vZGVWYWx1ZSgpICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5jb21tZW50KCBuLmdldE5vZGVWYWx1ZSgpICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5wcm9jaW5zdCggbi5nZXROb2RlTmFtZSgpLCBuLmdldE5vZGVWYWx1ZSgpICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOgotICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgbm9kZSIgKTsKLSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBsb2FkWG1sICggTm9kZSBub2RlLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHRoaXMsIG9wdGlvbnMgKTsKLQotICAgICAgICBsb2FkTm9kZSggbm9kZSwgY29udGV4dCApOwotCi0gICAgICAgIGFzc29jaWF0ZVNvdXJjZU5hbWUoIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gYXV0b1R5cGVkRG9jdW1lbnQoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGxvYWRYbWwgKAotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9hZFhtbElucHV0U3RyZWFtKCB4aXMsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gYXV0b1R5cGVkRG9jdW1lbnQoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkWG1sSW5wdXRTdHJlYW0gKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKLQotICAgICAgICBYTUxFdmVudCB4ID0geGlzLnBlZWsoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwIG5zTWFwID0gKChTdGFydEVsZW1lbnQpIHgpLmdldE5hbWVzcGFjZU1hcCgpOwotCi0gICAgICAgICAgICBpZiAobnNNYXAgIT0gbnVsbCAmJiBuc01hcC5zaXplKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnB1dEFsbCggbnNNYXAgKTsKLQotICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOwotCi0gICAgICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuTE9BRF9BRERJVElPTkFMX05BTUVTUEFDRVMsIG5hbWVzcGFjZXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHRoaXMsIG9wdGlvbnMgKTsKLQotICAgICAgICBib29sZWFuIGxpbmVOdW1zID0gb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuTE9BRF9MSU5FX05VTUJFUlMgKTsKLQotICAgICAgICBldmVudHM6Ci0gICAgICAgIGZvciAoIFhNTEV2ZW50IHhlID0geGlzLm5leHQoKSA7IHhlICE9IG51bGwgOyB4ZSA9IHhpcy5uZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCB4ZS5nZXRUeXBlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVCA6Ci0gICAgICAgICAgICAgICAgLy8gQlVHQlVHIChlcmljdmFzKSAxMjI1OCAtIEZJWEVEIGJlbG93Ci0gICAgICAgICAgICAgICAgU3RhcnREb2N1bWVudCBkb2MgPSAoU3RhcnREb2N1bWVudCkgeGU7Ci0KLS8vICAgICAgICAgICAgICAgIGNvbnRleHQuZG9jdHlwZSgKLS8vICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0bmFtZSgpLmdldExvY2FsTmFtZSgpLAotLy8gICAgICAgICAgICAgICAgICAgICIiLCBkb2MuZ2V0UHVibGljSWQoKQotCi0gICAgICAgICAgICAgICAgX3Byb3BzLnNldERvY3R5cGVTeXN0ZW1JZCggZG9jLmdldFN5c3RlbUlkKCkgKTsKLS8vICAgICAgICAgICAgICAgIF9wdWJsaWNJRCA9IGRvYy5nZXRQdWJsaWNJZCgpOwotICAgICAgICAgICAgICAgIF9wcm9wcy5zZXRFbmNvZGluZyggZG9jLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgKTsKLSAgICAgICAgICAgICAgICBfcHJvcHMuc2V0VmVyc2lvbiggZG9jLmdldFZlcnNpb24oKSApOwotICAgICAgICAgICAgICAgIF9zdGFuZEFsb25lID0gZG9jLmlzU3RhbmRhbG9uZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuRU5EX0RPQ1VNRU5UIDoKLSAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZU51bWJlckFubm90YXRpb24oIHhlICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhayBldmVudHM7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuTlVMTF9FTEVNRU5UIDoKLSAgICAgICAgICAgICAgICBpZiAoIXhpcy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGV2ZW50czsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UIDoKLSAgICAgICAgICAgICAgICBjb250ZXh0LmJlZ2luKCBYTUxOYW1lSGVscGVyLmdldFFOYW1lKCB4ZS5nZXROYW1lKCkgKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotCi0gICAgICAgICAgICAgICAgZm9yICggQXR0cmlidXRlSXRlcmF0b3IgYWkgPSAoKFN0YXJ0RWxlbWVudCkgeGUpLmdldEF0dHJpYnV0ZXMoKQotICAgICAgICAgICAgICAgICAgICAgIDsgYWkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hdHRyKAotICAgICAgICAgICAgICAgICAgICAgICAgWE1MTmFtZUhlbHBlci5nZXRRTmFtZSggYXR0ci5nZXROYW1lKCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIEF0dHJpYnV0ZUl0ZXJhdG9yIGFpID0gKChTdGFydEVsZW1lbnQpIHhlKS5nZXROYW1lc3BhY2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICA7IGFpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYWkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIFhNTE5hbWUgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBuYW1lLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldFByZWZpeCgpID09IG51bGwgJiYgbG9jYWwuZXF1YWxzKCAieG1sbnMiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9ICIiOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQueG1sbnMoIGxvY2FsLCBhdHRyLmdldFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTkRfRUxFTUVOVCA6Ci0gICAgICAgICAgICAgICAgY29udGV4dC5lbmQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtcykKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNQQUNFIDoKLSAgICAgICAgICAgICAgICBpZiAoKChTcGFjZSkgeGUpLmlnbm9yYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkID0gKENoYXJhY3RlckRhdGEpIHhlOwotCi0gICAgICAgICAgICAgICAgaWYgKGNkLmhhc0NvbnRlbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGV4dCggY2QuZ2V0Q29udGVudCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5DT01NRU5UIDoKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ29tbWVudCBjb21tZW50ID0KLSAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Db21tZW50KSB4ZTsKLQotICAgICAgICAgICAgICAgIGlmIChjb21tZW50Lmhhc0NvbnRlbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY29tbWVudCggY29tbWVudC5nZXRDb250ZW50KCkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT04gOgotICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwcm9jSW5zdHIgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSB4ZTsKLQotICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2luc3QoIHByb2NJbnN0ci5nZXRUYXJnZXQoKSwgcHJvY0luc3RyLmdldERhdGEoKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBpZ25vcmVkCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkVOVElUWV9SRUZFUkVOQ0UgOgotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORyA6Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORyA6Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNIQU5HRV9QUkVGSVhfTUFQUElORyA6Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlhNTF9FVkVOVCA6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIHhtbCBldmVudCB0eXBlOiAiICsgeGUuZ2V0VHlwZUFzU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQuZmluaXNoKCk7Ci0KLSAgICAgICAgYXNzb2NpYXRlU291cmNlTmFtZSggb3B0aW9ucyApOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgICAgICBhc3NlcnQgaXNMZWZ0T25seSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sT2JqZWN0IHggKQotICAgIHsKLSAgICAgICAgZHVtcCggeCwgU3lzdGVtLm91dCApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sT2JqZWN0IHgsIFByaW50U3RyZWFtIHBzICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciB4YyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIFJvb3QgciA9ICgoQ3Vyc29yKSB4YykuZ2V0Um9vdCgpOwotICAgICAgICByLmR1bXAoIHBzLCBudWxsLCAoKEN1cnNvcikgeGMpLmdldFNwbGF5KCksIGZhbHNlICk7Ci0gICAgICAgIHhjLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCAoIFhtbEN1cnNvciB4YyApCi0gICAgewotICAgICAgICBkdW1wKCB4YywgU3lzdGVtLm91dCApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sQ3Vyc29yIHhjLCBQcmludFN0cmVhbSBwcyApCi0gICAgewotICAgICAgICBSb290IHIgPSAoKEN1cnNvcikgeGMpLmdldFJvb3QoKTsKLSAgICAgICAgci5kdW1wKCBwcywgbnVsbCwgKChDdXJzb3IpIHhjKS5nZXRTcGxheSgpLCBmYWxzZSApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBUZXh0ICggUHJpbnRTdHJlYW0gcHMsIGludCBjcCwgaW50IGNjaCwgU3BsYXkgcywgaW50IHAgKQotICAgIHsKLSAgICAgICAgaWYgKGNwID49IDAgJiYgY3AgKyBjY2ggPD0gX3RleHQubGVuZ3RoKCkpCi0gICAgICAgICAgICBkdW1wU3RyaW5nKCBwcywgX3RleHQuZmV0Y2goIGNwLCBjY2ggKSwgcywgcCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcy5wcmludCggIltzdHJpbmc6IGNwPSIgKyBjcCArICIsIGNjaD0iICsgY2NoICsgIiBdIiApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wVGV4dCAoIFByaW50U3RyZWFtIHBzLCBpbnQgY3AsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgaWYgKGNwID49IDAgJiYgY3AgKyBjY2ggPD0gX3RleHQubGVuZ3RoKCkpCi0gICAgICAgICAgICBkdW1wU3RyaW5nKCBwcywgX3RleHQuZmV0Y2goIGNwLCBjY2ggKSwgbnVsbCwgMCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcy5wcmludCggIltzdHJpbmc6IGNwPSIgKyBjcCArICIsIGNjaD0iICsgY2NoICsgIiBdIiApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wU3RyaW5nICggUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBzICkKLSAgICB7Ci0gICAgICAgIGR1bXBTdHJpbmcoIHBzLCBzLCBudWxsLCAwICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBHb29iZXJzSW5saW5lICggUHJpbnRTdHJlYW0gcHMsIFNwbGF5IHMsIGludCBwICkKLSAgICB7Ci0gICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IENVUlNPUiAmJiBnLmdldFBvcygpID09IHApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3Vyc29yR29vYmVyIGNnID0gKEN1cnNvckdvb2JlcikgZzsKLQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiWyIgKyAoKEN1cnNvckdvb2JlcikgZykuZ2V0RGVidWdJZCgpICsgIl0iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHVtcFN0cmluZyAoIFByaW50U3RyZWFtIHBzLCBTdHJpbmcgc3RyLCBTcGxheSBzLCBpbnQgcCApCi0gICAgewotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgc3RyLmxlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkdW1wR29vYmVyc0lubGluZSggcHMsIHMsIGkgKyBwICk7Ci0KLSAgICAgICAgICAgIGlmIChpID09IDM2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiLi4uIiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdCggaSApOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlxcbiIgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdccicpCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcXHIiICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHQnKQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXFx0IiApOwotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1wiJykKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlxcXCIiICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoIGNoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHVtcEdvb2JlcnMgKCBQcmludFN0cmVhbSBwcywgR29vYmVyIGcgKQotICAgIHsKLSAgICAgICAgaWYgKGcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gQUdHUkVHQVRFKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcy5wcmludCggIiB7IiApOwotICAgICAgICAgICAgZHVtcEdvb2JlcnMoIHBzLCBnLl9nb29iZXJzICk7Ci0gICAgICAgICAgICBwcy5wcmludCggIn0iICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHMucHJpbnQoICIgLSAiICsgZy5nZXRLaW5kTmFtZSgpICsgIiBwb3M6ICIgKyBnLmdldFBvcygpICk7Ci0KLSAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IENVUlNPUikKLSAgICAgICAgICAgIHBzLnByaW50KCAiIGlkOiAiICsgKChDdXJzb3JHb29iZXIpIGcpLmdldERlYnVnSWQoKSApOwotCi0gICAgICAgIGlmIChnLl9uZXh0ICE9IGcuX3BhcmVudC5fZ29vYmVycykKLSAgICAgICAgICAgIGR1bXBHb29iZXJzKCBwcywgZy5fbmV4dCApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wU3BsYXlUcmVlKCBTcGxheSBzLCBQcmludFN0cmVhbSBwcyApCi0gICAgewotICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChzLl9yaWdodFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICBkdW1wU3BsYXlUcmVlKCBzLl9yaWdodFNwbGF5LCBwcyApOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHQgPSBzLl9wYXJlbnRTcGxheSA7IHQgIT0gbnVsbCA7IHQgPSB0Ll9wYXJlbnRTcGxheSApCi0gICAgICAgICAgICBwcy5wcmludCggIiAgIiApOwotCi0gICAgICAgIHBzLnByaW50KCAiWyIgKyBzLmdldERlYnVnSWQoKSApOwotICAgICAgICBwcy5wcmludCggIiBjOiIgKyBzLmdldENjaExlZnQoKSArICIoIiArIHMuZ2V0Q2NoKCkgKyAiKSIpOwotICAgICAgICBwcy5wcmludCggIiBiOiIgKyBzLmdldENkb2NCZWdpbkxlZnQoKSArICIoIiArIHMuZ2V0Q2RvY0JlZ2luKCkgKyAiKSIpOwotCi0gICAgICAgIGlmIChzLl9wYXJlbnRTcGxheSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcy5wcmludCggIiBwOiIgKyBzLl9wYXJlbnRTcGxheS5nZXREZWJ1Z0lkKCkgKTsKLSAgICAgICAgICAgIHBzLnByaW50KCBzLl9wYXJlbnRTcGxheS5fbGVmdFNwbGF5ID09IHMgPyAiTCIgOiAiUiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBzLnByaW50bG4oICJdIiApOwotCi0gICAgICAgIGlmIChzLl9sZWZ0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgIGR1bXBTcGxheVRyZWUoIHMuX2xlZnRTcGxheSwgcHMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCAoIFhtbEN1cnNvciBjLCBib29sZWFuIHZlcmJvc2UgKQotICAgIHsKLSAgICAgICAgKChDdXJzb3IpIGMpLmR1bXAoIHZlcmJvc2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wICggKQotICAgIHsKLSAgICAgICAgZHVtcCggU3lzdGVtLm91dCwgbnVsbCwgdGhpcywgZmFsc2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wICggYm9vbGVhbiB2ZXJib3NlICkKLSAgICB7Ci0gICAgICAgIGR1bXAoIFN5c3RlbS5vdXQsIG51bGwsIHRoaXMsIHZlcmJvc2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wICggUHJpbnRTdHJlYW0gcHMgKQotICAgIHsKLSAgICAgICAgZHVtcCggcHMsIG51bGwsIHRoaXMsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHVtcCAoIFByaW50U3RyZWFtIHBzLCBTdHJpbmcgbXNnLCBPYmplY3Qgc3JjLCBib29sZWFuIHZlcmJvc2UgKQotICAgIHsKLSAgICAgICAgLy8gVW5kZXIgSW50ZWxsaUosIGlmIHlvdSBjYWxsIGEgZnVuY3Rpb24gZnJvbSB0aGUgZXhwcmVzc2lvbgotICAgICAgICAvLyBldmFsdWF0b3IgYW5kIGl0IHByb2R1Y2VzIHRvbyBtdWNoIG91dHB1dCwgSW50ZWxsaUogd2lsbCBub3QKLSAgICAgICAgLy8gc2hvdyB5b3UgdGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24uICBTbywgSSBkdW1wIHRvIGEgZmlsZQotICAgICAgICAvLyBoZXJlIGFzIHdlbGwgYW5kIHRoZSBnaXZlbiBwcmludCBzdHJlYW0hCi0KLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoICJjOlxcIiApOwotCi0gICAgICAgIGlmIChmLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmID0gbmV3IEZpbGUoIGYsICJ4YmVhbi5kbXAiICk7Ci0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0gICAgICAgICAgICBQcmludFN0cmVhbSBwczIgPSBudWxsOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmICk7Ci0gICAgICAgICAgICAgICAgcHMyID0gbmV3IFByaW50U3RyZWFtKCBvcyApOwotCi0gICAgICAgICAgICAgICAgZG9EdW1wKCBwczIsIG1zZywgc3JjLCB2ZXJib3NlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHMyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwczIucHJpbnRsbiggIkV4Y2VwdGlvbiBkdXJpbmcgZHVtcC4iICk7Ci0gICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCBwczIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeSB7IG9zLmNsb3NlKCk7IH0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRvRHVtcCggcHMsIG1zZywgc3JjLCB2ZXJib3NlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4Y2VwdGlvbiBkdXJpbmcgZHVtcC4iICk7Ci0gICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSggU3lzdGVtLm91dCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIER1bXBOc01hbmFnZXIgaW1wbGVtZW50cyBOYW1lc3BhY2VNYW5hZ2VyCi0gICAgewotICAgICAgICBEdW1wTnNNYW5hZ2VyICggUHJpbnRTdHJlYW0gcHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnBzID0gcHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSAoIFN0cmluZyB1cmksIFN0cmluZyBzdWdnZXN0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJkZWJ1Z19wcmVmaXhfIiArIGkrKzsKLQotICAgICAgICAgICAgcHMucHJpbnQoICIgW2ZpbmRfcHJlZml4X2Zvcl9uc3VyaTogIiApOwotICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKyB1cmkgKyAiXCIgKCIgKyBzdWdnZXN0aW9uICsgIikgLT4gIiArIHByZWZpeCApOwotICAgICAgICAgICAgcHMucHJpbnQoICJdIiApOwotCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoICJ4bWwiICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIF94bWwxOTk4VXJpOwotCi0gICAgICAgICAgICBTdHJpbmcgdXJpID0gImRlYnVnX25zXyIgKyBpKys7Ci0KLSAgICAgICAgICAgIHBzLnByaW50KCAiIFtsb29rdXBfbnN1cmlfZm9yX3ByZWZpeDogIiApOwotICAgICAgICAgICAgcHMucHJpbnQoIHByZWZpeCArICIgLT4gXCIiICsgdXJpICsgIlwiIiApOwotICAgICAgICAgICAgcHMucHJpbnQoICJdIiApOwotCi0gICAgICAgICAgICByZXR1cm4gdXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJpbnRTdHJlYW0gcHM7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgaSA9IDE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9EdW1wICgKLSAgICAgICAgUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBtc2csIE9iamVjdCBzcmMsIGJvb2xlYW4gdmVyYm9zZSApCi0gICAgewotICAgICAgICBpZiAoIV9hc3NlcnRFbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCAiTm8gZHVtcCBwcm9kdWNlZCAoYXNzZXJ0IG5lZWRzIHRvIGJlIGVuYWJsZWQpIiApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTmFtZXNwYWNlTWFuYWdlciBuc20gPSBuZXcgRHVtcE5zTWFuYWdlciggcHMgKTsKLQotICAgICAgICBpZiAobXNnICE9IG51bGwpCi0gICAgICAgICAgICBwcy5wcmludGxuKCBtc2cgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHMucHJpbnRsbiggIkR1bXA6IiApOwotCi0gICAgICAgIGlmIChzcmMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIEN1cnNvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcy5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAiICBmcm9tIGN1cnNvciAiICsgKChDdXJzb3JHb29iZXIpKChDdXJzb3IpIHNyYykuX2RhdGEuX2dvb2JlcikuZ2V0RGVidWdJZCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBTcGxheSkKLSAgICAgICAgICAgICAgICBwcy5wcmludGxuKCAiICBmcm9tIHNwbGF5ICIgKyAoKFNwbGF5KSBzcmMpLmdldERlYnVnSWQoKSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBzLnByaW50bG4oICIgIGZyb20gc3JjICIgKyBzcmMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkZXB0aCA9IDA7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcyA9IF9kb2MgOyBzICE9IG51bGwgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBraW5kID0gcy5nZXRLaW5kKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBpZHMgPSAiIiArIHMuZ2V0RGVidWdJZCgpOwotICAgICAgICAgICAgaWRzID0gIiAgICAgICAgIi5zdWJzdHJpbmcoIDAsIDYgLSBpZHMubGVuZ3RoKCkgKSArIGlkczsKLSAgICAgICAgICAgIHBzLnByaW50KCBpZHMgKyAiOiAiICk7Ci0KLSAgICAgICAgICAgIGlmIChraW5kID09IEVORCkKLSAgICAgICAgICAgICAgICBkZXB0aC0tOwotCi0gICAgICAgICAgICBpZiAoIXMuaXNSb290KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGRlcHRoIDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICIgICIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZHVtcEdvb2JlcnNJbmxpbmUoIHBzLCBzLCAwICk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBET0MgOgotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiRE9DIiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBzOwotCi0gICAgICAgICAgICAgICAgaWYgKCFiLmlzTGVhZigpKQotICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOwotCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICI8IiApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldE5hbWUoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICI+IiApOwotCi0gICAgICAgICAgICAgICAgaWYgKGIuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYi5nZXRDY2hWYWx1ZSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBUZXh0KCBwcywgcy5nZXRDcFNsb3coKSwgYi5nZXRDY2hWYWx1ZSgpLCBzLCAxICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZHVtcEdvb2JlcnNJbmxpbmUoIHBzLCBzLCBzLmdldFBvc0xlYWZFbmQoKSApOwotCi0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPC8iICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIi8+IiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEFUVFIgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiI3htbG5zOiIgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIHMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPVwiIiApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJAIiApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICI9XCIiICk7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBUZXh0KCBwcywgcy5nZXRDcFNsb3coKSwgcy5nZXRDY2hWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgRU5EIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmQgZXMgPSAoRW5kKSBzOwotICAgICAgICAgICAgICAgIEJlZ2luIGIgPSBlcy5fYmVnaW47Ci0KLSAgICAgICAgICAgICAgICBwcy5wcmludCggIjwvIiApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCBiLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiLz4iICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBDT01NRU5UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0ZyYWdtZW50KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIkZSQUciICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPCEtLSIgKTsKLSAgICAgICAgICAgICAgICAgICAgZHVtcFRleHQoIHBzLCBzLmdldENwU2xvdygpLCBzLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICItLT4iICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFBST0NJTlNUIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIjw/IiApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldExvY2FsKCkgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIiAiICk7Ci0gICAgICAgICAgICAgICAgZHVtcFRleHQoIHBzLCBzLmdldENwU2xvdygpLCBzLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIj8+IiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFJPT1QgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiUk9PVCIgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVua25vd24gc3BsYXkga2luZCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLQotICAgICAgICAgICAgICAgIGR1bXBUZXh0KAotICAgICAgICAgICAgICAgICAgICBwcywgcy5nZXRDcFNsb3coKSArIHMuZ2V0Q2NoVmFsdWUoKSwgcy5nZXRDY2hBZnRlcigpLAotICAgICAgICAgICAgICAgICAgICBzLCBzLmdldFBvc0FmdGVyKCkgKTsKLQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGR1bXBHb29iZXJzSW5saW5lKCBwcywgcywgcy5nZXRFbmRQb3MoKSApOwotCi0gICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzLnBlZWtUeXBlKCkuYnVpbGRfdGV4dCggbnNtICk7Ci0KLSAgICAgICAgICAgICAgICBwcy5wcmludCggIiBbaW52YWxpZDoiICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLSAgICAgICAgICAgICAgICBkdW1wU3RyaW5nKCBwcywgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZHVtcEdvb2JlcnMoIHBzLCBzLl9nb29iZXJzICk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGIuZ2V0RmluaXNoKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICIgW2VuZDogIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIGIuZ2V0RmluaXNoKCkuZ2V0RGVidWdJZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIl0iICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYi5nZXRDb250YWluZXIoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtjb250YWluZXI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmdldENvbnRhaW5lcigpLmdldERlYnVnSWQoKSArICJdIiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBFTkQgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRW5kIGVzID0gKEVuZCkgczsKLSAgICAgICAgICAgICAgICAgICAgQmVnaW4gYiA9IGVzLl9iZWdpbjsKLQotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIiBbYmVnaW46ICIgKyBiLmdldERlYnVnSWQoKSArICJdIiApOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBzLnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBzLnByaW50bG4oKTsKLQotICAgICAgICBpZiAoZ2V0Q2NoTGVmdCgpID4gX3RleHQubGVuZ3RoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBzLnByaW50bG4oCi0gICAgICAgICAgICAgICAgIlRleHQgYnVmZmVyIGhhcyB0b28gZmV3IGNoYXJhY3RlcnMgKCIgKwotICAgICAgICAgICAgICAgICAgICAoZ2V0Q2NoTGVmdCgpIC0gX3RleHQubGVuZ3RoKCkpICsgIikiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZ2V0Q2NoTGVmdCgpIDwgX3RleHQubGVuZ3RoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBzLnByaW50bG4oCi0gICAgICAgICAgICAgICAgIlRleHQgYnVmZmVyIGhhcyB0b28gbWFueSBjaGFyYWN0ZXJzICgiICsKLSAgICAgICAgICAgICAgICAgICAgKF90ZXh0Lmxlbmd0aCgpIC0gZ2V0Q2NoTGVmdCgpKSArICIpOiAiICk7Ci0KLSAgICAgICAgICAgIGR1bXBTdHJpbmcoCi0gICAgICAgICAgICAgICAgcHMsCi0gICAgICAgICAgICAgICAgX3RleHQuZmV0Y2goIGdldENjaExlZnQoKSwgX3RleHQubGVuZ3RoKCkgLSBnZXRDY2hMZWZ0KCkgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBzLnByaW50bG4oICJTcGxheSB0cmVlOiIgKTsKLQotICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgaXNMZWZ0T25seTogIiArIF9sZWZ0T25seSApOwotICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgdmVyc2lvbjogIiArIGdldFZlcnNpb24oKSApOwotICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgZmlyc3Q6ICIgKyBfZG9jLmdldERlYnVnSWQoKSApOwotCi0gICAgICAgICAgICBwcy5wcmludGxuKCk7Ci0gICAgICAgICAgICBkdW1wU3BsYXlUcmVlKCB0aGlzLCBwcyApOwotICAgICAgICAgICAgcHMucHJpbnRsbigpOwotICAgICAgICAgICAgcHMucHJpbnRsbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHMucHJpbnRsbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCBhIHNwbGF5IChvciBzcGxheXMpIGludG8gdGhlIHRyZWUuICBUaGlzIGlzIGEgbG93IGxldmVsCi0gICAgICogb3BlcmF0aW9uLCBhbmQgb3BlcmF0ZXMgb25seSBvbiB0aGUgc3BsYXkgYXNwZWN0IG9mIHRoZSB0cmVlLgotICAgICAqIEFueSBpbnZhbGlkYXRpb24gbWFpbnRlbmFuY2UgbXVzdCBiZSBoYW5kbGVkIGJ5IGNhbGxlcnMuCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydFNwbGF5ICggU3BsYXkgcywgU3BsYXkgYSApCi0gICAgewotICAgICAgICBhc3NlcnQgcyAhPSBudWxsOwotICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0gICAgICAgIGFzc2VydCBhICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCB2YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgIWEuaXNSb290KCk7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBhLmdldFJvb3RTbG93KCkgPT0gdGhpczsKLSAgICAgICAgYXNzZXJ0IHMuX3BhcmVudFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBzLl9yaWdodFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBzLl9sZWZ0U3BsYXkgIT0gbnVsbCB8fCBzLmdldENjaExlZnQoKSA9PSAwOwotICAgICAgICBhc3NlcnQgcy5fbGVmdFNwbGF5ICE9IG51bGwgfHwgcy5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gMDsKLQotICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2goKTsKLSAgICAgICAgaW50IGNiZWdpbiA9IHMuZ2V0Q2RvY0JlZ2luKCk7Ci0KLSAgICAgICAgaWYgKHMuX2xlZnRTcGxheSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjY2ggKz0gcy5nZXRDY2hMZWZ0KCk7Ci0gICAgICAgICAgICBjYmVnaW4gKz0gcy5nZXRDZG9jQmVnaW5MZWZ0KCk7Ci0gICAgICAgICAgICBfbGVmdE9ubHkgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfbGVmdE9ubHkgJiYgYSA9PSBfbGVmdFNwbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBzLl9sZWZ0U3BsYXkgPSBfbGVmdFNwbGF5OwotICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSB0aGlzOwotCi0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hMZWZ0KCkgPT0gMDsKLSAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCgKLSAgICAgICAgICAgICAgICBfbGVmdFNwbGF5LmdldENjaExlZnQoKSArIF9sZWZ0U3BsYXkuZ2V0Q2NoKCkgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7Ci0gICAgICAgICAgICBzLmFkanVzdENkb2NCZWdpbkxlZnQoCi0gICAgICAgICAgICAgICAgX2xlZnRTcGxheS5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfbGVmdFNwbGF5LmdldENkb2NCZWdpbigpICk7Ci0KLSAgICAgICAgICAgIF9sZWZ0U3BsYXkuX3BhcmVudFNwbGF5ID0gczsKLSAgICAgICAgICAgIF9sZWZ0U3BsYXkgPSBzOwotCi0gICAgICAgICAgICBhZGp1c3RDY2hMZWZ0KCBjY2ggKTsKLSAgICAgICAgICAgIGFkanVzdENkb2NCZWdpbkxlZnQoIGNiZWdpbiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKF9sZWZ0T25seSAmJiBjY2ggPT0gMCAmJiBjYmVnaW4gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIElmIHRoZSBzcGxheSB0byBpbnNlcnQgaGFzIG5vIGNjaCBvciBjYmVnaW4sIHRoZW4gd2hlbgotICAgICAgICAgICAgLy8gdGhlIHRyZWUgaXMgbGVmdCBvbmx5IGNoaWxkcmVuLCBJIG5lZWQgbm90IHNwbGF5LgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSBhLl9wYXJlbnRTcGxheTsKLSAgICAgICAgICAgIHMuX2xlZnRTcGxheSA9IGE7Ci0gICAgICAgICAgICBhLl9wYXJlbnRTcGxheSA9IHM7Ci0gICAgICAgICAgICBzLl9wYXJlbnRTcGxheS5fbGVmdFNwbGF5ID0gczsKLQotICAgICAgICAgICAgcy5hZGp1c3RDY2hMZWZ0KCBhLmdldENjaExlZnQoKSArIGEuZ2V0Q2NoKCkgKTsKLQotICAgICAgICAgICAgcy5hZGp1c3RDZG9jQmVnaW5MZWZ0KAotICAgICAgICAgICAgICAgIGEuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgYS5nZXRDZG9jQmVnaW4oKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3BsYXkgcDsKLQotICAgICAgICAgICAgaWYgKGEuX3JpZ2h0U3BsYXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAocCA9IGEpLl9yaWdodFNwbGF5ID0gczsKLSAgICAgICAgICAgICAgICBfbGVmdE9ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBwID0gYS5fcmlnaHRTcGxheSA7IHAuX2xlZnRTcGxheSAhPSBudWxsIDsgKQotICAgICAgICAgICAgICAgICAgICBwID0gcC5fbGVmdFNwbGF5OwotCi0gICAgICAgICAgICAgICAgcC5fbGVmdFNwbGF5ID0gczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSBwOwotCi0gICAgICAgICAgICBmb3IgKCBwID0gcyA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBwLl9wYXJlbnRTcGxheTsKLQotICAgICAgICAgICAgICAgIGlmICh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgaWYgKHQuX2xlZnRTcGxheSA9PSBwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdC5hZGp1c3RDY2hMZWZ0KCBjY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgdC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCBjYmVnaW4gKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwID0gdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcy5zcGxheSggdGhpcywgdGhpcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lhbCBpbnNlcnQgdG8gaW5zZXJ0IGEgc2luZ2xlIHNwbGF5IGludG8gYSBsZWZ0b25seSB0cmVlIHdpdGhvdXQKLSAgICAgKiBjYXVzaW5nIHRoZSB0cmVlIHRvIGdvIG5vbiBsZWZ0IG9ubHkuICBCZWNhdXNlIHRoaXMgZG9lcyBub3Qgc3BsYXksCi0gICAgICogZG9pbmcgdGhpcyB0b28gbWFueSB0aW1lcyBjYW4gYmUgdmVyeSBpbmVmZmljaWVudC4KLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGluc2VydFNpbmdsZVNwbGF5U2Fuc1NwbGF5SW5MZWZ0T25seVRyZWUgKCBTcGxheSBzLCBTcGxheSBhICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfbGVmdE9ubHk7Ci0gICAgICAgIGFzc2VydCBzLl9yaWdodFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBzLl9sZWZ0U3BsYXkgPT0gbnVsbDsKLQotICAgICAgICBzLl9sZWZ0U3BsYXkgPSBhOwotICAgICAgICBzLl9wYXJlbnRTcGxheSA9IGEuX3BhcmVudFNwbGF5OwotICAgICAgICBhLl9wYXJlbnRTcGxheS5fbGVmdFNwbGF5ID0gczsKLSAgICAgICAgYS5fcGFyZW50U3BsYXkgPSBzOwotCi0gICAgICAgIHMuYWRqdXN0Q2NoTGVmdCggYS5nZXRDY2hMZWZ0KCkgKyBhLmdldENjaCgpICk7Ci0gICAgICAgIHMuYWRqdXN0Q2RvY0JlZ2luTGVmdCggYS5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBhLmdldENkb2NCZWdpbigpICk7Ci0gICAgICAgIAotICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2goKTsKLSAgICAgICAgaW50IGNiZWdpbiA9IHMuZ2V0Q2RvY0JlZ2luKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBTcGxheSBwID0gcy5fcGFyZW50U3BsYXkgOyBwICE9IG51bGwgOyBwID0gcC5fcGFyZW50U3BsYXkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwLmFkanVzdENjaExlZnQoIGNjaCApOwotICAgICAgICAgICAgcC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCBjYmVnaW4gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBbIGZpcnN0LCBsYXN0ICkgc3BsYXlzIGZyb20gdG90YWwgc2VxdWVuY2U6Ci0gICAgICoKLSAgICAgKiAgICAgQSAtIGZpcnN0IC0gQiAtIHggLSBsYXN0IC0gQwotICAgICAqCi0gICAgICogd2hlcmUgZmlyc3QsIGxhc3QgYW5kIHggYXJlIGluZGl2aWR1YWwgc3BsYXlzIGFuZCBBLCBCIGFuZCBDIGFyZQotICAgICAqIG11bHRpcGxlLCBpbnRlcnZlbmluZyBzcGxheXMuICBSZXR1cm4gdGhlIHJlc3VsdCB3aXRoIHggYXQgdGhlIHRvcAotICAgICAqIGFuZCBmaXJzdCBoaXMgbGVmdCBjaGlsZC4gIFRoaXMgYWxsb3dzIHggdG8gaGF2ZSB0aGUgc3BsYXkKLSAgICAgKiBjaGFyYWN0ZXJpc3RpY3MgZm9yIHRoZSB3aG9sZSByZW1vdmVkIHRyZWUuCi0gICAgICovCi0KLSAgICBTcGxheSByZW1vdmVTcGxheXMgKCBTcGxheSBmaXJzdCwgU3BsYXkgbGFzdCApCi0gICAgewotICAgICAgICBhc3NlcnQgdmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0IGZpcnN0ICE9IGxhc3Q7OwotICAgICAgICBhc3NlcnQgIWZpcnN0LmlzUm9vdCgpOwotICAgICAgICBhc3NlcnQgIWZpcnN0LmlzRG9jKCk7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBmaXJzdC5nZXRSb290U2xvdygpID09IHRoaXM7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBsYXN0LmdldFJvb3RTbG93KCkgPT0gdGhpczsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGZpcnN0LmNvbXBhcmVTbG93KCBsYXN0ICkgPT0gLTE7Ci0gICAgICAgIGFzc2VydCAhbGFzdC5pc1Jvb3QoKSB8fCBsYXN0ID09IHRoaXM7Ci0KLSAgICAgICAgU3BsYXkgeCA9IGxhc3QucHJldlNwbGF5KCk7Ci0KLSAgICAgICAgaWYgKHggPT0gZmlyc3QpCi0gICAgICAgICAgICByZXR1cm4geC5yZW1vdmVTcGxheSggdGhpcyApOwotCi0gICAgICAgIC8vIE1ha2UgdGhlIGRvZyBsZWchCi0KLSAgICAgICAgaWYgKGxhc3QgIT0gdGhpcykKLSAgICAgICAgICAgIGxhc3Quc3BsYXkoIHRoaXMsIHRoaXMgKTsKLQotICAgICAgICB4LnNwbGF5KCB0aGlzLCBsYXN0ICk7Ci0gICAgICAgIGZpcnN0LnNwbGF5KCB0aGlzLCB4ICk7Ci0KLSAgICAgICAgYXNzZXJ0IHRoaXMgPT0gbGFzdCB8fCB0aGlzLl9sZWZ0U3BsYXkgPT0gbGFzdDsKLSAgICAgICAgYXNzZXJ0IGxhc3QuX2xlZnRTcGxheSA9PSB4OwotICAgICAgICBhc3NlcnQgeC5fbGVmdFNwbGF5ID09IGZpcnN0OwotICAgICAgICBhc3NlcnQgeC5fcmlnaHRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgZmlyc3QuX2xlZnRTcGxheSAhPSBudWxsOwotCi0gICAgICAgIGludCBmaXJzdENjaExlZnQgPSBmaXJzdC5nZXRDY2hMZWZ0KCk7Ci0gICAgICAgIGludCBmaXJzdENiZWdpbkxlZnQgPSBmaXJzdC5nZXRDZG9jQmVnaW5MZWZ0KCk7Ci0KLSAgICAgICAgaW50IGRlbHRhQ2NoTGVmdCA9IGZpcnN0Q2NoTGVmdCAtIGxhc3QuZ2V0Q2NoTGVmdCgpOwotICAgICAgICBpbnQgZGVsdGFDYmVnaW5MZWZ0ID0gZmlyc3RDYmVnaW5MZWZ0IC0gbGFzdC5nZXRDZG9jQmVnaW5MZWZ0KCk7Ci0KLSAgICAgICAgbGFzdC5hZGp1c3RDY2hMZWZ0KCBkZWx0YUNjaExlZnQgKTsKLSAgICAgICAgbGFzdC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCBkZWx0YUNiZWdpbkxlZnQgKTsKLQotICAgICAgICBpZiAobGFzdCAhPSB0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGp1c3RDY2hMZWZ0KCBkZWx0YUNjaExlZnQgKTsKLSAgICAgICAgICAgIGFkanVzdENkb2NCZWdpbkxlZnQoIGRlbHRhQ2JlZ2luTGVmdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgeC5hZGp1c3RDY2hMZWZ0KCAtIGZpcnN0Q2NoTGVmdCApOwotICAgICAgICB4LmFkanVzdENkb2NCZWdpbkxlZnQoIC0gZmlyc3RDYmVnaW5MZWZ0ICk7Ci0KLSAgICAgICAgZmlyc3QuYWRqdXN0Q2NoTGVmdCggLSBmaXJzdENjaExlZnQgKTsKLSAgICAgICAgZmlyc3QuYWRqdXN0Q2RvY0JlZ2luTGVmdCggLSBmaXJzdENiZWdpbkxlZnQgKTsKLQotICAgICAgICBhc3NlcnQgZmlyc3QuZ2V0Q2NoTGVmdCgpID09IDA7Ci0gICAgICAgIGFzc2VydCBmaXJzdC5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gMDsKLQotICAgICAgICBhc3NlcnQgeC5nZXRDY2hMZWZ0KCkgKyBkZWx0YUNjaExlZnQgKyB4LmdldENjaCgpID09IDA7Ci0gICAgICAgIGFzc2VydCB4LmdldENkb2NCZWdpbkxlZnQoKSArIGRlbHRhQ2JlZ2luTGVmdCArIHguZ2V0Q2RvY0JlZ2luKCkgPT0gMDsKLQotICAgICAgICBmaXJzdC5fbGVmdFNwbGF5Ll9wYXJlbnRTcGxheSA9IGxhc3Q7Ci0gICAgICAgIGxhc3QuX2xlZnRTcGxheSA9IGZpcnN0Ll9sZWZ0U3BsYXk7Ci0gICAgICAgIHguX3BhcmVudFNwbGF5ID0gbnVsbDsKLQotICAgICAgICBmaXJzdC5fbGVmdFNwbGF5ID0gbnVsbDsKLSAgICAgICAgZmlyc3QuX3BhcmVudFNwbGF5ID0gbnVsbDsKLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGVTcGxheVRyZWUoKTsKLQotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2FibGVTdG9yZVZhbGlkYXRpb24gKCApCi0gICAgICAgIHsgZHYrKzsgcmV0dXJuIHRydWU7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlU3RvcmVWYWxpZGF0aW9uICAoICkKLSAgICAgICAgeyBkdi0tOyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZHY7Ci0KLSAgICB7Ci0gICAgICAgIGlmICghInRydWUiLmVxdWFscyggU3lzdGVtLmdldFByb3BlcnR5KCAidHJlZWFzc2VydHMiICkpKQotICAgICAgICAgICAgZGlzYWJsZVN0b3JlVmFsaWRhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlICggKQotICAgIHsKLSAgICAgICAgaWYgKGR2ICE9IDApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRvVmFsaWRhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gcnRlICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRG9jdW1lbnQgaW52YWxpZDogIiArIHJ0ZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgIHJ0ZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGR1bXAoIHRydWUgKTsKLSAgICAgICAgICAgIHRocm93IHJ0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8gUmVjdXJzaXZlIGRlc2NlbnQgdmFsaWRhdGlvbiBvZiB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQKLSAgICAvLwotICAgIC8vIEdyYW1tZXIgZm9yIHZhbGlkIGNvbnRlbnQgb2YgYSBkb2N1bWVudAotICAgIC8vCi0gICAgLy8gPGRvYz4gICAgICAgIDo6PSBET0MgPGF0dHJpYnV0ZXM+IDxjb250ZW50PiBST09UCi0gICAgLy8gPGF0dHJpYnV0ZXM+IDo6PSAoIEFUVFIgKSoKLSAgICAvLyA8Y29udGVudD4gICAgOjo9ICggKCBDT01NRU5UIHwgUFJPQ0lOU1QgfCA8ZWxlbWVudD4pICkqCi0gICAgLy8gPGVsZW1lbnQ+ICAgIDo6PSAoIExFQUYgIDxhdHRyaWJ1dGVzPiApIHwKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgKCBCRUdJTiA8YXR0cmlidXRlcz4gPGNvbnRlbnQ+IEVORCApCi0gICAgLy8KLQotICAgIHByaXZhdGUgU3BsYXkgdmFsaWRhdGVBdHRyaWJ1dGVzICggU3BsYXkgcyApCi0gICAgewotICAgICAgICB3aGlsZSAoIHMuZ2V0S2luZCgpID09IEFUVFIgKQotICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTcGxheSB2YWxpZGF0ZUNvbnRlbnQgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBrID0gcy5nZXRLaW5kKCk7Ci0KLSAgICAgICAgICAgIGlmIChrID09IENPTU1FTlQgfHwgayA9PSBQUk9DSU5TVCkKLSAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSBxID0gczsKLSAgICAgICAgICAgICAgICBzID0gdmFsaWRhdGVFbGVtZW50KCBzICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocSA9PSBzKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHByaXZhdGUgU3BsYXkgdmFsaWRhdGVFbGVtZW50ICggU3BsYXkgcyApCi0gICAgewotICAgICAgICBpZiAocy5nZXRLaW5kKCkgPT0gQkVHSU4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNwbGF5IGIgPSBzOwotCi0gICAgICAgICAgICBzID0gdmFsaWRhdGVBdHRyaWJ1dGVzKCBzLm5leHRTcGxheSgpICk7Ci0KLSAgICAgICAgICAgIGlmICghYi5pc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzID0gdmFsaWRhdGVDb250ZW50KCBzICk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0VuZCgpOiAiTWlzc2luZyBFTkQsIHNwbGF5OiAiICsgcy5nZXREZWJ1Z0lkKCk7Ci0KLSAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZURvYyAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBfZG9jLm5leHRTcGxheSgpOwotCi0gICAgICAgIHMgPSB2YWxpZGF0ZUF0dHJpYnV0ZXMoIHMgKTsKLQotICAgICAgICBzID0gdmFsaWRhdGVDb250ZW50KCBzICk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNSb290KCk6ICJFeHBlY3RlZCByb290IjsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUNvbnRleHQKLSAgICB7Ci0gICAgICAgIGludCBfbnVtU3BsYXlUeXBlczsKLSAgICAgICAgaW50IF9jSW52YWxpZGF0YWJsZVR5cGVzOwotICAgICAgICBpbnQgX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVHb29iZXIgKCBHb29iZXIgZywgU3BsYXkgcywgVmFsaWRhdGVDb250ZXh0IGNvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZy5nZXRLaW5kKCkgPT0gVFlQRTsKLSAgICAgICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLQotICAgICAgICAgICAgY29udGV4dC5fbnVtU3BsYXlUeXBlcysrOwotCi0gICAgICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgZzsKLQotICAgICAgICAgICAgaWYgKHR5cGUudXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5fY0ludmFsaWRhdGFibGVUeXBlcysrOwotCi0gICAgICAgICAgICBpZiAodHlwZS5pc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlcysrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGcuZ2V0S2luZCgpICE9IFRZUEU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgZy5nZXRTcGxheSgpID09IHM7Ci0gICAgICAgIGFzc2VydCBnLmdldFJvb3QoKSA9PSB0aGlzOwotICAgICAgICBhc3NlcnQgZy5nZXRQb3MoKSA+PSAwOwotICAgICAgICBhc3NlcnQgZy5nZXRQb3MoKSA8PSBzLmdldE1heFBvcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb1ZhbGlkYXRlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlRG9jKCk7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgZ2V0Q2NoTGVmdCgpID09IF90ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgIHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSgpOwotCi0vLyBUT0RPOiBWYWxpZGF0ZSB0aGF0IGlzIHRoZSByb290IHR5cGUgaXMgbnVsbCwgdGhlcmUgYXJlIG5vIHR5cGVzIGluCi0vLyB0cmVlIGF0IGFsbAotCi0vLyBUT0RPOiBDaGVjayB0aGUgaW52YXJpZW50IHRoYXQgaWYgdGhlcmUgaXMgYSBUeXBlIGFueXdoZXJlCi0vLyBpbiB0aGUgZG9jdW1lbnQsIHRoYXQgdGhlcmUgaXMgYW4gZXhpc3RpbmcgY2hhaW4gb2YgdHlwZXMKLS8vIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IGFuZCBpc19va19lbGVtZW50X3VzZXIgb3IgaXNfb2tfYXR0cmlidXRlX3VzZXIsCi0vLyBkZXBlbmRpbmcgb24gdGhlIGNhc2UsIHJldHVybnMgb2suCi0KLSAgICAgICAgVmFsaWRhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgVmFsaWRhdGVDb250ZXh0KCk7Ci0KLSAgICAgICAgQ29udGFpbmVyIHJlY2VudENvbnRhaW5lciA9IG51bGw7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcyA9IF9kb2MgOyBzICE9IG51bGwgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLmlzUm9vdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIHM7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgYi5nZXROYW1lKCkgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGFzc2VydAotICAgICAgICAgICAgICAgICAgICBiLmdldEZpbmlzaCgpID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGIuZ2V0RmluaXNoKCkuZ2V0Q29udGFpbmVyKCkgPT0gYjsKLQotICAgICAgICAgICAgICAgIGlmIChiLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0RmluaXNoKCkgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0RmluaXNoKCkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0RmluaXNoKCkuZ2V0Q29udGFpbmVyKCkgPT0gYjsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0Q2NoVmFsdWUoKSA9PSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocy5pc1Byb2NpbnN0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q29udGFpbmVyKCkgPT0gcmVjZW50Q29udGFpbmVyOwotCi0gICAgICAgICAgICAgICAgaWYgKCFzLmlzTGVhZigpKQotICAgICAgICAgICAgICAgICAgICByZWNlbnRDb250YWluZXIgPSAoQ29udGFpbmVyKSBzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IHJlY2VudENvbnRhaW5lcjsKLSAgICAgICAgICAgICAgICByZWNlbnRDb250YWluZXIgPSByZWNlbnRDb250YWluZXIuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnRleHQuX251bVNwbGF5VHlwZXMgPSAwOwotCi0gICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7Ci0gICAgICAgICAgICAgICAgICBnID0gcy5uZXh0R29vYmVyKCBnICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlR29vYmVyKCBnLCBzLCBjb250ZXh0ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0ludmFsaWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMucGVla1R5cGUoKSAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQuX251bVNwbGF5VHlwZXMgPT0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hBZnRlcigpID09IDA7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IG4gPSBzLm5leHROb25BdHRyU3BsYXkoKTsKLQotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbi5pc1Jvb3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoVmFsdWUoKSA9PSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoVmFsdWUoKSA9PSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY29udGV4dC5fbnVtU3BsYXlUeXBlcyA8PSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGNvbnRleHQuX2NJbnZhbGlkYXRhYmxlVHlwZXMgPT0gX2NJbnZhbGlkYXRhYmxlVHlwZXM7Ci0gICAgICAgIGFzc2VydCBjb250ZXh0Ll9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXMgPT1fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzOwotCi0gICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIGluZGljZXMKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHZhbGlkYXRlU3BsYXlUcmVlICggKQotICAgIHsKLSAgICAgICAgaWYgKGR2ICE9IDApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRvVmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gcnRlICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiU3BsYXkgdHJlZSBpbnZhbGlkOiAiICsgcnRlICk7Ci0KLSAgICAgICAgICAgIGR1bXAoIHRydWUgKTsKLQotICAgICAgICAgICAgdGhyb3cgcnRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsaWRhdGVTdGF0cyBleHRlbmRzIEhhc2hNYXAKLSAgICB7Ci0gICAgICAgIGludCBnZXRDY2ggKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRzKCBzICkuX2NjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRqdXN0Q2NoICggU3BsYXkgcywgaW50IGNjaERlbHRhICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RhdHMgc3RhdHMgPSBnZXRTdGF0cyggcyApOwotICAgICAgICAgICAgc3RhdHMuX2NjaCArPSBjY2hEZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDYmVnaW4gKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRzKCBzICkuX2NiZWdpbjsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRqdXN0Q2JlZ2luICggU3BsYXkgcywgaW50IGNiZWdpbkRlbHRhICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RhdHMgc3RhdHMgPSBnZXRTdGF0cyggcyApOwotICAgICAgICAgICAgc3RhdHMuX2NiZWdpbiArPSBjYmVnaW5EZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RhdHMgZ2V0U3RhdHMgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RhdHMgc3RhdHMgPSAoU3RhdHMpIGdldCggcyApOwotCi0gICAgICAgICAgICBpZiAoc3RhdHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwdXQoIHMsIHN0YXRzID0gbmV3IFN0YXRzKCkgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0YXRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdHMKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGludCBfY2NoOwotICAgICAgICAgICAgcHVibGljIGludCBfY2JlZ2luOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBkb1ZhbGlkYXRlU3BsYXlUcmVlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgICAgIFZhbGlkYXRlU3RhdHMgc3RhdHMgPSBuZXcgVmFsaWRhdGVTdGF0cygpOwotCi0gICAgICAgIGFzc2VydCBfcGFyZW50U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IF9yaWdodFNwbGF5ICA9PSBudWxsOwotICAgICAgICBhc3NlcnQgX2RvYy5fbGVmdFNwbGF5ID09IG51bGw7Ci0KLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0KLSAgICAgICAgaWYgKHMuX2xlZnRTcGxheSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzID0gcy5fbGVmdFNwbGF5OwotCi0gICAgICAgICAgICB3aGlsZSAoIHMgIT0gbnVsbCAmJiBzLl9sZWZ0U3BsYXkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgcyA9IHMuX2xlZnRTcGxheTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBzID09IF9kb2M7Ci0KLSAgICAgICAgbG9vcDoKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuX2xlZnRTcGxheSA9PSBudWxsICYmIHMuX3JpZ2h0U3BsYXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDY2goIHMsIHMuZ2V0Q2NoKCkgKTsKLSAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDYmVnaW4oIHMsIHMuZ2V0Q2RvY0JlZ2luKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHMuX3JpZ2h0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBzID0gcy5fcmlnaHRTcGxheSA7IHMuX2xlZnRTcGxheSAhPSBudWxsIDsgKQotICAgICAgICAgICAgICAgICAgICBzID0gcy5fbGVmdFNwbGF5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBwID0gcy5fcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHAuX3JpZ2h0U3BsYXkgPT0gbnVsbCB8fCBwLl9yaWdodFNwbGF5ID09IHMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDY2goIHMsIHMuZ2V0Q2NoKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENiZWdpbiggcywgcy5nZXRDZG9jQmVnaW4oKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5fbGVmdFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2NoKCBzLCBzdGF0cy5nZXRDY2goIHMuX2xlZnRTcGxheSApICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDYmVnaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIHN0YXRzLmdldENiZWdpbiggcy5fbGVmdFNwbGF5ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuX3JpZ2h0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDY2goIHMsIHN0YXRzLmdldENjaCggcy5fcmlnaHRTcGxheSApICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDYmVnaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIHN0YXRzLmdldENiZWdpbiggcy5fcmlnaHRTcGxheSApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcC5fbGVmdFNwbGF5ID09IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcC5fcmlnaHRTcGxheSAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzID0gcC5fcmlnaHRTcGxheTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBzLl9sZWZ0U3BsYXkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuX2xlZnRTcGxheTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBzID0gX2RvYyA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfbGVmdE9ubHkgfHwgcy5fcmlnaHRTcGxheSA9PSBudWxsOiAiIiArIHMuZ2V0RGVidWdJZCgpOwotICAgICAgICAgICAgYXNzZXJ0IHMuX2xlZnRTcGxheSAgPT0gbnVsbCB8fCBzLl9sZWZ0U3BsYXkgLl9wYXJlbnRTcGxheSA9PSBzOwotICAgICAgICAgICAgYXNzZXJ0IHMuX3JpZ2h0U3BsYXkgPT0gbnVsbCB8fCBzLl9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9PSBzOwotCi0gICAgICAgICAgICBpZiAocy5fbGVmdFNwbGF5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoTGVmdCgpID09IDA7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgICAgIHMuZ2V0Q2NoTGVmdCgpID09IHN0YXRzLmdldENjaCggcy5fbGVmdFNwbGF5ICk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiIiArIHMuZ2V0RGVidWdJZCgpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IHN0YXRzLmdldENiZWdpbiggcy5fbGVmdFNwbGF5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIGludGVyZmFjZSBDaGFuZ2VMaXN0ZW5lcgotICAgIHsKLSAgICAgICAgdm9pZCBjaGFuZ2VOb3RpZmljYXRpb24gKCApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYW5nZUNsaWVudAotICAgIHsKLSAgICAgICAgQ2hhbmdlTGlzdGVuZXIgX2xpc3RlbmVyOwotICAgICAgICBDaGFuZ2VDbGllbnQgICBfbmV4dDsKLSAgICB9Ci0KLSAgICBsb25nIGdldFZlcnNpb24gKCApCi0gICAgewotICAgICAgICByZXR1cm4gX192ZXJzaW9uOwotICAgIH0KLQotICAgIHZvaWQgaW52YWxpZGF0ZVZlcnNpb24gKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX2NoYW5nZUNsaWVudHMgPT0gbnVsbDsKLQotICAgICAgICBfX3ZlcnNpb24rKzsKLQotICAgICAgICBhc3NlcnQgKF9kZWJ1Z0NoYW5nZVZlcnNpb24gPSBfX3ZlcnNpb24pID09IDAgfHwgdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBVc2UgdGhpcyAqb25seSogaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQotICAgIHZvaWQgcmVzdG9yZVZlcnNpb24gKCBsb25nIG9sZFZlcnNpb24gKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9fdmVyc2lvbiA+PSBvbGRWZXJzaW9uOwotICAgICAgICBfX3ZlcnNpb24gPSBvbGRWZXJzaW9uOwotICAgICAgICBhc3NlcnQgKF9kZWJ1Z0NoYW5nZVZlcnNpb24gPSBfX3ZlcnNpb24pID09IDAgfHwgdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHZhbGlkYXRlQ2hhbmdlU3RhcnRlZCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfY2hhbmdlQ2xpZW50cyA9PSBudWxsOwotICAgICAgICByZXR1cm4gX2NoYW5nZUNsaWVudHMgPT0gbnVsbDsKLSAgICB9Ci0KLSAgICBib29sZWFuIHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfZGVidWdDaGFuZ2VWZXJzaW9uID09IF9fdmVyc2lvbjsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCByZWdpc3RlckZvckNoYW5nZSAoIENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZUNoYW5nZUxpc3RlbmVyU3RhdGUoKTsKLQotICAgICAgICAvLyBTZWUgaWYgdGhpcyBsaXN0ZW5lciBpcyB0aGUgZmlyc3Qgb25lIG9uIHRoZSBsaXN0LiAgRWFzeSBidXQgbm90Ci0gICAgICAgIC8vIHRvdGFsbHkgY29tcGxldGUgIG9wdGltaXphdGlvbgotCi0gICAgICAgIGlmIChfY2hhbmdlQ2xpZW50cyAhPSBudWxsICYmIF9jaGFuZ2VDbGllbnRzLl9saXN0ZW5lciA9PSBsaXN0ZW5lcikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDaGFuZ2VDbGllbnQgY2xpZW50ID0gbmV3IENoYW5nZUNsaWVudCgpOwotCi0gICAgICAgIGNsaWVudC5fbmV4dCA9IF9jaGFuZ2VDbGllbnRzOwotICAgICAgICBjbGllbnQuX2xpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgIF9jaGFuZ2VDbGllbnRzID0gY2xpZW50OwotICAgIH0KLQotICAgIHZvaWQgc3RhcnRDaGFuZ2UgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgdmFsaWRhdGVDaGFuZ2VMaXN0ZW5lclN0YXRlKCk7Ci0KLSAgICAgICAgbG9uZyBjdXJyZW50VmVyc2lvbiA9IDA7Ci0KLSAgICAgICAgYXNzZXJ0IChjdXJyZW50VmVyc2lvbiA9IF9fdmVyc2lvbikgPT0gMCB8fCB0cnVlOwotCi0gICAgICAgIHdoaWxlICggX2NoYW5nZUNsaWVudHMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jaGFuZ2VDbGllbnRzLl9saXN0ZW5lci5jaGFuZ2VOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgIF9jaGFuZ2VDbGllbnRzID0gX2NoYW5nZUNsaWVudHMuX25leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgY3VycmVudFZlcnNpb24gPT0gX192ZXJzaW9uOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gRG9jdW1lbnQgcHJvcGVydGllcwotICAgIC8vCi0KLSAgICBzdGF0aWMgY2xhc3MgRG9jUHJvcHMKLSAgICAgICAgZXh0ZW5kcyBYbWxEb2N1bWVudFByb3BlcnRpZXMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgSGFzaE1hcCBfbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHB1dCAoIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbWFwLnB1dCgga2V5LCB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXQgKCBPYmplY3Qga2V5ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9tYXAuZ2V0KCBrZXkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlICggT2JqZWN0IGtleSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbWFwLnJlbW92ZSgga2V5ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBudGhDYWNoZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5hbWVzU2FtZSAoIFFOYW1lIHBhdHRlcm4sIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzKCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2V0c1NhbWUgKCBRTmFtZVNldCBwYXR0ZXJuU2V0LCBRTmFtZVNldCBzZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHZhbHVlIGVxdWFsaXR5IGlzIHByb2JhYmx5IHRvbyBleHBlbnNpdmUuIFNpbmNlIHRoZSB1c2UgY2FzZQotICAgICAgICAgICAgLy8gaW52b2x2ZXMgUU5hbWVTZXRzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIsIHdlCi0gICAgICAgICAgICAvLyBjYW4gdXNlIGlkZW50aXR5IGNvbXBhcmlzb24uCi0gICAgICAgICAgICByZXR1cm4gcGF0dGVyblNldCAhPSBudWxsICYmIHBhdHRlcm5TZXQgPT0gc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5hbWVIaXQoUU5hbWUgbmFtZVBhdHRlcm4sICBRTmFtZVNldCBzZXRQYXR0ZXJuLCBRTmFtZSBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2V0UGF0dGVybiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc1NhbWUobmFtZVBhdHRlcm4sIG5hbWUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBzZXRQYXR0ZXJuLmNvbnRhaW5zKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hlU2FtZSAoUU5hbWUgbmFtZVBhdHRlcm4sICBRTmFtZVNldCBzZXRQYXR0ZXJuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0UGF0dGVybiA9PSBudWxsID8gbmFtZXNTYW1lKG5hbWVQYXR0ZXJuLCBfbmFtZSkgOgotICAgICAgICAgICAgICAgIHNldHNTYW1lKHNldFBhdHRlcm4sIF9zZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGRpc3RhbmNlICggU3BsYXkgcGFyZW50LCBRTmFtZSBuYW1lLCBRTmFtZVNldCBzZXQsIGludCBuICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG4gPj0gMDsKLQotICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IFJvb3QudGhpcy5nZXRWZXJzaW9uKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFIC0gMTsKLQotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBfcGFyZW50IHx8ICFjYWNoZVNhbWUobmFtZSwgc2V0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLSAgICAgICAgICAgIHJldHVybiBuID4gX24gPyBuIC0gX24gOiBfbiAtIG47Ci0gICAgICAgIH0KLQotICAgICAgICBCZWdpbiBmZXRjaCAoIFNwbGF5IHBhcmVudCwgUU5hbWUgbmFtZSwgUU5hbWVTZXQgc2V0LCBpbnQgbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuID49IDA7Ci0KLSAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBSb290LnRoaXMuZ2V0VmVyc2lvbigpIHx8IF9wYXJlbnQgIT0gcGFyZW50IHx8Ci0gICAgICAgICAgICAgICAgICAhIGNhY2hlU2FtZShuYW1lLCBzZXQpIHx8IG4gPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IFJvb3QudGhpcy5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgX3BhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgX2NoaWxkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBfbiA9IC0xOwotCi0gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb29wOgotICAgICAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gcGFyZW50Lm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5EICA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJPT1QgOiBicmVhayBsb29wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUhpdCggbmFtZSwgc2V0LCBzLmdldE5hbWUoKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoaWxkID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChfbiA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChuID4gX24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBuID4gX24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IF9jaGlsZC5nZXRGaW5pc2hTcGxheSgpLm5leHRTcGxheSgpIDsgOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUhpdCggbmFtZSwgc2V0LCBzLmdldE5hbWUoKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoaWxkID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX24rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG4gPCBfbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIG4gPCBfbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gX2NoaWxkOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnByZXZTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSB8fCBzLmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUhpdCggbmFtZSwgc2V0LCBzLmdldE5hbWUoKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoaWxkID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX24tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKEJlZ2luKSBfY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGxvbmcgICAgIF92ZXJzaW9uOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgIF9wYXJlbnQ7Ci0gICAgICAgIHByaXZhdGUgUU5hbWUgICAgX25hbWU7Ci0gICAgICAgIHByaXZhdGUgUU5hbWVTZXQgX3NldDsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgU3BsYXkgX2NoaWxkOwotICAgICAgICBwcml2YXRlIGludCAgIF9uOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gRGEgZmllbGRzLiAgRGEgQmVhcnMuICBEaXRrYSBpcyBHb2QuCi0gICAgLy8KLQotICAgIGJvb2xlYW4gX2xlZnRPbmx5OwotICAgIERvYyAgICAgX2RvYzsKLSAgICBUZXh0ICAgIF90ZXh0OwotICAgIGJvb2xlYW4gX3ZhbGlkYXRlT25TZXQ7Ci0KLSAgICAvLwotICAgIC8vIERvY3VtZW50IHZlcnNpb24uICBUaGVzZSBudW1iZXJzIGdldCBpbmNyZW1lbnRlZCB3aGVuIHRoZSBkb2N1bWVudAotICAgIC8vIGNoYW5nZXMgaW4gYSB2YXJpZXR5IG9mIHdheXMuCi0gICAgLy8KLQotICAgIHByaXZhdGUgbG9uZyBfX3ZlcnNpb24gPSAxOwotICAgIHByaXZhdGUgbG9uZyBfZGVidWdDaGFuZ2VWZXJzaW9uID0gMTsgLy8gRGVidWcgb25seQotCi0gICAgcHJpdmF0ZSBDaGFuZ2VDbGllbnQgX2NoYW5nZUNsaWVudHM7Ci0KLSAgICBEb2NQcm9wcyBfcHJvcHM7Ci0KLSAgICAvLwotICAgIC8vIFhtbElucHV0U3RyZWFtCi0gICAgLy8KLQotICAgIGJvb2xlYW4gX3N0YW5kQWxvbmU7Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIGZpbmFsIFNjaGVtYVR5cGVMb2FkZXIgX3NjaGVtYVR5cGVTeXN0ZW07Ci0KLSAgICBpbnQgX2NJbnZhbGlkYXRhYmxlVHlwZXM7Ci0gICAgaW50IF9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXM7Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIG50aENhY2hlIF9udGhDYWNoZV9BID0gbmV3IG50aENhY2hlKCk7Ci0gICAgbnRoQ2FjaGUgX250aENhY2hlX0IgPSBuZXcgbnRoQ2FjaGUoKTsKLSAgICBUeXBlU3RvcmVGYWN0b3J5IF9mYWN0b3J5OwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TYXZlci5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TYXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjUzMzZkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU2F2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NDggKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5DaGFyczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkVuY29kaW5nTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uR2VuZXJpY1htbElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFdmVudEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxOYW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LlhtbG5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQXR0cmlidXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbmRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbmRQcmVmaXhNYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0UHJlZml4TWFwcGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNhdmVyIGltcGxlbWVudHMgTmFtZXNwYWNlTWFuYWdlcgotewotICAgIC8vCi0gICAgLy8KLSAgICAvLwotICAgIAotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1vbml0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yb290OwotICAgIH0KLQotICAgIFNhdmVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzLmdldFJvb3RTbG93KCkgPT0gcjsKLQotICAgICAgICAvLyBJbnB1dCBzIGFuZCBwIG11c3QgYmUgbm9ybWFsaXplZCBhbHJlYWR5Ci0gICAgICAgIGFzc2VydCBwIDwgcy5nZXRFbmRQb3MoKTsKLQotICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgIF90b3AgPSBfc3BsYXkgPSBzOwotICAgICAgICBfcG9zID0gcDsKLSAgICAgICAgX3ZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLSAgICAgICAgX3NiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBfYXR0cnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBfYXR0ck5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgX2ZpcnN0UHVzaCA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICBfbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApOwotCi0gICAgICAgIGlmIChfbmV3TGluZSA9PSBudWxsKQotICAgICAgICAgICAgX25ld0xpbmUgPSAiXG4iOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlIG9mIHRoZSBuYW1lc3BhY2VzCi0gICAgICAgIF9uYW1lc3BhY2VTdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgX3VyaU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIF9wcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIFN0b3BzIHRoZSBzeW50aGVzaXMgb2YgdGhpcyBuYW1zcGFjZSBhbmQgbWFrZSBmb3IgYmV0dGVyCi0gICAgICAgIC8vIHJvdW5kdHJpcHBpbmcgCi0gICAgICAgIGFkZE1hcHBpbmcoICJ4bWwiLCBTcGxheS5feG1sMTk5OFVyaSApOwotCi0gICAgICAgIC8vIENoZWNrIGZvciBpbXBsaWNpdCBuYW1lc3BhY2VzCi0gICAgICAgIAotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwotCi0gICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMgKSkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwIG0gPSAoTWFwKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IG0ua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKCBwcmVmaXgsIChTdHJpbmcpIG0uZ2V0KCBwcmVmaXggKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTICkpCi0gICAgICAgICAgICBfc3VnZ2VzdGVkUHJlZml4ZXMgPSAoTWFwKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX1NVR0dFU1RFRF9QUkVGSVhFUyk7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgZGVmYXVsdCBwcmVmaXggaGFzIG5vdCBiZWVuIG1hcHBlZCwgZG8gc28gbm93Ci0gICAgICAgIAotICAgICAgICBpZiAoZ2V0TmFtZXNwYWNlRm9yUHJlZml4KCAiIiApID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbml0aWFsRGVmYXVsdFVyaSA9IG5ldyBTdHJpbmcoICIiICk7Ci0gICAgICAgICAgICBhZGRNYXBwaW5nKCAiIiwgX2luaXRpYWxEZWZhdWx0VXJpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBfc2F2ZU5hbWVzcGFjZXNGaXJzdCA9IG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfTkFNRVNQQUNFU19GSVJTVCApOwotCi0gICAgICAgIGlmIChfcHJldHR5UHJpbnQgPSBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVCApKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcHJldHR5SW5kZW50ID0gMjsKLQotICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wcmV0dHlJbmRlbnQgPQotICAgICAgICAgICAgICAgICAgICAoKEludGVnZXIpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCApKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ByZXR0eU9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICgoSW50ZWdlcikgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUICkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9BR0dSRVNTSVZFX05BTUVTUEFDRVMgKSAmJgotICAgICAgICAgICAgICAgICEodGhpcyBpbnN0YW5jZW9mIFN5bnRoTmFtZXNwYWNlU2F2ZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeW50aE5hbWVzcGFjZVNhdmVyIHNhdmVyID0KLSAgICAgICAgICAgICAgICBuZXcgU3ludGhOYW1lc3BhY2VTYXZlciggciwgcywgcCwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICB3aGlsZSAoIHNhdmVyLnByb2Nlc3MoKSApCi0gICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICBpZiAoIXNhdmVyLl9zeW50aE5hbWVzcGFjZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIF9wcmVDb21wdXRlZE5hbWVzcGFjZXMgPSBzYXZlci5fc3ludGhOYW1lc3BhY2VzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBfdXNlRGVmYXVsdE5hbWVzcGFjZSA9Ci0gICAgICAgICAgICBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1VTRV9ERUZBVUxUX05BTUVTUEFDRSApOwotCi0gICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX0ZJTFRFUl9QUk9DSU5TVCApKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZmlsdGVyUHJvY2luc3QgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfRklMVEVSX1BST0NJTlNUICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9VU0VfT1BFTl9GUkFHTUVOVCApKQotICAgICAgICAgICAgX2ZyYWdtZW50ID0gU3BsYXkuX29wZW51cmlGcmFnbWVudDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX2ZyYWdtZW50ID0gU3BsYXkuX3htbEZyYWdtZW50OwotCi0gICAgICAgIC8vIE91dGVyIG92ZXJyaWRlcyBpbm5lcgotICAgICAgICAKLSAgICAgICAgX2lubmVyID0KLSAgICAgICAgICAgIG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfSU5ORVIgKSAmJgotICAgICAgICAgICAgICAgICFvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX09VVEVSICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoX2lubmVyICYmICFfdG9wLmlzRG9jKCkpCi0gICAgICAgICAgICBfc3ludGhFbGVtID0gX2ZyYWdtZW50OwotICAgICAgICAKLSAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCApKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZnJhZ21lbnQgPSBfc3ludGhFbGVtID0KLSAgICAgICAgICAgICAgICAoUU5hbWUpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQgKTsKLQotICAgICAgICAgICAgaWYgKF9zeW50aEVsZW0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiTnVsbCBzeW50aGV0aWMgZWxlbWVudCIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgX3ByZVByb2Nlc3MgPSB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNoZWNrVmVyc2lvbiAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfdmVyc2lvbiAhPSBfcm9vdC5nZXRWZXJzaW9uKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQgZHVyaW5nIHNhdmUiICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFJvb3QgZ2V0Um9vdCAoICkgeyByZXR1cm4gX3Jvb3Q7IH0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwICBnZXRVcmlNYXAgKCApIHsgcmV0dXJuIF91cmlNYXA7IH0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwICBnZXRQcmVmaXhNYXAgKCApIHsgcmV0dXJuIF9wcmVmaXhNYXA7IH0KLQotICAgIC8vIGVtaXRDb250YWluZXIgd2lsbCBwcm9jZXNzIGxlYWYgY29udGVudHMgYW5kIHRoZSB0ZXh0IGFmdGVyIGEKLSAgICAvLyBzdGFydC4gIEFsbCBvdGhlciB0ZXh0IGlzIHByb2Nlc3NlZCB3aXRoIGVtaXRUZXh0QWZ0ZXIuCi0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0RG9jVHlwZSgKLSAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApOwotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gYSBzeW50aGV0aWMgcHJlZml4IGlzIGNyZWF0ZWQuCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc3ludGhldGljTmFtZXNwYWNlICgKLSAgICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgYm9vbGVhbiBjb25zaWRlckNyZWF0aW5nRGVmYXVsdCApIHsgfQotCi0gICAgLyoKLSAgICAgKiBJdCBpcyB2aXRhbCB0aGF0IHRoZSBzYXZlciBkb2VzIG5vdCBtb2RpZnkgdGhlIHRyZWUgaW4gdGhlIHByb2Nlc3Mgb2YKLSAgICAgKiBzYXZpbmcuICBTbywgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIGNvbnRlbnQgb3IgYXR0ciB2YWx1ZXMgd2hpY2ggbmVlZAotICAgICAqIG5ldyBuYW1lc3BhY2UvcHJlZml4IG1hcHBpbmdzLCBJIGNvbXB1dGUgdGhlIGNvbnRlbnQvdmFsdWVzIGJ5IHBhc3NpbmcKLSAgICAgKiB0aGUgTmFtZXNwYWNlTWFuYWdlciBpbXBsZW1lbnRlZCBieSB0aGUgc2F2ZXIgd2hpY2ggY2FuIGNvbnMgdXAgbWFwcGluZ3MKLSAgICAgKiBqdXN0IGZvciB0aGUgcHVycG9zZXMgb2Ygc2F2aW5nIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSB0cmVlIGJ5IGFkZGluZwotICAgICAqIFhtbG5zIHNwbGF5cy4KLSAgICAgKgotICAgICAqIFRodXMsIEkgbXVzdCBub3QsIGFzIGEgYnlwcm9kdWN0IG9mIHNhdmluZywgdmFsaWRhdGUgYW55IGNvbnRlbnQvdmFsdWVzCi0gICAgICogaW50byB0aGUgdHJlZSB3aGljaCBjYWxsIGJhY2sgZm9yIG5hbWVzcGFjZSBtYXBwaW5ncyB3aGljaCBuZWVkIHRvIGJlCi0gICAgICogY3JlYXRlZC4KLSAgICAgKgotICAgICAqIEFsc28sIEkgbmVlZCB0byBjb21wdXRlIHRoZSB2YWxpZCB0ZXh0IChpZiBhIHNwbGF5IGlzIGludmFsaWQpIGJlZm9yZQotICAgICAqIEkgaGF2ZSBjbG9zZWQgdGhlIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBlbmNsb3NpbmcgY29udGFpbmVyIGJlY2F1c2UKLSAgICAgKiBJIHdpbGwgaGF2ZSB0byBwZXJzaXN0IG91dCB0aGVzZSB0ZW1wb3JhcnkgbWVwcGluZ3MgYmVmb3JlIHRoZXkgYXJlCi0gICAgICogcmVmZXJlbmNlZCBieSB0aGUgdmFsdWVzIHdoaWNoIG5lZWQgdGhlbS4KLSAgICAgKi8KLQotICAgIGZpbmFsIFN0cmluZyB0ZXh0ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF90ZXh0ICE9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gX3RleHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBib29sZWFuIG5vVGV4dCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfdGV4dCAhPSBudWxsIHx8IF9zYi5sZW5ndGgoKSA9PSAwOwotICAgICAgICBhc3NlcnQgX3RleHQgPT0gbnVsbCB8fCBfdGV4dCA9PSBfc2I7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gX3RleHQgPT0gbnVsbDsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGNsZWFyVGV4dCAoICkKLSAgICB7Ci0gICAgICAgIF90ZXh0ID0gbnVsbDsKLSAgICAgICAgX3NiLmRlbGV0ZSggMCwgX3NiLmxlbmd0aCgpICk7Ci0gICAgfQotCi0gICAgZmluYWwgc3RhdGljIHZvaWQgc3BhY2VzICggU3RyaW5nQnVmZmVyIHNiLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQgKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCBjb3VudC0tID4gMCApCi0gICAgICAgICAgICBzYi5pbnNlcnQoIG9mZnNldCwgJyAnICk7Ci0gICAgfQotCi0gICAgZmluYWwgc3RhdGljIHZvaWQgdHJpbSAoIFN0cmluZ0J1ZmZlciBzYiApCi0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCBzYi5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgICAgICBpZiAoIVNwbGF5LmlzV2hpdGVTcGFjZSggc2IuY2hhckF0KCBpICkgKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBzYi5kZWxldGUoIDAsIGkgKTsKLQotICAgICAgICBmb3IgKCBpID0gc2IubGVuZ3RoKCkgOyBpID4gMCA7IGktLSApCi0gICAgICAgICAgICBpZiAoIVNwbGF5LmlzV2hpdGVTcGFjZSggc2IuY2hhckF0KCBpIC0gMSApICkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgc2IuZGVsZXRlKCBpLCBzYi5sZW5ndGgoKSApOwotICAgIH0KLQotICAgIC8vIENhbGwgcHJvY2VzcyB1bnRpbCBpdCByZXR1cm5zIGZhbHNlIHRvIHNhdmUgZXZlcnl0aGluZy4KLQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3MgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX3ByZVByb2Nlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ByZVByb2Nlc3MgPSBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICBTcGxheSBzID0gX3NwbGF5OwotICAgICAgICAgICAgICAgIGludCAgIHAgPSBfcG9zOwotICAgIAotICAgICAgICAgICAgICAgIF9zcGxheSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgX3BvcyA9IDA7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBvc2l0aW9uIHJpZ2h0IGJlZm9yZSBlbmQgdG9rZW4uICBFZmZlY3RpdmVseSB0aGVyZQotICAgICAgICAgICAgICAgIC8vIGlzIG5vdGhpbmcgdG8gc2F2ZSBoZXJlLCBzbyBzYXZlIG91dCB0aGUgZW1wdHkgZnJhZ21lbnQuCi0gICAgCi0gICAgICAgICAgICAgICAgaWYgKChwID09IDAgJiYgcy5pc0ZpbmlzaCgpKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChzLmlzTGVhZigpICYmIHAgPT0gcy5nZXRQb3NMZWFmRW5kKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dEZyYWdtZW50KCBudWxsLCAwLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAvLyBIZXJlLCBpZiBwID4gMCwgdGhlbiB3ZSdyZSBzYXZpbmcgc29tZSB0ZXh0Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHAgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICFzLmlzTGVhZigpIHx8IHAgIT0gcy5nZXRQb3NMZWFmRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0RnJhZ21lbnQoIHMsIHAsIHMuZ2V0UG9zdENjaCggcCApICk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGlmIChfaW5uZXIgJiYgKHMuaXNBdHRyKCkgfHwgcy5pc0NvbW1lbnQoKSB8fCBzLmlzUHJvY2luc3QoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dEZyYWdtZW50KCBzLCAwLCBzLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NYbWxuc0ZyYWdtZW50KCBzICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyRnJhZ21lbnQoIHMgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQ29tbWVudCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1lbnRGcmFnbWVudCggcyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNQcm9jaW5zdCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9maWx0ZXJQcm9jaW5zdCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKS5lcXVhbHMoIF9maWx0ZXJQcm9jaW5zdCApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dEZyYWdtZW50KCBudWxsLCAwLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvY2luc3RGcmFnbWVudCggcyApOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBfc3BsYXkgPSBzOwotICAgICAgICAgICAgICAgIF9lbmRTcGxheSA9IHMuaXNDb250YWluZXIoKSA/IHMuZ2V0RmluaXNoU3BsYXkoKSA6IHM7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAvLyBJIG5lZWQgdG8gYnJlYWsgdGhlIHByb2Nlc3Npbmcgb2YgYSBzcGxheSBpbnRvIHR3byBwYXJ0cy4gIFRoZQotICAgICAgICAgICAgLy8gZmlyc3QgcGFydCBpcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgc3BsYXkgYW5kIHRoZSBzZWNvbmQgcGFydCBpcwotICAgICAgICAgICAgLy8gdGhlIHBvc3QgcHJvY2Vzc2luZyBvZiB0aGUgc3BsYXkuICBJbiBwYXJ0aWN1bGFyLCB0aGUgcG9zdAotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZywgYW1vbmcgb3RoZXIgdGhpbmdzLCBwb3BzIHRoZSBtYXBwaW5nIHN0YWNrLiAgVGhpcwotICAgICAgICAgICAgLy8gaXMgZG9uZSBzbyBzdHVmZiAnc2F2ZWQnIGR1cmluZyB0aGUgZmlyc3QgcGFydCAodGhlIHByZS1wcm9jZXNzKQotICAgICAgICAgICAgLy8gY2FuIHVzZSB0aGUgbWFwcGluZyBzdGFjay4gIFdoZW4gdGhlIG5leHQgcHJvY2VzcyBjb21lcyBhcm91bmQsCi0gICAgICAgICAgICAvLyB0aGUgbWFwcGluZyBzdGFjayB3aWxsIHRoZW4gYmUgdXBkYXRlZC4KLSAgICAKLSAgICAgICAgICAgIGlmIChfcG9zdFBvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3BNYXBwaW5ncygpOwotICAgICAgICAgICAgICAgIF9wb3N0UG9wID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAoX3Bvc3RQcm9jZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgIT0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGVtaXR0ZWQgPSBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoX3NwbGF5ID09IF9lbmRTcGxheSkKLSAgICAgICAgICAgICAgICAgICAgX3NwbGF5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gX3NwbGF5OwotICAgIAotICAgICAgICAgICAgICAgICAgICBfc3BsYXkgPSBfc3BsYXkubmV4dE5vbkF0dHJTcGxheSgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoX3NraXBDb250YWluZXJGaW5pc2gpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQmVnaW4oKSAmJiAhcy5pc0xlYWYoKSAmJiBzLmdldENjaEFmdGVyKCkgPT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheS5pc0ZpbmlzaCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgX3NwbGF5ID0gX3NwbGF5ID09IF9lbmRTcGxheSA/IG51bGwgOiBfc3BsYXkubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9za2lwQ29udGFpbmVyRmluaXNoIHx8IHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAhX3Bvc3RQb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfcG9zdFBvcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBub1RleHQoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjY2hBZnRlciA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcHJldHR5UHJpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQgPSBfc2I7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjaEFmdGVyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgcy5nZXRQb3NBZnRlcigpICksIGNjaEFmdGVyICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW0oIF90ZXh0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBzdG9wID0gKENvbnRhaW5lcikgX3RvcDsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHN0b3AuZ2V0Q29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIGMgPSBzLmdldENvbnRhaW5lciggcy5nZXRQb3NBZnRlcigpICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBwID0gYzsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggOyBwICE9IHN0b3AgOyBwID0gcC5nZXRDb250YWluZXIoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMoIF90ZXh0LCAwLCBfcHJldHR5SW5kZW50ICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcHJldHR5SW5kZW50ID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0Lmluc2VydCggMCwgX25ld0xpbmUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIDEsIF9wcmV0dHlPZmZzZXQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3ByZXR0eUluZGVudCA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQuYXBwZW5kKCBfbmV3TGluZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMoIF90ZXh0LCBfdGV4dC5sZW5ndGgoKSwgX3ByZXR0eU9mZnNldCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgcCA9IGM7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMubmV4dE5vbkF0dHJTcGxheSgpLmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwLmdldENvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgcCAhPSBudWxsICYmIHAgIT0gc3RvcDsgcCA9IHAuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMoIF90ZXh0LCBfdGV4dC5sZW5ndGgoKSwgX3ByZXR0eUluZGVudCApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwgPyBjY2hBZnRlciA+IDAgOiBfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdFRleHRBZnRlciggcywgcy5nZXRQb3NBZnRlcigpLCBjY2hBZnRlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgX3Bvc3RQcm9jZXNzID0gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIEkgb25seSByZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgKnJlYWxseSogbm90aGluZyBtb3JlCi0gICAgICAgICAgICAgICAgLy8gdG8gcHJvY2VzcwotICAgIAotICAgICAgICAgICAgICAgIGlmIChlbWl0dGVkKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoX3Bvc3RQb3ApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwb3BNYXBwaW5ncygpOwotICAgICAgICAgICAgICAgICAgICBfcG9zdFBvcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGlmIChfc3BsYXkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gZ2V0Um9vdCgpLmdldFZlcnNpb24oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKLSAgICAKLSAgICAgICAgICAgIF9za2lwQ29udGFpbmVyRmluaXNoID0gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBzd2l0Y2ggKCBfc3BsYXkuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRE9DIDoKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb2Nlc3NDb250YWluZXIoIChDb250YWluZXIpIF9zcGxheSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTcGxheS5ST09UIDoKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EICA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0VuZCggX3NwbGF5ICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkNPTU1FTlQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRDb21tZW50KCBfc3BsYXkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3BsYXkuUFJPQ0lOU1QgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZmlsdGVyUHJvY2luc3QgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIV9zcGxheS5nZXRMb2NhbCgpLmVxdWFscyggX2ZpbHRlclByb2NpbnN0ICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0UHJvY2luc3QoIF9zcGxheSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQVRUUiA6Ci0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIHNwbGF5IGtpbmQgIiArIF9zcGxheS5nZXRLaW5kKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgX3Bvc3RQcm9jZXNzID0gdHJ1ZTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NDb250YWluZXIgKCBDb250YWluZXIgYyApCi0gICAgewotICAgICAgICBhc3NlcnQgYy5pc0RvYygpIHx8IGMuaXNCZWdpbigpOwotCi0gICAgICAgIFFOYW1lIG5hbWUgPQotICAgICAgICAgICAgX3N5bnRoRWxlbSAhPSBudWxsICYmIGMgPT0gX3RvcAotICAgICAgICAgICAgICAgID8gX3N5bnRoRWxlbQotICAgICAgICAgICAgICAgIDogYy5pc0JlZ2luKCkgPyBjLmdldE5hbWUoKSA6IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWVVcmkgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBkb2N0eXBlIHRvIHNhdmUgb3V0Ci0KLSAgICAgICAgaWYgKGMuaXNEb2MoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IF9yb290Ll9wcm9wcy5nZXREb2N0eXBlU3lzdGVtSWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBkb2NUeXBlTmFtZSA9IF9yb290Ll9wcm9wcy5nZXREb2N0eXBlTmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCB8fCBkb2NUeXBlTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkb2NUeXBlTmFtZSA9PSBudWxsICYmIG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZG9jVHlwZU5hbWUgPSBuYW1lLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRvY1R5cGVOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3IgeGMgPSBfcm9vdC5jcmVhdGVDdXJzb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh4Yy50b0ZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGVOYW1lID0geGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeGMuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkb2NUeXBlTmFtZSA9PSBudWxsICYmIF9mcmFnbWVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkb2NUeXBlTmFtZSA9IF9mcmFnbWVudC5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCA9IF9yb290Ll9wcm9wcy5nZXREb2N0eXBlUHVibGljSWQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBlbWl0RG9jVHlwZSggZG9jVHlwZU5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBmcm9udGllci4gIElmIHRoaXMgZWxlbWVudCBoYXMgYSBuYW1lCi0gICAgICAgIC8vIHdoaWNoIGhhcyBubyBuYW1lc3BhY2UsIHRoZW4gd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCBwdXNoaW5nCi0gICAgICAgIC8vIHRoZSBtYXBwaW5ncyBjYXVzZXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHRvIGJlIGVtcHR5Ci0KLSAgICAgICAgYm9vbGVhbiBlbnN1cmVEZWZhdWx0RW1wdHkgPSBuYW1lICE9IG51bGwgJiYgbmFtZVVyaS5sZW5ndGgoKSA9PSAwOwotCi0gICAgICAgIHB1c2hNYXBwaW5ncyggYywgZW5zdXJlRGVmYXVsdEVtcHR5ICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlcmUgYXJlIGZvdXIgdGhpbmdzIHdoaWNoIHVzZSBtYXBwaW5nczoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gICAxKSBUaGUgZWxlbWVudCBuYW1lCi0gICAgICAgIC8vICAgMikgVGhlIGVsZW1lbnQgdmFsdWUgKHFuYW1lIGJhc2VkKQotICAgICAgICAvLyAgIDMpIEF0dHJpYnV0ZSBuYW1lcwotICAgICAgICAvLyAgIDQpIFRoZSBhdHRyaWJ1dGUgdmFsdWVzIChxbmFtZSBiYXNlZCkKLSAgICAgICAgLy8KLQotICAgICAgICAvLyAxKSBUaGUgZWxlbWVudCBuYW1lIChub3QgZm9yIHN0YXJ0cykKLQotICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgZW5zdXJlTWFwcGluZyggbmFtZVVyaSwgbnVsbCwgIWVuc3VyZURlZmF1bHRFbXB0eSwgZmFsc2UgKTsKLQotICAgICAgICBhc3NlcnQgbm9UZXh0KCk7Ci0KLSAgICAgICAgaWYgKGMuaXNJbnZhbGlkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIDIpIFRoZSBlbGVtZW50IHZhbHVlCi0gICAgICAgICAgICBfdGV4dCA9IF9zYi5hcHBlbmQoIGMucGVla1R5cGUoKS5idWlsZF90ZXh0KCB0aGlzICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9hdHRycy5jbGVhcigpOwotICAgICAgICBfYXR0ck5hbWVzLmNsZWFyKCk7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcyA9IGMubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSAmJgotICAgICAgICAgICAgICAgICAgICAoX3dhbnREdXBBdHRycyB8fCAhX2F0dHJOYW1lcy5jb250YWlucyggcy5nZXROYW1lKCkgKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2F0dHJOYW1lcy5hZGQoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gMykgQXR0cmlidXRlIG5hbWUKLSAgICAgICAgICAgICAgICBlbnN1cmVNYXBwaW5nKCBzLmdldFVyaSgpLCBudWxsLCBmYWxzZSwgdHJ1ZSApOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGludmFsaWRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZSA9IHMucGVla1R5cGUoKS5idWlsZF90ZXh0KCB0aGlzICk7IC8vICM0Ci0KLSAgICAgICAgICAgICAgICBfYXR0cnMucHV0KCBzLCBpbnZhbGlkVmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVtaXRDb250YWluZXIgaGFuZGxlcyB0ZXh0IG9ubHkgZm9yIGxlYXZlcyBhbmQgc3RhcnRzCi0KLSAgICAgICAgaWYgKF9wcmV0dHlQcmludCAmJiAoYy5pc0RvYygpIHx8IGMuaXNMZWFmKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICBfdGV4dCA9IF9zYiwKLSAgICAgICAgICAgICAgICAgICAgci5nZXRDcCggYyApLAotICAgICAgICAgICAgICAgICAgICBjLmlzTGVhZigpID8gYy5nZXRDY2hWYWx1ZSgpIDogYy5nZXRDY2goKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cmltKCBfdGV4dCApOwotCi0gICAgICAgICAgICBpZiAoYy5pc0RvYygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIDAsIF9wcmV0dHlPZmZzZXQgKTsKLQotICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IF9wcmV0dHlPZmZzZXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3ByZXR0eUluZGVudCA+PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdGV4dC5pbnNlcnQoIDAsIF9uZXdMaW5lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMoIF90ZXh0LCAxLCBfcHJldHR5T2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdGV4dC5hcHBlbmQoIF9uZXdMaW5lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMoIF90ZXh0LCBfdGV4dC5sZW5ndGgoKSwgX3ByZXR0eU9mZnNldCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVyaXZlZCBzYXZlcnMgbWF5IHdhbnQgdG8gdGVzdCB0aGUgc3R1ZmYgYmVpbmcgc3RvcmVkIHRvCi0gICAgICAgIC8vIHNlZSBpZiBpcyB3ZWxsIGZvcm1lZCBvciBub3QgaW4gb3JkZXIgdG8gc2F2ZSBvdXQgYQotICAgICAgICAvLyBmcmFnbWVudC4gIERvIHRoaXMgaGVyZSB3aGVuIGVtaXR0aW5nIHRoZSBmaXJzdCBjb250YWluZXIgaWYKLSAgICAgICAgLy8gdGhhdCBjb250YWluZXIgaXMgdGhlIHJvb3QgKGlmIG5vdCB0aGUgcm9vdCwgdGhlbiB3ZSBhcmUKLSAgICAgICAgLy8gd2VsbCBmb3JtZWQpCi0KLSAgICAgICAgaWYgKF93YW50RnJhZ1Rlc3QgJiYgbmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKF90ZXh0ICE9IG51bGwgJiYgIVNwbGF5LmlzV2hpdGVTcGFjZSggX3RleHQgKSkgfHwKLSAgICAgICAgICAgICAgICAgICFjLmlzQWZ0ZXJXaGl0ZVNwYWNlKCBnZXRSb290KCkgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIWMuaXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IGMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgbGVhZiBhbnl3YXlzIC0tIHNvbWV0aW1lcyBpdCBoYXBwZW5zIQotICAgICAgICAgICAgICAgIGlmIChjLmlzTGVhZigpIHx8IHMuaXNBdHRyKCkgfHwgaGFzTWFwcGluZ3MoKSkKLSAgICAgICAgICAgICAgICAgICAgX25lZWRzRnJhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzYXdCZWdpbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBTcGxheSBjRW5kID0gYy5nZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIDsgcyAhPSBjRW5kIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhd0JlZ2luKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25lZWRzRnJhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhd0JlZ2luID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMuaXNBZnRlcldoaXRlU3BhY2UoIGdldFJvb3QoKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uZWVkc0ZyYWcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzYXdCZWdpbikKLSAgICAgICAgICAgICAgICAgICAgICAgIF9uZWVkc0ZyYWcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIEkgYW0gZG9pbmcgYWdncmVzc2l2ZSBuYW1lc3BhY2VzIGFuZCB3ZSdyZSBlbWl0dGluZyBhCi0gICAgICAgIC8vIGNvbnRhaW5lciB3aGljaCBjYW4gY29udGFpbiBjb250ZW50LCBhZGQgdGhlIG5hbWVzcGFjZXMKLSAgICAgICAgLy8gd2UndmUgY29tcHV0ZWQuICBCYXNpY2FsbHksIEknbSBtYWtpbmcgc3VyZSB0aGUgcHJlLWNvbXB1dGVkCi0gICAgICAgIC8vIG5hbWVzcGFjZXMgYXJlIG1hcHBlZCBvbiB0aGUgZmlyc3QgY29udGFpbmVyIHdoaWNoIGhhcyBhIG5hbWUuCi0KLSAgICAgICAgaWYgKF9wcmVDb21wdXRlZE5hbWVzcGFjZXMgIT0gbnVsbCAmJiAobmFtZSAhPSBudWxsIHx8IF9uZWVkc0ZyYWcpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX3ByZUNvbXB1dGVkTmFtZXNwYWNlcy5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGVuc3VyZU1hcHBpbmcoCi0gICAgICAgICAgICAgICAgICAgIHVyaSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlcy5nZXQoIHVyaSApICE9IG51bGwgJiYgIWVuc3VyZURlZmF1bHRFbXB0eSwgZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IHRvIG51bGwgc28gd2UgZG8gdGhpcyBvbmNlIGF0IHRoZSB0b3AKLSAgICAgICAgICAgIF9wcmVDb21wdXRlZE5hbWVzcGFjZXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF93YW50RnJhZ1Rlc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNlZSBpZiBJIG5lZWQgdG8gZ2VuIGEgZnJhZ21lbnQgZm9yIHRoZSBkb2N1bWVudAotCi0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsIHx8IChjLmlzRG9jKCkgJiYgX3N5bnRoRWxlbSA9PSBudWxsKTsKLQotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX25lZWRzRnJhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfZnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGVuc3VyZUZyYWdtZW50TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9kb2NFbGVtID0gbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgX2RvY0VsZW0gPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdENvbnRhaW5lciggYywgbmFtZSApOwotCi0gICAgICAgIGNsZWFyVGV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRW5kICggU3BsYXkgcyApCi0gICAgewotICAgICAgICBDb250YWluZXIgYyA9IHMuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBRTmFtZSBuYW1lID0KLSAgICAgICAgICAgIF9zeW50aEVsZW0gIT0gbnVsbCAmJiBjID09IF90b3AKLSAgICAgICAgICAgICAgICA/IF9zeW50aEVsZW0KLSAgICAgICAgICAgICAgICA6IGMuaXNCZWdpbigpID8gYy5nZXROYW1lKCkgOiBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKF93YW50RnJhZ1Rlc3QgJiYgbmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGlzUm9vdCA9IHMuaXNSb290KCk7Ci0KLSAgICAgICAgICAgIGlmICghaXNSb290IHx8IF9kb2NFbGVtICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IAotICAgICAgICAgICAgICAgICAgICBpc1Jvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgID8gX2RvY0VsZW0KLSAgICAgICAgICAgICAgICAgICAgICAgIDogKHMuaXNFbmQoKSA/IHMuZ2V0Q29udGFpbmVyKCkgOiBzICkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdEVuZCggX3NwbGF5LCBuYW1lICk7Ci0KLSAgICAgICAgYXNzZXJ0ICFfcG9zdFBvcDsKLQotICAgICAgICBfcG9zdFBvcCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHB1c2hGcmFnbWVudE1hcHBpbmdzICggU3BsYXkgcyApCi0gICAgewotICAgICAgICAvLyBtYXNrIHRoZSBpbml0aWFsIGZyYW1lIHRvIGhpZGUgZGVmYXVsdCBtYXBwaW5ncwotICAgICAgICAKLSAgICAgICAgcHVzaE1hcHBpbmdzKAotICAgICAgICAgICAgcyA9PSBudWxsID8gbnVsbCA6IHMuZ2V0Q29udGFpbmVyKCksCi0gICAgICAgICAgICBfZnJhZ21lbnQuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCApOwotICAgICAgICAKLSAgICAgICAgZW5zdXJlRnJhZ21lbnROYW1lc3BhY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc1htbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIC8vIFNhdmluZyBhIGRlZmF1bHQgeG1sbnMgbWFwcGluZyBpcyBkYW5nZXJvdXMsIGp1c3Qgc3BpdCBvdXQgZW1wdHkKLSAgICAgICAgLy8gdGV4dAotICAgICAgICAKLSAgICAgICAgaWYgKHMuZ2V0TG9jYWwoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRnJhZ21lbnRNYXBwaW5ncyggbnVsbCApOwotICAgICAgICAgICAgX3RleHQgPSBfc2I7Ci0gICAgICAgICAgICBlbWl0VGV4dEZyYWdtZW50KCBzLCAwLCAwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRnJhZ21lbnRNYXBwaW5ncyggbnVsbCApOwotICAgICAgICAgICAgZW5zdXJlTWFwcGluZyggcy5nZXRVcmkoKSwgcy5nZXRMb2NhbCgpLCBmYWxzZSwgdHJ1ZSApOwotICAgICAgICAgICAgZW1pdFhtbG5zRnJhZ21lbnQoIHMgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzQ29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgewotICAgICAgICBwdXNoRnJhZ21lbnRNYXBwaW5ncyggbnVsbCApOwotICAgICAgICBlbWl0Q29tbWVudEZyYWdtZW50KCBzICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgewotICAgICAgICBwdXNoRnJhZ21lbnRNYXBwaW5ncyggbnVsbCApOwotICAgICAgICBlbWl0UHJvY2luc3RGcmFnbWVudCggcyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gYSBzaW5nbGUgYXR0ciBpcyBiZWluZyBzYXZlZC4gIEl0IGlzIG5vdCBjYWxsZWQKLSAgICAgKiBhcyBhIGNvbnNlcXVlbmNlIG9mIHNhdmluZyBvdXQgYSBjb250YWluZXIuCi0gICAgICovCi0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc0F0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7Ci0KLSAgICAgICAgcHVzaEZyYWdtZW50TWFwcGluZ3MoIHMgKTsKLQotICAgICAgICBlbnN1cmVNYXBwaW5nKCBzLmdldFVyaSgpLCBudWxsLCBmYWxzZSwgdHJ1ZSApOwotCi0gICAgICAgIGFzc2VydCBub1RleHQoKTsKLQotICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyAtIHBhc3MgU3RyaW5nQnVmZmVyIHRvIGJ1aWxkVGV4dCB0byBzYXZlIG9iamVjdCBjcmVhdGlvbgotICAgICAgICAgICAgX3RleHQgPSBfc2IuYXBwZW5kKCBzLnBlZWtUeXBlKCkuYnVpbGRfdGV4dCggdGhpcyApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0QXR0ckZyYWdtZW50KCBzICk7Ci0KLSAgICAgICAgY2xlYXJUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIGEgc2luZ2xlIGNodW5rIG9mIHRleHQgaXMgdG8gYmUgc2F2ZWQuCi0gICAgICogSXQgaXMgbm90IGNhbGxlZCBhcyBhIGNvbnNlcXVlbmNlIG9mIHNhdmluZyBvdXQgYSBjb250YWluZXIuCi0gICAgICovCi0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc1RleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIC8vIE9ubHkgbmVlZCB0byBzYXZlIGFuY2VzdG9yIG5hbWVzcGFjZSBtYXBwaW5ncyBpZiB0aGVyZSBjb3VsZCBiZSBhCi0gICAgICAgIC8vIHFuYW1lIGhlcmUuICBJZiB0aGUgdGV4dCBpcyBvZiBsZW5ndGggMCwgdGhlbiB0aGVyZSBpcyBubyBxbmFtZS4KLQotICAgICAgICBTcGxheSBjID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICgoX3RleHQgIT0gbnVsbCAmJiBfdGV4dC5sZW5ndGgoKSA+IDApIHx8IChzICE9IG51bGwgJiYgY2NoID4gMCkpCi0gICAgICAgICAgICBjID0gcy5nZXRDb250YWluZXIoIHAgKTsKLSAgICAgICAgCi0gICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBjICk7Ci0KLSAgICAgICAgZW1pdFRleHRGcmFnbWVudCggcywgcCwgY2NoICk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBMYXlvdXQgb2YgbmFtZXNwYWNlIHN0YWNrOgotICAgIC8vCi0gICAgLy8gICAgVVJJIFVuZG8KLSAgICAvLyAgICBVUkkgUmVuYW1lCi0gICAgLy8gICAgUHJlZml4IFVuZG8KLSAgICAvLyAgICBNYXBwaW5nCi0gICAgLy8KLQotICAgIGJvb2xlYW4gaGFzTWFwcGluZ3MgKCApCi0gICAgewotICAgICAgICBpbnQgaSA9IF9uYW1lc3BhY2VTdGFjay5zaXplKCk7Ci0KLSAgICAgICAgcmV0dXJuIGkgPiAwICYmIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAxICkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIGl0ZXJhdGVNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIF9jdXJyZW50TWFwcGluZyA9IF9uYW1lc3BhY2VTdGFjay5zaXplKCk7Ci0KLSAgICAgICAgd2hpbGUgKCBfY3VycmVudE1hcHBpbmcgPiAwICYmCi0gICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2suZ2V0KCBfY3VycmVudE1hcHBpbmcgLSAxICkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJyZW50TWFwcGluZyAtPSA4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBoYXNNYXBwaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jdXJyZW50TWFwcGluZyA8IF9uYW1lc3BhY2VTdGFjay5zaXplKCk7Ci0gICAgfQotCi0gICAgdm9pZCBuZXh0TWFwcGluZyAoICkKLSAgICB7Ci0gICAgICAgIF9jdXJyZW50TWFwcGluZyArPSA4OwotICAgIH0KLQotICAgIFN0cmluZyBtYXBwaW5nUHJlZml4ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGhhc01hcHBpbmcoKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9uYW1lc3BhY2VTdGFjay5nZXQoIF9jdXJyZW50TWFwcGluZyArIDYgKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbWFwcGluZ1VyaSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBoYXNNYXBwaW5nKCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBfY3VycmVudE1hcHBpbmcgKyA3ICk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG1hcHBpbmdQcmV2UHJlZml4VXJpICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGhhc01hcHBpbmcoKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9uYW1lc3BhY2VTdGFjay5nZXQoIF9jdXJyZW50TWFwcGluZyArIDUgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwdXNoTWFwcGluZ3MgKCBDb250YWluZXIgYywgYm9vbGVhbiBlbnN1cmVEZWZhdWx0RW1wdHkgKQotICAgIHsKLSAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggbnVsbCApOwotCi0gICAgICAgIGZvciAoIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2VzOgotICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IGMubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbG5zIHggPSAoWG1sbnMpIHM7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB4LmdldExvY2FsKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSB4LmdldFVyaSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbnN1cmVEZWZhdWx0RW1wdHkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgubGVuZ3RoKCkgPT0gMCAmJiB1cmkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJlZml4IGlzIG5vdCBhbHJlYWR5IG1hcHBlZCBpbgotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZyYW1lCi0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nUHJlZml4KCkuZXF1YWxzKCBwcmVmaXggKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBuYW1lc3BhY2VzOwotCi0gICAgICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoIHByZWZpeCwgdXJpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQdXNoIGFsbCBhbmNlc3RvcnMgdGhlIGZpcnN0IHRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFfZmlyc3RQdXNoKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVuc3VyZURlZmF1bHRFbXB0eSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRVcmkgPSAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggIiIgKTsKLQotICAgICAgICAgICAgLy8gSSBtYXAgdGhlIGRlZmF1bHQgdG8gIiIgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCi0gICAgICAgICAgICBhc3NlcnQgZGVmYXVsdFVyaSAhPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoZGVmYXVsdFVyaS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyggIiIsICIiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBfZmlyc3RQdXNoID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXBNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIGZvciAoIGludCBpID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKSA7IGkgPiAwIDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDEgKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIi0tLS0tLS0tLS0tLS0tLS0iICk7Ci0gICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiTWFwcGluZzogIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDIgKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIiAtPiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMSApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIlByZWZpeCBVbmRvOiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNCApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiIC0+ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAzICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiVXJpIFJlbmFtZTogIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDUgKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIiAtPiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNiApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIlVyaVVuZG86ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA3ICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICIgLT4gIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDggKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgICAgICAgICBpIC09IDg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkTWFwcGluZyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcHJlZml4ICE9IG51bGw7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHByZWZpeCBiZWluZyBtYXBwZWQgaGVyZSBpcyBhbHJlYWR5IG1hcHBlZCB0byBhIHVyaSwKLSAgICAgICAgLy8gdGhhdCB1cmkgd2lsbCBlaXRoZXIgZ28gb3V0IG9mIHNjb3BlIG9yIGJlIG1hcHBlZCB0byBhbm90aGVyCi0gICAgICAgIC8vIHByZWZpeC4KLQotICAgICAgICBTdHJpbmcgcmVuYW1lVXJpID0gKFN0cmluZykgX3ByZWZpeE1hcC5nZXQoIHByZWZpeCApOwotICAgICAgICBTdHJpbmcgcmVuYW1lUHJlZml4ID0gbnVsbDsKLQotICAgICAgICBpZiAocmVuYW1lVXJpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNlZSBpZiB0aGlzIHByZWZpeCBpcyBhbHJlYWR5IG1hcHBlZCB0byB0aGlzIHVyaS4gIElmCi0gICAgICAgICAgICAvLyBzbywgdGhlbiBhZGQgdG8gdGhlIHN0YWNrLCBidXQgdGhlcmUgaXMgbm90aGluZyB0byByZW5hbWUKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAocmVuYW1lVXJpLmVxdWFscyggdXJpICkpCi0gICAgICAgICAgICAgICAgcmVuYW1lVXJpID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IF9uYW1lc3BhY2VTdGFjay5zaXplKCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIGkgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMSApID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA3ICkuZXF1YWxzKCByZW5hbWVVcmkgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJlZml4ID0gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDggKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmFtZVByZWZpeCA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVuYW1lUHJlZml4LmVxdWFscyggcHJlZml4ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpIC09IDg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGkgPiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggX3VyaU1hcC5nZXQoIHVyaSApICk7Ci0gICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIHVyaSApOwotCi0gICAgICAgIGlmIChyZW5hbWVVcmkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggX3VyaU1hcC5nZXQoIHJlbmFtZVVyaSApICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCByZW5hbWVVcmkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIG51bGwgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIHByZWZpeCApOwotICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBfcHJlZml4TWFwLmdldCggcHJlZml4ICkgKTsKLQotICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBwcmVmaXggKTsKLSAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggdXJpICk7Ci0KLSAgICAgICAgX3VyaU1hcC5wdXQoIHVyaSwgcHJlZml4ICk7Ci0gICAgICAgIF9wcmVmaXhNYXAucHV0KCBwcmVmaXgsIHVyaSApOwotCi0gICAgICAgIGlmIChyZW5hbWVVcmkgIT0gbnVsbCkKLSAgICAgICAgICAgIF91cmlNYXAucHV0KCByZW5hbWVVcmksIHJlbmFtZVByZWZpeCApOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwb3BNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKLQotICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAxICkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gMSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3Qgb2xkVXJpID0gX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDcgKTsgCi0gICAgICAgICAgICBPYmplY3Qgb2xkUHJlZml4ID0gX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDggKTsgCi0KLSAgICAgICAgICAgIGlmIChvbGRQcmVmaXggPT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgX3VyaU1hcC5yZW1vdmUoIG9sZFVyaSApOyAKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgX3VyaU1hcC5wdXQoIG9sZFVyaSwgb2xkUHJlZml4ICk7IAotCi0gICAgICAgICAgICBvbGRQcmVmaXggPSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNCApOyAKLSAgICAgICAgICAgIG9sZFVyaSA9IF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAzICk7IAotCi0gICAgICAgICAgICBpZiAob2xkVXJpID09IG51bGwpIAotICAgICAgICAgICAgICAgIF9wcmVmaXhNYXAucmVtb3ZlKCBvbGRQcmVmaXggKTsgCi0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgIF9wcmVmaXhNYXAucHV0KCBvbGRQcmVmaXgsIG9sZFVyaSApOyAKLQotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA1ICk7Ci0KLSAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfdXJpTWFwLnB1dCggdXJpLCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNiApICk7Ci0KLSAgICAgICAgICAgIC8vIEhhaGFoYWhhaGFoYSAtLSA6LSgKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSAxICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gMiApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDMgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSA0ICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gNSApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDYgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSA3ICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gOCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRVcmlNYXBwaW5nICggU3RyaW5nIHVyaSApCi0gICAgewotICAgICAgICBhc3NlcnQgX3VyaU1hcC5nZXQoIHVyaSApICE9IG51bGw7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBfdXJpTWFwLmdldCggdXJpICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdHJ5UHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBpZiAocHJlZml4ID09IG51bGwgfHwgU3BsYXkuYmVnaW5zV2l0aFhtbCggcHJlZml4ICkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nVXJpID0gKFN0cmluZykgX3ByZWZpeE1hcC5nZXQoIHByZWZpeCApOwotCi0gICAgICAgIC8vIElmIHRoZSBwcmVmaXggaXMgY3VycmVudGx5IG1hcHBlZCwgdGhlbiB0cnkgYW5vdGhlciBwcmVmaXguICBBCi0gICAgICAgIC8vIHNwZWNpYWwgY2FzZSBpcyB0aGF0IG9mIHRyeWluZyB0byBtYXAgdGhlIGRlZmF1bHQgcHJlZml4ICgiIikuCi0gICAgICAgIC8vIEhlcmUsIHRoZXJlIGFsd2F5cyBleGlzdHMgYSBkZWZhdWx0IG1hcHBpbmcuICBJZiB0aGlzIGlzIHRoZQotICAgICAgICAvLyBtYXBwaW5nIHdlIGZvdW5kLCB0aGVuIHJlbWFwIGl0IGFueXdheXMuIEkgdXNlICE9IHRvIGNvbXBhcmUKLSAgICAgICAgLy8gc3RyaW5ncyBiZWNhdXNlIEkgd2FudCB0byB0ZXN0IGZvciB0aGUgc3BlY2lmaWMgaW5pdGlhbCBkZWZhdWx0Ci0gICAgICAgIC8vIHVyaSBJIGFkZGVkIHdoZW4gSSBpbml0aWFsaXplZCB0aGUgc2F2ZXIuCi0KLSAgICAgICAgaWYgKGV4aXN0aW5nVXJpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgKHByZWZpeC5sZW5ndGgoKSA+IDAgfHwgZXhpc3RpbmdVcmkgIT0gX2luaXRpYWxEZWZhdWx0VXJpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBlbnN1cmVNYXBwaW5nICgKLSAgICAgICAgU3RyaW5nIHVyaSwgU3RyaW5nIGNhbmRpZGF0ZVByZWZpeCwKLSAgICAgICAgYm9vbGVhbiBjb25zaWRlckNyZWF0aW5nRGVmYXVsdCwgYm9vbGVhbiBtdXN0SGF2ZVByZWZpeCApCi0gICAgewotICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBjYW5kaWRhdGVQcmVmaXggPT0gbnVsbCB8fCBjYW5kaWRhdGVQcmVmaXgubGVuZ3RoKCkgPiAwOwotCi0gICAgICAgIC8vIENhbiBiZSBjYWxsZWQgZm9yIG5vLW5hbWVzcGFjZWQgdGhpbmdzCi0KLSAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIF91cmlNYXAuZ2V0KCB1cmkgKTsKLQotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgKHByZWZpeC5sZW5ndGgoKSA+IDAgfHwgIW11c3RIYXZlUHJlZml4KSkKLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSSB0cnkgcHJlZml4ZXMgZnJvbSBhIG51bWJlciBvZiBwbGFjZXMsIGluIG9yZGVyOgotICAgICAgICAvLwotICAgICAgICAvLyAgMSkgV2hhdCB3YXMgcGFzc2VkIGluCi0gICAgICAgIC8vICAyKSBUaGUgb3B0aW9uYWwgc3VnZ2VzdGlvbnMgKGZvciB1cmkncykKLSAgICAgICAgLy8gIDMpIFRoZSBkZWZhdWx0IG1hcHBpbmcgaXMgYWxsb3dlZAotICAgICAgICAvLyAgNCkgbnMjKysKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5kaWRhdGVQcmVmaXggPT0gbnVsbCB8fCAhdHJ5UHJlZml4KCBjYW5kaWRhdGVQcmVmaXggKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdWdnZXN0ZWRQcmVmaXhlcyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIF9zdWdnZXN0ZWRQcmVmaXhlcy5jb250YWluc0tleSggdXJpICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeVByZWZpeCggKFN0cmluZykgX3N1Z2dlc3RlZFByZWZpeGVzLmdldCggdXJpICkgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVQcmVmaXggPSAoU3RyaW5nKSBfc3VnZ2VzdGVkUHJlZml4ZXMuZ2V0KCB1cmkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0ICYmIF91c2VEZWZhdWx0TmFtZXNwYWNlICYmIHRyeVByZWZpeCggIiIgKSkKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVQcmVmaXggPSAiIjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZVByZWZpeCA9IFFOYW1lSGVscGVyLnN1Z2dlc3RQcmVmaXgoIHVyaSApOwotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAxIDsgOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVByZWZpeCggY2FuZGlkYXRlUHJlZml4ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVByZWZpeCA9IGJhc2VQcmVmaXggKyBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBjYW5kaWRhdGVQcmVmaXggIT0gbnVsbDsKLQotICAgICAgICBzeW50aGV0aWNOYW1lc3BhY2UoIGNhbmRpZGF0ZVByZWZpeCwgdXJpLCBjb25zaWRlckNyZWF0aW5nRGVmYXVsdCApOwotCi0gICAgICAgIGFkZE1hcHBpbmcoIGNhbmRpZGF0ZVByZWZpeCwgdXJpICk7Ci0KLSAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSAoIFN0cmluZyB1cmksIFN0cmluZyBwcmVmaXggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpID4gMDsKLQotICAgICAgICBib29sZWFuIGVtcHR5VXJpID0gdXJpLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZW5zdXJlTWFwcGluZyggdXJpLCBwcmVmaXgsIGVtcHR5VXJpLCAhZW1wdHlVcmkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeCAoIFN0cmluZyBwcmVmaXggKQotICAgIHsKLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoICJ4bWwiICkpCi0gICAgICAgICAgICByZXR1cm4gU3BsYXkuX3htbDE5OThVcmk7Ci0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9wcmVmaXhNYXAuZ2V0KCBwcmVmaXggKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGVuc3VyZUZyYWdtZW50TmFtZXNwYWNlICggKQotICAgIHsKLSAgICAgICAgaWYgKF9mcmFnbWVudC5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGVuc3VyZU1hcHBpbmcoIF9mcmFnbWVudC5nZXROYW1lc3BhY2VVUkkoKSwgImZyYWciLCBmYWxzZSwgZmFsc2UgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFNhdmVyIHdoaWNoIHJlY29yZHMgc3ludGhldGljIG5hbWVzcGFjZXMKLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3ludGhOYW1lc3BhY2VTYXZlciBleHRlbmRzIFNhdmVyCi0gICAgewotICAgICAgICBMaW5rZWRIYXNoTWFwIF9zeW50aE5hbWVzcGFjZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICAKLSAgICAgICAgU3ludGhOYW1lc3BhY2VTYXZlciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHN5bnRoZXRpY05hbWVzcGFjZSAoCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBib29sZWFuIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0ICkKLSAgICAgICAgewotICAgICAgICAgICAgX3N5bnRoTmFtZXNwYWNlcy5wdXQoIHVyaSwgY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgPyAidXNlRGVmYXVsdCIgOiBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKSB7IH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXREb2NUeXBlKAotICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApIHsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgU2F2ZXIgd2hpY2ggZ2VuZXJhdGVzIGNoYXJhY3RlcnMuCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dFNhdmVyIGV4dGVuZHMgU2F2ZXIKLSAgICB7Ci0gICAgICAgIFRleHRTYXZlciAoCi0gICAgICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMsIFN0cmluZyBlbmNvZGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIF93YW50RnJhZ1Rlc3QgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IHIuX3Byb3BzLmdldFZlcnNpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAiMS4wIjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBlbWl0KCAiPD94bWwgdmVyc2lvbj1cIiIgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCB2ZXJzaW9uICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggIlwiIGVuY29kaW5nPVwiIiArIGVuY29kaW5nICsgIlwiPz4iICsgX25ld0xpbmUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjLmlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBjLCBuYW1lLCBudWxsLCBudWxsLCBmYWxzZSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2NoID0gX3RleHQgPT0gbnVsbCA/IGMuZ2V0Q2NoVmFsdWUoKSA6IF90ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCAnPicgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBjICksIGNjaCApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoIF90ZXh0ICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aXplQ29udGVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCAiPC8iICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0TmFtZSggbmFtZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoICcvJyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIWMuaXNMZWFmKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwICYmIGMubmV4dE5vbkF0dHJTcGxheSgpLmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoICcvJyApOwotICAgICAgICAgICAgICAgICAgICAgICAgX3NraXBDb250YWluZXJGaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZW1pdCggJz4nICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIGMsIG5hbWUsIG51bGwsIG51bGwsIHRydWUgKTsKLQotICAgICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIGMgKSwgYy5nZXRDY2goKSApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggX3RleHQgKTsKLQotICAgICAgICAgICAgICAgIGVudGl0aXplQ29udGVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRBdHRySGVscGVyICggU3BsYXkgcywgU3RyaW5nIGludmFsaWRWYWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbWl0KCAnICcgKTsKLSAgICAgICAgICAgIGVtaXROYW1lKCBzLmdldE5hbWUoKSApOwotICAgICAgICAgICAgZW1pdCggIj1cIiIgKTsKLQotICAgICAgICAgICAgaWYgKGludmFsaWRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGVtaXQoIGludmFsaWRWYWx1ZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggcyApLCBzLmdldENjaCgpICk7Ci0KLSAgICAgICAgICAgIGVudGl0aXplQXR0clZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGVtaXQoICciJyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXROYW1lc3BhY2VzSGVscGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoICcgJyApOwotICAgICAgICAgICAgICAgIGVtaXRYbWxucyggbWFwcGluZ1ByZWZpeCgpLCBtYXBwaW5nVXJpKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENvbnRhaW5lckhlbHBlciAoCi0gICAgICAgICAgICBDb250YWluZXIgYywgUU5hbWUgbmFtZSwKLSAgICAgICAgICAgIFNwbGF5IGV4dHJhQXR0ciwgU3RyaW5nQnVmZmVyIGV4dHJhQXR0clRleHQsCi0gICAgICAgICAgICBib29sZWFuIGNsb3NlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKLQotICAgICAgICAgICAgZW1pdCggJzwnICk7Ci0gICAgICAgICAgICBlbWl0TmFtZSggbmFtZSApOwotCi0gICAgICAgICAgICBpZiAoX3NhdmVOYW1lc3BhY2VzRmlyc3QpCi0gICAgICAgICAgICAgICAgZW1pdE5hbWVzcGFjZXNIZWxwZXIoKTsKLQotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX2F0dHJzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSAoU3BsYXkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBlbWl0QXR0ckhlbHBlciggcywgKFN0cmluZykgX2F0dHJzLmdldCggcyApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXh0cmFBdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEF0dHJIZWxwZXIoCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyVGV4dCA9PSBudWxsID8gbnVsbCA6IGV4dHJhQXR0clRleHQudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIV9zYXZlTmFtZXNwYWNlc0ZpcnN0KQotICAgICAgICAgICAgICAgIGVtaXROYW1lc3BhY2VzSGVscGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChjbG9zZSkKLSAgICAgICAgICAgICAgICBlbWl0KCAnPicgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCBzLmdldENwRm9yUG9zKCBnZXRSb290KCksIHAgKSwgY2NoICk7Ci0gICAgICAgICAgICBlbnRpdGl6ZUNvbnRlbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGVtaXRUZXh0KCBzLCBwLCBjY2ggKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCBfdGV4dCApOwotICAgICAgICAgICAgICAgIGVudGl0aXplQ29udGVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsLCBmYWxzZSApOwotCi0gICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggIj4iICk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIF90ZXh0ICk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFbmRIZWxwZXIoIF9mcmFnbWVudCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggIj4iICk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRUZXh0KCBzLCBwLCBjY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVuZEhlbHBlciggX2ZyYWdtZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVtaXQoICIvPiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBzLCBfdGV4dCwgZmFsc2UgKTsKLSAgICAgICAgICAgIGVtaXQoICIvPiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCwgZmFsc2UgKTsKLSAgICAgICAgICAgIGVtaXQoICIvPiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsLCB0cnVlICk7Ci0gICAgICAgICAgICBlbWl0Q29tbWVudCggcyApOwotICAgICAgICAgICAgZW1pdEVuZEhlbHBlciggX2ZyYWdtZW50ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwsIHRydWUgKTsKLSAgICAgICAgICAgIGVtaXRQcm9jaW5zdCggcyApOwotICAgICAgICAgICAgZW1pdEVuZEhlbHBlciggX2ZyYWdtZW50ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnMgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHByZWZpeCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOwotCi0gICAgICAgICAgICBlbWl0KCAieG1sbnMiICk7Ci0KLSAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoICI6IiApOwotICAgICAgICAgICAgICAgIGVtaXQoIHByZWZpeCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbWl0KCAiPVwiIiApOwotCi0gICAgICAgICAgICAvLyBUT0RPIC0gbXVzdCBlbmNvZGUgdXJpIHByb3Blcmx5Ci0KLSAgICAgICAgICAgIGVtaXQoIHVyaSApOwotICAgICAgICAgICAgZW50aXRpemVBdHRyVmFsdWUoKTsKLQotICAgICAgICAgICAgZW1pdCggJyInICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kSGVscGVyICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoICI8LyIgKTsKLSAgICAgICAgICAgIGVtaXROYW1lKCBuYW1lICk7Ci0gICAgICAgICAgICBlbWl0KCAnPicgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdExpdGVyYWwgKCBTdHJpbmcgbGl0ZXJhbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsaXRlcmFsLmluZGV4T2YoICJcIiIgKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggIlwiIiApOwotICAgICAgICAgICAgICAgIGVtaXQoIGxpdGVyYWwgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCAiXCIiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggIiciICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggbGl0ZXJhbCApOwotICAgICAgICAgICAgICAgIGVtaXQoICInIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGRvY3R5cGVOYW1lICE9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVtaXQoICI8IURPQ1RZUEUgIiApOwotICAgICAgICAgICAgZW1pdCggZG9jdHlwZU5hbWUgKTsKLQotICAgICAgICAgICAgaWYgKHB1YmxpY0lEID09IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCAiIFNZU1RFTSAiICk7Ci0gICAgICAgICAgICAgICAgZW1pdExpdGVyYWwoIHN5c3RlbUlEICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwdWJsaWNJRCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoICIgUFVCTElDICIgKTsKLSAgICAgICAgICAgICAgICBlbWl0TGl0ZXJhbCggcHVibGljSUQgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCAiICIgKTsKLSAgICAgICAgICAgICAgICBlbWl0TGl0ZXJhbCggc3lzdGVtSUQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW1pdCggIj4iICsgX25ld0xpbmUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb21tZW50KCk7Ci0gICAgICAgICAgICBlbWl0KCAiPCEtLSIgKTsKLSAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggcyApLCBzLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgIGVudGl0aXplQ29tbWVudCgpOwotICAgICAgICAgICAgZW1pdCggIi0tPiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5pc1Byb2NpbnN0KCk7Ci0gICAgICAgICAgICBlbWl0KCAiPD8iICk7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gZW5jb2RpbmcgaXNzdWVzIGhlcmU/Ci0gICAgICAgICAgICBlbWl0KCBzLmdldExvY2FsKCkgKTsKLQotICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoVmFsdWUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggIiAiICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoVmFsdWUoKSApOwotICAgICAgICAgICAgICAgIGVudGl0aXplUHJvY2luc3QoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW1pdCggIj8+IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEVuc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBjY2ggY2hhcnMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAqIFJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGF2YWlsYWJsZS4gIElmIGxlc3MgdGhhbiBjY2gsCi0gICAgICAgICAqIHRoZW4gdGhhdCdzIGFsbCB3aGljaCB3aWxsIGV2ZXIgYmVjb21lIGF2YWlsYWJsZS4KLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZW5zdXJlICggaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEV2ZW4gaWYgd2UncmUgYXNrZWQgdG8gZW5zdXJlIG5vdGhpbmcsIHN0aWxsIHRyeSB0byBlbnN1cmUKLSAgICAgICAgICAgIC8vIGF0bGVhc3Qgb25lIGNoYXJhY3RlciBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHdlJ3JlIGF0IHRoZQotICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgICAgIGlmIChjY2ggPD0gMCkKLSAgICAgICAgICAgICAgICBjY2ggPSAxOwotCi0gICAgICAgICAgICBpbnQgYXZhaWxhYmxlID0gZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgYXZhaWxhYmxlIDwgY2NoIDsgYXZhaWxhYmxlID0gZ2V0QXZhaWxhYmxlKCkgKQotICAgICAgICAgICAgICAgIGlmICghcHJvY2VzcygpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgYXNzZXJ0IGF2YWlsYWJsZSA9PSBnZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXROYW1lICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0KLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICh1cmkubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0VXJpTWFwcGluZyggdXJpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIHByZWZpeCApOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCAiOiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydCBuYW1lLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID4gMDsKLQotICAgICAgICAgICAgZW1pdCggbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByZUVtaXQgKCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfbGFzdEVtaXRDY2ggPSBjY2g7Ci0KLSAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKF9mcmVlIDwgY2NoKQotICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoLCAtMSApOwotCi0gICAgICAgICAgICBhc3NlcnQgY2NoIDw9IF9mcmVlOwotCi0gICAgICAgICAgICBpbnQgdXNlZCA9IGdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgYWJvdXQgdG8gZW1pdCBhbmQgdGhlcmUgaXMgbm90aW5nIGluIHRoZSBidWZmZXIsIHJlc2V0Ci0gICAgICAgICAgICAvLyB0aGUgYnVmZmVyIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgc28gYXMgdG8gbm90IGdyb3cgaXQgYW55bW9yZQotICAgICAgICAgICAgLy8gdGhhbiBuZWVkZWQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh1c2VkID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9pbiA9PSBfb3V0OwotICAgICAgICAgICAgICAgIGFzc2VydCBfZnJlZSA9PSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBfaW4gPSBfb3V0ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2xhc3RFbWl0SW4gPSBfaW47Ci0KLSAgICAgICAgICAgIF9mcmVlIC09IGNjaDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggU3RyaW5nIHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2NoID0gcyA9PSBudWxsID8gMCA6IHMubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChwcmVFbWl0KCBjY2ggKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBjaHVuazsKLQotICAgICAgICAgICAgaWYgKF9pbiA8PSBfb3V0IHx8IGNjaCA8IChjaHVuayA9IF9idWYubGVuZ3RoIC0gX2luKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzLmdldENoYXJzKCAwLCBjY2gsIF9idWYsIF9pbiApOwotICAgICAgICAgICAgICAgIF9pbiArPSBjY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcy5nZXRDaGFycyggMCwgY2h1bmssIF9idWYsIF9pbiApOwotICAgICAgICAgICAgICAgIHMuZ2V0Q2hhcnMoIGNodW5rLCBjY2gsIF9idWYsIDAgKTsKLSAgICAgICAgICAgICAgICBfaW4gPSAoX2luICsgY2NoKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXQgKCBTdHJpbmdCdWZmZXIgc2IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2NoID0gc2IgPT0gbnVsbCA/IDAgOiBzYi5sZW5ndGgoKTsKLQotICAgICAgICAgICAgaWYgKHByZUVtaXQoIGNjaCApKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IGNodW5rOwotCi0gICAgICAgICAgICBpZiAoX2luIDw9IF9vdXQgfHwgY2NoIDwgKGNodW5rID0gX2J1Zi5sZW5ndGggLSBfaW4pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmdldENoYXJzKCAwLCBjY2gsIF9idWYsIF9pbiApOwotICAgICAgICAgICAgICAgIF9pbiArPSBjY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuZ2V0Q2hhcnMoIDAsIGNodW5rLCBfYnVmLCBfaW4gKTsKLSAgICAgICAgICAgICAgICBzYi5nZXRDaGFycyggY2h1bmssIGNjaCwgX2J1ZiwgMCApOwotICAgICAgICAgICAgICAgIF9pbiA9IChfaW4gKyBjY2gpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdCAoIGludCBjcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoCi0gICAgICAgICAgICAgICAgZ2V0Um9vdCgpLl90ZXh0Ll9idWYsCi0gICAgICAgICAgICAgICAgZ2V0Um9vdCgpLl90ZXh0LnVuT2JzY3VyZSggY3AsIGNjaCApLAotICAgICAgICAgICAgICAgIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXQgKCBjaGFyIGNoICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlRW1pdCggMSApOwotCi0gICAgICAgICAgICBfYnVmWyBfaW4gXSA9IGNoOwotCi0gICAgICAgICAgICBfaW4gPSAoX2luICsgMSkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPj0gMDsKLQotICAgICAgICAgICAgaWYgKHByZUVtaXQoIGNjaCApKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IGNodW5rOwotCi0gICAgICAgICAgICBpZiAoX2luIDw9IF9vdXQgfHwgY2NoIDwgKGNodW5rID0gX2J1Zi5sZW5ndGggLSBfaW4pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGJ1Ziwgb2ZmLCBfYnVmLCBfaW4sIGNjaCApOwotICAgICAgICAgICAgICAgIF9pbiArPSBjY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYsIF9idWYsIF9pbiwgY2h1bmsgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiArIGNodW5rLCBfYnVmLCAwLCBjY2ggLSBjaHVuayApOwotICAgICAgICAgICAgICAgIF9pbiA9IChfaW4gKyBjY2gpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW50aXRpemVDb250ZW50ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xhc3RFbWl0Q2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgaSA9IF9sYXN0RW1pdEluOwotICAgICAgICAgICAgZmluYWwgaW50IG4gPSBfYnVmLmxlbmd0aDsKLQotICAgICAgICAgICAgYm9vbGVhbiBoYXNPdXRPZlJhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgY2NoID0gX2xhc3RFbWl0Q2NoIDsgY2NoID4gMCA7IGNjaC0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2J1ZlsgaSBdOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoID09ICc8JyB8fCBjaCA9PSAnJicpCi0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNCYWRDaGFyKCBjaCApKQotICAgICAgICAgICAgICAgICAgICBoYXNPdXRPZlJhbmdlID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGlmICgrK2kgPT0gbikKLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwICYmICFoYXNPdXRPZlJhbmdlKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaSA9IF9sYXN0RW1pdEluOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSGV1cmlzdGljIGZvciBrbm93aW5nIHdoZW4gdG8gc2F2ZSBvdXQgc3R1ZmYgYXMgYSBDREFUQS4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIGlmIChfbGFzdEVtaXRDY2ggPiAzMiAmJiBjb3VudCA+IDUgJiYKLSAgICAgICAgICAgICAgICAgIGNvdW50ICogMTAwIC8gX2xhc3RFbWl0Q2NoID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGxhc3RXYXNCcmFja2V0ID0gX2J1ZlsgaSBdID09ICddJzsKLQotICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiPCFbQ0RBVEFbIiArIF9idWZbIGkgXSApOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWNvbmRUb0xhc3RXYXNCcmFja2V0ID0gbGFzdFdhc0JyYWNrZXQ7Ci0KLSAgICAgICAgICAgICAgICBsYXN0V2FzQnJhY2tldCA9IF9idWZbIGkgXSA9PSAnXSc7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKytpID09IF9idWYubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBpID0gMDsKLQotICAgICAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz4nICYmIHNlY29uZFRvTGFzdFdhc0JyYWNrZXQgJiYgbGFzdFdhc0JyYWNrZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZndDsiICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzQmFkQ2hhciggY2ggKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiPyIgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgICAgIHNlY29uZFRvTGFzdFdhc0JyYWNrZXQgPSBsYXN0V2FzQnJhY2tldDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0JyYWNrZXQgPSBjaCA9PSAnXSc7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gX2J1Zi5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbWl0KCAiXV0+IiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzwnKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImbHQ7IiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnJicpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZhbXA7IiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0JhZENoYXIoIGNoICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIj8iICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBfYnVmLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbnRpdGl6ZUF0dHJWYWx1ZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IGkgPSBfbGFzdEVtaXRJbjsKLQotICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpCi0gICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJmx0OyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnJicpCi0gICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJmFtcDsiICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJyInKQotICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZxdW90OyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgICAgIGlmIChpID09IF9idWYubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbnRpdGl6ZUNvbW1lbnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbGFzdEVtaXRDY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBpID0gX2xhc3RFbWl0SW47Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gbGFzdFdhc0Rhc2ggPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgIGlmIChpc0JhZENoYXIoIGNoICkpCi0gICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiPyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnLScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFdhc0Rhc2gpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgIi0tIiB3aXRoICItICIgdG8gbWFrZSB3ZWxsIGZvcm1lZAotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICIgIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0Rhc2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNEYXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYXN0V2FzRGFzaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gX2J1Zi5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBCZWNhdXNlIEkgaGF2ZSBvbmx5IHJlcGxhY2VkIGNoYXJzIHdpdGggc2luZ2xlIGNoYXJzLAotICAgICAgICAgICAgLy8gX2xhc3RFbWl0SW4gd2lsbCBzdGlsbCBiZSBvawotCi0gICAgICAgICAgICBpZiAoX2J1ZlsgX2xhc3RFbWl0SW4gKyBfbGFzdEVtaXRDY2ggLSAxIF0gPT0gJy0nKQotICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBfbGFzdEVtaXRJbiArIF9sYXN0RW1pdENjaCAtIDEsICIgIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVudGl0aXplUHJvY2luc3QgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbGFzdEVtaXRDY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBpID0gX2xhc3RFbWl0SW47Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gbGFzdFdhc1F1ZXN0aW9uID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNCYWRDaGFyKCBjaCApKQotICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIj8iICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz4nKQotICAgICAgICAgICAgICAgIHsKLSAgICAvLyBUT0RPIC0gSGFkIHRvIGNvbnZlcnQgdG8gYSBzcGFjZSBoZXJlIC4uLiBpbXBsZXMgbm90IHdlbGwgZm9ybWVkIFhNTAotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFdhc1F1ZXN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICIgIiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgbGFzdFdhc1F1ZXN0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RXYXNRdWVzdGlvbiA9IGNoID09ICc/JzsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpID09IF9idWYubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRlc3QgaWYgYSBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4geG1sIGNoYXJhY3RlciBjb250ZW50LiBTZWUKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1DaGFyCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFkQ2hhciAoIGNoYXIgY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gISAoCi0gICAgICAgICAgICAgICAgKGNoID49IDB4MjAgJiYgY2ggPD0gMHhEN0ZGICkgfHwKLSAgICAgICAgICAgICAgICAoY2ggPj0gMHhFMDAwICYmIGNoIDw9IDB4RkZGRCkgfHwKLSAgICAgICAgICAgICAgICAoY2ggPj0gMHgxMDAwMCAmJiBjaCA8PSAweDEwRkZGRikgfHwKLSAgICAgICAgICAgICAgICAoY2ggPT0gMHg5KSB8fCAoY2ggPT0gMHhBKSB8fCAoY2ggPT0gMHhEKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCByZXBsYWNlICggaW50IGksIFN0cmluZyByZXBsYWNlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByZXBsYWNlbWVudC5sZW5ndGgoKSA+IDA7Ci0KLSAgICAgICAgICAgIGludCBkQ2NoID0gcmVwbGFjZW1lbnQubGVuZ3RoKCkgLSAxOwotCi0gICAgICAgICAgICBpZiAoZENjaCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9idWZbIGkgXSA9IHJlcGxhY2VtZW50LmNoYXJBdCggMCApOwotICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0KLSAgICAgICAgICAgIGlmIChkQ2NoID4gX2ZyZWUpCi0gICAgICAgICAgICAgICAgaSA9IHJlc2l6ZSggZENjaCwgaSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLQotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IGRDY2g7Ci0gICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPiAwOwotCi0gICAgICAgICAgICBpZiAoX291dCA+IF9pbiAmJiBpID49IF9vdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgX2J1ZiwgX291dCAtIGRDY2gsIGkgLSBfb3V0ICk7Ci0gICAgICAgICAgICAgICAgX291dCAtPSBkQ2NoOwotICAgICAgICAgICAgICAgIGkgLT0gZENjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9pbjsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBpLCBfYnVmLCBpICsgZENjaCwgX2luIC0gaSApOwotICAgICAgICAgICAgICAgIF9pbiArPSBkQ2NoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBsYWNlbWVudC5nZXRDaGFycyggMCwgZENjaCArIDEsIF9idWYsIGkgKTsKLQotICAgICAgICAgICAgX2ZyZWUgLT0gZENjaDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0KLSAgICAgICAgICAgIHJldHVybiBpICsgZENjaCArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0QXZhaWxhYmxlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2J1ZiA9PSBudWxsID8gMCA6IF9idWYubGVuZ3RoIC0gX2ZyZWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGZvciBjY2ggY2hhcnMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIGludCByZXNpemUgKCBpbnQgY2NoLCBpbnQgaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IDA7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gX2ZyZWU7Ci0KLSAgICAgICAgICAgIGludCBuZXdMZW4gPSBfYnVmID09IG51bGwgPyBfaW5pdGlhbEJ1ZlNpemUgOiBfYnVmLmxlbmd0aCAqIDI7Ci0gICAgICAgICAgICBpbnQgdXNlZCA9IGdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICB3aGlsZSAoIG5ld0xlbiAtIHVzZWQgPCBjY2ggKQotICAgICAgICAgICAgICAgIG5ld0xlbiAqPSAyOwotCi0gICAgICAgICAgICBjaGFyW10gbmV3QnVmID0gbmV3IGNoYXIgWyBuZXdMZW4gXTsKLQotICAgICAgICAgICAgaWYgKHVzZWQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfaW4gPiBfb3V0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGkgPT0gLTEgfHwgKGkgPj0gX291dCAmJiBpIDwgX2luKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgbmV3QnVmLCAwLCB1c2VkICk7Ci0gICAgICAgICAgICAgICAgICAgIGkgLT0gX291dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGkgPT0gLTEgfHwgKGkgPj0gX291dCB8fCBpIDwgX2luKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgbmV3QnVmLCAwLCB1c2VkIC0gX2luICk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIG5ld0J1ZiwgdXNlZCAtIF9pbiwgX2luICk7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBpID49IF9vdXQgPyBpIC0gX291dCA6IGkgKyBfb3V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfb3V0ID0gMDsKLSAgICAgICAgICAgICAgICBfaW4gPSB1c2VkOwotICAgICAgICAgICAgICAgIF9mcmVlICs9IG5ld0J1Zi5sZW5ndGggLSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZnJlZSArPSBuZXdCdWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIGFzc2VydCBfaW4gPT0gMCAmJiBfb3V0ID09IDA7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGkgPT0gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9idWYgPSBuZXdCdWY7Ci0KLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVuc3VyZSggMSApID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPiAwOwotCi0gICAgICAgICAgICBpbnQgY2ggPSBfYnVmWyBfb3V0IF07Ci0KLSAgICAgICAgICAgIF9vdXQgPSAoX291dCArIDEpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICBfZnJlZSsrOwotCi0gICAgICAgICAgICByZXR1cm4gY2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCBjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc3RyZWFtIGV2ZW4gaWYgdGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybgotICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBiZWNhdXNlIHRoZSBSZWFkZXIgZG9jIHNheXMgdG8gcmV0dXJuIC0xIGF0IGVuZCBvZgotICAgICAgICAgICAgLy8gc3RyZWFtLgotCi0gICAgICAgICAgICBpbnQgbjsKLQotICAgICAgICAgICAgaWYgKChuID0gZW5zdXJlKCBsZW4gKSkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIGlmIChjYnVmID09IG51bGwgfHwgbGVuIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgbGVuKQotICAgICAgICAgICAgICAgIGxlbiA9IG47Ci0KLSAgICAgICAgICAgIGlmIChfb3V0IDwgX2luKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGNidWYsIG9mZiwgbGVuICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNodW5rID0gX2J1Zi5sZW5ndGggLSBfb3V0OwotCi0gICAgICAgICAgICAgICAgaWYgKGNodW5rID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgY2J1Ziwgb2ZmLCBsZW4gKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBjYnVmLCBvZmYsIGNodW5rICk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIGNidWYsIG9mZiArIGNodW5rLCBsZW4gLSBjaHVuayApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX291dCA9IChfb3V0ICsgbGVuKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgX2ZyZWUgKz0gbGVuOwotCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIGxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgd3JpdGUgKCBXcml0ZXIgd3JpdGVyLCBpbnQgY2NoTWluICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCBnZXRBdmFpbGFibGUoKSA8IGNjaE1pbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3MoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjaGFyc0F2YWlsYWJsZSA9IGdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICBpZiAoY2hhcnNBdmFpbGFibGUgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggdGhlIGNpcmN1bGFyIGNhc2VzCi0KLSAgICAgICAgICAgICAgICBhc3NlcnQgX291dCA9PSAwOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIF9idWYsIDAsIGNoYXJzQXZhaWxhYmxlICk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfZnJlZSArPSBjaGFyc0F2YWlsYWJsZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfaW4gPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2hhcnNBdmFpbGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRW5zdXJlIGFsbCB0ZXh0IGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcuCi0gICAgICAgICAqLwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgc2F2ZVRvU3RyaW5nICggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBnb25uYSBidWlsZCBhIHN0cmluZy4gIEluc3RlYWQgb2YgdXNpbmcgU3RyaW5nQnVmZmVyLCBtYXkKLSAgICAgICAgICAgIC8vIGFzIHdlbGwgdXNlIG15IGJ1ZmZlciBoZXJlLiAgRmlsbCB0aGUgd2hvbGUgc3Vja2VyIHVwIGFuZAotICAgICAgICAgICAgLy8gY3JlYXRlIGEgU3RyaW5nIQotCi0gICAgICAgICAgICB3aGlsZSAoIHByb2Nlc3MoKSApCi0gICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICBhc3NlcnQgX291dCA9PSAwOwotCi0gICAgICAgICAgICBpbnQgYXZhaWxhYmxlID0gZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGUgPT0gMCA/ICIiIDogbmV3IFN0cmluZyggX2J1ZiwgX291dCwgYXZhaWxhYmxlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX2luaXRpYWxCdWZTaXplID0gNDA5NjsKLQotICAgICAgICBwcml2YXRlIGludCBfbGFzdEVtaXRJbjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX2xhc3RFbWl0Q2NoOwotCi0gICAgICAgIHByaXZhdGUgaW50ICAgIF9mcmVlOwotICAgICAgICBwcml2YXRlIGludCAgICBfaW47Ci0gICAgICAgIHByaXZhdGUgaW50ICAgIF9vdXQ7Ci0gICAgICAgIHByaXZhdGUgY2hhcltdIF9idWY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBSZWFkZXIgd2hpY2ggZXhwb3NlcyB0aGUgdGV4dCBvZiBhIHBhcnQgb2YgdGhlIHRyZWUuCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dFJlYWRlciBleHRlbmRzIFJlYWRlcgotICAgIHsKLSAgICAgICAgVGV4dFJlYWRlciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90ZXh0U2F2ZXIgPSBuZXcgVGV4dFNhdmVyKCByLCBzLCBwLCBvcHRpb25zLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSAoICkgdGhyb3dzIElPRXhjZXB0aW9uIHsgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlYWR5ICggKSB0aHJvd3MgSU9FeGNlcHRpb24geyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdGV4dFNhdmVyLnJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoIGNoYXJbXSBjYnVmICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdGV4dFNhdmVyLnJlYWQoIGNidWYsIDAsIGNidWYgPT0gbnVsbCA/IDAgOiBjYnVmLmxlbmd0aCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkICggY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4gKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF90ZXh0U2F2ZXIucmVhZCggY2J1Ziwgb2ZmLCBsZW4gKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVGV4dFNhdmVyIF90ZXh0U2F2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnB1dFN0cmVhbVNhdmVyIGV4dGVuZHMgSW5wdXRTdHJlYW0KLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtU2F2ZXIgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwob3B0aW9ucyk7Ci0gICAgICAgICAgICBfYnl0ZUJ1ZmZlciA9IG5ldyBPdXRwdXRTdHJlYW1JbXBsKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyLl9wcm9wcy5nZXRFbmNvZGluZygpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcgPQotICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ01hcC5nZXRJQU5BMkphdmFNYXBwaW5nKCByLl9wcm9wcy5nZXRFbmNvZGluZygpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkNIQVJBQ1RFUl9FTkNPRElORykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBvcHRpb25zLmdldChYbWxPcHRpb25zLkNIQVJBQ1RFUl9FTkNPRElORyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBpYW5hRW5jb2RpbmcgPQotICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ01hcC5nZXRKYXZhMklBTkFNYXBwaW5nKCBlbmNvZGluZyApOwotCi0gICAgICAgICAgICAgICAgaWYgKGlhbmFFbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGlhbmFFbmNvZGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRKYXZhMklBTkFNYXBwaW5nKCAiVVRGOCIgKTsKLQotICAgICAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoIGVuY29kaW5nICk7Ci0KLSAgICAgICAgICAgIGlmIChqYXZhRW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udmVydGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggX2J5dGVCdWZmZXIsIGphdmFFbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX3RleHRTYXZlciA9IG5ldyBUZXh0U2F2ZXIoIHIsIHMsIHAsIG9wdGlvbnMsIGVuY29kaW5nICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYnl0ZUJ1ZmZlci5yZWFkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCBieXRlW10gYmJ1ZiwgaW50IG9mZiwgaW50IGxlbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYnl0ZUJ1ZmZlci5yZWFkICggYmJ1Ziwgb2ZmLCBsZW4gKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGVuc3VyZSAoIGludCBjYnl0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEV2ZW4gaWYgd2UncmUgYXNrZWQgdG8gZW5zdXJlIG5vdGhpbmcsIHN0aWxsIHRyeSB0byBlbnN1cmUKLSAgICAgICAgICAgIC8vIGF0bGVhc3Qgb25lIGJ5dGUgc28gd2UgY2FuIGRldGVybWluZSBpZiB3ZSdyZSBhdCB0aGUKLSAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgc3RyZWFtLgotCi0gICAgICAgICAgICBpZiAoY2J5dGUgPD0gMCkKLSAgICAgICAgICAgICAgICBjYnl0ZSA9IDE7Ci0KLSAgICAgICAgICAgIGludCBieXRlc0F2YWlsYWJsZSA9IF9ieXRlQnVmZmVyLmdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICBmb3IgKCA7IGJ5dGVzQXZhaWxhYmxlIDwgY2J5dGUgOwotICAgICAgICAgICAgICAgICAgYnl0ZXNBdmFpbGFibGUgPSBfYnl0ZUJ1ZmZlci5nZXRBdmFpbGFibGUoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90ZXh0U2F2ZXIud3JpdGUoIF9jb252ZXJ0ZXIsIDIwNDggKSA8IDIwNDgpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBieXRlc0F2YWlsYWJsZSA9IF9ieXRlQnVmZmVyLmdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICBpZiAoYnl0ZXNBdmFpbGFibGUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzQXZhaWxhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBPdXRwdXRTdHJlYW1JbXBsIGV4dGVuZHMgT3V0cHV0U3RyZWFtCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZWFkICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbVNhdmVyLnRoaXMuZW5zdXJlKCAxICkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGdldEF2YWlsYWJsZSgpID4gMDsKLQotICAgICAgICAgICAgICAgIGludCBiaXRlID0gX2J1ZlsgX291dCBdOwotCi0gICAgICAgICAgICAgICAgX291dCA9IChfb3V0ICsgMSkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBfZnJlZSsrOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCByZWFkICggYnl0ZVtdIGJidWYsIGludCBvZmYsIGludCBsZW4gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc3RyZWFtIGV2ZW4gaWYgdGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybgotICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgYmVjYXVzZSB0aGUgUmVhZGVyIGRvYyBzYXlzIHRvIHJldHVybiAtMSBhdCBlbmQgb2YKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0uCi0KLSAgICAgICAgICAgICAgICBpbnQgbjsKLQotICAgICAgICAgICAgICAgIGlmICgobiA9IGVuc3VyZSggbGVuICkpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIGlmIChiYnVmID09IG51bGwgfHwgbGVuIDw9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAgICAgaWYgKG4gPCBsZW4pCi0gICAgICAgICAgICAgICAgICAgIGxlbiA9IG47Ci0KLSAgICAgICAgICAgICAgICBpZiAoX291dCA8IF9pbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGJidWYsIG9mZiwgbGVuICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaHVuayA9IF9idWYubGVuZ3RoIC0gX291dDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmsgPj0gbGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgYmJ1Ziwgb2ZmLCBsZW4gKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBiYnVmLCBvZmYsIGNodW5rICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1ZiwgMCwgYmJ1Ziwgb2ZmICsgY2h1bmssIGxlbiAtIGNodW5rICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfb3V0ID0gKF9vdXQgKyBsZW4pICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgX2ZyZWUgKz0gbGVuOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGdldEF2YWlsYWJsZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2J1ZiA9PSBudWxsID8gMCA6IF9idWYubGVuZ3RoIC0gX2ZyZWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlICggaW50IGJpdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZnJlZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXNpemUoIDEgKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+IDA7Ci0KLSAgICAgICAgICAgICAgICBfYnVmWyBfaW4gXSA9IChieXRlKSBiaXRlOwotCi0gICAgICAgICAgICAgICAgX2luID0gKF9pbiArIDEpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgX2ZyZWUtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUgKCBieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2J5dGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjYnl0ZSA+PSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKGNieXRlID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgIGlmIChfZnJlZSA8IGNieXRlKQotICAgICAgICAgICAgICAgICAgICByZXNpemUoIGNieXRlICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX2luID09IF9vdXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID09IF9idWYubGVuZ3RoIC0gZ2V0QXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9pbiA9IF9vdXQgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBjaHVuazsKLQotICAgICAgICAgICAgICAgIGlmIChfaW4gPD0gX291dCB8fCBjYnl0ZSA8IChjaHVuayA9IF9idWYubGVuZ3RoIC0gX2luKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGJ1Ziwgb2ZmLCBfYnVmLCBfaW4sIGNieXRlICk7Ci0gICAgICAgICAgICAgICAgICAgIF9pbiArPSBjYnl0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYsIF9idWYsIF9pbiwgY2h1bmsgKTsKLQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBvZmYgKyBjaHVuaywgX2J1ZiwgMCwgY2J5dGUgLSBjaHVuayApOwotCi0gICAgICAgICAgICAgICAgICAgIF9pbiA9IChfaW4gKyBjYnl0ZSkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfZnJlZSAtPSBjYnl0ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCByZXNpemUgKCBpbnQgY2J5dGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjYnl0ZSA+IF9mcmVlOwotCi0gICAgICAgICAgICAgICAgaW50IG5ld0xlbiA9IF9idWYgPT0gbnVsbCA/IF9pbml0aWFsQnVmU2l6ZSA6IF9idWYubGVuZ3RoICogMjsKLSAgICAgICAgICAgICAgICBpbnQgdXNlZCA9IGdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBuZXdMZW4gLSB1c2VkIDwgY2J5dGUgKQotICAgICAgICAgICAgICAgICAgICBuZXdMZW4gKj0gMjsKLQotICAgICAgICAgICAgICAgIGJ5dGVbXSBuZXdCdWYgPSBuZXcgYnl0ZSBbIG5ld0xlbiBdOwotCi0gICAgICAgICAgICAgICAgaWYgKHVzZWQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9vdXQgPT0gX2luKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgMCwgbmV3QnVmLCAwLCB1c2VkICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9pbiA+IF9vdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBuZXdCdWYsIDAsIHVzZWQgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9idWYsIF9vdXQsIG5ld0J1ZiwgMCwgdXNlZCAtIF9pbiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9idWYsIDAsIG5ld0J1ZiwgdXNlZCAtIF9pbiwgX2luICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfb3V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgX2luID0gdXNlZDsKLSAgICAgICAgICAgICAgICAgICAgX2ZyZWUgKz0gbmV3QnVmLmxlbmd0aCAtIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZnJlZSArPSBuZXdCdWYubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX2luID09IDAgJiYgX291dCA9PSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9idWYgPSBuZXdCdWY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfaW5pdGlhbEJ1ZlNpemUgPSA0MDk2OwotCi0gICAgICAgICAgICBpbnQgICAgX2ZyZWU7Ci0gICAgICAgICAgICBpbnQgICAgX2luOwotICAgICAgICAgICAgaW50ICAgIF9vdXQ7Ci0gICAgICAgICAgICBieXRlW10gX2J1ZjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtSW1wbCAgIF9ieXRlQnVmZmVyOwotICAgICAgICBwcml2YXRlIFRleHRTYXZlciAgICAgICAgICBfdGV4dFNhdmVyOwotICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbVdyaXRlciBfY29udmVydGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgWG1sSW5wdXRTdHJlYW1TYXZlciBleHRlbmRzIFNhdmVyCi0gICAgewotICAgICAgICBYbWxJbnB1dFN0cmVhbVNhdmVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTEV2ZW50IGRlcXVldWUgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9vdXQgPT0gbnVsbCAmJiAhcHJvY2VzcygpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBpZiAoX291dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBYbWxFdmVudEltcGwgZSA9IF9vdXQ7Ci0KLSAgICAgICAgICAgIGlmICgoX291dCA9IF9vdXQuX25leHQpID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2luID0gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW5xdWV1ZSAoIFhtbEV2ZW50SW1wbCBlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGUuX25leHQgPT0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKF9pbiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfb3V0ID09IG51bGw7Ci0gICAgICAgICAgICAgICAgX291dCA9IF9pbiA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2luLl9uZXh0ID0gZTsKLSAgICAgICAgICAgICAgICBfaW4gPSBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiQ2FuJ3Qgc3RyZWFtIGFuIGF0dHJpYnV0ZSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKLSAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggZ2V0Um9vdCgpLCBzLCBwLCBudWxsICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEJVR0JVRyAtIHRoZXJlIGNvdWxkIGJlIG5hbWVzcGFjZXMgcHVzaGVkIGZvciB0aGlzIHRleHQsIG5vdAotICAgICAgICAgICAgLy8gc3VyZSBob3cgdG8gY29tbXVuaWNhdGUgdGhvc2UsIGhvd2V2ZXIKLQotICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCAmJiBjY2ggPiAwKQotICAgICAgICAgICAgICAgIGVtaXRUZXh0KCBzLCBwLCBjY2ggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGVtaXRUZXh0KCBzLCBwLCBjY2ggKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIGdldFJvb3QoKSwgcywgLTEsIHRleHQoKSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kUHJlZml4TWFwcGluZ3MgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJldlByZWZpeFVyaSA9IG1hcHBpbmdQcmV2UHJlZml4VXJpKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJldlByZWZpeFVyaSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgRW5kUHJlZml4TWFwcGluZ0ltcGwoIHIsIG1hcHBpbmdQcmVmaXgoKSApICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VQcmVmaXhNYXBwaW5nSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBtYXBwaW5nUHJlZml4KCksIG1hcHBpbmdVcmkoKSwgcHJldlByZWZpeFVyaSApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIGlmIChzLmlzUm9vdCgpKQotICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmREb2N1bWVudEltcGwoIHIsIHMgKSApOwotICAgICAgICAgICAgZWxzZSBpZiAocy5pc0VuZCgpKQotICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmRFbGVtZW50SW1wbCggciwgcywgbmFtZSwgZ2V0VXJpTWFwKCkgKSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmRFbGVtZW50SW1wbCggciwgcywgbmFtZSwgZ2V0VXJpTWFwKCkgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbWl0RW5kUHJlZml4TWFwcGluZ3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbW1lbnQoIHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRQcm9jaW5zdCggcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ29tbWVudEltcGwoIGdldFJvb3QoKSwgcyApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW5xdWV1ZSggbmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwoIGdldFJvb3QoKSwgcyApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJDYW4ndCBzdHJlYW0gYW4gYXR0cmlidXRlIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVucXVldWUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdGFydFByZWZpeE1hcHBpbmdJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgciwgbWFwcGluZ1ByZWZpeCgpLCBtYXBwaW5nVXJpKCkgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYy5pc0RvYygpKQotICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBTdGFydERvY3VtZW50SW1wbCggciwgYyApICk7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5xdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXJ0RWxlbWVudEltcGwoIHIsIGMsIG5hbWUsIHRoaXMgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYy5pc0RvYygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjLmlzRG9jKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIHIsIGMsIC0xLCB0ZXh0KCkgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjLmdldENjaCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCByLCBjLCAxLCBudWxsICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGMuaXNMZWFmKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCByLCBjLCAtMSwgdGV4dCgpICkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjLmdldENjaFZhbHVlKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIHIsIGMsIDEsIG51bGwgKSApOwotCi0gICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZEVsZW1lbnRJbXBsKCByLCBjLCBuYW1lLCBnZXRVcmlNYXAoKSApICk7Ci0KLSAgICAgICAgICAgICAgICBlbWl0RW5kUHJlZml4TWFwcGluZ3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBYTUxOYW1lIGNvbXB1dGVOYW1lICggUU5hbWUgbiwgTWFwIHVyaU1hcCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgdXJpID0gbnVsbDsKLQotICAgICAgICAgICAgYXNzZXJ0IG4uZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwOwotCi0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFzc2VydCBtYXkgZmlyZSBpZiBzb21lb25lIGNvbXB1dGVzIGEgbmFtZQotICAgICAgICAgICAgLy8gb2YgYW4gZWxlbWVudC9hdHRyIHRvbyBsYXRlIChhZnRlciBvdGhlciBldmVudHMgaGF2ZSBiZWVuCi0gICAgICAgICAgICAvLyBlbnF1ZXVlZCBhbmQgdGhlIHVyaSBtYXAgaGFzIGJlZW4gdXBkYXRlZC4gIEkgY2hlY2sgbGF0ZXIKLSAgICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBjcmFzaCwgaG93ZXZlci4KLQotICAgICAgICAgICAgYXNzZXJ0IHVyaSA9PSBudWxsIHx8IHVyaU1hcC5jb250YWluc0tleSggdXJpICkgOiAiUHJvYmxlbSB1cmkgIiArIHVyaTsKLQotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSB1cmlNYXAuZ2V0KCB1cmkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbCggdXJpLCBuLmdldExvY2FsUGFydCgpLCBwcmVmaXggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFhtbEV2ZW50SW1wbCBleHRlbmRzIFhtbEV2ZW50QmFzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcm9vdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgWG1sRXZlbnRJbXBsICggaW50IHR5cGUsIFJvb3QgciwgU3BsYXkgcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIHR5cGUgKTsKLSAgICAgICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgICAgICAgICAgX3NwbGF5ID0gczsKLSAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IF9yb290LmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBYTUxOYW1lIGdldFNjaGVtYVR5cGUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJOWUkiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBMb2NhdGlvbiBnZXRMb2NhdGlvbiAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gcGVyaGFwcyBJIGNhbiBzYXZlIGEgbG9jYXRpb24gZ29vYmVyIHNvbWV0aW1lcz8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1ZlcnNpb24gKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IF9yb290LmdldFZlcnNpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm90ZWN0ZWQgZmluYWwgUm9vdCBnZXRSb290ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcm9vdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFNwbGF5IGdldFNwbGF5ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3BsYXk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgUm9vdCAgX3Jvb3Q7Ci0gICAgICAgICAgICBwcml2YXRlIFNwbGF5IF9zcGxheTsKLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgX3ZlcnNpb247Ci0KLSAgICAgICAgICAgIFhtbEV2ZW50SW1wbCBfbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXJ0RG9jdW1lbnRJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIFN0YXJ0RG9jdW1lbnQKLSAgICAgICAgewotICAgICAgICAgICAgU3RhcnREb2N1bWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVCwgciwgcyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuX3Byb3BzLmdldERvY3R5cGVTeXN0ZW1JZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLl9wcm9wcy5nZXRFbmNvZGluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuX3N0YW5kQWxvbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24gKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5fcHJvcHMuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXJ0RWxlbWVudEltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgU3RhcnRFbGVtZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0YXJ0RWxlbWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMsIFFOYW1lIG5hbWUsIFNhdmVyIHNhdmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCwgciwgcyApOwotCi0gICAgICAgICAgICAgICAgX25hbWUgPSBjb21wdXRlTmFtZSggbmFtZSwgc2F2ZXIuZ2V0VXJpTWFwKCkgKTsKLQotICAgICAgICAgICAgICAgIF9wcmVmaXhNYXAgPSBzYXZlci5nZXRQcmVmaXhNYXAoKTsKLQotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgbGFzdEF0dHIgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IHNhdmVyLl9hdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpIDsKLSAgICAgICAgICAgICAgICAgICAgICBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IGEgPSAoU3BsYXkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCBhdHRyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3JtYWxBdHRyaWJ1dGVJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGEsIChTdHJpbmcpIHNhdmVyLl9hdHRycy5nZXQoIGEgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlci5nZXRVcmlNYXAoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlcyA9IGF0dHI7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBdHRyLl9uZXh0ID0gYXR0cjsKLQotICAgICAgICAgICAgICAgICAgICBsYXN0QXR0ciA9IGF0dHI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdEF0dHIgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yICggc2F2ZXIuaXRlcmF0ZU1hcHBpbmdzKCkgOwotICAgICAgICAgICAgICAgICAgICAgIHNhdmVyLmhhc01hcHBpbmcoKSA7IHNhdmVyLm5leHRNYXBwaW5nKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCBhdHRyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxuc0F0dHJpYnV0ZUltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgc2F2ZXIubWFwcGluZ1ByZWZpeCgpLCBzYXZlci5tYXBwaW5nVXJpKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZXIuZ2V0VXJpTWFwKCkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVzcGFjZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzID0gYXR0cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEF0dHIuX25leHQgPSBhdHRyOwotCi0gICAgICAgICAgICAgICAgICAgIGxhc3RBdHRyID0gYXR0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0QXR0cmlidXRlcyAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVJdGVyYXRvckltcGwoIGdldFJvb3QoKSwgX2F0dHJpYnV0ZXMsIG51bGwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXROYW1lc3BhY2VzICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZUl0ZXJhdG9ySW1wbCggZ2V0Um9vdCgpLCBudWxsLCBfbmFtZXNwYWNlcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldEF0dHJpYnV0ZXNBbmROYW1lc3BhY2VzICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZUl0ZXJhdG9ySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSb290KCksIF9hdHRyaWJ1dGVzLCBfbmFtZXNwYWNlcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVCeU5hbWUgKCBYTUxOYW1lIHhtbE5hbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIEF0dHJpYnV0ZUltcGwgYSA9IF9hdHRyaWJ1dGVzIDsgYSAhPSBudWxsIDsgYSA9IGEuX25leHQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sTmFtZS5lcXVhbHMoIGEuZ2V0TmFtZSgpICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSAoIFN0cmluZyBwcmVmaXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX3ByZWZpeE1hcC5nZXQoIHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlTWFwICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJlZml4TWFwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXR0cmlidXRlSXRlcmF0b3JJbXBsCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBBdHRyaWJ1dGVJdGVyYXRvcgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbW9uaXRvcigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Jvb3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUl0ZXJhdG9ySW1wbCAoCi0gICAgICAgICAgICAgICAgICAgIFJvb3QgciwgQXR0cmlidXRlSW1wbCBhdHRyaWJ1dGVzLCBBdHRyaWJ1dGVJbXBsIG5hbWVzcGFjZXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IHIuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlIG5leHQgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsIGF0dHIgPSBudWxsOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciA9IF9hdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gYXR0ci5fbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9uYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciA9IF9uYW1lc3BhY2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzID0gYXR0ci5fbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYXR0cmlidXRlcyAhPSBudWxsIHx8IF9uYW1lc3BhY2VzICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlIHBlZWsgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfbmFtZXNwYWNlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZXNwYWNlczsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2tpcCAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gX2F0dHJpYnV0ZXMuX25leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfbmFtZXNwYWNlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzID0gX25hbWVzcGFjZXMuX25leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIHZvaWQgY2hlY2tWZXJzaW9uICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IF9yb290LmdldFZlcnNpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgUm9vdCAgICAgICAgICBfcm9vdDsKLSAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgICAgICAgICAgX3ZlcnNpb247Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVJbXBsIF9hdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgIHByaXZhdGUgQXR0cmlidXRlSW1wbCBfbmFtZXNwYWNlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzIEF0dHJpYnV0ZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbW9uaXRvcigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Jvb3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgKCBSb290IHIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IHIuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBYTUxOYW1lIGdldE5hbWUgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgLy8gVE9ETyAtIE1ha2Ugc3VyZSB0aHJvd2luZyBhd2F5IHRoaXMgRFREIGluZm8gaXMgb2suCi0gICAgLy8gSXMgdGhlcmUgc2NoZW1hIGluZm8gd2hpY2ggY2FuIHJldHVybiBtb3JlIHVzZWZ1bCBpbmZvPwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDREFUQSI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXRTY2hlbWFUeXBlICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIC8vIFRPRE8gLSBDYW4gSSByZXR1cm4gc29tZXRoaW5nIHJlYXNvbmFibGUgaGVyZT8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tWZXJzaW9uICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IF9yb290LmdldFZlcnNpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgX25leHQ7Ci0KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgWE1MTmFtZSBfbmFtZTsKLQotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBSb290ICBfcm9vdDsKLSAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgIF92ZXJzaW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxuc0F0dHJpYnV0ZUltcGwgZXh0ZW5kcyBBdHRyaWJ1dGVJbXBsCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sbnNBdHRyaWJ1dGVJbXBsICgKLSAgICAgICAgICAgICAgICAgICAgUm9vdCByLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBNYXAgdXJpTWFwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyKCByICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX3VyaSA9IHVyaTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgPSAieG1sbnMiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgPSBwcmVmaXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAieG1sbnMiOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBuZXcgWG1sTmFtZUltcGwoIG51bGwsIGxvY2FsLCBwcmVmaXggKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF91cmk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfdXJpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3JtYWxBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgQXR0cmlidXRlSW1wbAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5vcm1hbEF0dHJpYnV0ZUltcGwgKAotICAgICAgICAgICAgICAgICAgICBSb290IHIsIFNwbGF5IHMsIFN0cmluZyB2YWx1ZSwgTWFwIHVyaU1hcCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdXBlciggciApOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKLSAgICAgICAgICAgICAgICAgICAgX3NwbGF5ID0gczsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIF9uYW1lID0gY29tcHV0ZU5hbWUoIHMuZ2V0TmFtZSgpLCB1cmlNYXAgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZSAhPSBudWxsID8gX3ZhbHVlIDogX3NwbGF5LmdldFRleHQoIF9yb290ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7IC8vIElmIGludmFsaWQgaW4gdGhlIHN0b3JlCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBTcGxheSBfc3BsYXk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgWE1MTmFtZSBfbmFtZTsKLSAgICAgICAgICAgIHByaXZhdGUgTWFwICAgICBfcHJlZml4TWFwOwotCi0gICAgICAgICAgICBwcml2YXRlIEF0dHJpYnV0ZUltcGwgX2F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICBwcml2YXRlIEF0dHJpYnV0ZUltcGwgX25hbWVzcGFjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGFydFByZWZpeE1hcHBpbmdJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIFN0YXJ0UHJlZml4TWFwcGluZwotICAgICAgICB7Ci0gICAgICAgICAgICBTdGFydFByZWZpeE1hcHBpbmdJbXBsICggUm9vdCByLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkcsIHIsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIF9wcmVmaXggPSBwcmVmaXg7Ci0gICAgICAgICAgICAgICAgX3VyaSA9IHVyaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF91cmk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ByZWZpeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF9wcmVmaXgsIF91cmk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFuZ2VQcmVmaXhNYXBwaW5nSW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBDaGFuZ2VQcmVmaXhNYXBwaW5nCi0gICAgICAgIHsKLSAgICAgICAgICAgIENoYW5nZVByZWZpeE1hcHBpbmdJbXBsICgKLSAgICAgICAgICAgICAgICBSb290IHIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBvbGRVcmksIFN0cmluZyBuZXdVcmkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkcsIHIsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIF9vbGRVcmkgPSBvbGRVcmk7Ci0gICAgICAgICAgICAgICAgX25ld1VyaSA9IG5ld1VyaTsKLSAgICAgICAgICAgICAgICBfcHJlZml4ID0gcHJlZml4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9sZE5hbWVzcGFjZVVyaSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29sZFVyaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3TmFtZXNwYWNlVXJpICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmV3VXJpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXggKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfb2xkVXJpLCBfbmV3VXJpLCBfcHJlZml4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW5kUHJlZml4TWFwcGluZ0ltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgRW5kUHJlZml4TWFwcGluZwotICAgICAgICB7Ci0gICAgICAgICAgICBFbmRQcmVmaXhNYXBwaW5nSW1wbCAoIFJvb3QgciwgU3RyaW5nIHByZWZpeCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORywgciwgbnVsbCApOwotICAgICAgICAgICAgICAgIF9wcmVmaXggPSBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJlZml4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3ByZWZpeDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJhY3RlckRhdGFJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIENoYXJhY3RlckRhdGEKLSAgICAgICAgewotICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YUltcGwgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBTdHJpbmcgY2hhckRhdGEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5DSEFSQUNURVJfREFUQSwgciwgcyApOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHAgPiAwIHx8IChjaGFyRGF0YSAhPSBudWxsICYmIGNoYXJEYXRhLmxlbmd0aCgpID4gMCk7Ci0KLSAgICAgICAgICAgICAgICBfcG9zID0gcDsKLSAgICAgICAgICAgICAgICBfY2hhckRhdGEgPSBjaGFyRGF0YTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoX3BvcyA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY2hhckRhdGE7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIF9wb3MgKSwgcy5nZXRQb3N0Q2NoKCBfcG9zICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIGludCAgICBfcG9zOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2NoYXJEYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW5kRWxlbWVudEltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgRW5kRWxlbWVudAotICAgICAgICB7Ci0gICAgICAgICAgICBFbmRFbGVtZW50SW1wbCAoIFJvb3QgciwgU3BsYXkgcywgUU5hbWUgbmFtZSwgTWFwIHVyaU1hcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkVORF9FTEVNRU5ULCByLCBzICk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKSB8fCBzLmlzRW5kKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHMuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9uYW1lID0gY29tcHV0ZU5hbWUoIG5hbWUsIHVyaU1hcCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFhNTE5hbWUgX25hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmREb2N1bWVudEltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgRW5kRG9jdW1lbnQKLSAgICAgICAgewotICAgICAgICAgICAgRW5kRG9jdW1lbnRJbXBsICggUm9vdCByLCBTcGxheSBzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuRU5EX0RPQ1VNRU5ULCByLCBzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21tZW50SW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBDb21tZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1lbnRJbXBsICggUm9vdCByLCBTcGxheSBzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuQ09NTUVOVCwgciwgcyApOwotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQ29tbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldENjaCgpID09IDAgPyBudWxsIDogcy5nZXRUZXh0KCBnZXRSb290KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkuZ2V0Q2NoKCkgPiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgKCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OLCByLCBzICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNQcm9jaW5zdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5nZXRMb2NhbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREYXRhICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXRDY2goKSA9PSAwID8gbnVsbCA6IHMuZ2V0VGV4dCggZ2V0Um9vdCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBYbWxFdmVudEltcGwgX2luLCBfb3V0OwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBYbWxJbnB1dFN0cmVhbUltcGwgZXh0ZW5kcyBHZW5lcmljWG1sSW5wdXRTdHJlYW0KLSAgICB7Ci0gICAgICAgIFhtbElucHV0U3RyZWFtSW1wbCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF94bWxJbnB1dFN0cmVhbVNhdmVyID0KLSAgICAgICAgICAgICAgICBuZXcgWG1sSW5wdXRTdHJlYW1TYXZlciggciwgcywgcCwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICAvLyBNYWtlIHRoZSBzYXZlciBncmluZCBhd2F5IGp1c3QgYSBiaXQgdG8gdGhyb3cgYW55IGV4Y2VwdGlvbnMKLSAgICAgICAgICAgIC8vIHJlbGF0ZWQgdG8gdGhlIGluYWJpbGl0eSB0byBjcmVhdGUgYSBzdHJlYW0gb24gdGhpcyB4bWwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX3htbElucHV0U3RyZWFtU2F2ZXIucHJvY2VzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFhNTEV2ZW50IG5leHRFdmVudCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3htbElucHV0U3RyZWFtU2F2ZXIuZGVxdWV1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBYbWxJbnB1dFN0cmVhbVNhdmVyIF94bWxJbnB1dFN0cmVhbVNhdmVyOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFZhbGlkYXRvclNhdmVyCi0gICAgICAgIGV4dGVuZHMgU2F2ZXIgaW1wbGVtZW50cyBWYWxpZGF0b3JMaXN0ZW5lci5FdmVudAotICAgIHsKLSAgICAgICAgVmFsaWRhdG9yU2F2ZXIgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwKLSAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucywgVmFsaWRhdG9yTGlzdGVuZXIgdkV2ZW50U2luayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIF93YW50RHVwQXR0cnMgPSB0cnVlOwotCi0gICAgICAgICAgICBhc3NlcnQgcCA9PSAwOwotCi0gICAgICAgICAgICBfc3RhcnRTcGxheSA9IHM7Ci0gICAgICAgICAgICBfdkV2ZW50U2luayA9IHZFdmVudFNpbms7Ci0KLSAgICAgICAgICAgIHdoaWxlICggcHJvY2VzcygpICkKLSAgICAgICAgICAgICAgICA7ICAvLyBFbXB0eQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKLSAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIHMsIHAsIG51bGwsIHMsIHAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIHMsIHAsIG51bGwsIHRleHQoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVORCwgcywgMCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5nZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIHMsIDAsIG51bGwsIHMsIDEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5nZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIHMsIDAsIG51bGwsIHMsIDEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5CRUdJTiwgcywgMCwgbnVsbCApOwotCi0gICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIHMsIDAsIG51bGwsIHRleHQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5nZXRDY2goKSA+IDApCi0gICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBzLCAwLCBudWxsLCBzLCAwICk7Ci0KLSAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuRU5ELCBzLCAwICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3hzaU5vTG9jID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX3hzaUxvYyA9PSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IF94c2lUeXBlID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX3hzaU5pbCA9PSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYc2lBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBzLmdldExvY2FsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInR5cGUiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfeHNpVHlwZSA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5pbCIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF94c2lOaWwgPSBzOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJzY2hlbWFMb2NhdGlvbiIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF94c2lMb2MgPSBzOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgX3hzaU5vTG9jID0gczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtaXRFdmVudCgKLSAgICAgICAgICAgICAgICBWYWxpZGF0b3JMaXN0ZW5lci5CRUdJTiwgYywgMCwKLSAgICAgICAgICAgICAgICBjID09IF9zdGFydFNwbGF5ID8gbnVsbCA6IG5hbWUgKTsKLQotICAgICAgICAgICAgX3hzaU5vTG9jID0gX3hzaUxvYyA9IF94c2lUeXBlID0gX3hzaU5pbCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHMgPSAoU3BsYXkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzWHNpQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gcy5nZXRMb2NhbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbC5lcXVhbHMoICJ0eXBlIiApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5lcXVhbHMoICJuaWwiICkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLmVxdWFscyggInNjaGVtYUxvY2F0aW9uIiApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5lcXVhbHMoICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIiApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBpbnZhbGlkQXR0clZhbHVlID0gKFN0cmluZykgX2F0dHJzLmdldCggcyApOwotCi0gICAgICAgICAgICAgICAgaWYgKGludmFsaWRBdHRyVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckxpc3RlbmVyLkFUVFIsIHMsIDAsIHMuZ2V0TmFtZSgpLCBzLCAwICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckxpc3RlbmVyLkFUVFIsIHMsIDAsIHMuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEF0dHJWYWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkRBVFRSUywgYywgMCApOwotCi0gICAgICAgICAgICBpZiAoYy5pc0RvYygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjLmlzRG9jKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIGMsIDEsIG51bGwsIHRleHQoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjLmdldENjaCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBjLCAxLCBudWxsLCBjLCAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjLmlzTGVhZigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjY2ggPSBfdGV4dCAhPSBudWxsID8gX3RleHQubGVuZ3RoKCkgOiBjLmdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgYywgMSwgbnVsbCwgdGV4dCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgYywgMSwgbnVsbCwgYywgMSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkQsIGMsIGMuZ2V0UG9zTGVhZkVuZCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnQgKCBpbnQga2luZCwgU3BsYXkgc0xvYywgaW50IHBMb2MgKQotICAgICAgICAgICAgeyBlbWl0RXZlbnQoIGtpbmQsIHNMb2MsIHBMb2MsIG51bGwsIG51bGwsIDAsIG51bGwgKTsgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFdmVudCAoIGludCBraW5kLCBTcGxheSBzTG9jLCBpbnQgcExvYywgUU5hbWUgbmFtZSApCi0gICAgICAgICAgICB7IGVtaXRFdmVudCgga2luZCwgc0xvYywgcExvYywgbmFtZSwgbnVsbCwgMCwgbnVsbCApOyB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50ICgKLSAgICAgICAgICAgIGludCBraW5kLCBTcGxheSBzTG9jLCBpbnQgcExvYywgUU5hbWUgbmFtZSwgU3RyaW5nIHRleHQgKQotICAgICAgICAgICAgICAgIHsgZW1pdEV2ZW50ICgga2luZCwgc0xvYywgcExvYywgbmFtZSwgbnVsbCwgMCwgdGV4dCApOyB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50ICgKLSAgICAgICAgICAgIGludCBraW5kLCBTcGxheSBzTG9jLCBpbnQgcExvYywgUU5hbWUgbmFtZSwgU3BsYXkgc1RleHQsIGludCBwVGV4dCApCi0gICAgICAgICAgICAgICAgeyBlbWl0RXZlbnQgKCBraW5kLCBzTG9jLCBwTG9jLCBuYW1lLCBzVGV4dCwgcFRleHQsIG51bGwgKTsgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFdmVudCAoCi0gICAgICAgICAgICBpbnQga2luZCwgU3BsYXkgc0xvYywgaW50IHBMb2MsIFFOYW1lIG5hbWUsCi0gICAgICAgICAgICBTcGxheSBzVGV4dCwgaW50IHBUZXh0LCBTdHJpbmcgdGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChraW5kID09IFZhbGlkYXRvckxpc3RlbmVyLlRFWFQgJiYgX2VtaXR0ZWRUZXh0KQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgYm9vbGVhbiBoYXNUZXh0ID0gdGV4dCAhPSBudWxsIHx8IHNUZXh0ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGFzc2VydAotICAgICAgICAgICAgICAgICFoYXNUZXh0IHx8Ci0gICAgICAgICAgICAgICAgICAgIChraW5kID09IFZhbGlkYXRvckxpc3RlbmVyLkFUVFIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPT0gVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBraW5kICE9IFZhbGlkYXRvckxpc3RlbmVyLkFUVFIgfHwgaGFzVGV4dDsKLSAgICAgICAgICAgIGFzc2VydCBraW5kICE9IFZhbGlkYXRvckxpc3RlbmVyLlRFWFQgfHwgaGFzVGV4dDsKLQotICAgICAgICAgICAgYXNzZXJ0IGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fCBuYW1lICE9IG51bGw7Ci0KLSAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIF9zVGV4dCA9IHNUZXh0OwotICAgICAgICAgICAgX3BUZXh0ID0gcFRleHQ7Ci0gICAgICAgICAgICBfZXZlbnRUZXh0ID0gdGV4dDsKLSAgICAgICAgICAgIF9oYXNUZXh0ID0gaGFzVGV4dDsKLSAgICAgICAgICAgIF9zTG9jID0gc0xvYzsKLSAgICAgICAgICAgIF9wTG9jID0gcExvYzsKLQotICAgICAgICAgICAgX3ZFdmVudFNpbmsubmV4dEV2ZW50KCBraW5kLCB0aGlzICk7Ci0KLSAgICAgICAgICAgIF9lbWl0dGVkVGV4dCA9IGtpbmQgPT0gVmFsaWRhdG9yTGlzdGVuZXIuVEVYVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vCi0gICAgICAgIC8vCi0KLSAgICAgICAgcHVibGljIFhtbEN1cnNvciBnZXRMb2NhdGlvbkFzQ3Vyc29yICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yKCBnZXRSb290KCksIF9zTG9jLCBfcExvYyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpVHlwZSAoIENoYXJzIGNoYXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF94c2lUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBzZXRDaGFycyggY2hhcnMsIFBSRVNFUlZFLCBudWxsLCBfeHNpVHlwZSwgMCApOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldFhzaU5pbCAoIENoYXJzIGNoYXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF94c2lOaWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLQotICAgICAgICAgICAgc2V0Q2hhcnMoIGNoYXJzLCBQUkVTRVJWRSwgbnVsbCwgX3hzaU5pbCwgMCApOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldFhzaUxvYyAoIENoYXJzIGNoYXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF94c2lMb2MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHNldENoYXJzKCBjaGFycywgUFJFU0VSVkUsIG51bGwsIF94c2lMb2MsIDAgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lOb0xvYyAoIENoYXJzIGNoYXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF94c2lOb0xvYyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgc2V0Q2hhcnMoIGNoYXJzLCBQUkVTRVJWRSwgbnVsbCwgX3hzaU5vTG9jLCAwICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFFOYW1lIGdldE5hbWUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRDaGFycyAoCi0gICAgICAgICAgICBDaGFycyBjaGFycywgaW50IHdzciwgU3RyaW5nIHN0cmluZywgU3BsYXkgc1RleHQsIGludCBwVGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzdHJpbmcgIT0gbnVsbCB8fCBzVGV4dCAhPSBudWxsOwotCi0gICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLQotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotICAgICAgICAgICAgY2hhcnMuc3RyaW5nID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXJzLnN0cmluZyA9IHN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBUZXh0ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gci5fdGV4dC5fYnVmOwotICAgICAgICAgICAgICAgIGNoYXJzLmxlbmd0aCA9IHNUZXh0LmdldENjaCgpOwotCi0gICAgICAgICAgICAgICAgY2hhcnMub2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICByLmdldENwKCBzVGV4dCApLCBjaGFycy5sZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBUZXh0ID09IDEgJiYgc1RleHQuaXNMZWFmKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gci5fdGV4dC5fYnVmOwotICAgICAgICAgICAgICAgIGNoYXJzLmxlbmd0aCA9IHNUZXh0LmdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBjaGFycy5vZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuZ2V0Q3AoIHNUZXh0ICksIGNoYXJzLmxlbmd0aCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwVGV4dCA9PSBzVGV4dC5nZXRQb3NBZnRlcigpOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBtb3JlVGV4dCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZm9yICggU3BsYXkgdCA9IHNUZXh0Lm5leHROb25BdHRyU3BsYXkoKSA7IDsKLSAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXQuaXNDb21tZW50KCkgJiYgIXQuaXNQcm9jaW5zdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtb3JlVGV4dCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IHIuX3RleHQuX2J1ZjsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoID0gc1RleHQuZ2V0Q2NoQWZ0ZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICBjaGFycy5vZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RleHQuZ2V0Q3BGb3JQb3MoIHIsIHBUZXh0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgY2NoID0gc1RleHQuZ2V0Q2NoQWZ0ZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQudW5PYnNjdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUZXh0LmdldENwRm9yUG9zKCByLCBwVGV4dCApLCBjY2ggKTsKLQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIHIuX3RleHQuX2J1Ziwgb2ZmLCBjY2ggKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSB0ID0gc1RleHQubmV4dE5vbkF0dHJTcGxheSgpIDsgOwotICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC5pc0NvbW1lbnQoKSAmJiAhdC5pc1Byb2NpbnN0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmdldENjaEFmdGVyKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaCA9IHQuZ2V0Q2NoQWZ0ZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQudW5PYnNjdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRDcEZvclBvcyggciwgMSApLCBjY2ggKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggci5fdGV4dC5fYnVmLCBvZmYsIGNjaCApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoID0gc2IubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IG5ldyBjaGFyIFsgY2hhcnMubGVuZ3RoIF07Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzLm9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuZ2V0Q2hhcnMoIDAsIGNoYXJzLmxlbmd0aCwgY2hhcnMuYnVmZmVyLCAwICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod3NyICE9IFBSRVNFUlZFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB0aGlzIGlzIHF1aWNrLCBkaXJ0eSBhbmQgdmVyeSBpbmVmZmljaWVudAotICAgICAgICAgICAgICAgIC8vICAgICAgICBtYWtlIGl0IGZhc3RlciEKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBjaGFycy5hc1N0cmluZygpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSAtMSwgblNwYWNlcyA9IDAsIGNjaCA9IHN0ci5sZW5ndGgoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBjY2ggOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoIGkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9ICcgJzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAod3NyID09IENPTExBUFNFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU3BhY2VzKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5TcGFjZXMgPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TcGFjZXMgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IG5TcGFjZXMgPiAwIDsgblNwYWNlcy0tICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICcgJyApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIGNoICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hhcnMuc3RyaW5nID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0VGV4dCggY2hhcnMsIFBSRVNFUlZFICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRUZXh0ICggQ2hhcnMgY2hhcnMsIGludCB3c3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9oYXNUZXh0KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTm8gdGV4dCBmb3IgdGhpcyBldmVudCIpOwotCi0gICAgICAgICAgICBzZXRDaGFycyggY2hhcnMsIHdzciwgX2V2ZW50VGV4dCwgX3NUZXh0LCBfcFRleHQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gLSByYXRoZXIgZXhwZW5zaXZlIHRvIG1ha2UgQ2hhcnMgYW5kIGdldFRleHQgYW5kIGdldAotICAgICAgICAvLyBTdHJpbmcKLSAgICAgICAgcHVibGljIGJvb2xlYW4gdGV4dElzV2hpdGVzcGFjZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2hhcnMgY2hhcnMgPSBuZXcgQ2hhcnMoKTsKLSAgICAgICAgICAgIGdldFRleHQoIGNoYXJzICk7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IGNoYXJzLmFzU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzLmxlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBzLmNoYXJBdCggaSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVmFsaWRhdG9yTGlzdGVuZXIgX3ZFdmVudFNpbms7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICAgICAgICAgICAgX3N0YXJ0U3BsYXk7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgX2VtaXR0ZWRUZXh0OwotCi0gICAgICAgIHByaXZhdGUgUU5hbWUgICBfbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgIF94c2lUeXBlOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3hzaU5pbDsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgIF94c2lMb2M7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICBfeHNpTm9Mb2M7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICBfZXZlbnRUZXh0OwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3NUZXh0OwotICAgICAgICBwcml2YXRlIGludCAgICAgX3BUZXh0OwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3NMb2M7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgICBfcExvYzsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9oYXNUZXh0OwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFNheFNhdmVyIGV4dGVuZHMgU2F2ZXIKLSAgICB7Ci0gICAgICAgIFNheFNhdmVyICgKLSAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucywKLSAgICAgICAgICAgIENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLCBMZXhpY2FsSGFuZGxlciBsZXhpY2FsaGFuZGxlciApCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICBfYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfd2FudEZyYWdUZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyID0gY29udGVudEhhbmRsZXI7Ci0gICAgICAgICAgICBfbGV4aWNhbGhhbmRsZXIgPSBsZXhpY2FsaGFuZGxlcjsKLQotLy8gICAgICAgICAgICBfY29udGVudEhhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKCBoaG1tbW0gICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggcHJvY2VzcygpICkKLSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTYXZlclNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlLl9zYXhFeGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBTYXZlclNBWEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgU2F2ZXJTQVhFeGNlcHRpb24gKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3NheEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiBfc2F4RXhjZXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHRocm93U2F4RXhjZXB0aW9uICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2F2ZXJTQVhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjLmlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBjLCBuYW1lLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBfdGV4dCA9PSBudWxsID8gYy5nZXRDY2hWYWx1ZSgpIDogX3RleHQubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBjLCAwLCBjY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggX3RleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIGMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjLmlzRG9jKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBjLCBuYW1lLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIGMsIDAsIGMuZ2V0Q2NoKCkgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBfdGV4dCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRBdHRySGVscGVyICggU3BsYXkgcywgU3RyaW5nIHZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IHMuZ2V0TG9jYWwoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzLmdldFVyaSgpOwotCi0gICAgICAgICAgICBfYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgcy5nZXRVcmkoKSwgcy5nZXRMb2NhbCgpLAotICAgICAgICAgICAgICAgIGdldFByZWZpeGVkTmFtZSggcy5nZXROYW1lKCkgKSwKLSAgICAgICAgICAgICAgICAiQ0RBVEEiLAotICAgICAgICAgICAgICAgIHZhbHVlID09IG51bGwgPyBzLmdldFRleHQoIGdldFJvb3QoKSApIDogdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGROYW1lc3BhY2VBdHRyICggU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5zdGFydFByZWZpeE1hcHBpbmcoIHByZWZpeCwgdXJpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCAiIiwgIiIsICJ4bWxucyIsICJDREFUQSIsIHVyaSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAieG1sbnM6IiArIHByZWZpeCwgIkNEQVRBIiwgdXJpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0TmFtZXNwYWNlc0hlbHBlciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2VBdHRyKCBtYXBwaW5nUHJlZml4KCksIG1hcHBpbmdVcmkoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDb250YWluZXJIZWxwZXIgKAotICAgICAgICAgICAgQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUsCi0gICAgICAgICAgICBTcGxheSBleHRyYUF0dHIsIFN0cmluZ0J1ZmZlciBleHRyYUF0dHJUZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2F0dHJpYnV0ZXMuY2xlYXIoKTsKLQotICAgICAgICAgICAgaWYgKF9zYXZlTmFtZXNwYWNlc0ZpcnN0KQotICAgICAgICAgICAgICAgIGVtaXROYW1lc3BhY2VzSGVscGVyKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHMgPSAoU3BsYXkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGVtaXRBdHRySGVscGVyKCBzLCAoU3RyaW5nKSBfYXR0cnMuZ2V0KCBzICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4dHJhQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRBdHRySGVscGVyKAotICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHIsCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0clRleHQgPT0gbnVsbCA/IG51bGwgOiBleHRyYUF0dHJUZXh0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFfc2F2ZU5hbWVzcGFjZXNGaXJzdCkKLSAgICAgICAgICAgICAgICBlbWl0TmFtZXNwYWNlc0hlbHBlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbWl0RWxlbWVudCggbmFtZSwgZ2V0UHJlZml4ZWROYW1lKCBuYW1lICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q2hhcmFjdGVycyAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyggYnVmLCBvZmYsIGNjaCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDaGFyYWN0ZXJzICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggcy5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBwICksIGNjaCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENoYXJhY3RlcnMgKCBpbnQgY3AsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBlbWl0Q2hhcmFjdGVycygKLSAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuX2J1ZiwgZ2V0Um9vdCgpLl90ZXh0LnVuT2JzY3VyZSggY3AsIGNjaCApLAotICAgICAgICAgICAgICAgIGNjaCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENoYXJhY3RlcnMgKCBTdHJpbmdCdWZmZXIgc2IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gc2IudG9TdHJpbmcoKTsgLy8gSW5lZmZpY2llbnQsIHVzZSBhIHNoYXJlZCBjaGFyW10KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIHRleHQudG9DaGFyQXJyYXkoKSwgMCwgdGV4dC5sZW5ndGgoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEVuZEVsZW1lbnQgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldFByZWZpeGVkTmFtZSggbmFtZSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoIG1hcHBpbmdQcmVmaXgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZW5kTmFtZXNwYWNlcyAoICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9hdHRyaWJ1dGVzLmdldExlbmd0aCgpIDsgaSArKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW4gPSBfYXR0cmlidXRlcy5nZXRRTmFtZSggaSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFxbi5zdGFydHNXaXRoKCAieG1sbnMiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IHFuLmluZGV4T2YoICc6JyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqID49IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuLnN1YnN0cmluZyggaiArIDEgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKCAiIiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZml4ZWROYW1lICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBucyA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbHAgPSBuYW1lLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgICAgICBpZiAobnMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbHA7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRVcmlNYXBwaW5nKCBucyApOwotCi0gICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxwOwotCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbHA7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEVsZW1lbnQgKCBRTmFtZSBuYW1lLCBTdHJpbmcgcHJlZml4ZWROYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UHJlZml4ZWROYW1lKCBuYW1lICksIF9hdHRyaWJ1dGVzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggcywgcCwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIF90ZXh0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKLSAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xleGljYWxoYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGV4aWNhbGhhbmRsZXIuc3RhcnREVEQoIGRvY3R5cGVOYW1lLCBwdWJsaWNJRCwgc3lzdGVtSUQgKTsKLSAgICAgICAgICAgICAgICAgICAgX2xleGljYWxoYW5kbGVyLmVuZERURCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xleGljYWxoYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNwID0gZ2V0Um9vdCgpLmdldENwKCBzICk7Ci0gICAgICAgICAgICAgICAgaW50IGNjaCA9IHMuZ2V0Q2NoVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xleGljYWxoYW5kbGVyLmNvbW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNjaCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKSwgcy5nZXRUZXh0KCBnZXRSb290KCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggX3RleHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMgIT0gbnVsbCAmJiBjY2ggPiAwKQotICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBzLCBwLCBjY2ggKTsKLQotICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIF9mcmFnbWVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggX2ZyYWdtZW50ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgcywgX3RleHQgKTsKLSAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBfZnJhZ21lbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBlbWl0Q29tbWVudCggcyApOwotICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIF9mcmFnbWVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBlbWl0UHJvY2luc3QoIHMgKTsKLSAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBfZnJhZ21lbnQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVzSW1wbCBfYXR0cmlidXRlczsKLQotICAgICAgICBwcml2YXRlIFNBWEV4Y2VwdGlvbiBfc2F4RXhjZXB0aW9uOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBDb250ZW50SGFuZGxlciBfY29udGVudEhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgTGV4aWNhbEhhbmRsZXIgX2xleGljYWxoYW5kbGVyOwotICAgIH0KLQotICAgICAgICAgICAgCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbCBfdGhyZWFkRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9Ci0gICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgRG9tU2F2ZXIgZXh0ZW5kcyBTYXZlcgotICAgIHsKLSAgICAgICAgRG9tU2F2ZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBib29sZWFuIGNyZWF0ZURvYywgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIF9jcmVhdGVEb2MgPSBjcmVhdGVEb2M7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlIGV4cG9ydERvbSAoICkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyAtIGFkZCBhbiBvcHRpb25zIHdoaWNoIHNwZWNpZmllcyBhIERvY3VtZW50IHdpdGggd2hpY2gKLSAgICAgICAgICAgIC8vIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQKLQotICAgICAgICAgICAgX2RvYyA9ICgoRG9jdW1lbnRCdWlsZGVyKSBfdGhyZWFkRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5nZXQoKSkubmV3RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgTm9kZSByZXN1bHQ7Ci0KLSAgICAgICAgICAgIGlmIChfY3JlYXRlRG9jKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9jdXJyZW50Tm9kZSA9IF9kb2M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBmcmFnID0gX2RvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gX2N1cnJlbnROb2RlID0gZnJhZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKCBwcm9jZXNzKCkgKQotICAgICAgICAgICAgICAgIDsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgaWYgKGMuaXNEb2MoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTWFwcGluZ3MoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTmFtZXNwYWNlIGF0dHJpYnV0ZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQiICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IGMubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjLmdldENjaCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHIuX3RleHQuZmV0Y2goIDAsIGMuZ2V0Q2NoKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgX2N1cnJlbnROb2RlICE9IF9kb2MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAotICAgICAgICAgICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVUZXh0Tm9kZSggdGV4dCApLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjLmlzQmVnaW4oKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZSA9IGMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLmdldFVyaSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRVcmlNYXBwaW5nKCBjLmdldFVyaSgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IHByZWZpeCArICI6IiArIHFuYW1lOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IF9kb2MuY3JlYXRlRWxlbWVudE5TKCBjLmdldFVyaSgpLCBxbmFtZSApOwotCi0gICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSggZSwgbnVsbCApOwotCi0gICAgICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBtYXBwaW5nUHJlZml4KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSAieG1sbnMiOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9ICJ4bWxuczoiICsgcHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlTlMoIFNwbGF5Ll94bWxuc1VyaSwgcW5hbWUsIG1hcHBpbmdVcmkoKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IChTcGxheSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IHMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocy5nZXRVcmkoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRVcmlNYXBwaW5nKCBzLmdldFVyaSgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gcHJlZml4ICsgIjoiICsgcW5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW52YWxpZEF0dHJWYWx1ZSA9IChTdHJpbmcpIF9hdHRycy5nZXQoIHMgKTsKLQotICAgICAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKAotICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRVcmkoKSwgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQXR0clZhbHVlID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHMuZ2V0VGV4dCggciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnZhbGlkQXR0clZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjLmdldENjaFZhbHVlKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdldENwRm9yUG9zKCByLCAxICksIGMuZ2V0Q2NoVmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuaW5zZXJ0QmVmb3JlKCBfZG9jLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICksIG51bGwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlID0gZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJyZW50Tm9kZSA9IF9jdXJyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKLQotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgIHRleHQgPSByLl90ZXh0LmZldGNoKCBzLmdldENwRm9yUG9zKCByLCBwICksIGNjaCApOwotCi0gICAgICAgICAgICBpZiAoX2N1cnJlbnROb2RlICE9IF9kb2MpCi0gICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSggX2RvYy5jcmVhdGVUZXh0Tm9kZSggdGV4dCApLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKLSAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAotICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlQ29tbWVudCgKLSAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIDAgKSwgcy5nZXRDY2hWYWx1ZSgpICkgKSwgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcy5nZXRMb2NhbCgpLAotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgMCApLCBzLmdldENjaFZhbHVlKCkgKSApLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGEgbm9kZSBmb3IgYSBuYW1lc3BhY2UgYXR0cmlidXRlIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGEgbm9kZSBmb3IgYSBhdHRyaWJ1dGUiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBCVUdCVUcgLSB0aGVyZSBjb3VsZCBiZSBuYW1lc3BhY2VzIHB1c2hlZCBmb3IgdGhpcyB0ZXh0LCBidXQgbm90Ci0gICAgICAgICAgICAvLyBzdXJlIGhvdyB0byByZXByZXNlbnQgdGhlbSBoZXJlLi4uLiAgSSBzaG91bGQgcmVhbGx5IHB1dCB0aGUKLSAgICAgICAgICAgIC8vIGZyYWdtZW50IGxvZ2ljIGluIHRoZSBiYXNlIHNhdmVyIGFuZCBoYXZlIHRoZSBiYXNlIHNhdmVyCi0gICAgICAgICAgICAvLyBzeW50aGVzaXplIHdlbGwgZm9ybWVkIG91dHB1dC4uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCi0gICAgICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlVGV4dE5vZGUoCi0gICAgICAgICAgICAgICAgICAgIF90ZXh0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gX3RleHQudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBzICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHIuX3RleHQuZmV0Y2goIHMuZ2V0Q3BGb3JQb3MoIHIsIHAgKSwgY2NoICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIiApLAotICAgICAgICAgICAgICAgICAgICBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZUNvbW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCAwICksIHMuZ2V0Q2NoVmFsdWUoKSApICksIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcy5nZXRMb2NhbCgpLAotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgMCApLCBzLmdldENjaFZhbHVlKCkgKSApLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudCBfZG9jOwotICAgICAgICBOb2RlICAgICBfY3VycmVudE5vZGU7Ci0gICAgICAgIGJvb2xlYW4gIF9jcmVhdGVEb2M7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyICBfdGV4dDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyICBfc2I7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gICAgICAgX3NraXBDb250YWluZXJGaW5pc2g7Ci0gICAgcHJvdGVjdGVkIExpbmtlZEhhc2hNYXAgX2F0dHJzOwotICAgIAotICAgIHByaXZhdGUgSGFzaFNldCBfYXR0ck5hbWVzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9pbm5lcjsKLSAgICBwcml2YXRlIGZpbmFsIFJvb3QgICAgX3Jvb3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTcGxheSAgIF90b3A7Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nICAgIF92ZXJzaW9uOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3dhbnREdXBBdHRyczsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfd2FudEZyYWdUZXN0OwotICAgIHByb3RlY3RlZCBib29sZWFuIF9uZWVkc0ZyYWc7Ci0gICAgcHJvdGVjdGVkIFFOYW1lICAgX2ZyYWdtZW50OwotICAgIHByb3RlY3RlZCBRTmFtZSAgIF9kb2NFbGVtOwotICAgIAotICAgIHByb3RlY3RlZCBRTmFtZSBfc3ludGhFbGVtOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3NhdmVOYW1lc3BhY2VzRmlyc3Q7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3VzZURlZmF1bHROYW1lc3BhY2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX3ByZXR0eVByaW50OwotICAgIHByaXZhdGUgaW50ICAgICBfcHJldHR5SW5kZW50OwotICAgIHByaXZhdGUgaW50ICAgICBfcHJldHR5T2Zmc2V0OwotCi0gICAgcHJpdmF0ZSBTcGxheSAgIF9zcGxheTsKLSAgICBwcml2YXRlIGludCAgICAgX3BvczsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3ByZVByb2Nlc3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9wb3N0UHJvY2VzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3Bvc3RQb3A7Ci0gICAgcHJpdmF0ZSBTcGxheSAgIF9lbmRTcGxheTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IF9uYW1lc3BhY2VTdGFjazsKLSAgICBwcml2YXRlIGludCAgICAgICBfY3VycmVudE1hcHBpbmc7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwICAgX3VyaU1hcDsKLSAgICBwcml2YXRlIEhhc2hNYXAgICBfcHJlZml4TWFwOwotICAgIHByaXZhdGUgYm9vbGVhbiAgIF9maXJzdFB1c2g7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgX2luaXRpYWxEZWZhdWx0VXJpOwotICAgIAotICAgIHByaXZhdGUgSGFzaE1hcCBfcHJlQ29tcHV0ZWROYW1lc3BhY2VzOwotICAgIHByaXZhdGUgU3RyaW5nICBfZmlsdGVyUHJvY2luc3Q7Ci0gICAgcHJpdmF0ZSBNYXAgICAgIF9zdWdnZXN0ZWRQcmVmaXhlczsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgIF9uZXdMaW5lOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TcGxheS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TcGxheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NjNDZiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMTMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxNYXJrOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3BsYXkgZXh0ZW5kcyBHb29iZXJzCi17Ci0gICAgLy8KLSAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGtpbmQgb2YgYSBiYXNlIHRva2VuCi0gICAgLy8KLQotICAgIFNwbGF5ICggaW50IGtpbmQsIGJvb2xlYW4gaXMgKQotICAgIHsKLSAgICAgICAgX2JpdHMgPSBraW5kOwotCi0gICAgICAgIGlmIChpcykKLSAgICAgICAgICAgIF9iaXRzICs9IDB4ODsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFNwbGF5IGtpbmRzCi0gICAgLy8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9DICAgICAgPSAgMDsgLy8gRE9DIG11c3QgYmUgMAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU4gICAgPSAgMTsgLy8gQkVHSU4gbXVzdCBiZSAxCi0gICAgc3RhdGljIGZpbmFsIGludCBBVFRSICAgICA9ICAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCAgPSAgMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0NJTlNUID0gIDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBST09UICAgICA9ICA1OyAvLyBST09UIG11c3QgYmUgc2Vjb25kIHRvIGxhc3QKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORCAgICAgID0gIDY7IC8vIEVORCBtdXN0IGJlIGxhc3QKLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgZmluYWwgaW50IGdldEtpbmQgKCApIHsgcmV0dXJuIF9iaXRzICYgMHg3OyB9Ci0KLSAgICBmaW5hbCBib29sZWFuIGlzRG9jICAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gRE9DOyAgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzUm9vdCAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gUk9PVDsgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQmVnaW4gICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQkVHSU47ICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzRW5kICAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gRU5EOyAgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQXR0ciAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQVRUUjsgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQ29tbWVudCAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQ09NTUVOVDsgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzUHJvY2luc3QgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gUFJPQ0lOU1Q7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzQ29udGFpbmVyICggKSB7IHJldHVybiBnZXRLaW5kKCkgPD0gQkVHSU47ICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzRmluaXNoICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPj0gUk9PVDsgICAgIH0KLQotICAgIGZpbmFsIGludCBnZXRDY2ggICAgICAgICAgICggKSB7IHJldHVybiBfY2NoOyAgICAgICAgICAgICAgfQotCi0gICAgZmluYWwgaW50IGdldENkb2NCZWdpbiAgICAgKCApIHsgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENjaExlZnQgICAgICAgKCApIHsgcmV0dXJuIF9jY2hMZWZ0OyAgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENkb2NCZWdpbkxlZnQgKCApIHsgcmV0dXJuIF9iaXRzID4+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+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzY3J1YlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcnViVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LCB3cywgY3AgKyBzLmdldENjaFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NoQWZ0ZXIsIHNiLCBzY3J1YlN0YXRlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcCArPSBzLmdldENjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBhdHRyIHNwbGF5IGZvciBhIGdpdmVuIGNvbnRhaW5lciwgbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0KLSAgICBTcGxheSBnZXRBdHRyICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpICYmIHMuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQotICAgICAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRYc2lOaWwgKCBSb290IHIsIGJvb2xlYW4gbmlsICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChnZXRYc2lOaWwoIHIgKSA9PSBuaWwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc2V0QXR0ciggciwgX3hzaU5pbCwgInRydWUiICk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBnZXRYc2lOaWwgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgU3BsYXkgczsKLQotICAgICAgICBmb3IgKCBzID0gbmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc1hzaU5pbCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHMuZ2V0VGV4dCggciwgVHlwZVN0b3JlLldTX0NPTExBUFNFICk7Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyggInRydWUiICkgfHx2YWx1ZS5lcXVhbHMoICIxIiApOwotICAgIH0KLQotICAgIFFOYW1lIGdldFhzaVR5cGVOYW1lICggUm9vdCByICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIFNwbGF5IHM7Ci0KLSAgICAgICAgZm9yICggcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNYc2lUeXBlKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBhc3NlcnQgcy5pc1hzaVR5cGUoKTsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBzLmdldFRleHQoIHIsIFR5cGVTdG9yZS5XU19DT0xMQVBTRSApOwotCi0vLyBUT0RPIC0gdW5vYnNjdXJlIHRoZSB1bmRlcmx5aW5nIHRleHQgYW5kIHVzZSBpdCBkaXJlY3RseQotLy8gVE9ETyAtIHNob3VsZCBJIG1ha2Ugc3VyZSB0aGUgcHJlZml4IGlzIHdxZWxsIGZvcm1lZD8gaWUuIGp1c3QgdGV4dAotCi0gICAgICAgIFN0cmluZyBwcmVmaXgsIGxvY2FsbmFtZTsKLQotICAgICAgICBpbnQgZmlyc3Rjb2xvbiA9IHZhbHVlLmluZGV4T2YoICc6JyApOwotCi0gICAgICAgIGlmIChmaXJzdGNvbG9uID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZpeCA9IHZhbHVlLnN1YnN0cmluZyggMCwgZmlyc3Rjb2xvbiApOwotICAgICAgICAgICAgbG9jYWxuYW1lID0gdmFsdWUuc3Vic3RyaW5nKCBmaXJzdGNvbG9uICsgMSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBsb2NhbG5hbWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB1cmkgPSBuYW1lc3BhY2VGb3JQcmVmaXgoIHByZWZpeCwgdHJ1ZSApOwotCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBubyBwcmVmaXggZGVmaW5pdGlvbiBmb3VuZCAtIHRoYXQncyBpbGxlZ2FsCi0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggdXJpLCBsb2NhbG5hbWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFhzaVR5cGUgKCBSb290IHIsIFFOYW1lIHR5cGVOYW1lICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBdHRyKCByLCBfeHNpVHlwZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgU3RyaW5nIG5zID0gdHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByZWZpeEZvck5hbWVzcGFjZSggciwgbnMsIG51bGwsIHRydWUpOwotCi0gICAgICAgIGFzc2VydCBwcmVmaXggIT0gbnVsbCA6ICJDYW5ub3QgZXN0YWJsaXNoIHByZWZpeCBmb3IgIiArIG5zOwotCi0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgdmFsdWUgPSBwcmVmaXggKyAiOiIgKyB2YWx1ZTsKLQotICAgICAgICBib29sZWFuIHNldCA9IGZhbHNlOwotCi0gICAgICAgIHNldEF0dHIoIHIsIF94c2lUeXBlLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHZvaWQgcmVtb3ZlQXR0ciAoIFJvb3QgciwgUU5hbWUgYXR0ck5hbWUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgbmV4dDsKLSAgICAgICAgZm9yICggU3BsYXkgcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIGF0dHJOYW1lICkpCi0gICAgICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0QXR0ciAoIFJvb3QgciwgUU5hbWUgYXR0ck5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLSAgICAgICAgYXNzZXJ0IGF0dHJOYW1lICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB2YWx1ZSAhPSBudWxsOwotCi0gICAgICAgIGJvb2xlYW4gc2V0ID0gZmFsc2U7Ci0KLSAgICAgICAgU3BsYXkgbmV4dDsKLSAgICAgICAgZm9yICggU3BsYXkgcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIGF0dHJOYW1lICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldCkKLSAgICAgICAgICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzLnNldFRleHQoIHIsIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBzSW5zZXJ0ID0gdGhpczsKLSAgICAgICAgICAgIGludCAgIHBJbnNlcnQgPSAxOwotCi0gICAgICAgICAgICBpZiAoIWlzTGVhZigpICYmIGdldENjaCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc0luc2VydCA9IG5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgIHBJbnNlcnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2NoVmFsdWUgPSB2YWx1ZS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgQXR0ciBhdHRyID0gbmV3IEF0dHIoIGF0dHJOYW1lICk7Ci0gICAgICAgICAgICBhdHRyLmFkanVzdENjaCggY2NoVmFsdWUgKTsKLQotICAgICAgICAgICAgc0luc2VydC5pbnNlcnQoIHIsIHBJbnNlcnQsIGF0dHIsIHZhbHVlLCAwLCBjY2hWYWx1ZSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudC92YWx1ZSBvZiB0aGlzIHNwbGF5IHRvIHRoZSBnaXZlbiB0ZXh0LgotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCBzZXRUZXh0ICggUm9vdCByLCBPYmplY3QgdHh0LCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHJlbW92ZUNvbnRlbnQoIHIsIGZhbHNlICk7Ci0KLSAgICAgICAgaWYgKHR4dCA9PSBudWxsIHx8IGNjaCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBET0MgOgotICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFpc0JlZ2luKCkgfHwgaXNMZWFmKCk7Ci0gICAgICAgICAgICBpbnNlcnRDaGFycyggMSwgciwgdHh0LCBvZmYsIGNjaCApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBBVFRSIDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIGtpbmQgZm9yIHNldFRleHQiOwotICAgICAgICAgICAgfQotLy8gVE9ETyAtIGlmIHNldHRpbmcgdGV4dCBvZiB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLS8vIFRPRE8gLSBpZiBzZXR0aW5nIHRleHQgb2YgeHNpOnR5cGUgb3IgeHNpOm5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgc2V0dGluZyB0ZXh0IG9mIHhzaTp0eXBlIG9yIHhzaTpuaWwgbXVzdCBkbyBzdHVmZgotLy8gVE9ETyAtIGlmIHNldHRpbmcgdGV4dCBvZiB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLQotICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDT01NRU5UICA6Ci0gICAgICAgIGNhc2UgUFJPQ0lOU1QgOgotICAgICAgICB7Ci0gICAgICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBnZXRDY2hWYWx1ZSgpID09IDA7Ci0KLSAgICAgICAgICAgIHIuX3RleHQuaW5zZXJ0KCByLmdldENwKCB0aGlzICksIHR4dCwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCBjY2ggKTsKLQotICAgICAgICAgICAgaWYgKGdldEtpbmQoKSA9PSBBVFRSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludmFsaWRhdGVUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNYc2lUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmRpc2Nvbm5lY3RUeXBlcyggciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciBzZXRUZXh0IjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIGZpbmFsIE1hcCBsb29rdXBBbGxQcmVmaXhNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIE1hcCBtYXBwaW5ncyA9IG51bGw7Ci0KLSAgICAgICAgU3BsYXkgY29udGFpbmVyID0gdGhpcy5pc0NvbnRhaW5lcigpID8gdGhpcyA6IGdldENvbnRhaW5lcigpOwotCi0gICAgICAgIGZvciAoIDsgY29udGFpbmVyICE9IG51bGwgOyBjb250YWluZXIgPSBjb250YWluZXIuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gY29udGFpbmVyLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7Ci0gICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBpbmdzLmNvbnRhaW5zS2V5KCBzLmdldExvY2FsKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dCggcy5nZXRMb2NhbCgpLCBzLmdldFVyaSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgYXBwbHlOYW1lc3BhY2VzICggUm9vdCByLCBNYXAgbmFtZXNwYWNlcyApCi0gICAgewotICAgICAgICBpZiAobmFtZXNwYWNlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFNwbGF5IGNvbnRhaW5lciA9IHRoaXMuaXNDb250YWluZXIoKSA/IHRoaXMgOiBnZXRDb250YWluZXIoKTsKLQotICAgICAgICBuYW1lc3BhY2VfbG9vcDoKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IG5hbWVzcGFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIFVzdWFsbHksIHRoaXMgaXMgdGhlIHByZWRlZmluZWQgeG1sIG5hbWVzcGFjZQotICAgICAgICAgICAgaWYgKHByZWZpeC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICJ4bWwiICkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBuYW1lc3BhY2VzLmdldCggcHJlZml4ICk7Ci0KLSAgICAgICAgICAgIFNwbGF5IGNhbmRpZGF0ZSA9IGNvbnRhaW5lcjsKLQotICAgICAgICAgICAgY2FuZGlkYXRlX2xvb3A6Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSBjID0gY29udGFpbmVyLmdldENvbnRhaW5lcigpIDsgYyAhPSBudWxsICYmICFjLmlzRG9jKCkgOwotICAgICAgICAgICAgICAgICAgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSAmJiBwcmVmaXguZXF1YWxzKCBzLmdldExvY2FsKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIHMuZ2V0VXJpKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgbmFtZXNwYWNlX2xvb3A7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGNhbmRpZGF0ZV9sb29wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gYzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgbmFtZXNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGF0dHIgbGlzdCBhZnRlcgotICAgICAgICAgICAgLy8gbWFrZWluZyBzdXJlIGFsbCBwcmV2aW91cyBtYXBwaW5ncyBhcmUgZ29uZQotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgcHJlZml4ICk7Ci0KLSAgICAgICAgICAgIHJlbW92ZUF0dHIoIHIsIHFuYW1lICk7Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZS5uZXh0Tm9uQXR0clNwbGF5KCkuaW5zZXJ0KAotICAgICAgICAgICAgICAgIHIsIDAsIG5ldyBYbWxucyggcW5hbWUgKSwgbnVsbCwgMCwgMCwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRyL2VsZW1lbnQuCi0gICAgICovCi0gICAgZmluYWwgU3RyaW5nIGdldFByZWZpeCAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNCZWdpbigpIHx8IGlzQXR0cigpOwotCi0gICAgICAgIGlmIChpc1htbG5zKCkpCi0gICAgICAgICAgICByZXR1cm4gInhtbG5zIjsKLQotICAgICAgICAvLyBUT0RPIC0gaGF2ZSBhIHByZWZpeCBnb29iZXIgdG8gb3ZlcnJpZGUgdGhlIG1hcHBpbmcgb24gdGhlIGZyb250aWVyLgotICAgICAgICAvLyBQYXJzZXIgd2lsbCBhZGQgdGhpcyB3aGVuIHRoZSBuYXR1cmFsIHByZWZpeCBpcyBub3QgdGhlIHJlYWwgcHJlZml4LgotCi0gICAgICAgIFNwbGF5IGMgPSBpc0JlZ2luKCkgPyB0aGlzIDogZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgLy8gc3BlY2lhbCBjYXNlCi0gICAgICAgIFN0cmluZyBucyA9IGdldFVyaSgpOwotCi0gICAgICAgIC8vIGxhc3QgYXJndW1lbnQgaXMgZmFsc2UsIHdoaWNoIG1lYW5zLCBkb24ndCBtb2RpZnkgdGhlIHRyZWUKLSAgICAgICAgcmV0dXJuIHByZWZpeEZvck5hbWVzcGFjZSggciwgbnMsIG51bGwsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBwcmVmaXgsIHJldHVybnMgdGhlIG5hbWVzcGFjZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIHByZWZpeCBhdCB0aGlzIGxvY2F0aW9uLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcKLSAgICAgKiBmb3IgdGhpcyBwcmVmaXguCi0gICAgICogPHA+Ci0gICAgICogcHJlZml4PSIiIGluZGljYXRlcyB0aGUgYWJzZW5jZSBvZiBhIHByZWZpeC4gIEEgcmV0dXJuIHZhbHVlCi0gICAgICogb2YgIiIgaW5kaWNhdGVzIHRoZSBuby1uYW1lc3BhY2UsIGFuZCBzaG91bGQgbm90IGJlIGNvbmZ1c2VkCi0gICAgICogd2l0aCBhIHJldHVybiB2YWx1ZSBvZiBudWxsLCB3aGljaCBpbmRpY2F0ZXMgYW4gaWxsZWdhbAotICAgICAqIHN0YXRlLCB3aGVyZSB0aGVyZSBpcyBubyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcHJlZml4LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgbm90IGV4cGxpY2l0bHkgbWFwcGVkIGluIHRoZSB4bWwsCi0gICAgICogdGhlIHhtbCBzcGVjIHNheXMgdGhhdCBpdCBzaG91bGQgYmUgbWFwcGVkIHRvIHRoZSBuby1uYW1lc3BhY2UuCi0gICAgICogV2hlbiB0aGUgJ2RlZmF1bHRBbHdheXNNYXBwZWQnIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgZGVmYXVsdCBuYW1lcHNhY2UKLSAgICAgKiB3aWxsIHJldHVybiB0aGUgbm8tbmFtZXNwYWNlIGV2ZW4gaWYgaXQgaXMgbm90IGV4cGxpY2l0eQotICAgICAqIG1hcHBlZCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB3aWxsIHJldHVybiBudWxsLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJjZXB0cyB0aGUgYnVpbHQtaW4gcHJlZml4ZXMgInhtbCIgYW5kCi0gICAgICogInhtbG5zIiBhbmQgcmV0dXJucyB0aGVpciB3ZWxsLWtub3duIG5hbWVzcGFjZSBVUklzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGxvb2sgdXAuCi0gICAgICogQHBhcmFtIG1hcERlZmF1bHQgSWYgdHJ1ZSwgcmV0dXJuIHRoZSBuby1uYW1lc3BhY2UgZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBpZiBub3Qgc2V0LgotICAgICAqIEByZXR1cm4gVGhlIG1hcHBlZCBuYW1lc3BhY2UgVVJJICgiIiBpZiBuby1uYW1lc3BhY2UpLCBvciBudWxsIGlmIG5vIG1hcHBpbmcuCi0gICAgICovCi0gICAgZmluYWwgU3RyaW5nIG5hbWVzcGFjZUZvclByZWZpeCAoIFN0cmluZyBwcmVmaXgsIGJvb2xlYW4gZGVmYXVsdEFsd2F5c01hcHBlZCApCi0gICAgewotICAgICAgICAvLyBudWxsIHNhbWUgYXMgIiIsIG1lYW5zIGxvb2sgdXAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotCi0gICAgICAgIC8vIGhhbmRsZSBidWlsdC1pbiBwcmVmaXhlcwotICAgICAgICBpZiAoInhtbCIuZXF1YWxzKHByZWZpeCkpCi0gICAgICAgICAgICByZXR1cm4gX3htbDE5OThVcmk7Ci0gICAgICAgIGlmICgieG1sbnMiLmVxdWFscyhwcmVmaXgpKQotICAgICAgICAgICAgcmV0dXJuIF94bWxuc1VyaTsKLQotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLQotICAgICAgICAvLyBmaW5kIGFuIHhtbG5zIGRlY2wKLSAgICAgICAgZm9yICggQ29udGFpbmVyIGMgPSAoQ29udGFpbmVyKSB0aGlzIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcHJlZml4LmVxdWFscyggcy5nZXRMb2NhbCgpICkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldFVyaSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ1IxMzUxOTM6IGlmIGRlZmF1bHRBbHdheXNNYXBwZWQsIHJldHVybiBuby1uYW1lc3BhY2Ugd2hlbiBubyBkZWZhdWx0IG5hbWVzcGFjZSBpcyBmb3VuZAotICAgICAgICAvLyBvdGhlcndpc2UsIHJldHVybiBudWxsIHRvIGluZGljYXRlIG5vIGRlZmF1bHQgbmFtZXNwYWNlIHdhcyBmb3VuZC4KLSAgICAgICAgaWYgKGRlZmF1bHRBbHdheXNNYXBwZWQgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBubyBuYW1lc3BhY2UgZGVmbiBmb3VuZDogcmV0dXJuIG51bGwKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVmaXggdG8gdXNlIGZvciBhIGdpdmVuIG5hbWVzcGFjZSBVUkkuICBDYW4gZWl0aGVyCi0gICAgICogYmUgYWxsb3dlZCB0byBtb2RpZnkgdGhlIHRyZWUgdG8gZW5zdXJlIHN1Y2ggYSBtYXBwaW5nIChpZiByCi0gICAgICogaXMgbm9uLW51bGwpLCBvciBjYW4gYmUgdG9sZCB0byByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubwotICAgICAqIGV4aXN0aW5nIG1hcHBpbmcgKGlmIHIgaXMgbnVsbCkuCi0gICAgICogPHA+Ci0gICAgICogRm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0cmVlIG1heSBiZSBtb2RpZmllZCwgYSBzdWdnZXN0ZWQgcHJlZml4Ci0gICAgICogY2FuIGJlIHN1cHBsaWVkLiAgVGhlIHN1Z2dlc3Rpb24gbWF5IGJlIGlnbm9yZWQgZm9yIGFueSByZWFzb24sCi0gICAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBwcmVmaXggaXMgYWxyZWFkeSBpbi11c2UuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyAieG1sIiBhbmQgInhtbG5zIiBmb3IgdGhlIHdlbGwta25vd24gbmFtZXNwYWNlIFVSSXMKLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRob3NlIGJ1aWx0LWluIHByZWZpeGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHIgICAgICAgc2hvdWxkIGJlIG51bGwgaWYgeW91IGRvbid0IHdhbnQgdG8gbW9kaWZ5IHRoZSB0cmVlLgotICAgICAqICAgICAgICAgICAgICAgIGlmIGEgcHJlZml4IGNhbid0IGJlIGZvdW5kLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQKLSAgICAgKiAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBhbiB4bWxucy4KLSAgICAgKiBAcGFyYW0gbnMgICAgICB0aGUgbmFtZXNwYWNlIHRvIGxvb2sgZm9yIG9yIGludHJvZHVjZSBhIG1hcHBpbmcgZm9yLgotICAgICAqICAgICAgICAgICAgICAgIGNhcmVmdWwgd2l0aCAiIiwgYmVjYXVzZSBpdCBtYXkgaGF2ZSBub25sb2NhbCBlZmZlY3RzCi0gICAgICogICAgICAgICAgICAgICAgaWYgc29tZWJvZHkgaGFzIG92ZXJyaWRkZW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSBzdWdnZXN0aW9uICBhIHN1Z2dlc3RlZCBwcmVmaXggdG8gdHJ5IGZpcnN0OyBtYXkgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjcmVhdGVJZk1pc3NpbmcgdHJ1ZSAobm9ybWFsbHkgaXQncyB0cnVlKSBpZiB5b3Ugd2FudCB0byBjcmVhdGUKLSAgICAgKiAgICAgICAgICAgICAgICBhbiB4bWxucyBkZWNsYXJhdGlvbiB3aGVuIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgZm9yCi0gICAgICogICAgICAgICAgICAgICAgeW91ciByZXF1ZXN0ZWQgVVJJLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gbW9kaWZ5IHRoZSB0cmVlLAotICAgICAqICAgICAgICAgICAgICAgIHBhc3MgZmFsc2UuCi0gICAgICovCi0gICAgZmluYWwgU3RyaW5nIHByZWZpeEZvck5hbWVzcGFjZSAoICBSb290IHIsIFN0cmluZyBucywgU3RyaW5nIHN1Z2dlc3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNyZWF0ZUlmTWlzc2luZyApCi0gICAgewotICAgICAgICAvLyBudWxsIHNhbWUgYXMgZW1wdHkgc3RyaW5nLCBtZWFucyBuby1uYW1lc3BhY2UKLSAgICAgICAgaWYgKG5zID09IG51bGwpCi0gICAgICAgICAgICBucyA9ICIiOwotCi0gICAgICAgIC8vIHNwZWNpYWwgY2FzZXMKLSAgICAgICAgaWYgKF94bWwxOTk4VXJpLmVxdWFscyggbnMgKSkKLSAgICAgICAgICAgIHJldHVybiAieG1sIjsKLSAgICAgICAgaWYgKF94bWxuc1VyaS5lcXVhbHMoIG5zICkpCi0gICAgICAgICAgICByZXR1cm4gInhtbG5zIjsKLQotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLQotICAgICAgICBDb250YWluZXIgYzsKLSAgICAgICAgU3BsYXkgczsKLQotICAgICAgICAvLwotICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGlzIG5zIGlzIG5vdCBzcGVjaWZpZWQgKG5vIG5hbWVzcGFjZSkKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAobnMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9vcDoKLSAgICAgICAgICAgIGZvciAoIGMgPSAoQ29udGFpbmVyKSB0aGlzIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSAmJiBzLmdldExvY2FsKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuZ2V0VXJpKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXRMb2NhbCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gb3ZlcnJpZGRlbiBkZWZhdWx0IG5hbWVzcGFjZSBpbiBzY29wZSwKLSAgICAgICAgICAgIC8vIHJldHVybiAiIiAtIHRoZSBkZWZhdWx0IGRlZmF1bHQgbmFtZXNwYWNlIGlzIHRoZSBuby1uYW1lcHNhY2UuCi0gICAgICAgICAgICAvLwotCi0gICAgICAgICAgICBpZiAoIGMgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBwcm9ibGVtYXRpYyBkZWZhdWx0IG5hbWVzcGFjZSBidXQgY2Fubm90IG1vZGlmeQotICAgICAgICAgICAgLy8gdGhlIHRyZWUsIHJldHVybiBudWxsIC0gbm8gcHJlZml4IGF2YWlsYWJsZS4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIGlmICggIWNyZWF0ZUlmTWlzc2luZyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBUaGVyZSBpcyBhIGRlZmF1bHQgbmFtZXNwYWNlIHdoaWNoIG1hcHMgdG8gYSAncmVhbCcgbmFtZXNwYWNlLAotICAgICAgICAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBuYW1lc3BhY2Ugb24gdGhpcyBjb250YWluZXIgd2hpY2ggaXMgIiIuICBUaGlzCi0gICAgICAgICAgICAvLyBjYW4gc2NyZXcgYXR0cmlidXRlcyBhbmQgc3VjaCwgYnV0LCBvaCB3ZWxsLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgZm9yICggcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcy5nZXRMb2NhbCgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzLnNldE5hbWUoIHIsIG5ldyBRTmFtZSggIiIsICIiICkgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0TG9jYWwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4geG1sbnM9IiIgZGVjbGFyYXRpb24KLQotICAgICAgICAgICAgQXR0ciBhID0gbmV3IFhtbG5zKCBuZXcgUU5hbWUoICIiLCAiIiApICk7Ci0KLSAgICAgICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotICAgICAgICAgICAgci5pbnNlcnRTcGxheSggYSwgdGhpcyApOwotCi0gICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBhLmdldExvY2FsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyB0aGUgb3JkaW5hcnkgbm90LWEtbm8tbmFtZXNwYWNlIGNhc2UKLSAgICAgICAgLy8KLQotICAgICAgICBhc3NlcnQgbnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDA7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gbG9vayBmb3IgYW4gZXhpc3RpbmcgcHJlZml4IGZvciB0aGUgcmVxdWVzdGVkIFVSSQotICAgICAgICAvLwotCi0gICAgICAgIGZvciAoIGMgPSAoQ29udGFpbmVyKSB0aGlzIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5keG1sbnM6IGZvciAoIHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcy5nZXRVcmkoKS5lcXVhbHMoIG5zICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcy5nZXRMb2NhbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyBjaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgcHJlZml4IGlzbid0IG1hc2tlZAotICAgICAgICAgICAgICAgICAgICBmb3IgKCBDb250YWluZXIgYzIgPSAoQ29udGFpbmVyKSB0aGlzIDsgYzIgIT0gYyA7IGMyID0gYzIuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzMiA9IGMyLm5leHRTcGxheSgpIDsgczIuaXNBdHRyKCkgOyBzMiA9IHMyLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczIuaXNYbWxucygpICYmIHMyLmdldExvY2FsKCkuZXF1YWxzKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGZpbmR4bWxuczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBtYXNrZWQ6IE9LLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIGNvdWxkIG5vdCBmaW5kIGFuIGV4aXN0aW5nIHByZWZpeCBpbi1zY29wZSB0aGF0IHdvcmtzLgotICAgICAgICAvLyBJZiAhY3JlYXRlSWZNaXNzaW5nLCBkb24ndCBtb2RpZnkgdGhlIHRyZWUgLSByZXR1cm4gbnVsbCBpbnN0ZWFkLgotICAgICAgICAvLwotCi0gICAgICAgIGlmICghY3JlYXRlSWZNaXNzaW5nKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gV2UgbXVzdCBhZGQgYW4geG1sbnM6c29tZXRoaW5nPSJ1cmkiLCBzbyB3ZSBtdXN0IHBpY2sgYSBwcmVmaXguCi0gICAgICAgIC8vIFdlIHdpbGwgdXNlIHRoZSBzdWdnZXN0aW9uIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gc2NvcGUgYW5kIGlmCi0gICAgICAgIC8vIGl0J3Mgbm90IHRoZSBlbXB0eSBzdHJpbmcgb3IgYW4gaWxsZWdhbCBwcmVmaXguCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKHN1Z2dlc3Rpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb24ubGVuZ3RoKCkgPT0gMCB8fCBzdWdnZXN0aW9uLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCggInhtbCIgKSkKLSAgICAgICAgICAgICAgICBzdWdnZXN0aW9uID0gbnVsbDsgLy8gYmFkIHN1Z2dlc3Rpb24KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKS5lcXVhbHMoIHN1Z2dlc3Rpb24gKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIG5vIHN1Z2dlc3Rpb24sIGNvbWUgdXAgd2l0aCBhIHNhZmUgcHJlZml4IHRvIHVzZQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChzdWdnZXN0aW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlID0gUU5hbWVIZWxwZXIuc3VnZ2VzdFByZWZpeChucyk7Ci0gICAgICAgICAgICBzdWdnZXN0aW9uID0gYmFzZTsKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMSA7IDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb29wOgotICAgICAgICAgICAgICAgIGZvciAoIGMgPSAoQ29udGFpbmVyKSB0aGlzIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggcyA9IGMubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKS5lcXVhbHMoIHN1Z2dlc3Rpb24gKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBzdWdnZXN0aW9uID0gYmFzZSArIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb250YWluZXIgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgQ29udGFpbmVyIGxhc3RDb250YWluZXIgPSBudWxsOwotCi0gICAgICAgIGZvciAoIGMgPSAoQ29udGFpbmVyKSB0aGlzIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0Q29udGFpbmVyID0gYzsKLQotICAgICAgICAgICAgaWYgKGMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgIHRhcmdldCA9IGM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICB0YXJnZXQgPSBsYXN0Q29udGFpbmVyOwotCi0gICAgICAgIEF0dHIgYSA9IG5ldyBYbWxucyggbmV3IFFOYW1lKCBucywgc3VnZ2VzdGlvbiApICk7Ci0KLSAgICAgICAgci5zdGFydENoYW5nZSgpOwotCi0gICAgICAgIHIuaW5zZXJ0U3BsYXkoIGEsIHRhcmdldCApOwotCi0gICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICByZXR1cm4gYS5nZXRMb2NhbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRlbnQgYXQgcG9zIGluIHRoaXMKLSAgICAgKiBzcGxheS4KLSAgICAgKi8KLQotICAgIGZpbmFsIENvbnRhaW5lciBnZXRDb250YWluZXIgKCBpbnQgcCApCi0gICAgewotICAgICAgICBhc3NlcnQgcCA+PSAwICYmIHAgPD0gZ2V0RW5kUG9zKCk7Ci0gICAgICAgIGFzc2VydCBwID4gMCB8fCAhaXNEb2MoKTsKLQotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChpc0xlYWYoKSkKLSAgICAgICAgICAgIHJldHVybiBwIDwgZ2V0UG9zQWZ0ZXIoKSA/IChDb250YWluZXIpIHRoaXMgOiBnZXRDb250YWluZXIoKTsKLQotICAgICAgICBpZiAoaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiAoQ29udGFpbmVyKSB0aGlzOwotCi0gICAgICAgIGlmIChpc0ZpbmlzaCgpKQotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgIHJldHVybiBnZXRDb250YWluZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzcGxheSB3aGljaCBjb250YWlucyB0aGlzIHNwbGF5LgotICAgICAqLwotCi0gICAgYWJzdHJhY3QgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZmNuIHRvIGxvY2F0ZSB0aGUgY29udGFpbmVyIHRoaXMgc3BsYXkgaXMgY29udGFpbmVyIGluLgotICAgICAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBpbXBsZW1lbnRhdGlvbnMgb2YgZ2V0Q29udGFpbmVyIGluCi0gICAgICogY2FzZXMgd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBub3Qgb2J2aW91c2x5IGNvbXB1dGFibGUuCi0gICAgICovCi0KLSAgICBDb250YWluZXIgZmluZENvbnRhaW5lciAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNDb250YWluZXIoKTsKLSAgICAgICAgYXNzZXJ0ICFpc0ZpbmlzaCgpOwotCi0gICAgICAgIFNwbGF5IHMgPSBuZXh0U3BsYXkoKTsKLQotICAgICAgICB3aGlsZSAoICFzLmlzRmluaXNoKCkgJiYgIXMuaXNCZWdpbigpICkKLSAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotCi0gICAgICAgIHJldHVybiBzLmdldENvbnRhaW5lcigpOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgaW52YWxpZGF0ZVRleHQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNWYWxpZCgpOwotCi0gICAgICAgIFR5cGUgdCA9IHBlZWtUeXBlKCk7Ci0KLSAgICAgICAgaWYgKHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLQotICAgICAgICAgICAgdC5pbnZhbGlkYXRlVGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBpbnZhbGlkYXRlTmlsICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLQotICAgICAgICBpZiAoIWlzQXR0cigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIHQgPSBwZWVrVHlwZSgpOwotCi0gICAgICAgICAgICBpZiAodCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHQuaW52YWxpZGF0ZU5pbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZGlzY29ubmVjdFR5cGVzICggUm9vdCByICkKLSAgICB7Ci0gICAgICAgIGRpc2Nvbm5lY3RUeXBlcyggciwgZmFsc2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZGlzY29ubmVjdFR5cGVzICggUm9vdCByLCBib29sZWFuIGRpc2Nvbm5lY3REb2MgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLQotICAgICAgICBTcGxheSBsYXN0ID0gaXNBdHRyKCkgPyB0aGlzIDogZ2V0RmluaXNoU3BsYXkoKTsKLQotICAgICAgICBTcGxheSBzID0gdGhpczsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIHQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSB8fCBzLmlzTGVhZigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQgPSBzLnBlZWtUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzRmluaXNoKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29udGFpbmVyIGMgPSBzLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFjLmlzRG9jKCkgfHwgZGlzY29ubmVjdERvYykKLSAgICAgICAgICAgICAgICAgICAgdCA9IGMucGVla1R5cGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSB1ID0gdC5nZXRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHUuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodS5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHQudmFsaWRhdGVWYWx1ZSggdSwgdCApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5pc2ggc3BsYXkgbWlnaHQgZ2V0IHdoYWNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIFNwbGF5IGYgPSB1LmdldEZpbmlzaFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHQudmFsaWRhdGVDb250ZW50KCB1LCB0ICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID09IGxhc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0LmRpc2Nvbm5lY3QoIHIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHMgPT0gbGFzdCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKHMuaXNDb250YWluZXIoKSAmJiAhcy5pc0xlYWYoKSAmJiBzLnBlZWtUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHlwZSBvZiBvZiB0aGlzCi0gICAgICovCi0KLSAgICBmaW5hbCB2b2lkIHNldFR5cGUgKCBSb290IHIsIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgIHsKLSAgICAgICAgc2V0VHlwZSggciwgc1R5cGUsIHRydWUgKTsKLSAgICB9Ci0gICAgCi0gICAgZmluYWwgdm9pZCBzZXRUeXBlICggUm9vdCByLCBTY2hlbWFUeXBlIHNUeXBlLCBib29sZWFuIGNvbXBsYWluICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0gICAgICAgIGFzc2VydCBzVHlwZSAhPSBudWxsOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElzIHRoZSBjdXJyZW50IHR5cGUgYWxyZWFkeSB0aGlzIHR5cGU/Ci0gICAgICAgIC8vCi0KLSAgICAgICAgVHlwZSB0ID0gcGVla1R5cGUoKTsKLQotICAgICAgICBpZiAodCAhPSBudWxsICYmIHQuZ2V0X3NjaGVtYV90eXBlKCkgPT0gc1R5cGUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQ2FuIGFsd2F5cyBzZXQgYW4gYXJiaXRyYXJ5IHR5cGUgYXQgdGhlIGRvYyBsZXZlbAotICAgICAgICAvLwotCi0gICAgICAgIGlmIChpc0RvYygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIsIHRydWUgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IHBlZWtUeXBlKCkgPT0gbnVsbDsKLQotICAgICAgICAgICAgbmV3IFR5cGUoIHIsIHNUeXBlLCB0aGlzICk7Ci0KLSAgICAgICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBHb3R0YSBnZXQgdGhlIHBhcmVudCB0eXBlIHRvIGRvIGFueXRoaW5nIGZ1cnRoZXIuICBJZiBpdAotICAgICAgICAvLyBjYW4ndCBiZSBmb3VuZCwgdGhlbiBiYXJmCi0gICAgICAgIC8vCi0KLSAgICAgICAgVHlwZSBwYXJlbnRUeXBlID0gZ2V0Q29udGFpbmVyKCkuZ2V0VHlwZSggciApOwotCi0gICAgICAgIGFzc2VydCBwYXJlbnRUeXBlICE9IG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWW91IGNhbiBzZXQgdGhlIGF0dHJpYnV0ZSB0eXBlLCBhcyBsb25nIGFzIGl0IGlzIHRoZSBuYXR1cmFsCi0gICAgICAgIC8vIHR5cGUuICBBdHRyaWJ1dGVzIGNhbm5vdCBoYXZlIHhzaTp0eXBlCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKGlzQXR0cigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocGFyZW50VHlwZS5nZXRfYXR0cmlidXRlX3R5cGUoIGdldE5hbWUoKSApICE9IHNUeXBlICYmIGNvbXBsYWluKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW4ndCBzZXQgdHlwZSBvZiBhdHRyaWJ1dGUgdG8gIiArIHNUeXBlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBOb3csIGZvciBpbnRlcmlvciB0eXBlcywgSSBoYXZlIHRvIGRlYWwgd2l0aCB4c2k6dHlwZSBhbmQKLSAgICAgICAgLy8gd2hldGhlciBvciBub3QgdGhlIHR5cGUgaXMgYWxsb3dlZCBhdCB0aGlzIHBvaW50LgotICAgICAgICAvLwotCi0gICAgICAgIC8vIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGlzIHR5cGUgY2FuIGJlIGhlcmUgc2FucyB4c2k6dHlwZS4KLSAgICAgICAgLy8gSWYgc28sIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyB4c2k6dHlwZQotCi0gICAgICAgIGlmIChwYXJlbnRUeXBlLmdldF9lbGVtZW50X3R5cGUoIGdldE5hbWUoKSwgbnVsbCApID09IHNUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRYc2lUeXBlKCByLCBudWxsICk7Ci0KLSAgICAgICAgICAgIGRpc2Nvbm5lY3RUeXBlcyggciApOwotCi0gICAgICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGRlc2lyZWQgdHlwZSBoYXMgbm8gbmFtZSwgdGhlbiBpdCBjYW5ub3QgYmUKLSAgICAgICAgLy8gcmVmZXJlbmNlZCB2aWEgeHNpOnR5cGUKLQotICAgICAgICBRTmFtZSB0eXBlTmFtZSA9IHNUeXBlLmdldE5hbWUoKTsKLQotICAgICAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBsYWluKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW4ndCBzZXQgdHlwZSBvZiBlbGVtZW50LCB0eXBlIGlzIHVuLW5hbWVkIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50VHlwZS5nZXRfZWxlbWVudF90eXBlKCBnZXROYW1lKCksIHR5cGVOYW1lICkgIT0gc1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wbGFpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHR5cGUgb2YgZWxlbWVudCwgaW52YWxpZCB0eXBlIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRYc2lUeXBlKCByLCB0eXBlTmFtZSApOwotCi0gICAgICAgIGRpc2Nvbm5lY3RUeXBlcyggciApOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgVHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzcGxheS4gIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gY3JlYXRlCi0gICAgICogb25lIGFuZCB3aWxsIHJldHVybiBudWxsIGlzIG5vbiBleGlzdHMuCi0gICAgICovCi0KLSAgICBmaW5hbCBUeXBlIHBlZWtUeXBlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLQotICAgICAgICBUeXBlIHR5cGUgPSBudWxsOwotCi0gICAgICAgIGlmIChfZ29vYmVycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUeXBlKSBnOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbCB8fCBpc1ZhbGlkKCk7Ci0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNwbGF5LiAgSWYgbm9uIGV4aXN0cywgaXQgYXR0ZW1wdHMKLSAgICAgKiB0byBjcmVhdGUgb25lLiAgUmV0dXJucyBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKi8KLQotICAgIGZpbmFsIFR5cGUgZ2V0VHlwZSAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIFR5cGUgdHlwZSA9IHBlZWtUeXBlKCk7Ci0KLSAgICAgICAgaWYgKCFpc0RvYygpICYmIHR5cGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZSBwYXJlbnRUeXBlID0gZ2V0Q29udGFpbmVyKCkuZ2V0VHlwZSggciApOwotCi0gICAgICAgICAgICBhc3NlcnQgcGFyZW50VHlwZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBEZWZlbnNpdmUKLSAgICAgICAgICAgIGlmIChwYXJlbnRUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgbmV3VXNlcjsKLQotICAgICAgICAgICAgaWYgKGlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdVc2VyID0KLSAgICAgICAgICAgICAgICAgICAgcGFyZW50VHlwZS5jcmVhdGVfZWxlbWVudF91c2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLCBnZXRYc2lUeXBlTmFtZSggciApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgICAgICAgICAgbmV3VXNlciA9IHBhcmVudFR5cGUuY3JlYXRlX2F0dHJpYnV0ZV91c2VyKCBnZXROYW1lKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0IG5ld1VzZXIgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gRGVmZW5zaXZlCi0gICAgICAgICAgICBpZiAobmV3VXNlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICB0eXBlID0gbmV3IFR5cGUoIHIsIG5ld1VzZXIsIHRoaXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB0eXBlICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyBpbnNpZGUgb2YgdGhlIGNvbnRlbnQgb2Ygc1JhbmdlPyAgRG9lcyBhbiBpbmNsdXNpdmUgY2hlY2suCi0gICAgICovCi0KLSAgICBmaW5hbCBib29sZWFuIGJldHdlZW4gKCBSb290IHIsIGludCBwVGhpcywgU3BsYXkgc1JhbmdlICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHNSYW5nZS5nZXRSb290U2xvdygpOwotCi0gICAgICAgIGlmIChzUmFuZ2UuaXNEb2MoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChjb21wYXJlKCByLCBwVGhpcywgc1JhbmdlLCAwICkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFNwbGF5IHNFbmQ7Ci0gICAgICAgIGludCAgIHBFbmQ7Ci0KLSAgICAgICAgYXNzZXJ0ICFzUmFuZ2UuaXNEb2MoKTsKLQotICAgICAgICBpZiAoc1JhbmdlLmlzTGVhZigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzRW5kID0gc1JhbmdlOwotICAgICAgICAgICAgcEVuZCA9IHNSYW5nZS5nZXRQb3NMZWFmRW5kKCkgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNSYW5nZS5pc0JlZ2luKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNFbmQgPSBzUmFuZ2UuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgIHBFbmQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc0VuZCA9IHNSYW5nZS5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgIHBFbmQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhcmUoIHIsIHBUaGlzLCBzRW5kLCBwRW5kICkgPD0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlIHR3byBwb3NpdGlvbnMuICBBdHRyaWJ1dGVzIGFyZSBhIGJpdGNoLgotICAgICAqLwotCi0gICAgZmluYWwgaW50IGNvbXBhcmUgKCBSb290IHIsIGludCBwVGhpcywgU3BsYXkgc1RoYXQsIGludCBwVGhhdCApCi0gICAgewotICAgICAgICBTcGxheSBzVGhpcyA9IHRoaXM7Ci0KLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNUaGlzLmdldFJvb3RTbG93KCkgPT0gcjsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNUaGF0LmdldFJvb3RTbG93KCkgPT0gcjsKLSAgICAgICAgYXNzZXJ0IHBUaGlzID49IDAgJiYgcFRoaXMgPD0gc1RoaXMuZ2V0RW5kUG9zKCk7Ci0gICAgICAgIGFzc2VydCBwVGhhdCA+PSAwICYmIHBUaGF0IDw9IHNUaGF0LmdldEVuZFBvcygpOwotCi0gICAgICAgIC8vIE5vcm1hbGl6ZSBwb3NpdGlvbnMKLQotICAgICAgICBpZiAocFRoaXMgPT0gc1RoaXMuZ2V0RW5kUG9zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVGhpcy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKHNUaGlzID0gc1RoaXMubmV4dFNwbGF5KCkpLmlzQXR0cigpKQotICAgICAgICAgICAgICAgICAgICBwVGhpcyA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc1RoaXMgPSBzVGhpcy5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHBUaGlzID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc1RoaXMgPSBzVGhpcy5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgcFRoaXMgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBUaGF0ID09IHNUaGF0LmdldEVuZFBvcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1RoYXQuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChzVGhhdCA9IHNUaGF0Lm5leHRTcGxheSgpKS5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgcFRoYXQgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNUaGF0ID0gc1RoYXQucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICBwVGhhdCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNUaGF0ID0gc1RoYXQubmV4dE5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIHBUaGF0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBwVGhpcyA8IHNUaGlzLmdldEVuZFBvcygpOwotICAgICAgICBhc3NlcnQgcFRoYXQgPCBzVGhhdC5nZXRFbmRQb3MoKTsKLQotICAgICAgICBpZiAoc1RoaXMgPT0gc1RoYXQpCi0gICAgICAgICAgICByZXR1cm4gcFRoaXMgPCBwVGhhdCA/IC0xIDogcFRoaXMgPiBwVGhhdCA/IDEgOiAwOwotCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKHNUaGlzLmlzQXR0cigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1RoYXQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoIHIsIHNUaGF0ICk7Ci0KLSAgICAgICAgICAgIGlmIChzVGhpcy5wcmV2Tm9uQXR0clNwbGF5KCkgIT0gc1RoYXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoIHIsIHNUaGF0ICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBwVGhhdCA9PSAwID8gMSA6IC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNUaGF0LmlzQXR0cigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIXNUaGlzLmlzQXR0cigpOwotCi0gICAgICAgICAgICBpZiAoc1RoYXQucHJldk5vbkF0dHJTcGxheSgpICE9IHNUaGlzKQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOwotCi0gICAgICAgICAgICByZXR1cm4gcFRoaXMgPT0gMCA/IC0xIDogMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY29tcGFyZSAoIFJvb3QgciwgU3BsYXkgc1RoYXQgKQotICAgIHsKLSAgICAgICAgU3BsYXkgc1RoaXMgPSB0aGlzOwotCi0gICAgICAgIGlmIChzVGhpcyA9PSBzVGhhdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGlmIChyLmlzTGVmdE9ubHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUaGlzLmdldENjaExlZnQoKSA8IHNUaGF0LmdldENjaExlZnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIGlmIChzVGhpcy5nZXRDY2hMZWZ0KCkgPiBzVGhhdC5nZXRDY2hMZWZ0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgICAgIGlmIChzVGhpcy5nZXRDZG9jQmVnaW5MZWZ0KCkgPCBzVGhhdC5nZXRDZG9jQmVnaW5MZWZ0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2RvY0JlZ2luTGVmdCgpID4gc1RoYXQuZ2V0Q2RvY0JlZ2luTGVmdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICB3aGlsZSAoIHNUaGlzICE9IHIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNUaGlzID0gc1RoaXMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc1RoaXMgPT0gc1RoYXQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIGlmIChzVGhpcy5nZXRDY2goKSA+IDAgfHwgc1RoaXMuZ2V0Q2RvY0JlZ2luKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1RoYXQuaXNSb290KCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgaWYgKHNUaGlzLmlzUm9vdCgpKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgc1RoaXMuc3BsYXkoIHIsIHIgKTsKLSAgICAgICAgc1RoYXQuc3BsYXkoIHIsIHNUaGlzICk7Ci0KLSAgICAgICAgYXNzZXJ0IHNUaGlzLl9sZWZ0U3BsYXkgPT0gc1RoYXQgfHwgc1RoaXMuX3JpZ2h0U3BsYXkgPT0gc1RoYXQ7Ci0KLSAgICAgICAgcmV0dXJuIHNUaGlzLl9sZWZ0U3BsYXkgPT0gc1RoYXQgPyAxIDogLTE7Ci0gICAgfQotCi0gICAgZmluYWwgU3BsYXkgbmV4dE5vbkF0dHJTcGxheSAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBuZXh0U3BsYXkoKTsKLQotICAgICAgICB3aGlsZSAoIHMgIT0gbnVsbCAmJiBzLmlzQXR0cigpICkKLSAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotCi0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIGZpbmFsIFNwbGF5IHByZXZOb25BdHRyU3BsYXkgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gcHJldlNwbGF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKCBzICE9IG51bGwgJiYgcy5pc0F0dHIoKSApCi0gICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBmaW5hbCBTcGxheSBuZXh0U3BsYXkgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gdGhpczsKLSAgICAgICAgU3BsYXkgciA9IHMuX3JpZ2h0U3BsYXk7Ci0KLSAgICAgICAgaWYgKHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggU3BsYXkgbCA9IHMgPSByIDsgKGwgPSBsLl9sZWZ0U3BsYXkpICE9IG51bGwgOyApCi0gICAgICAgICAgICAgICAgcyA9IGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcCA9IHMuX3BhcmVudFNwbGF5IDsgOyBwID0gKHMgPSBwKS5fcGFyZW50U3BsYXkgKQotICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCB8fCBwLl9sZWZ0U3BsYXkgPT0gcykKLSAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICBmaW5hbCBTcGxheSBwcmV2U3BsYXkgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gdGhpczsKLSAgICAgICAgU3BsYXkgbCA9IHMuX2xlZnRTcGxheTsKLQotICAgICAgICBpZiAobCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSByID0gcyA9IGwgOyAociA9IHIuX3JpZ2h0U3BsYXkpICE9IG51bGwgOyApCi0gICAgICAgICAgICAgICAgcyA9IHI7Ci0KLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcCA9IHMuX3BhcmVudFNwbGF5IDsgOyBwID0gKHMgPSBwKS5fcGFyZW50U3BsYXkgKQotICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCB8fCBwLl9yaWdodFNwbGF5ID09IHMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCByb3RhdGVSaWdodCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfcGFyZW50U3BsYXkuX2xlZnRTcGxheSA9PSB0aGlzOwotCi0gICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7Ci0gICAgICAgIFNwbGF5IGcgPSBwLl9wYXJlbnRTcGxheTsKLQotICAgICAgICBhc3NlcnQgcCAhPSBudWxsOwotCi0gICAgICAgIHAuX2xlZnRTcGxheSA9IF9yaWdodFNwbGF5OwotCi0gICAgICAgIGlmIChfcmlnaHRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgX3JpZ2h0U3BsYXkuX3BhcmVudFNwbGF5ID0gcDsKLQotICAgICAgICBfcmlnaHRTcGxheSA9IHA7Ci0gICAgICAgIHAuX3BhcmVudFNwbGF5ID0gdGhpczsKLSAgICAgICAgX3BhcmVudFNwbGF5ID0gZzsKLQotICAgICAgICBpZiAoZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZy5fbGVmdFNwbGF5ID09IHApCi0gICAgICAgICAgICAgICAgZy5fbGVmdFNwbGF5ID0gdGhpczsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBnLl9yaWdodFNwbGF5ID0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHAuYWRqdXN0Q2NoTGVmdCggLSBnZXRDY2hMZWZ0KCkgLSBnZXRDY2goKSApOwotICAgICAgICBwLmFkanVzdENkb2NCZWdpbkxlZnQoIC0gZ2V0Q2RvY0JlZ2luTGVmdCgpIC0gZ2V0Q2RvY0JlZ2luKCkgKTsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIHJvdGF0ZUxlZnQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5Ll9yaWdodFNwbGF5ID09IHRoaXM7Ci0KLSAgICAgICAgU3BsYXkgcCA9IF9wYXJlbnRTcGxheTsKLSAgICAgICAgU3BsYXkgZyA9IHAuX3BhcmVudFNwbGF5OwotCi0gICAgICAgIGFzc2VydCBwICE9IG51bGw7Ci0KLSAgICAgICAgcC5fcmlnaHRTcGxheSA9IF9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgaWYgKF9sZWZ0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgIF9sZWZ0U3BsYXkuX3BhcmVudFNwbGF5ID0gcDsKLQotICAgICAgICBfbGVmdFNwbGF5ID0gcDsKLSAgICAgICAgcC5fcGFyZW50U3BsYXkgPSB0aGlzOwotICAgICAgICBfcGFyZW50U3BsYXkgPSBnOwotCi0gICAgICAgIGlmIChnICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnLl9sZWZ0U3BsYXkgPT0gcCkKLSAgICAgICAgICAgICAgICBnLl9sZWZ0U3BsYXkgPSB0aGlzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGcuX3JpZ2h0U3BsYXkgPSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRqdXN0Q2NoTGVmdCggcC5nZXRDY2hMZWZ0KCkgKyBwLmdldENjaCgpICk7Ci0gICAgICAgIGFkanVzdENkb2NCZWdpbkxlZnQoIHAuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgcC5nZXRDZG9jQmVnaW4oKSApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gU3BsYXkgdGhpcyBzbyB0aGF0IGl0J3MgcGFyZW50IGlzIHBTdG9wLgotICAgIC8vCi0gICAgLy8gVGhpcyB2ZXJzaW9uIG9mIHNwbGF5IGlzIGNhcGFibGUgb2Ygc3BsYXlpbmcgdGhpcyB0byB0aGUgdG9wLiAgVGhlcmUKLSAgICAvLyBhcmUgdHdvIGNhc2VzLiAgT25lIGlzIHRoZXJlIHIgaXMgdGhpcyBhbmQgdGhpcyBpcyBzcGxheWVkIHRvIGJlCi0gICAgLy8gdGhlIGxlZnQgY2hpbGQgb2Ygci4gIFRoZSBvdGhlciBjYXNlIGlzIHdoZXJlIHIgaXMgbnVsbC4gIEluIHRoaXMgY2FzZQotICAgIC8vIHRoZSB0cmVlIHRoaXMgaXMgaW4gaXMgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiBkb2N1bWVudCwgYW5kIHRoaXMgd2lsbCBiZQotICAgIC8vIHNwbGF5ZWQgdG8gdGhlIHRvcCBvZiB0aGF0IHN1YnRyZWUgc3VjaCB0aGF0IGl0J3MgcGFyZW50IHdpbGwgYmUgbnVsbC4KLSAgICAvLwotCi0gICAgZmluYWwgdm9pZCBzcGxheSAoIFJvb3QgciwgU3BsYXkgcFN0b3AgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHBTdG9wICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB0aGlzICE9IHBTdG9wOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgciA9PSBudWxsIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHIgPT0gbnVsbCB8fCBwU3RvcC5nZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCByID09IG51bGwgfHwgci52YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgIWlzUm9vdCgpOwotCi0gICAgICAgIGJvb2xlYW4gcm90YXRlZCA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfcGFyZW50U3BsYXkgIT0gbnVsbDsKLQotICAgICAgICAgICAgU3BsYXkgcCA9IF9wYXJlbnRTcGxheTsKLQotICAgICAgICAgICAgYXNzZXJ0IHAgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNoaWxkIG9mIHRoZSBzdG9wcGVyLCB0aGVuIHdlIGFyZSBkb25lCi0KLSAgICAgICAgICAgIGlmIChwID09IHBTdG9wKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBTcGxheSBnID0gcC5fcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgY2hpbGQgb2Ygcm9vdCwgdGhlbiBzaW1wbGUgcm90YXRlCi0KLSAgICAgICAgICAgIHJvdGF0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoZyA9PSBwU3RvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocC5fbGVmdFNwbGF5ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHJvdGF0ZVJpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KCk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmFuY3kgc3BsYXlzCi0KLSAgICAgICAgICAgIGlmIChnLl9sZWZ0U3BsYXkgPT0gcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocC5fbGVmdFNwbGF5ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHAucm90YXRlUmlnaHQoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoKTsKLQotICAgICAgICAgICAgICAgIHJvdGF0ZVJpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHAuX3JpZ2h0U3BsYXkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgcC5yb3RhdGVMZWZ0KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodCgpOwotCi0gICAgICAgICAgICAgICAgcm90YXRlTGVmdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJvdGF0ZWQgJiYgciAhPSBudWxsKQotICAgICAgICAgICAgci5fbGVmdE9ubHkgPSBmYWxzZTsKLQotICAgICAgICBhc3NlcnQgciA9PSBudWxsIHx8IHIudmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhpcyBzcGxheSB3aGVyZSByb290IGlzIHRoZSBzcGxheSByb290IG9mIHRoZSB0cmVlIHRoaXMgc3BsYXkuCi0gICAgICogVGhpcyBtYXkgYmUgYSBST09UIHNwbGF5Ci0gICAgICovCi0KLSAgICBmaW5hbCBTcGxheSByZW1vdmVTcGxheSAoIFNwbGF5IHIgKQotICAgIHsKLSAgICAgICAgUm9vdCByb290ID0gci5pc1Jvb3QoKSA/IChSb290KSByIDogbnVsbDsKLQotICAgICAgICBhc3NlcnQgci5fcGFyZW50U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHJvb3QgPT0gbnVsbCB8fCByb290LnZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgICAgIGFzc2VydCAhaXNSb290KCk7Ci0gICAgICAgIGFzc2VydCAhaXNEb2MoKTsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFNwbGF5Um9vdFNsb3coKSA9PSByOwotCi0gICAgICAgIC8vIElmIHRoZSBzcGxheSB0byBiZSByZW1vdmVkIGhhcyBubyBjY2ggb3IgY2JlZ2luLCB0aGVuIHdoZW4gdGhlCi0gICAgICAgIC8vIHRyZWUgaXMgbGVmdCBvbmx5IGNoaWxkcmVuLCB3ZSBuZWVkIG5vdCBzcGxheS4KLQotICAgICAgICBpbnQgY2NoID0gZ2V0Q2NoKCk7Ci0gICAgICAgIGludCBjYmVnaW4gPSBnZXRDZG9jQmVnaW4oKTsKLQotICAgICAgICBpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuX2xlZnRPbmx5ICYmIGNjaCA9PSAwICYmIGNiZWdpbiA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3JpZ2h0U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfcGFyZW50U3BsYXkgIT0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKChfcGFyZW50U3BsYXkuX2xlZnRTcGxheSA9IF9sZWZ0U3BsYXkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX2xlZnRTcGxheS5fcGFyZW50U3BsYXkgPSBfcGFyZW50U3BsYXk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzcGxheSggcm9vdCwgciApOwotCi0gICAgICAgICAgICBpZiAoX2xlZnRTcGxheSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHIuYWRqdXN0Q2NoTGVmdCggLSBjY2ggKTsKLSAgICAgICAgICAgICAgICByLmFkanVzdENkb2NCZWdpbkxlZnQoIC0gY2JlZ2luICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHIuX2xlZnRTcGxheSA9IF9yaWdodFNwbGF5KSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfcmlnaHRTcGxheS5fcGFyZW50U3BsYXkgPSByOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHAgPSBwcmV2U3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIHAuc3BsYXkoIHJvb3QsIHRoaXMgKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBwLl9yaWdodFNwbGF5ID09IG51bGw7Ci0KLSAgICAgICAgICAgICAgICByLl9sZWZ0U3BsYXkgPSBwOwotICAgICAgICAgICAgICAgIHAuX3BhcmVudFNwbGF5ID0gcjsKLSAgICAgICAgICAgICAgICByLmFkanVzdENjaExlZnQoIC0gY2NoICk7Ci0gICAgICAgICAgICAgICAgci5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGNiZWdpbiApOwotICAgICAgICAgICAgICAgIHAuX3JpZ2h0U3BsYXkgPSBfcmlnaHRTcGxheTsKLQotICAgICAgICAgICAgICAgIGlmIChwLl9yaWdodFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHAuX3JpZ2h0U3BsYXkuX3BhcmVudFNwbGF5ID0gcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIF9sZWZ0U3BsYXkgPSBfcmlnaHRTcGxheSA9IF9wYXJlbnRTcGxheSA9IG51bGw7Ci0gICAgICAgIGFkanVzdENjaExlZnQoIC0gZ2V0Q2NoTGVmdCgpICk7Ci0gICAgICAgIGFkanVzdENkb2NCZWdpbkxlZnQoIC0gZ2V0Q2RvY0JlZ2luTGVmdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHJvb3QgPT0gbnVsbCB8fCByb290LnZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBUaGUgWm9vIChtb3JlIGxpa2UgYSBwZXR0aW5nIHpvbyBub3cpCi0gICAgLy8KLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBRTmFtZVNwbGF5IGV4dGVuZHMgU3BsYXkKLSAgICB7Ci0gICAgICAgIFFOYW1lU3BsYXkgKCBpbnQga2luZCwgYm9vbGVhbiBpcywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBraW5kLCBpcyApOwotICAgICAgICAgICAgX25hbWUgPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgUU5hbWUgZ2V0TmFtZSAoICkgeyByZXR1cm4gX25hbWU7IH0KLSAgICAgICAgZmluYWwgdm9pZCAgY2hhbmdlTmFtZSAoIFFOYW1lIG5hbWUgKSB7IF9uYW1lID0gbmFtZTsgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBnZXRVcmkgICAoICkgeyByZXR1cm4gX25hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7IH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGdldExvY2FsICggKSB7IHJldHVybiBfbmFtZS5nZXRMb2NhbFBhcnQoKTsgICAgfQotCi0gICAgICAgIHByaXZhdGUgUU5hbWUgX25hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lciBleHRlbmRzIFFOYW1lU3BsYXkKLSAgICB7Ci0gICAgICAgIENvbnRhaW5lciAoIGludCBraW5kLCBib29sZWFuIGlzLCBRTmFtZSBuYW1lICkKLSAgICAgICAgICAgIHsgc3VwZXIoIGtpbmQsIGlzLCBuYW1lICk7IH0KLQotICAgICAgICBhYnN0cmFjdCBGaW5pc2ggZ2V0RmluaXNoICggKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgRG9jIGV4dGVuZHMgQ29udGFpbmVyCi0gICAgewotICAgICAgICBEb2MgKCBSb290IHIsIFFOYW1lIG5hbWUgKQotICAgICAgICAgICAgeyBzdXBlciggRE9DLCBmYWxzZSwgbmFtZSApOyBfcm9vdCA9IHI7IH0KLQotICAgICAgICBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBudWxsOyB9Ci0gICAgICAgIEZpbmlzaCAgICBnZXRGaW5pc2ggKCApIHsgcmV0dXJuIF9yb290OyB9Ci0KLSAgICAgICAgUm9vdCBfcm9vdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQmVnaW4gZXh0ZW5kcyBDb250YWluZXIKLSAgICB7Ci0gICAgICAgIEJlZ2luICggUU5hbWUgbmFtZSwgQ29udGFpbmVyIGNvbnRhaW5lciApCi0gICAgICAgICAgICB7IHN1cGVyKCBCRUdJTiwgZmFsc2UsIG5hbWUgKTsgX2NvbnRhaW5lciA9IGNvbnRhaW5lcjsgfQotCi0gICAgICAgIGZpbmFsIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIF9jb250YWluZXI7IH0KLSAgICAgICAgZmluYWwgRmluaXNoICAgIGdldEZpbmlzaCAgICAoICkgeyByZXR1cm4gX2VuZDsgfQotCi0gICAgICAgIEVuZCAgICAgICAgIF9lbmQ7Ci0gICAgICAgIENvbnRhaW5lciAgIF9jb250YWluZXI7Ci0gICAgfQotCi0gICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZpbmlzaCBleHRlbmRzIFNwbGF5Ci0gICAgewotICAgICAgICBGaW5pc2ggKCBpbnQga2luZCApIHsgc3VwZXIoIGtpbmQsIGZhbHNlICk7IH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgRW5kIGV4dGVuZHMgRmluaXNoCi0gICAgewotICAgICAgICBFbmQgKCBCZWdpbiBiZWdpbiApIHsgc3VwZXIoIEVORCApOyBfYmVnaW4gPSBiZWdpbjsgfQotCi0gICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIF9iZWdpbjsgfQotCi0gICAgICAgIGZpbmFsIEJlZ2luIF9iZWdpbjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWVudCBleHRlbmRzIFNwbGF5Ci0gICAgewotICAgICAgICBDb21tZW50ICggKSB7IHN1cGVyKCBDT01NRU5ULCBmYWxzZSApOyB9Ci0KLSAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gZmluZENvbnRhaW5lcigpOyB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEZyYWdtZW50IGV4dGVuZHMgU3BsYXkKLSAgICB7Ci0gICAgICAgIEZyYWdtZW50ICggKSB7IHN1cGVyKCBDT01NRU5ULCB0cnVlICk7IH0KLQotICAgICAgICBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBudWxsOyB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEF0dHIgZXh0ZW5kcyBRTmFtZVNwbGF5Ci0gICAgewotICAgICAgICBBdHRyICggUU5hbWUgbmFtZSApIHsgc3VwZXIoIEFUVFIsIGZhbHNlLCBuYW1lICk7IH0KLQotICAgICAgICBBdHRyICggUU5hbWUgbmFtZSwgYm9vbGVhbiBpc1htbG5zICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIEFUVFIsIHRydWUsIG5hbWUgKTsKLSAgICAgICAgICAgIGFzc2VydCBpc1htbG5zOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IHByZXZTcGxheSgpIDsgOyBzID0gcy5wcmV2U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENvbnRhaW5lcikgczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBYbWxucyBleHRlbmRzIEF0dHIKLSAgICB7Ci0gICAgICAgIFhtbG5zICggUU5hbWUgbmFtZSApIHsgc3VwZXIoIG5hbWUsIHRydWUgKTsgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9jaW5zdCBleHRlbmRzIFFOYW1lU3BsYXkKLSAgICB7Ci0gICAgICAgIFByb2NpbnN0ICggUU5hbWUgdGFyZ2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIFBST0NJTlNULCBmYWxzZSwgdGFyZ2V0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9jaW5zdCAoIFN0cmluZyB0YXJnZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggUFJPQ0lOU1QsIGZhbHNlLCBuZXcgUU5hbWUoICIiLCB0YXJnZXQgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gZmluZENvbnRhaW5lcigpOyB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZlcnkgc3BsYXkgcG9pbnRzIHRvIGEgY29sbGVjdGlvbiBvZiBnb29iZXJzLiAgR29vYmVycyBjYW4gYmUKLSAgICAgKiBhZ2dyZWdhdGVkIGludG8gZ3JvdXBzIHdoaWNoIHNoYXJlIHRoZSBzYW1lIHN0YXRlIChraW5kIGFuZCBwb3NpdGlvbikuCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IENVUlNPUiAgICAgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSAgICAgICA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEFHR1JFR0FURSAgPSAzOwotCi0gICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEdvb2JlciBleHRlbmRzIEdvb2JlcnMKLSAgICB7Ci0gICAgICAgIEdvb2JlciAoIFJvb3QgciwgaW50IGtpbmQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgICAgICBfc3RhdGUgPSBraW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50ICAgZ2V0S2luZCAgKCApIHsgcmV0dXJuIF9zdGF0ZSAmIDc7ICB9Ci0gICAgICAgIGZpbmFsIFJvb3QgIGdldFJvb3QgICggKSB7IHJldHVybiBfcm9vdDsgICAgICAgfQotICAgICAgICBmaW5hbCBTcGxheSBnZXRTcGxheSAoICkgeyByZXR1cm4gX3NwbGF5OyAgICAgIH0KLSAgICAgICAgZmluYWwgaW50ICAgZ2V0UG9zICAgKCApIHsgcmV0dXJuIF9zdGF0ZSA+PiAzOyB9Ci0gICAgICAgIGZpbmFsIGludCAgIGdldFN0YXRlICggKSB7IHJldHVybiBfc3RhdGU7ICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBbm5vdGF0aW9uICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQU5OT1RBVElPTjsgfQotCi0gICAgICAgIGZpbmFsIHZvaWQgc2V0ICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzICE9IG51bGw7Ci0gICAgICAgICAgICBkb1NldCggciwgcywgcCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGRvU2V0ICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzICE9IG51bGwgfHwgcCA9PSAwOwotICAgICAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHMgPT0gbnVsbCB8fCByID09IHMuZ2V0Um9vdFNsb3coKTsKLSAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBfc3BsYXkgPT0gbnVsbCB8fCBfcm9vdCA9PSBfc3BsYXkuZ2V0Um9vdFNsb3coKTsKLS8vICAgICAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IF9yb290ID09IHIgfHwgX3NwbGF5LmdldFJvb3RTbG93KCkgIT0gcy5nZXRSb290U2xvdygpOwotCi0gICAgICAgICAgICBfcm9vdCA9IHI7Ci0KLSAgICAgICAgICAgIGlmIChfc3BsYXkgIT0gcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3NwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCBzICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydCBwID49IDA7Ci0gICAgICAgICAgICBhc3NlcnQgX3NwbGF5ID09IG51bGwgfHwgcCA8PSBfc3BsYXkuZ2V0TWF4UG9zKCk7Ci0gICAgICAgICAgICBfc3RhdGUgPSBwICogOCArIChfc3RhdGUgJiA3KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIHZvaWQgc2V0ICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHIgIT0gbnVsbDsKLSAgICAgICAgICAgIF9yb290ID0gcjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIHZvaWQgc2V0ICggU3BsYXkgcywgaW50IHAgKSB7IGRvU2V0KCBnZXRSb290KCksIHMsICAgICAgICAgIHAgKTsgfQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoICAgICAgICAgIGludCBwICkgeyBkb1NldCggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBwICk7IH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoIEdvb2JlciBnICkKLSAgICAgICAgICAgIHsgZG9TZXQoIGcuZ2V0Um9vdCgpLCBnLmdldFNwbGF5KCksIGcuZ2V0UG9zKCkgKTsgfQotCi0gICAgICAgIHZvaWQgZGlzY29ubmVjdCAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvU2V0KCByLCBudWxsLCAwICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIHZvaWQgYXBwZW5kICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgcy5nZXRSb290U2xvdygpID09IF9yb290OwotICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IF9wYXJlbnQgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfbmV4dCA9PSBudWxsICYmIF9wcmV2ID09IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChzLl9nb29iZXJzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcy5fZ29vYmVycyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgX25leHQgPSBfcHJldiA9IHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX25leHQgPSBzLl9nb29iZXJzOwotICAgICAgICAgICAgICAgIF9wcmV2ID0gX25leHQuX3ByZXY7Ci0gICAgICAgICAgICAgICAgX25leHQuX3ByZXYgPSB0aGlzOwotICAgICAgICAgICAgICAgIF9wcmV2Ll9uZXh0ID0gdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX3NwbGF5ID0gczsKLSAgICAgICAgICAgIF9wYXJlbnQgPSBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHJlbW92ZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IF9nb29iZXJzID09IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChfbmV4dCA9PSB0aGlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfcGFyZW50Ll9nb29iZXJzID09IHRoaXM7Ci0KLSAgICAgICAgICAgICAgICBfcGFyZW50Ll9nb29iZXJzID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIC8vIElmIHBhcmVudCBpcyBhbiBhZ2dyZWdhdGUgZ29vYmVyLCByZW1vdmUgaXQgdG9vCi0KLSAgICAgICAgICAgICAgICBpZiAoX3BhcmVudCAhPSBfc3BsYXkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHb29iZXIgZyA9IChHb29iZXIpIF9wYXJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBnLmdldEtpbmQoKSA9PSBBR0dSRUdBVEU7Ci0gICAgICAgICAgICAgICAgICAgIGcucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wcmV2Ll9uZXh0ID0gX25leHQ7Ci0gICAgICAgICAgICAgICAgX25leHQuX3ByZXYgPSBfcHJldjsKLQotICAgICAgICAgICAgICAgIGlmIChfcGFyZW50Ll9nb29iZXJzID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIF9wYXJlbnQuX2dvb2JlcnMgPSBfbmV4dDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX25leHQgPSBfcHJldiA9IG51bGw7Ci0KLSAgICAgICAgICAgIF9wYXJlbnQgPSBudWxsOwotICAgICAgICAgICAgX3NwbGF5ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbEJvb2ttYXJrIGdldEJvb2ttYXJrICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBnZXRLaW5kKCkgPT0gQU5OT1RBVElPTgotICAgICAgICAgICAgICAgICAgICA/ICgoQW5ub3RhdGlvbikgdGhpcykuZ2V0WG1sQm9va21hcmsoKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0S2luZE5hbWUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIENVUlNPUiAgICAgOiByZXR1cm4gIkNVUlNPUiI7Ci0gICAgICAgICAgICBjYXNlIFRZUEUgICAgICAgOiByZXR1cm4gIlRZUEUiOwotICAgICAgICAgICAgY2FzZSBBTk5PVEFUSU9OIDogcmV0dXJuICJBTk5PVEFUSU9OIjsKLSAgICAgICAgICAgIGRlZmF1bHQgICAgICAgICA6IHJldHVybiAiPHVua25vdyBnb29iZXIga2luZD4iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBSb290IF9yb290OwotCi0gICAgICAgIHByaXZhdGUgU3BsYXkgX3NwbGF5OwotCi0gICAgICAgIHByaXZhdGUgaW50IF9zdGF0ZTsgIC8vIHBvcyBhbmQga2luZAotCi0gICAgICAgIEdvb2JlciAgX25leHQ7Ci0gICAgICAgIEdvb2JlciAgX3ByZXY7Ci0gICAgICAgIEdvb2JlcnMgX3BhcmVudDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ3Vyc29yR29vYmVyIGV4dGVuZHMgR29vYmVyCi0gICAgewotICAgICAgICBDdXJzb3JHb29iZXIgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggciwgQ1VSU09SICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwIGNyZWF0ZURlYnVnSWRNYXAgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIENyZWVweSB3YXkgdG8gZGlzY292ZXIgaXMgYXNzZXJ0IGlzIGVuYWJsZWQuCi0gICAgICAgICAgICBIYXNoTWFwIG1hcCA9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgKG1hcCA9IG5ldyBIYXNoTWFwKCkpICE9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXREZWJ1Z0lkICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2RlYnVnSWRzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBfZGVidWdJZHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghX2RlYnVnSWRzLmNvbnRhaW5zS2V5KCB0aGlzICkpCi0gICAgICAgICAgICAgICAgICAgIF9kZWJ1Z0lkcy5wdXQoIHRoaXMsIG5ldyBJbnRlZ2VyKCBfbmV4dERlYnVnSWQrKyApICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSBfZGVidWdJZHMuZ2V0KCB0aGlzICkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwIF9kZWJ1Z0lkcyA9IGNyZWF0ZURlYnVnSWRNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50ICAgX25leHREZWJ1Z0lkID0gMTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbiBleHRlbmRzIEdvb2JlciBpbXBsZW1lbnRzIFhtbE1hcmsKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgbW9uaXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSb290KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBbm5vdGF0aW9uICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIEFOTk9UQVRJT04gKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFubm90YXRpb24gKCBSb290IHIsIFhtbEJvb2ttYXJrIGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzKCByICk7Ci0KLSAgICAgICAgICAgIGlmIChhLl9yZWYgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfYW5ub3RhdGlvbiA9IGE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX3JlZiA9IGEuX3JlZjsKLQotICAgICAgICAgICAgX2tleSA9IGEuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldEtleSAoIE9iamVjdCBrZXkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfa2V5ID0ga2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FsbGVkIHZpYSBib29rbWFyayAocHVibGljIHZpYSBYbWxNYXJrKQotICAgICAgICBwdWJsaWMgZmluYWwgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFNwbGF5KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBjcmVhdGUgYSBjdXJzb3Igb24gYSBib29rbWFyayB0aGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgYmVlbiBjbGVhcmVkIG9yIHJlcGxhY2VkLiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWG1sQm9va21hcmsgZ2V0WG1sQm9va21hcmsgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfYW5ub3RhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBfYW5ub3RhdGlvbjsKLQotICAgICAgICAgICAgaWYgKF9yZWYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFhtbEJvb2ttYXJrKSBfcmVmLmdldCgpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZGlzY29ubmVjdCAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3QoIHIgKTsKLQotICAgICAgICAgICAgWG1sQm9va21hcmsgeGEgPSBnZXRYbWxCb29rbWFyaygpOwotCi0gICAgICAgICAgICBpZiAoeGEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB4YS5fY3VycmVudE1hcmsgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgWG1sQm9va21hcmsgX2Fubm90YXRpb247Ci0gICAgICAgIFJlZmVyZW5jZSAgICAgX3JlZjsKLQotICAgICAgICBPYmplY3QgX2tleTsKLSAgICB9Ci0KLSAgICBmaW5hbCBHb29iZXIgZmlyc3RHb29iZXIgKCApCi0gICAgewotICAgICAgICBpZiAoX2dvb2JlcnMgPT0gbnVsbCB8fCBfZ29vYmVycy5nZXRLaW5kKCkgIT0gQUdHUkVHQVRFKQotICAgICAgICAgICAgcmV0dXJuIF9nb29iZXJzOwotCi0gICAgICAgIGFzc2VydCBfZ29vYmVycy5fZ29vYmVycyAhPSBudWxsOwotICAgICAgICBhc3NlcnQgX2dvb2JlcnMuX2dvb2JlcnMuZ2V0S2luZCgpICE9IEFHR1JFR0FURTsKLQotICAgICAgICByZXR1cm4gX2dvb2JlcnMuX2dvb2JlcnM7Ci0gICAgfQotCi0gICAgZmluYWwgR29vYmVyIG5leHRHb29iZXIgKCBHb29iZXIgZyApCi0gICAgewotICAgICAgICBhc3NlcnQgZyAhPSBudWxsOwotCi0gICAgICAgIGlmICgoZyA9IGcuX25leHQpICE9IGcuX3BhcmVudC5fZ29vYmVycykKLSAgICAgICAgICAgIHJldHVybiBnOwotCi0gICAgICAgIHJldHVybiBnLl9wYXJlbnQgPT0gZy5fc3BsYXkgPyBudWxsIDogbmV4dEdvb2JlciggKEdvb2JlcikgZy5fcGFyZW50ICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2Fzc2VydEVuYWJsZWQgPSBnZXRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGdldEFzc2VydEVuYWJsZWQgKCApCi0gICAgewotICAgICAgICAvLyBDcmVlcHkgd2F5IHRvIGRpc2NvdmVyIGlzIGFzc2VydCBpcyBlbmFibGVkLgotICAgICAgICBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgYXNzZXJ0IChlbmFibGVkID0gdHJ1ZSkgfHwgdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGVuYWJsZWQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgYXNzZXJ0QXNzZXJ0RW5hYmxlZCAoICkKLSAgICB7Ci0gICAgICAgIGlmICghX2Fzc2VydEVuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJBc3NlcnQgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgdGhpcyBvcGVyYXRpb24iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBc3NvY2lhdGUgaWQncyB3aXRoIHNwbGF5cyB3aGVuIGFzc2VydHMgYXJlIGVuYWJsZWQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXAgX2RlYnVnSWRzID0KLSAgICAgICAgX2Fzc2VydEVuYWJsZWQgPyBuZXcgSGFzaE1hcCgpIDogbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBfbmV4dERlYnVnSWQgPSAxOwotCi0gICAgcHVibGljIGludCBnZXREZWJ1Z0lkICggKQotICAgIHsKLSAgICAgICAgaWYgKF9kZWJ1Z0lkcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoIF9kZWJ1Z0lkcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX2RlYnVnSWRzLmNvbnRhaW5zS2V5KCB0aGlzICkpCi0gICAgICAgICAgICAgICAgX2RlYnVnSWRzLnB1dCggdGhpcywgbmV3IEludGVnZXIoIF9uZXh0RGVidWdJZCsrICkgKTsKLQotICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgX2RlYnVnSWRzLmdldCggdGhpcyApKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wICggKSB7IGdldFJvb3RTbG93KCkuZHVtcCgpOyB9Ci0gICAgdm9pZCBkdW1wICggYm9vbGVhbiB2ZXJib3NlICkgeyBnZXRSb290U2xvdygpLmR1bXAoIHZlcmJvc2UgKTsgfQotCi0gICAgcHVibGljIFNwbGF5IGdldFNwbGF5Um9vdFNsb3cgKCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0KLSAgICAgICAgd2hpbGUgKCBzLl9wYXJlbnRTcGxheSAhPSBudWxsICkKLSAgICAgICAgICAgIHMgPSBzLl9wYXJlbnRTcGxheTsKLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUm9vdCBnZXRSb290U2xvdyAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydEFzc2VydEVuYWJsZWQoKTsKLQotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXlSb290U2xvdygpOwotCi0gICAgICAgIHJldHVybiBzLmlzUm9vdCgpID8gKFJvb3QpIHMgOiBudWxsOwotICAgIH0KLQotICAgIGludCBnZXRDcFNsb3cgKCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgaW50IGNjaCA9IDA7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcyA9IHRoaXMgOyAocyA9IHMucHJldlNwbGF5KCkpICE9IG51bGwgOyApCi0gICAgICAgICAgICBjY2ggKz0gcy5nZXRDY2goKTsKLQotICAgICAgICByZXR1cm4gY2NoOwotICAgIH0KLQotICAgIGludCBjb21wYXJlU2xvdyAoIFNwbGF5IHNUaGF0ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydEFzc2VydEVuYWJsZWQoKTsKLQotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSBzVGhhdC5nZXRSb290U2xvdygpOwotCi0gICAgICAgIGlmICh0aGlzID09IHNUaGF0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcyA9IHRoaXMgOyBzICE9IG51bGwgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICBpZiAocyA9PSBzVGhhdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgcyA9IHRoaXMgOyBzICE9IG51bGwgOyBzID0gcy5wcmV2U3BsYXkoKSApCi0gICAgICAgICAgICBpZiAocyA9PSBzVGhhdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBhc3NlcnQgZmFsc2U6ICJZaWtlcyEiOwotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGJvb2xlYW4gdmFsaWRhdGUgKCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgcmV0dXJuIGdldFJvb3RTbG93KCkudmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIERvY3VtZW50IHNwbGF5IHRyZWUgbWVtYmVycwotICAgIC8vCi0KLSAgICBTcGxheSBfbGVmdFNwbGF5OwotICAgIFNwbGF5IF9yaWdodFNwbGF5OwotICAgIFNwbGF5IF9wYXJlbnRTcGxheTsKLQotICAgIHByaXZhdGUgaW50IF9iaXRzOyAvLyAyNzogY0RvY2JlZ2luTGVmdCwgMTogaW52YWxpZCwgMTogbXVsdGksIDM6IGtpbmQKLSAgICBwcml2YXRlIGludCBfY2NoOwotICAgIHByaXZhdGUgaW50IF9jY2hBZnRlcjsKLSAgICBwcml2YXRlIGludCBfY2NoTGVmdDsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVGV4dC5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzQ0YjIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5Xcml0ZUNvbnRleHQ7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5SZWFkQ29udGV4dDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dAotewotICAgIGNoYXJbXSBfYnVmOwotICAgIGludCAgICBfZ2FwOyAgICAvLyBXaGVyZSB0aGUgZ2FwIHN0YXJ0cwotICAgIGludCAgICBfZ2FwTGVuOyAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBnYXAKLQotICAgIGludCBsZW5ndGggKCApCi0gICAgewotICAgICAgICByZXR1cm4gYnVmTGVuKCkgLSBfZ2FwTGVuOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGJ1ZkxlbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHkgKCBjaGFyW10gbmV3QnVmICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfYnVmICE9IG51bGwgJiYgbmV3QnVmLmxlbmd0aCA+PSBsZW5ndGgoKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIG5ld0J1ZiwgMCwgX2dhcCApOwotCi0gICAgICAgIGludCBsZW5BZnRlckdhcCA9IF9idWYubGVuZ3RoIC0gX2dhcCAtIF9nYXBMZW47Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgIF9idWYsIF9nYXAgKyBfZ2FwTGVuLAotICAgICAgICAgICAgbmV3QnVmLCBuZXdCdWYubGVuZ3RoIC0gKGxlbkFmdGVyR2FwKSwgbGVuQWZ0ZXJHYXAgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlc2l6ZSAoIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+IF9nYXBMZW47Ci0gICAgICAgIAotICAgICAgICBpbnQgbmV3U2l6ZSA9IGxlbmd0aCgpICsgY2NoOwotICAgICAgICBpbnQgbmV3TGVuID0gX2J1ZiA9PSBudWxsID8gMTAyNCA6IF9idWYubGVuZ3RoICogMjsKLQotICAgICAgICB3aGlsZSAoIG5ld0xlbiA8IG5ld1NpemUgKQotICAgICAgICAgICAgbmV3TGVuICo9IDI7Ci0KLSAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbmV3TGVuIF07Ci0KLSAgICAgICAgaWYgKF9idWYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29weSggbmV3QnVmICk7Ci0gICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGggLSBfYnVmLmxlbmd0aDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGg7Ci0KLSAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKLSAgICB9Ci0KLSAgICB2b2lkIHRyaW0gKCApCi0gICAgewotICAgICAgICBpZiAoX2J1ZiAhPSBudWxsICYmIF9nYXBMZW4gIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbGVuZ3RoKCkgXTsKLQotICAgICAgICAgICAgY29weSggbmV3QnVmICk7Ci0KLSAgICAgICAgICAgIF9idWYgPSBuZXdCdWY7Ci0gICAgICAgICAgICBfZ2FwID0gMDsKLSAgICAgICAgICAgIF9nYXBMZW4gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBtb3ZlICggaW50IHBvcywgVGV4dCBzcmMsIGludCBzcmNQb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgaW5zZXJ0KCBwb3MsIHNyYywgc3JjUG9zLCBjY2ggKTsKLQotICAgICAgICBpZiAoc3JjID09IHRoaXMgJiYgc3JjUG9zID49IHBvcykKLSAgICAgICAgICAgIHNyY1BvcyArPSBjY2g7Ci0KLSAgICAgICAgc3JjLnJlbW92ZSggc3JjUG9zLCBjY2ggKTsKLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIE9iamVjdCB0eHQsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgaWYgKHR4dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHh0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoU3RyaW5nKSB0eHQsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlIGlmICh0eHQgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoVGV4dCkgdHh0LCBvZmYsIGNjaCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCB0eHQgaW5zdGFuY2VvZiBjaGFyW107Ci0gICAgICAgICAgICAgICAgaW5zZXJ0KCBwb3MsIChjaGFyW10pIHR4dCwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFRleHQgc3JjLCBpbnQgc3JjUG9zLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoaXMgY2FuIGRlYWwgd2l0aCBjb3B5aW5nIGZyb20gaXRzZWxmCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQotICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOwotCi0gICAgICAgICAgICBpZiAoc3JjUG9zICsgY2NoIDwgc3JjLl9nYXApCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzcmNQb3MgPj0gc3JjLl9nYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyY1BvcyArIHNyYy5fZ2FwTGVuLCBfYnVmLCBfZ2FwLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVmdExlbiA9IHNyYy5fZ2FwIC0gc3JjUG9zOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgbGVmdExlbiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyYy5fZ2FwICsgc3JjLl9nYXBMZW4sCi0gICAgICAgICAgICAgICAgICAgIF9idWYsIF9nYXAgKyBsZWZ0TGVuLCBjY2ggLSBsZWZ0TGVuICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9nYXAgKz0gY2NoOwotICAgICAgICAgICAgX2dhcExlbiAtPSBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBjaGFyW10gY2hhcnMsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNoYXJzICE9IF9idWY7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNjaCA+IF9nYXBMZW4pCi0gICAgICAgICAgICAgICAgcmVzaXplKCBjY2ggKTsKLQotICAgICAgICAgICAgbW92ZUdhcCggcG9zICk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGNoYXJzLCBvZmYsIF9idWYsIF9nYXAsIGNjaCApOwotCi0gICAgICAgICAgICBfZ2FwICs9IGNjaDsKLSAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBpbnNlcnQoIHBvcywgcywgMCwgcy5sZW5ndGgoKSApOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG9mZiA+PSAwICYmIG9mZiA8IHMubGVuZ3RoKCk7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoIDw9IHMubGVuZ3RoKCkgLSBvZmY7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQotICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOwotCi0gICAgICAgICAgICBzLmdldENoYXJzKCBvZmYsIG9mZiArIGNjaCwgX2J1ZiwgX2dhcCApOwotCi0gICAgICAgICAgICBfZ2FwICs9IGNjaDsKLSAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHJlbW92ZSggcG9zLCBjY2gsIG51bGwsIDAgKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoLCBjaGFyW10gcmV0QnVmLCBpbnQgb2ZmICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgKyBjY2ggPD0gbGVuZ3RoKCk7Ci0KLSAgICAgICAgbW92ZUdhcCggcG9zICk7Ci0KLSAgICAgICAgYXNzZXJ0IHJldEJ1ZiA9PSBudWxsIHx8IHJldEJ1Zi5sZW5ndGggLSBvZmYgPj0gY2NoOwotCi0gICAgICAgIGlmIChjY2ggPiAwICYmIHJldEJ1ZiAhPSBudWxsKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIHJldEJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgCi0gICAgICAgIF9nYXBMZW4gKz0gY2NoOwotICAgIH0KLQotICAgIHZvaWQgbW92ZUdhcCggaW50IHBvcyApCi0gICAgewotICAgICAgICBpZiAocG9zIDwgX2dhcCkKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgX2J1ZiwgcG9zICsgX2dhcExlbiwgX2dhcCAtIHBvcyApOwotICAgICAgICBlbHNlIGlmIChwb3MgPiBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIF9idWYsIF9nYXAsIHBvcyAtIF9nYXApOwotCi0gICAgICAgIF9nYXAgPSBwb3M7Ci0gICAgfQotCi0gICAgaW50IHVuT2JzY3VyZSAoIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOwotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOwotCi0gICAgICAgIGlmIChjY2ggPiAwICYmIChwb3MgPCBfZ2FwICYmIHBvcyArIGNjaCA+IF9nYXApKQotICAgICAgICAgICAgbW92ZUdhcCggcG9zICsgY2NoICk7Ci0KLSAgICAgICAgcmV0dXJuIHBvcyA8IF9nYXAgPyBwb3MgOiBwb3MgKyBfZ2FwTGVuOwotICAgIH0KLQotICAgIHZvaWQgZmV0Y2ggKCBTdHJpbmdCdWZmZXIgc2IsIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgY2NoICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG9zID49IF9nYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBfYnVmLCBwb3MgKyBfZ2FwTGVuLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGNjaCAtIF9nYXAgKyBwb3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBmZXRjaCAoIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcywgY2NoICk7Ci0KLSAgICAgICAgaWYgKHBvcyA+PSBfZ2FwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcyArIF9nYXBMZW4sIGNjaCApOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOwotICAgICAgICBzYi5hcHBlbmQoIF9idWYsIF9nYXAgKyBfZ2FwTGVuLCBjY2ggLSBfZ2FwICsgcG9zICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBmZXRjaCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IG9mZiA+PSAwOwotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOwotICAgICAgICBhc3NlcnQgYnVmLmxlbmd0aCAtIG9mZiA+PSBjY2g7Ci0KLSAgICAgICAgaWYgKGNjaCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zLCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgIGVsc2UgaWYgKHBvcyA+PSBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zICsgX2dhcExlbiwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjaHVuayA9IF9nYXAgLSBwb3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgYnVmLCBvZmYsIGNodW5rICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGJ1Ziwgb2ZmICsgY2h1bmssIGNjaCAtIGNodW5rICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZldGNoKCAwLCBsZW5ndGgoKSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVHlwZS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MzVkN2QuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM5ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkF0dHI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkJlZ2luOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvcHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Hb29iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZVVzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVmlzaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZSBleHRlbmRzIEdvb2JlciBpbXBsZW1lbnRzIFR5cGVTdG9yZQotewotICAgIFR5cGUgKCBSb290IHIsIFNjaGVtYVR5cGUgc1R5cGUsIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgdGhpcyggciwgKChUeXBlU3RvcmVVc2VyRmFjdG9yeSkgc1R5cGUpLmNyZWF0ZVR5cGVTdG9yZVVzZXIoKSwgcyApOwotICAgIH0KLSAgICAKLSAgICBUeXBlICggUm9vdCByLCBUeXBlU3RvcmVVc2VyIHVzZXIsIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHIsIFNwbGF5LlRZUEUgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLnBlZWtUeXBlKCkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHVzZXIgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotICAgICAgICAKLSAgICAgICAgX3VzZXIgPSB1c2VyOwotICAgICAgICAKLSAgICAgICAgc2V0KCBzLCAwICk7Ci0KLSAgICAgICAgaWYgKHVzZXIudXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkpCi0gICAgICAgICAgICByLl9jSW52YWxpZGF0YWJsZVR5cGVzKys7Ci0KLSAgICAgICAgaWYgKHVzZXIuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKSkKLSAgICAgICAgICAgIHIuX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlcysrOwotICAgICAgICAKLSAgICAgICAgdXNlci5hdHRhY2hfc3RvcmUoIHRoaXMgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgc3VwZXIuZGlzY29ubmVjdCggciApOwotICAgICAgICAKLSAgICAgICAgaWYgKF91c2VyLnVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpKQotICAgICAgICAgICAgci5fY0ludmFsaWRhdGFibGVUeXBlcy0tOwotCi0gICAgICAgIGlmIChfdXNlci5pc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpKQotICAgICAgICAgICAgci5fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzLS07Ci0gICAgICAgIAotICAgICAgICBfdXNlci5kaXNjb25uZWN0X3N0b3JlKCk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBTY2hlbWFUeXBlIGdldF9zY2hlbWFfdHlwZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5nZXRfc2NoZW1hX3R5cGUoKTsKLSAgICB9Ci0gICAgCi0gICAgU2NoZW1hVHlwZSBnZXRfZWxlbWVudF90eXBlICggUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSApCi0gICAgewotICAgICAgICByZXR1cm4gX3VzZXIuZ2V0X2VsZW1lbnRfdHlwZSggZWx0TmFtZSwgeHNpVHlwZSApOwotICAgIH0KLSAgICAKLSAgICBTY2hlbWFUeXBlIGdldF9hdHRyaWJ1dGVfdHlwZSAoIFFOYW1lIGF0dHJOYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5nZXRfYXR0cmlidXRlX3R5cGUoIGF0dHJOYW1lICk7Ci0gICAgfQotICAgIAotICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlX2VsZW1lbnRfdXNlciAoIFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUgKQotICAgIHsKLSAgICAgICAgVHlwZVN0b3JlVXNlciByZXQgPSBudWxsOwotICAgICAgICBpZiAoZ2V0Um9vdCgpLl9mYWN0b3J5ICE9IG51bGwpCi0gICAgICAgICAgICByZXQgPSBnZXRSb290KCkuX2ZhY3RvcnkuY3JlYXRlRWxlbWVudFVzZXIoZ2V0X3NjaGVtYV90eXBlKCksIGVsdE5hbWUsIHhzaVR5cGUpOwotCi0gICAgICAgIGlmIChyZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldCA9IF91c2VyLmNyZWF0ZV9lbGVtZW50X3VzZXIoIGVsdE5hbWUsIHhzaVR5cGUgKTsKLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICAgICAgICAgIAotICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlX2F0dHJpYnV0ZV91c2VyKCBRTmFtZSBhdHRyTmFtZSApCi0gICAgewotICAgICAgICBUeXBlU3RvcmVVc2VyIHJldCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGdldFJvb3QoKS5fZmFjdG9yeSAhPSBudWxsKQotICAgICAgICAgICAgcmV0ID0gZ2V0Um9vdCgpLl9mYWN0b3J5LmNyZWF0ZUF0dHJpYnV0ZVVzZXIoZ2V0X3NjaGVtYV90eXBlKCksICBhdHRyTmFtZSk7Ci0KLSAgICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0ID0gX3VzZXIuY3JlYXRlX2F0dHJpYnV0ZV91c2VyKCBhdHRyTmFtZSApOwotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgWG1sT2JqZWN0IGdldFhtbE9iamVjdCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBfdXNlcjsKLSAgICB9Ci0KLSAgICBib29sZWFuIHVzZXNfaW52YWxpZGF0ZV92YWx1ZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci51c2VzX2ludmFsaWRhdGVfdmFsdWUoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91c2VyLmlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBpbnZhbGlkYXRlVGV4dCAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5oaWJpdFVzZXJJbnZhbGlkYXRlID09IDApCi0gICAgICAgICAgICBfdXNlci5pbnZhbGlkYXRlX3ZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBpbnZhbGlkYXRlTmlsICggKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmhpYml0VXNlckludmFsaWRhdGUgPT0gMCkKLSAgICAgICAgICAgIF91c2VyLmludmFsaWRhdGVfbmlsdmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBpbnZhbGlkYXRlRWxlbWVudCAoIENvbnRhaW5lciBjb250YWluZXIsIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHMuZ2V0Q29udGFpbmVyKCkgPT0gY29udGFpbmVyOwotICAgICAgICAKLSAgICAgICAgaWYgKF9pbmhpYml0VXNlckludmFsaWRhdGUgPiAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFR5cGUgY29udGFpbmVyVHlwZSA9IGNvbnRhaW5lci5wZWVrVHlwZSgpOwotCi0gICAgICAgIGlmIChjb250YWluZXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKCFjb250YWluZXJUeXBlLmlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgY29udGFpbmVyVHlwZS5fdXNlci5pbnZhbGlkYXRlX3ZhbHVlKCk7Ci0KLSAgICAgICAgZm9yICggOyA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDb250YWluZXIoKSA9PSBjb250YWluZXI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVHlwZSBjaGlsZFR5cGUgPSBzLnBlZWtUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkVHlwZS5fdXNlci5pbnZhbGlkYXRlX2VsZW1lbnRfb3JkZXIoKTsKLQotICAgICAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIGJ1aWxkX3RleHQgKCBOYW1lc3BhY2VNYW5hZ2VyIG5zbSApCi0gICAgewotICAgICAgICByZXR1cm4gX3VzZXIuYnVpbGRfdGV4dCggbnNtICk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBidWlsZF9uaWwgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3VzZXIuYnVpbGRfbmlsKCk7Ci0gICAgfQotICAgIAotICAgIGludCB2YWxpZGF0ZUNvbnRlbnQgKCBTcGxheSBzLCBOYW1lc3BhY2VNYW5hZ2VyIG5zbSApCi0gICAgewotICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcy5pc0ludmFsaWQoKTsKLSAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCkgfHwgcy5pc0RvYygpOwotCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gYnVpbGRfdGV4dCggbnNtICk7Ci0KLSAgICAgICAgYXNzZXJ0IHRleHQgIT0gbnVsbDsKLQotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlKys7Ci0KLSAgICAgICAgLy8gVmFsaWRhdGluZyBkb2VzIG5vdCBsb2dpY2FsbHkgY2hhbmdlIHRoZSBkb2MKLSAgICAgICAgbG9uZyBvbGRWZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIAotICAgICAgICBzLnRvZ2dsZUlzSW52YWxpZCgpOyAvLyBQcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24KLSAgICAgICAgCi0gICAgICAgIHMuaW5zZXJ0Q2hhcnMoIDEsIHIsIHRleHQsIDAsIHRleHQubGVuZ3RoKCkgKTsKLQotICAgICAgICByLnJlc3RvcmVWZXJzaW9uKCBvbGRWZXJzaW9uICk7Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07Ci0KLSAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoKCk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgdmFsaWRhdGVWYWx1ZSAoIFNwbGF5IHMsIE5hbWVzcGFjZU1hbmFnZXIgbnNtICkKLSAgICB7Ci0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLmlzSW52YWxpZCgpOwotICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKLQotICAgICAgICBTdHJpbmcgdGV4dCA9IGJ1aWxkX3RleHQoIG5zbSApOwotCi0gICAgICAgIGFzc2VydCB0ZXh0ICE9IG51bGw7Ci0KLSAgICAgICAgLy8gVmFsaWRhdGluZyBkb2VzIG5vdCBsb2dpY2FsbHkgY2hhbmdlIHRoZSBkb2MKLSAgICAgICAgbG9uZyBvbGRWZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlKys7Ci0gICAgICAgIAotICAgICAgICBzLnRvZ2dsZUlzSW52YWxpZCgpOyAvLyBQcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24KLSAgICAgICAgCi0gICAgICAgIHMuc2V0VGV4dCggciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSApOwotICAgICAgICAKLSAgICAgICAgci5yZXN0b3JlVmVyc2lvbiggb2xkVmVyc2lvbiApOwotICAgICAgICAKLSAgICAgICAgX2luaGliaXRVc2VySW52YWxpZGF0ZS0tOwotICAgIH0KLQotICAgIFFOYW1lU2V0IGdldF9lbGVtZW50X2VuZGluZ19kZWxpbWl0ZXJzKCBRTmFtZSBxbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gX3VzZXIuZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoIHFuYW1lICk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNfYXR0cmlidXRlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkuaXNBdHRyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVfb25fc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCkudmFsaWRhdGVPblNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxDdXJzb3IgbmV3X2N1cnNvciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ3Vyc29yKCBnZXRSb290KCksIGdldFNwbGF5KCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSAoIFZhbGlkYXRvckxpc3RlbmVyIHZFdmVudFNpbmsgKQotICAgIHsKLSAgICAgICAgbmV3IFNhdmVyLlZhbGlkYXRvclNhdmVyKCBnZXRSb290KCksIGdldFNwbGF5KCksIDAsIG51bGwsIHZFdmVudFNpbmsgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgZ2V0X3NjaGVtYXR5cGVsb2FkZXIgKCApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLmdldFNjaGVtYVR5cGVMb2FkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFFOYW1lIGdldF94c2lfdHlwZSAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCkgfHwgcy5pc05vcm1hbEF0dHIoKTsKLQotICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBzLmdldFhzaVR5cGVOYW1lKCBnZXRSb290KCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgY2hhbmdlX3R5cGUgKCBTY2hlbWFUeXBlIHNUeXBlICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIHMuc2V0VHlwZSggZ2V0Um9vdCgpLCBzVHlwZSwgZmFsc2UgKTsKLQotICAgICAgICBUeXBlIHQgPSBzLmdldFR5cGUoIGdldFJvb3QoKSApOwotCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdC5fdXNlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZV90ZXh0ICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgX2luaGliaXRVc2VySW52YWxpZGF0ZSsrOwotCi0gICAgICAgIHMucmVtb3ZlQ29udGVudCggZ2V0Um9vdCgpLCBmYWxzZSApOwotCi0gICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7Ci0gICAgICAgIGFzc2VydCBzLmlzSW52YWxpZCgpOwotICAgICAgICAKLSAgICAgICAgX2luaGliaXRVc2VySW52YWxpZGF0ZS0tOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGZldGNoX3RleHQgKCBpbnQgd2hpdGVzcGFjZVJ1bGUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0ICFzLmlzSW52YWxpZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIkNhbid0IGZldGNoIHRleHQgd2hlbiBpbnZhbGlkIiApOwotCi0gICAgICAgIHJldHVybiBzLmdldFRleHQoIGdldFJvb3QoKSwgd2hpdGVzcGFjZVJ1bGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVfdGV4dCAoIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUrKzsKLSAgICAgICAgZ2V0U3BsYXkoKS5zZXRUZXh0KCBnZXRSb290KCksIHRleHQsIDAsIHRleHQubGVuZ3RoKCkgKTsKLSAgICAgICAgX2luaGliaXRVc2VySW52YWxpZGF0ZS0tOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGNvbXB1dGVfZmxhZ3MgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLQotICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgQ29udGFpbmVyIHBhcmVudENvbnRhaW5lciA9IHMuZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgVHlwZSBwYXJlbnRUeXBlID0gcGFyZW50Q29udGFpbmVyLmdldFR5cGUoIGdldFJvb3QoKSApOwotCi0gICAgICAgIGFzc2VydCBwYXJlbnRUeXBlICE9IG51bGw7Ci0KLSAgICAgICAgVHlwZVN0b3JlVXNlciBwYXJlbnRVc2VyID0gcGFyZW50VHlwZS5fdXNlcjsKLQotICAgICAgICBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnRVc2VyLmdldF9hdHRyaWJ1dGVmbGFncyggcy5nZXROYW1lKCkgKTsKLQotICAgICAgICBpbnQgZiA9IHBhcmVudFVzZXIuZ2V0X2VsZW1lbnRmbGFncyggcy5nZXROYW1lKCkgKTsKLQotICAgICAgICBpZiAoZiAhPSAtMSkKLSAgICAgICAgICAgIHJldHVybiBmOwotCi0gICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IHBhcmVudFVzZXIubmV3X3Zpc2l0b3IoKTsKLQotICAgICAgICBpZiAodmlzaXRvciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgYXNzZXJ0ICFwYXJlbnRDb250YWluZXIuaXNMZWFmKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBTcGxheSB0ID0gcGFyZW50Q29udGFpbmVyLm5leHRTcGxheSgpIDsgOyB0ID0gdC5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHQuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EIDoKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQoIHQuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodCA9PSBzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5nZXRfZWxlbWVudGZsYWdzKCk7Ci0KLSAgICAgICAgICAgICAgICB0ID0gdC5nZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hRmllbGQgZ2V0X3NjaGVtYV9maWVsZCAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIENvbnRhaW5lciBwYXJlbnRDb250YWluZXIgPSBzLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgIFR5cGVTdG9yZVVzZXIgcGFyZW50VXNlciA9IHBhcmVudENvbnRhaW5lci5nZXRUeXBlKCBnZXRSb290KCkgKS5fdXNlcjsKLSAgICAgICAgCi0gICAgICAgIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2F0dHJpYnV0ZV9maWVsZCggcy5nZXROYW1lKCkgKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0JlZ2luKCk7Ci0KLSAgICAgICAgYXNzZXJ0ICFwYXJlbnRDb250YWluZXIuaXNMZWFmKCk7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmVWaXNpdG9yIHZpc2l0b3IgPSBwYXJlbnRVc2VyLm5ld192aXNpdG9yKCk7Ci0KLSAgICAgICAgaWYgKHZpc2l0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHQgPSBwYXJlbnRDb250YWluZXIubmV4dFNwbGF5KCkgOyA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggdC5nZXROYW1lKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9zY2hlbWFfZmllbGQoKTsKLQotICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGNvdW50X2VsZW1lbnRzICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLmNvdW50KCAoQ29udGFpbmVyKSBnZXRTcGxheSgpLCBuYW1lLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb3VudF9lbGVtZW50cyhRTmFtZVNldCBuYW1lcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCkuY291bnQoKENvbnRhaW5lcilnZXRTcGxheSgpLCAgbnVsbCwgbmFtZXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlciAoIFFOYW1lIG5hbWUsIGludCBpICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBCZWdpbiBudGhCZWdpbiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4oIHMsIG5hbWUsIG51bGwsIGkgKTsKLQotICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFR5cGUgdCA9IG50aEJlZ2luLmdldFR5cGUoIGdldFJvb3QoKSApOwotCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdC5fdXNlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlciAoIFFOYW1lU2V0IG5hbWVzLCBpbnQgaSApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLQotICAgICAgICBCZWdpbiBudGhCZWdpbiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4ocywgIG51bGwsIG5hbWVzLCBpKTsKLSAgICAgICAgaWYgKG50aEJlZ2luID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgICAgIFR5cGUgdCA9IG50aEJlZ2luLmdldFR5cGUoZ2V0Um9vdCgpKTsKLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKLQotICAgICAgICByZXR1cm4gdC5fdXNlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRBbGxFbGVtZW50VHlwZXMgKCBRTmFtZSBuYW1lLCBRTmFtZVNldCBzZXQsIExpc3QgZmlsbE1lVXAgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGdldFNwbGF5KCkuaXNDb250YWluZXIoKTsKLQotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBsb29wOgotICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBzLmdldEtpbmQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkVORCAgOgotICAgICAgICAgICAgY2FzZSBTcGxheS5ST09UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhayBsb29wOwotICAgICAgICAgICAgfSAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocy5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSA9IHMuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1lVXAuYWRkKCB0eXBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNldC5jb250YWlucyhzLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSA9IHMuZ2V0VHlwZShnZXRSb290KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNZVVwLmFkZCh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5kX2FsbF9lbGVtZW50X3VzZXJzICggUU5hbWUgbmFtZSwgTGlzdCBmaWxsTWVVcCApCi0gICAgewotICAgICAgICBpbnQgaSA9IGZpbGxNZVVwLnNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmRBbGxFbGVtZW50VHlwZXMoIG5hbWUsIG51bGwsIGZpbGxNZVVwICk7Ci0KLSAgICAgICAgZm9yICggaW50IGogPSBpIDsgaiA8IGZpbGxNZVVwLnNpemUoKSA7IGorKyApCi0gICAgICAgICAgICBmaWxsTWVVcC5zZXQoIGosICgoVHlwZSkgZmlsbE1lVXAuZ2V0KCBqICkpLl91c2VyICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluZF9hbGxfZWxlbWVudF91c2VycyAoUU5hbWVTZXQgbmFtZXMsIExpc3QgZmlsbE1lVXApCi0gICAgewotICAgICAgICBpbnQgaSA9IGZpbGxNZVVwLnNpemUoKTsKLSAgICAgICAgZmluZEFsbEVsZW1lbnRUeXBlcyhudWxsLCBuYW1lcywgZmlsbE1lVXApOwotCi0gICAgICAgIGZvciAoIGludCBqID0gaSA7IGogPCBmaWxsTWVVcC5zaXplKCkgOyBqKysgKQotICAgICAgICAgICAgZmlsbE1lVXAuc2V0KCBqLCAoKFR5cGUpIGZpbGxNZVVwLmdldCggaiApKS5fdXNlciApOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfYXR0cmlidXRlX3VzZXIgKCBRTmFtZSBuYW1lICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBnZXRTcGxheSgpLmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgU3BsYXkgYSA9IGdldFNwbGF5KCkuZ2V0QXR0ciggbmFtZSApOwotCi0gICAgICAgIGlmIChhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBUeXBlIHQgPSBhLmdldFR5cGUoIGdldFJvb3QoKSApOwotCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHQuX3VzZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV9kZWZhdWx0X3RleHQgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLQotICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgQ29udGFpbmVyIHBhcmVudENvbnRhaW5lciA9IHMuZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgVHlwZSBwYXJlbnRUeXBlID0gcGFyZW50Q29udGFpbmVyLmdldFR5cGUoIGdldFJvb3QoKSApOwotCi0gICAgICAgIGFzc2VydCBwYXJlbnRUeXBlICE9IG51bGw7Ci0KLSAgICAgICAgVHlwZVN0b3JlVXNlciBwYXJlbnRVc2VyID0gcGFyZW50VHlwZS5fdXNlcjsKLQotICAgICAgICBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnRVc2VyLmdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBwYXJlbnRVc2VyLmdldF9kZWZhdWx0X2VsZW1lbnRfdGV4dCggcy5nZXROYW1lKCkgKTsKLQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IHBhcmVudFVzZXIubmV3X3Zpc2l0b3IoKTsKLQotICAgICAgICBpZiAodmlzaXRvciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYXNzZXJ0ICFwYXJlbnRDb250YWluZXIuaXNMZWFmKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBTcGxheSB0ID0gcGFyZW50Q29udGFpbmVyLm5leHRTcGxheSgpIDsgOyB0ID0gdC5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHQuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EIDoKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQoIHQuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodCA9PSBzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5nZXRfZGVmYXVsdF90ZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICB0ID0gdC5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVfbmlsICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIGlmICghcy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHMuc2V0WHNpTmlsKCBnZXRSb290KCksIGJ1aWxkX25pbCgpICk7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gZmluZF9uaWwgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0gIAotICAgICAgICByZXR1cm4gcy5pc0F0dHIoKSA/IGZhbHNlIDogcy5nZXRYc2lOaWwoIGdldFJvb3QoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSAoCi0gICAgICAgIFN0cmluZyBuc3VyaSwgU3RyaW5nIHN1Z2dlc3RlZF9wcmVmaXggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICBzID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcy5wcmVmaXhGb3JOYW1lc3BhY2UoIGdldFJvb3QoKSwgbnN1cmksIHN1Z2dlc3RlZF9wcmVmaXgsIHRydWUpOwotCi0gICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbDsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeCAoIFN0cmluZyBwcmVmaXggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICBzID0gcy5nZXRDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzLm5hbWVzcGFjZUZvclByZWZpeCggcHJlZml4LCB0cnVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgaW5zZXJ0X2VsZW1lbnRfdXNlciAoIFFOYW1lIG5hbWUsIGludCBpICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAoaSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCi0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgQ29udGFpbmVyIGMgPSAoQ29udGFpbmVyKSBzOwotCi0gICAgICAgIEJlZ2luIG50aEJlZ2luID0gci5maW5kTnRoQmVnaW4oIGMsIG5hbWUsIG51bGwsIGkgKTsKLQotICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiByLmNvdW50KCBjLCBuYW1lLCBudWxsICkgKyAxKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBhZGRfZWxlbWVudF91c2VyKCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5zZXJ0RWxlbWVudCggbmFtZSwgbnRoQmVnaW4sIDAgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyKFFOYW1lU2V0IHNldCwgUU5hbWUgbmFtZSwgaW50IGkpCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgIENvbnRhaW5lciBjID0gKFNwbGF5LkNvbnRhaW5lcikgczsKLQotICAgICAgICBCZWdpbiBudGhCZWdpbiA9IHIuZmluZE50aEJlZ2luKGMsIG51bGwsIHNldCwgaSk7Ci0KLSAgICAgICAgaWYgKG50aEJlZ2luID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID4gci5jb3VudChjLCBudWxsLCBzZXQpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBhZGRfZWxlbWVudF91c2VyKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGluc2VydEVsZW1lbnQobmFtZSwgbnRoQmVnaW4sIDApOwotICAgIH0KLSAgICAKLS8vIFRPRE8gLSBjb25zb2xpZGF0ZSBuYW1lcywgdGhpcyBmY24gaXMgdmVyeSBleHBlbnNpdmUgaW4gY3JlYXRpbmcgbmFtZXMKLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBhZGRfZWxlbWVudF91c2VyICggUU5hbWUgcW5hbWUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNwbGF5IGNhbmRpZGF0ZVNwbGF5OwotICAgICAgICBpbnQgY2FuZGlkYXRlUG9zOwotICAgICAgICAgICAgCi0gICAgICAgIGlmIChzLmlzTGVhZigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYW5kaWRhdGVTcGxheSA9IHM7Ci0gICAgICAgICAgICBjYW5kaWRhdGVQb3MgPSBzLmdldFBvc0xlYWZFbmQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVNwbGF5ID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgY2FuZGlkYXRlUG9zID0gMDsKLQotICAgICAgICAgICAgUU5hbWVTZXQgZW5kU2V0ID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9vcDoKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHQgPSBjYW5kaWRhdGVTcGxheSA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ID0gdC5wcmV2U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHQuZ2V0TmFtZSgpLmVxdWFscyggcW5hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW5kU2V0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGVuZFNldCA9IGdldF9lbGVtZW50X2VuZGluZ19kZWxpbWl0ZXJzKCBxbmFtZSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGVuZFNldC5jb250YWlucyggdC5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlU3BsYXkgPSB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW5zZXJ0RWxlbWVudCggcW5hbWUsIGNhbmRpZGF0ZVNwbGF5LCBjYW5kaWRhdGVQb3MgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFR5cGVTdG9yZVVzZXIgaW5zZXJ0RWxlbWVudCAoIFFOYW1lIG5hbWUsIFNwbGF5IHMsIGludCBwICkKLSAgICB7Ci0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIEJlZ2luIGIgPSBuZXcgQmVnaW4oIG5hbWUsIG51bGwgKTsKLSAgICAgICAgYi50b2dnbGVJc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIHMuaW5zZXJ0KCByLCBwLCBiLCBudWxsLCAwLCAwLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBUeXBlIHQgPSBiLmdldFR5cGUoIHIgKTsKLQotICAgICAgICBhc3NlcnQgdCAhPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHQuX3VzZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9lbGVtZW50ICggUU5hbWUgcW5hbWUsIGludCBpICkKLSAgICB7Ci0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCi0gICAgICAgIEJlZ2luIGIgPSBnZXRSb290KCkuZmluZE50aEJlZ2luKCBzLCBxbmFtZSwgbnVsbCwgaSApOwotCi0gICAgICAgIGlmIChiID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCi0gICAgICAgIGIucmVtb3ZlKCBnZXRSb290KCksIHRydWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVfZWxlbWVudChRTmFtZVNldCBuYW1lcywgaW50IGkpCi0gICAgewotICAgICAgICBpZiAoaSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCi0gICAgICAgIEJlZ2luIGIgPSBnZXRSb290KCkuZmluZE50aEJlZ2luKHMsIG51bGwsIG5hbWVzLCBpKTsKLQotICAgICAgICBpZiAoYiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQotICAgICAgICBiLnJlbW92ZShnZXRSb290KCksIHRydWUpOwotCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9hdHRyaWJ1dGVfdXNlciAoIFFOYW1lIHFuYW1lICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBTcGxheSBhID0gcy5nZXRBdHRyKCBxbmFtZSApOwotCi0gICAgICAgIGlmIChhICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgICAgICAKLSAgICAgICAgcy5uZXh0U3BsYXkoKS5pbnNlcnQoCi0gICAgICAgICAgICBnZXRSb290KCksIDAsIGEgPSBuZXcgQXR0ciggcW5hbWUgKSwgbnVsbCwgMCwgMCwgdHJ1ZSApOwotICAgICAgICAKLSAgICAgICAgVHlwZSB0ID0gYS5nZXRUeXBlKCBnZXRSb290KCkgKTsKLQotICAgICAgICBhc3NlcnQgdCAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0Ll91c2VyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVfYXR0cmlidXRlICggUU5hbWUgcW5hbWUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNwbGF5IGEgPSBzLmdldEF0dHIoIHFuYW1lICk7Ci0KLSAgICAgICAgaWYgKGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBhLnJlbW92ZSggZ2V0Um9vdCgpLCB0cnVlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNvcHlfY29udGVudHNfZnJvbSAoIFR5cGVTdG9yZSBzb3VyY2UgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHNvdXJjZSBpbnN0YW5jZW9mIFR5cGU7Ci0KLSAgICAgICAgVHlwZSBzb3VyY2VUeXBlID0gKFR5cGUpIHNvdXJjZTsKLQotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBzLnJlcGxhY2VDb250ZW50cyggZ2V0Um9vdCgpLCBzb3VyY2VUeXBlLmdldFNwbGF5KCksIHNvdXJjZVR5cGUuZ2V0Um9vdCgpLCB0cnVlLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcy5nZXRUeXBlKCBnZXRSb290KCkgKS5fdXNlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcnJheV9zZXR0ZXIgKCBYbWxPYmplY3RbXSBzb3VyY2VzLCBRTmFtZSBlbGVtZW50TmFtZSApCi0gICAgewotICAgICAgICAvLyBUT0RPIC0gdGhpcyBpcyB0aGUgcXVpY2sgYW5kIGRpcnR5IGltcGxlbWVudGF0aW9uLCBtYWtlIHRoaXMgZmFzdGVyCi0gICAgICAgIAotICAgICAgICBpbnQgbSA9IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIEFycmF5TGlzdCBjb3BpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEFycmF5TGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbSA7IGkrKyApCi0gICAgICAgIHsKLS8vIFRPRE8gLSBkZWFsIHdpdGggbnVsbCBzb3VyY2VzWyBpIF0gaGVyZSAtLSB3aGF0IHRvIGRvPwotCi0gICAgICAgICAgICBpZiAoc291cmNlc1sgaSBdID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkFycmF5IGVsZW1lbnQgbnVsbCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlc1sgaSBdLmlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29waWVzLmFkZCggbnVsbCApOwotICAgICAgICAgICAgICAgIHR5cGVzLmFkZCggbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFR5cGUgdHlwZSA9IChUeXBlKSAoKFR5cGVTdG9yZVVzZXIpIHNvdXJjZXNbIGkgXSkuZ2V0X3N0b3JlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY29waWVzLmFkZCggdHlwZS5nZXRTcGxheSgpLmNvcHlTcGxheUNvbnRlbnRzKCB0eXBlLmdldFJvb3QoKSkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHR5cGVzLmFkZCggc291cmNlc1sgaSBdLnNjaGVtYVR5cGUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG4gPSBjb3VudF9lbGVtZW50cyggZWxlbWVudE5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG4gPiBtIDsgbi0tICkKLSAgICAgICAgICAgIHJlbW92ZV9lbGVtZW50KCBlbGVtZW50TmFtZSwgbSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBuKysgKQotICAgICAgICAgICAgYWRkX2VsZW1lbnRfdXNlciggZWxlbWVudE5hbWUgKTsKLQotICAgICAgICBhc3NlcnQgbSA9PSBuOwotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgZmluZEFsbEVsZW1lbnRUeXBlcyggZWxlbWVudE5hbWUsIG51bGwsIGVsZW1lbnRzICk7Ci0KLSAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGVsZW1lbnRzLnNpemUoKSA9PSBuOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpIGVsZW1lbnRzLmdldCggaSApOwotCi0gICAgICAgICAgICBpZiAoc291cmNlc1sgaSBdLmlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICAgICAgdHlwZS5nZXRYbWxPYmplY3QoKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHMgPSB0eXBlLmdldFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgciA9PSB0eXBlLmdldFJvb3QoKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcy5yZW1vdmVDb250ZW50KCByLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ29weUNvbnRleHQgY29weUNvbnRleHQgPSAoQ29weUNvbnRleHQpIGNvcGllcy5nZXQoIGkgKTsKLQotICAgICAgICAgICAgICAgIFNwbGF5IGNvcHlUcmVlID0gY29weUNvbnRleHQuZ2V0VHJlZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvcHlUcmVlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dENvcHkgPSBjb3B5Q29udGV4dC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcy5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICByLCAxLCBjb3B5VHJlZSwgdGV4dENvcHksIDAsIHRleHRDb3B5ID09IG51bGwgPyAwIDogdGV4dENvcHkubGVuZ3RoLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHlwZS5jaGFuZ2VfdHlwZSggKFNjaGVtYVR5cGUpIHR5cGVzLmdldCggaSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRfZWxlbWVudHMgKCBUeXBlU3RvcmVWaXNpdG9yIHZpc2l0b3IgKQotICAgIHsKLSAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBzLmdldEtpbmQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkVORCA6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3RbXSBleGVjX3F1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIFBhdGgucXVlcnkoIHRoaXMsIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vCi0gICAgLy8KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb25pdG9yIG9iamVjdCwgdXNlZCBmb3Igc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIGRvYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldF9yb290X29iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Um9vdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVHlwZVN0b3JlVXNlciBfdXNlcjsKLSAgICBwcml2YXRlIGludCBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YbWxPYmplY3RMaXN0LmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1htbE9iamVjdExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyMjMyNi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1htbE9iamVjdExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7Ci0KLS8vIEJVR0JVRzogKioqVExMKioqIFdoeSBpc24ndCB0aGlzIGV4cG9zZWQgaW4gb3JnLmFwYWNoZS54bWxiZWFucz8/Pz8KLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi0vKioKLSAqIEludGVyZmFjZSB0byByZXByZXNlbnQgbGlzdHMgb2YgWG1sT2JqZWN0IGluc3RhbmNlcyByZXR1cm5lZAotICogZnJvbSBhIHF1ZXJ5LiBVc2VkIGFsc28gYXMgYSBjb252ZW5pZW50IHR5cGVkIHdheSBvZiBjb2xsZWN0aW5nCi0gKiBYbWxPYmplY3QgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9iamVjdExpc3QgewotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIFhtbE9iamVjdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHhtbCB0aGUgWG1sT2JqZWN0IGluc3RhbmNlIHRvIGFkZCB0byB0aGUgbGlzdAotICAgICAqLwotICAgIHZvaWQgYWRkKFhtbE9iamVjdCB4bWwpOwotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyB0aGUgY29udGVudHMgb2YgYW5vdGhlciBsaXN0IHRvIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxMaXN0IHRoZSBsaXN0IHdoaWNoIGlzIHRvIGJlIGFwcGVuZGVkIHRvIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZEFsbChYbWxPYmplY3RMaXN0IHhtbExpc3QpOwotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhbiBhcnJheSBvZiBYbWxPYmplY3QgaW5zdGFuY2VzIHRvIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxBcnJheSB0aGUgYXJyYXkgd2hpY2ggaXMgdG8gYmUgYXBwZW5kZWQgdG8gdGhpcyBsaXN0LgotICAgICAqLwotICAgIHZvaWQgYWRkQWxsKFhtbE9iamVjdFtdIHhtbEFycmF5KTsKLQotICAgIC8qKgotICAgICAqIENsZWFycyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbGlzdC4gQWZ0ZXIgdGhpcyBvcGVyYXRpb24sCi0gICAgICoge0BsaW5rICNpc0VtcHR5KCkgaXNFbXB0eSgpfSB3aWxsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBYbWxPYmplY3QgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHNwZWNpZmllZCBwb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFhtbE9iamVjdCBhdCB0aGUgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgotICAgICAqCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmCi0gICAgICogICAgICAgICA8Y29kZT4oaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gc2l6ZSgpKTwvY29kZT4KLSAgICAgKi8KLSAgICBYbWxPYmplY3QgZ2V0KGludCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBpZiB0aGlzIFhtbExpc3QgaXMgZW1wdHkuIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgICAqIDxjb2RlPntAbGluayAjc2l6ZSgpIHNpemUoKX0gPT0gMDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIGxpc3QgaXMgZW1wdHkuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBYbWxPYmplY3QgaW5zdGFuY2VzIGNvbnRhaW5lZCBpbiB0aGlzCi0gICAgICogbGlzdC4gVGhpcyBpdGVyYXRvciB3aWxsIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGluCi0gICAgICogcmVzcG9uc2UgdG8gaXRzIHJlbW92ZSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG92ZXIgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbGlzdAotICAgICAqLwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgWG1sT2JqZWN0IGluc3RhbmNlcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LgotICAgICAqCi0gICAgICogQHJldHVybiBpbnQgc2l6ZSBvZiB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBpbnQgc2l6ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBYbWxMaXN0IGluIGEgbmV3bHkgY3JlYXRlZCBhcnJheSBvZgotICAgICAqIFhtbE9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIFhtbE9iamVjdCBpbnN0YW5jZXMgd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZgotICAgICAqICAgICAgICAgdGhlIGxpc3QuCi0gICAgICovCi0gICAgWG1sT2JqZWN0W10gdG9BcnJheSgpOwotCi0KLQotICAgIC8qKgotICAgICAqIFN0YXRpYyBmYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzIG9mIFhtbE9iamVjdExpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8vIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBDTEFTUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ0xBU1MgPSBDbGFzcy5mb3JOYW1lKCJjb20uYmVhLndsaS52YXJpYWJsZXMuWG1sT2JqZWN0TGlzdEltcGwiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIFhtbE9iamVjdExpc3RJbXBsLiIpOwotICAgICAgICAgICAgICAgIGlzZS5pbml0Q2F1c2UodCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgaXNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogY3JlYXRlcyBhIG5ldyBlbXB0eSBYbWxPYmplY3RMaXN0IGluc3RhbmNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IGVtcHR5IFhtbE9iamVjdExpc3QgaW5zdGFuY2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0TGlzdCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3RMaXN0KUNMQVNTLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogY3JlYXRlcyBhIG5ldyBYbWxPYmplY3RMaXN0IGluc3RhbmNlLCBmaWxsZWQgd2l0aCB0aGUgZWxlbWVudHMKLSAgICAgICAgICogb2YgdGhlIGdpdmVuIGxpc3QKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBYbWxPYmplY3RMaXN0IGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3RMaXN0IG5ld0luc3RhbmNlKFhtbE9iamVjdExpc3QgbGlzdCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3RMaXN0IG5ld0xpc3QgPSAoWG1sT2JqZWN0TGlzdClDTEFTUy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIG5ld0xpc3QuYWRkQWxsKGxpc3QpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0OwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZSBnaXZlbiBhbiBhcnJheSBvZiBYbWxPYmplY3RzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IFhtbE9iamVjdExpc3QgaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdExpc3QgbmV3SW5zdGFuY2UoWG1sT2JqZWN0W10geG1sT2JqZWN0cykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3RMaXN0IG5ld0xpc3QgPSAoWG1sT2JqZWN0TGlzdCkgQ0xBU1MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBuZXdMaXN0LmFkZEFsbCh4bWxPYmplY3RzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1hxcmxEZWxlZ2F0ZS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YcXJsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0NDRhMy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1hxcmxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYcXJsRGVsZWdhdGUgCi17Ci0gICAgcHJpdmF0ZSBYcXJsRGVsZWdhdGUgKCApCi0gICAgewotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNoZWNrICggT2JqZWN0IG8gKQotICAgIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyB4cXJsLmphciIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBQYXRoLlF1ZXJ5IGNvbXBpbGVQYXRoICggU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChQYXRoLlF1ZXJ5KQotICAgICAgICAgICAgICAgIGludm9rZSggX2NvbXBpbGVQYXRoLCBuZXcgT2JqZWN0W10geyBwYXRoLCBvcHRpb25zIH0gKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFBhdGguUXVlcnkgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKFBhdGguUXVlcnkpCi0gICAgICAgICAgICAgICAgaW52b2tlKAotICAgICAgICAgICAgICAgICAgICBfY29tcGlsZVF1ZXJ5LCBuZXcgT2JqZWN0W10geyBxdWVyeUV4cHIsIG9wdGlvbnMsIG5ldyBCb29sZWFuKHRydWUpIH0gKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0aHJvd1J1bnRpbWVFeGNlcHRpb24gKCBUaHJvd2FibGUgZSApCi0gICAgewotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgCi0gICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgCi0gICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gcnRlID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGNhdXNlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAKLSAgICAgICAgcnRlLmluaXRDYXVzZSggY2F1c2UgKTsKLQotICAgICAgICB0aHJvdyBydGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGludm9rZSAoIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHBhcmFtcyApCi0gICAgewotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgeHFybC5qYXIiICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoIG51bGwsIHBhcmFtcyApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvd1J1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIFVucmVhY2hhYmxlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBMb29zZSBjb3VwbGluZyBmdW5jdGlvbmFsaXR5IHdpdGggeHFybC5qYXIKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBfY29tcGlsZVBhdGg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIF9jb21waWxlUXVlcnk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaGFzWHFybDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlhxcmxJbXBsIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBoYXNYcXJsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhc1hxcmwgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNYcXJsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDbGFzcyB4cXJsSW1wbCA9Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuWHFybEltcGwiICk7Ci0KLSAgICAgICAgICAgICAgICBfY29tcGlsZVBhdGggPQotICAgICAgICAgICAgICAgICAgICB4cXJsSW1wbC5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlUGF0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgWG1sT3B0aW9ucy5jbGFzcyB9ICk7Ci0KLSAgICAgICAgICAgICAgICBfY29tcGlsZVF1ZXJ5ID0KLSAgICAgICAgICAgICAgICAgICAgeHFybEltcGwuZ2V0RGVjbGFyZWRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZVF1ZXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBYbWxPcHRpb25zLmNsYXNzLCBCb29sZWFuLmNsYXNzIH0gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc05hdmlnYXRvci5qYXZhIGIvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNOYXZpZ2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyZDdjOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc05hdmlnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbjsKLWltcG9ydCBvcmcuamF4ZW4uWFBhdGg7Ci1pbXBvcnQgb3JnLmpheGVuLk5hdmlnYXRvcjsKLWltcG9ydCBvcmcuamF4ZW4uRGVmYXVsdE5hdmlnYXRvcjsKLWltcG9ydCBvcmcuamF4ZW4uRnVuY3Rpb25DYWxsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qYXhlbi5VbnN1cHBvcnRlZEF4aXNFeGNlcHRpb247Ci0vL2ltcG9ydCBvcmcuamF4ZW4uTmFtZWRBY2Nlc3NOYXZpZ2F0b3I7Ci1pbXBvcnQgb3JnLmpheGVuLnV0aWwuQW5jZXN0b3JBeGlzSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmpheGVuLnV0aWwuRm9sbG93aW5nU2libGluZ0F4aXNJdGVyYXRvcjsKLWltcG9ydCBvcmcuamF4ZW4udXRpbC5QcmVjZWRpbmdTaWJsaW5nQXhpc0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5qYXhlbi51dGlsLkZvbGxvd2luZ0F4aXNJdGVyYXRvcjsKLWltcG9ydCBvcmcuamF4ZW4udXRpbC5QcmVjZWRpbmdBeGlzSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmpheGVuLnV0aWwuU2VsZkF4aXNJdGVyYXRvcjsKLWltcG9ydCBvcmcuamF4ZW4udXRpbC5EZXNjZW5kYW50T3JTZWxmQXhpc0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5qYXhlbi51dGlsLkFuY2VzdG9yT3JTZWxmQXhpc0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5qYXhlbi51dGlsLlNpbmdsZU9iamVjdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5qYXhlbi51dGlsLkRlc2NlbmRhbnRBeGlzSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmpheGVuLnNheHBhdGguU0FYUGF0aEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQotICogRGF0ZTogT2N0IDEwLCAyMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBYQmVhbnNOYXZpZ2F0b3IKLSAgICBleHRlbmRzIERlZmF1bHROYXZpZ2F0b3IKLS8vICAgIGltcGxlbWVudHMgTmFtZWRBY2Nlc3NOYXZpZ2F0b3IKLXsKLSAgICBwcml2YXRlIFhtbEN1cnNvciBfeGM7Ci0KLSAgICBwcml2YXRlIFhCZWFuc05hdmlnYXRvcigpCi0gICAge30KLQotICAgIC8qKiBSZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPkRvY3VtZW50TmF2aWdhdG9yPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5hdmlnYXRvciBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFhCZWFuc05hdmlnYXRvcigpOwotICAgIH0KLQotCi0gICAgc3RhdGljIGNsYXNzIEpheGVuTm9kZQotICAgICAgICBleHRlbmRzIFhtbEN1cnNvci5YbWxCb29rbWFyawotICAgIHsKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciB4YyA9IHRoaXMuY3JlYXRlQ3Vyc29yKCk7Ci0gICAgICAgICAgICByZXR1cm4gIntOb2RlOiIgKyB4Yy5jdXJyZW50VG9rZW5UeXBlKCkudG9TdHJpbmcoKSArICIgIiArIHhjLnRvU3RyaW5nKCkgKyAifSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vCi0gICAgLy8gRGVmYXVsdE5hdmlnYXRvciBpbXBsZW1lbnRhdGlvbgotICAgIC8vCi0KLSAgICAvKiogUmV0cmlldmUgdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGdpdmVuIGVsZW1lbnQgbm9kZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gZWxlbWVudCBUaGUgY29udGV4dCBlbGVtZW50IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZWxlbWVudCBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWVzcGFjZVVyaShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICAgICgoSmF4ZW5Ob2RlKWVsZW1lbnQpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIF94Yy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBlbGVtZW50IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGVsZW1lbnQgVGhlIGNvbnRleHQgZWxlbWVudCBub2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpZWxlbWVudCkudG9Cb29rbWFyayhfeGMpOwotICAgICAgICByZXR1cm4gX3hjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIFFOYW1lIG9mIHRoZSBnaXZlbiBlbGVtZW50IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGVsZW1lbnQgVGhlIGNvbnRleHQgZWxlbWVudCBub2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIFFOYW1lIG9mIHRoZSBlbGVtZW50IG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50UU5hbWUoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgICAoKEpheGVuTm9kZSllbGVtZW50KS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBfeGMuZ2V0TmFtZSgpLmdldFByZWZpeCgpOwotICAgICAgICByZXR1cm4gKCAhIiIuZXF1YWxzKHByZWZpeCkgPyBwcmVmaXggKyAiOiIgOiAiIiApICsgX3hjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZSBub2RlLgotICAgICAqCi0gICAgICogIEBwYXJhbSBhdHRyIFRoZSBjb250ZXh0IGF0dHJpYnV0ZSBub2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlVXJpKE9iamVjdCBhdHRyKQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpYXR0cikudG9Cb29rbWFyayhfeGMpOwotICAgICAgICByZXR1cm4gX3hjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZSBub2RlLgotICAgICAqCi0gICAgICogIEBwYXJhbSBhdHRyIFRoZSBjb250ZXh0IGF0dHJpYnV0ZSBub2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZShPYmplY3QgYXR0cikKLSAgICB7Ci0gICAgICAgICgoSmF4ZW5Ob2RlKWF0dHIpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIF94Yy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBRTmFtZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGF0dHIgVGhlIGNvbnRleHQgYXR0cmlidXRlIG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgUU5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUU5hbWUoT2JqZWN0IGF0dHIpCi0gICAgewotICAgICAgICAoKEpheGVuTm9kZSlhdHRyKS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBfeGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gX3hjLnByZWZpeEZvck5hbWVzcGFjZSh1cmkpOwotICAgICAgICByZXR1cm4gKCAhIiIuZXF1YWxzKHByZWZpeCkgPyBwcmVmaXggKyAiOiIgOiAiIiApICsgX3hjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBkb2N1bWVudCBub2RlLiBBIGRvY3VtZW50IG5vZGUKLSAgICAgKiAgaXMgdGhlIG5vZGUgdGhhdCBpcyBzZWxlY3RlZCBieSB0aGUgeHBhdGggZXhwcmVzc2lvbiA8Y29kZT4vPC9jb2RlPi4KLSAgICAgKgotICAgICAqICBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gdGVzdC4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYSBkb2N1bWVudCBub2RlLAotICAgICAqICAgICAgICAgIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpb2JqZWN0KS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBfeGMuaXNTdGFydGRvYygpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBlbGVtZW50IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRlc3QuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGFuIGVsZW1lbnQgbm9kZSwKLSAgICAgKiAgICAgICAgICBlbHNlIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpb2JqZWN0KS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBfeGMuaXNTdGFydCgpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBhdHRyaWJ1dGUgbm9kZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gdGVzdC4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYW4gYXR0cmlidXRlIG5vZGUsCi0gICAgICogICAgICAgICAgZWxzZSA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZShPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpb2JqZWN0KS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBfeGMuaXNBdHRyKCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgbmFtZXNwYWNlIG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRlc3QuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGEgbmFtZXNwYWNlIG5vZGUsCi0gICAgICogICAgICAgICAgZWxzZSA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZShPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpb2JqZWN0KS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBfeGMuaXNOYW1lc3BhY2UoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBjb21tZW50IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRlc3QuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGEgY29tbWVudCBub2RlLAotICAgICAqICAgICAgICAgIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50KE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICAoKEpheGVuTm9kZSlvYmplY3QpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIF94Yy5pc0NvbW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSB0ZXh0IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRlc3QuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGEgdGV4dCBub2RlLAotICAgICAqICAgICAgICAgIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNUZXh0KE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICAoKEpheGVuTm9kZSlvYmplY3QpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIF94Yy5pc1RleHQoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBwcm9jZXNzaW5nLWluc3RydWN0aW9uIG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRlc3QuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGEgcHJvY2Vzc2luZy1pbnN0cnVjdGlvbiBub2RlLAotICAgICAqICAgICAgICAgIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgICgoSmF4ZW5Ob2RlKW9iamVjdCkudG9Cb29rbWFyayhfeGMpOwotICAgICAgICByZXR1cm4gX3hjLmlzUHJvY2luc3QoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIHN0cmluZy12YWx1ZSBvZiBhIGNvbW1lbnQgbm9kZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gY29tbWVudCBUaGUgY29tbWVudCBub2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIHN0cmluZy12YWx1ZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRTdHJpbmdWYWx1ZShPYmplY3QgY29tbWVudCkKLSAgICB7Ci0gICAgICAgICgoSmF4ZW5Ob2RlKWNvbW1lbnQpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIF94Yy5nZXRUZXh0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIHN0cmluZy12YWx1ZSBvZiBhbiBlbGVtZW50IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGVsZW1lbnQgVGhlIGNvbW1lbnQgbm9kZS4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBzdHJpbmctdmFsdWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50U3RyaW5nVmFsdWUoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgICAoKEpheGVuTm9kZSllbGVtZW50KS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBfeGMuZ2V0VGV4dFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBzdHJpbmctdmFsdWUgb2YgYW4gYXR0cmlidXRlIG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSBub2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIHN0cmluZy12YWx1ZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVN0cmluZ1ZhbHVlKE9iamVjdCBhdHRyKQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpYXR0cikudG9Cb29rbWFyayhfeGMpOwotICAgICAgICByZXR1cm4gX3hjLmdldFRleHRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZSB0aGUgc3RyaW5nLXZhbHVlIG9mIGEgbmFtZXNwYWNlIG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2Ugbm9kZS4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBzdHJpbmctdmFsdWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VTdHJpbmdWYWx1ZShPYmplY3QgbnMpCi0gICAgewotICAgICAgICAoKEpheGVuTm9kZSlucykudG9Cb29rbWFyayhfeGMpOwotICAgICAgICByZXR1cm4gX3hjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIHN0cmluZy12YWx1ZSBvZiBhIHRleHQgbm9kZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gdHh0IFRoZSB0ZXh0IG5vZGUuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgc3RyaW5nLXZhbHVlIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dFN0cmluZ1ZhbHVlKE9iamVjdCB0eHQpCi0gICAgewotICAgICAgICAoKEpheGVuTm9kZSl0eHQpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIF94Yy5nZXRUZXh0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIG5hbWVzcGFjZSBwcmVmaXggb2YgYSBuYW1lc3BhY2Ugbm9kZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSBub2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoT2JqZWN0IG5zKQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpbnMpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIF94Yy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgYSBwYXJzZWQgZm9ybSBvZiB0aGUgZ2l2ZW4geHBhdGggc3RyaW5nLCB3aGljaCB3aWxsIGJlIHN1aXRhYmxlCi0gICAgICogIGZvciBxdWVyaWVzIG9uIGRvY3VtZW50cyB0aGF0IHVzZSB0aGUgc2FtZSBuYXZpZ2F0b3IgYXMgdGhpcyBvbmUuCi0gICAgICoKLSAgICAgKiAgQHNlZSBvcmcuamF4ZW4uWFBhdGgKLSAgICAgKgotICAgICAqICBAcGFyYW0geHBhdGggVGhlIHhwYXRoIGV4cHJlc3Npb24uCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBBIG5ldyBYUGF0aCBleHByZXNzaW9uIG9iamVjdC4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIG9yZy5qYXhlbi5zYXhwYXRoLlNBWFBhdGhFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlCi0gICAgICogICAgICAgICAgeHBhdGggZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFBhdGggcGFyc2VYUGF0aChTdHJpbmcgeHBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgU0FYUGF0aEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYQmVhbnNYUGF0aCh4cGF0aCk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBPdmVyd3JpdHRlbiBtZXRob2RzCi0gICAgLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIEpheGVuTm9kZSBfbmV4dE5vZGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIFhtbEN1cnNvciBfeGMgPSBudWxsOwotCi0gICAgICAgIENoaWxkSXRlcmF0b3IoWG1sQ3Vyc29yIHhjKQotICAgICAgICB7Ci0gICAgICAgICAgICBfeGMgPSB4YzsKLSAgICAgICAgICAgIFhtbEN1cnNvci5Ub2tlblR5cGUgdGsgPSBfeGMudG9GaXJzdENvbnRlbnRUb2tlbigpOyAvL25vdCBpbmNsdWRpbmcgYXR0cyBhbmQgbnMtZXMKLSAgICAgICAgICAgIGlmICh0ay5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBKYXhlbk5vZGUgcmVzID0gX25leHROb2RlOwotCi0gICAgICAgICAgICByZXMudG9Cb29rbWFyayhfeGMpOwotCi0gICAgICAgICAgICBpZiAoX3hjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBYbWxDdXJzb3IuVG9rZW5UeXBlLlNUQVJUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF94Yy50b0VuZFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChfeGMudG9OZXh0VG9rZW4oKS5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigib3B0aW9uYWwgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpY29udGV4dE5vZGUpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGlsZEl0ZXJhdG9yKF94Yyk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRBeGlzSXRlcmF0b3IoT2JqZWN0IGNvbnRleHROb2RlKSB0aHJvd3MgVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IERlc2NlbmRhbnRBeGlzSXRlcmF0b3IoIGNvbnRleHROb2RlLCB0aGlzICk7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICAoKEpheGVuTm9kZSljb250ZXh0Tm9kZSkudG9Cb29rbWFyayhfeGMpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXNjZW5kYW50SXRlcmF0b3IoX3hjKTsKLSAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UGFyZW50QXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpY29udGV4dE5vZGUpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgaWYgKF94Yy50b1BhcmVudCgpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVPYmplY3RJdGVyYXRvcihnZXRCb29rbWFya0luVGhpc1BsYWNlKF94YykpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QW5jZXN0b3JBeGlzSXRlcmF0b3IoT2JqZWN0IGNvbnRleHROb2RlKSB0aHJvd3MgVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFuY2VzdG9yQXhpc0l0ZXJhdG9yKCBjb250ZXh0Tm9kZSwgdGhpcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRGb2xsb3dpbmdTaWJsaW5nQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGb2xsb3dpbmdTaWJsaW5nQXhpc0l0ZXJhdG9yKCBjb250ZXh0Tm9kZSwgdGhpcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVjZWRpbmdTaWJsaW5nQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVjZWRpbmdTaWJsaW5nQXhpc0l0ZXJhdG9yKCBjb250ZXh0Tm9kZSwgdGhpcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRGb2xsb3dpbmdBeGlzSXRlcmF0b3IoT2JqZWN0IGNvbnRleHROb2RlKSB0aHJvd3MgVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEZvbGxvd2luZ0F4aXNJdGVyYXRvciggY29udGV4dE5vZGUsIHRoaXMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJlY2VkaW5nQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVjZWRpbmdBeGlzSXRlcmF0b3IoIGNvbnRleHROb2RlLCB0aGlzICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIEpheGVuTm9kZSBfbmV4dE5vZGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIFhtbEN1cnNvciBfeGMgPSBudWxsOwotCi0gICAgICAgIEF0dHJpYnV0ZUl0ZXJhdG9yKFhtbEN1cnNvciB4YykKLSAgICAgICAgewotICAgICAgICAgICAgX3hjID0geGM7Ci0gICAgICAgICAgICBpZiAoIV94Yy50b0ZpcnN0QXR0cmlidXRlKCkpCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBnZXRCb29rbWFya0luVGhpc1BsYWNlKF94Yyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25leHROb2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIEpheGVuTm9kZSByZXMgPSBfbmV4dE5vZGU7Ci0KLSAgICAgICAgICAgIHJlcy50b0Jvb2ttYXJrKF94Yyk7Ci0KLSAgICAgICAgICAgIGlmICghX3hjLnRvTmV4dEF0dHJpYnV0ZSgpKQotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigib3B0aW9uYWwgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEF0dHJpYnV0ZUF4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgICgoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlSXRlcmF0b3IoX3hjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVzcGFjZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgSmF4ZW5Ob2RlIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgWG1sQ3Vyc29yIF94YyA9IG51bGw7Ci0KLSAgICAgICAgTmFtZXNwYWNlSXRlcmF0b3IoWG1sQ3Vyc29yIHhjKQotICAgICAgICB7Ci0gICAgICAgICAgICBfeGMgPSB4YzsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEN1cnNvci5Ub2tlblR5cGUgdGsgPSBfeGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAodGsgPT0gWG1sQ3Vyc29yLlRva2VuVHlwZS5BVFRSKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAodGsgPT0gWG1sQ3Vyc29yLlRva2VuVHlwZS5OQU1FU1BBQ0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBnZXRCb29rbWFya0luVGhpc1BsYWNlKF94Yyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBKYXhlbk5vZGUgcmVzID0gX25leHROb2RlOwotICAgICAgICAgICAgcmVzLnRvQm9va21hcmsoX3hjKTsKLQotICAgICAgICAgICAgaWYgKF94Yy50b05leHRUb2tlbigpLmlzTmFtZXNwYWNlKCkpCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvcHRpb25hbCBtZXRob2Qgbm90IGltcGxlbWVudGVkIik7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0TmFtZXNwYWNlQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpY29udGV4dE5vZGUpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VJdGVyYXRvcihfeGMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRTZWxmQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZWxmQXhpc0l0ZXJhdG9yKCBjb250ZXh0Tm9kZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVzY2VuZGFudE9yU2VsZkF4aXNJdHIgaW1wbGVtZW50cyBJdGVyYXRvcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBKYXhlbk5vZGUgX25leHROb2RlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBYbWxDdXJzb3IgX3hjID0gbnVsbDsKLQotICAgICAgICBEZXNjZW5kYW50T3JTZWxmQXhpc0l0cihYbWxDdXJzb3IgeGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF94YyA9IHhjOwotICAgICAgICAgICAgWG1sQ3Vyc29yLlRva2VuVHlwZSB0ayA9IF94Yy50b0ZpcnN0Q29udGVudFRva2VuKCk7IC8vbm90IGluY2x1ZGluZyBhdHRzIGFuZCBucy1lcwotICAgICAgICAgICAgaWYgKHRrLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBnZXRCb29rbWFya0luVGhpc1BsYWNlKF94Yyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25leHROb2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIEpheGVuTm9kZSByZXMgPSBfbmV4dE5vZGU7Ci0KLSAgICAgICAgICAgIHJlcy50b0Jvb2ttYXJrKF94Yyk7Ci0KLSAgICAgICAgICAgIGlmIChfeGMuY3VycmVudFRva2VuVHlwZSgpID09IFhtbEN1cnNvci5Ub2tlblR5cGUuU1RBUlQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3hjLnRvRW5kVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKF94Yy50b05leHRUb2tlbigpLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBnZXRCb29rbWFya0luVGhpc1BsYWNlKF94Yyk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvcHRpb25hbCBtZXRob2Qgbm90IGltcGxlbWVudGVkIik7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0RGVzY2VuZGFudE9yU2VsZkF4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVzY2VuZGFudE9yU2VsZkF4aXNJdGVyYXRvciggY29udGV4dE5vZGUsIHRoaXMgKTsKLSAgICAgICAgLy8oKEpheGVuTm9kZSljb250ZXh0Tm9kZSkudG9Cb29rbWFyayhfeGMpOwotICAgICAgICAvL3JldHVybiBuZXcgRGVzY2VuZGFudE9yU2VsZkF4aXNJdGVyYXRvcihfeGMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBbmNlc3Rvck9yU2VsZkF4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQW5jZXN0b3JPclNlbGZBeGlzSXRlcmF0b3IoIGNvbnRleHROb2RlLCB0aGlzICk7Ci0gICAgICAgIC8vKChKYXhlbk5vZGUpY29udGV4dE5vZGUpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgLy9yZXR1cm4gbmV3IEFuY2VzdG9yT3JTZWxmQXhpc0l0ZXJhdG9yKF94Yyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXREb2N1bWVudE5vZGUoT2JqZWN0IGNvbnRleHROb2RlKQotICAgIHsKLSAgICAgICAgICAgICgoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgICAgICBfeGMudG9TdGFydERvYygpOwotICAgICAgICAgICAgcmV0dXJuIGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRyYW5zbGF0ZU5hbWVzcGFjZVByZWZpeFRvVXJpKFN0cmluZyBwcmVmaXgsIE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgICAgICAgICgoSmF4ZW5Ob2RlKWVsZW1lbnQpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgICAgIHJldHVybiBfeGMubmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25UYXJnZXQoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgICgoSmF4ZW5Ob2RlKW9iaikudG9Cb29rbWFyayhfeGMpOwotICAgICAgICByZXR1cm4gX3hjLmdldFRleHRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGF0YShPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpb2JqKS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBfeGMuZ2V0VGV4dFZhbHVlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldERvY3VtZW50KFN0cmluZyB1cmwpIHRocm93cyBGdW5jdGlvbkNhbGxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIG5vdCBmaW5kIGVsZW1lbnRzLiBPdmVycmlkZSBpbiBzdWJjbGFzcwotICAgICAqICBpZiBzdWJjbGFzcyBkb2VzIGtub3cgYWJvdXQgYXR0cmlidXRlIHR5cGVzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBvYmplY3QgICBhIG5vZGUgZnJvbSB0aGUgZG9jdW1lbnQgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGlkCi0gICAgICogIEBwYXJhbSBlbGVtZW50SWQgICBpZCB0byBsb29rIGZvcgotICAgICAqCi0gICAgICogIEByZXR1cm4gICBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRFbGVtZW50QnlJZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZWxlbWVudElkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lZENoaWxkSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBKYXhlbk5vZGUgX25leHROb2RlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBfcW5hbWU7Ci0gICAgICAgIHByaXZhdGUgWG1sQ3Vyc29yIF94YyA9IG51bGw7Ci0KLSAgICAgICAgTmFtZWRDaGlsZEl0ZXJhdG9yKFhtbEN1cnNvciB4YywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICAgICAgewotICAgICAgICAgICAgX3hjID0geGM7Ci0gICAgICAgICAgICBfcW5hbWUgPSBuZXcgUU5hbWUoIChuYW1lc3BhY2VVUkk9PW51bGwgPyAiIiA6IG5hbWVzcGFjZVVSSSksIGxvY2FsTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICghX3hjLnRvRmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoX3hjLmN1cnJlbnRUb2tlblR5cGUoKT09WG1sQ3Vyc29yLlRva2VuVHlwZS5TVEFSVCAmJgotICAgICAgICAgICAgICAgICAgX3hjLmdldE5hbWUoKS5lcXVhbHMoX3FuYW1lKQotICAgICAgICAgICAgICAgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV94Yy50b05leHRTaWJsaW5nKF9xbmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBKYXhlbk5vZGUgcmVzID0gX25leHROb2RlOwotICAgICAgICAgICAgcmVzLnRvQm9va21hcmsoX3hjKTsKLQotICAgICAgICAgICAgaWYgKCFfeGMudG9OZXh0U2libGluZyhfcW5hbWUpKQotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigib3B0aW9uYWwgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkQXhpc0l0ZXJhdG9yKAotICAgICAgICAgICAgT2JqZWN0IGNvbnRleHROb2RlLAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgICgoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7Ci0gICAgICAgIHJldHVybiBuZXcgTmFtZWRDaGlsZEl0ZXJhdG9yKF94YywgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZWRBdHRyaWJ1dGVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIEpheGVuTm9kZSBfbmV4dE5vZGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIFFOYW1lIF9xbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBYbWxDdXJzb3IgX3hjOwotCi0gICAgICAgIE5hbWVkQXR0cmlidXRlSXRlcmF0b3IoWG1sQ3Vyc29yIHhjLCBTdHJpbmcgbG9jYWwsIFN0cmluZyB1cmkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF94YyA9IHhjOwotICAgICAgICAgICAgX3FuYW1lID0gbmV3IFFOYW1lKCggdXJpPT1udWxsID8gIiIgOiB1cmkpLCBsb2NhbCk7Ci0KLSAgICAgICAgICAgIFhtbEN1cnNvci5Ub2tlblR5cGUgdGsgPSBfeGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGlmICh0ayE9WG1sQ3Vyc29yLlRva2VuVHlwZS5BVFRSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIF94Yy5nZXROYW1lKCkuZXF1YWxzKF9xbmFtZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfbmV4dE5vZGUgPSBtb3ZlKF94Yyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25leHROb2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIEpheGVuTm9kZSByZXMgPSBfbmV4dE5vZGU7Ci0gICAgICAgICAgICByZXMudG9Cb29rbWFyayhfeGMpOwotCi0gICAgICAgICAgICBfbmV4dE5vZGUgPSBtb3ZlKF94Yyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBKYXhlbk5vZGUgbW92ZShYbWxDdXJzb3IgeGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4Yy5jdXJyZW50VG9rZW5UeXBlKCkgIT0gWG1sQ3Vyc29yLlRva2VuVHlwZS5BVFRSICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUoeGMudG9OZXh0VG9rZW4oKT09WG1sQ3Vyc29yLlRva2VuVHlwZS5BVFRSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggeGMuZ2V0TmFtZSgpLmVxdWFscyhfcW5hbWUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCb29rbWFya0luVGhpc1BsYWNlKHhjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm9wdGlvbmFsIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiKTsgfQotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRyaWJ1dGVBeGlzSXRlcmF0b3IoCi0gICAgICAgICAgICBPYmplY3QgY29udGV4dE5vZGUsCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgKChKYXhlbk5vZGUpY29udGV4dE5vZGUpLnRvQm9va21hcmsoX3hjKTsKLSAgICAgICAgcmV0dXJuIG5ldyBOYW1lZEF0dHJpYnV0ZUl0ZXJhdG9yKF94YywgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHN0YXRpYyBKYXhlbk5vZGUgZ2V0Qm9va21hcmtJblRoaXNQbGFjZShYbWxDdXJzb3IgeGMpCi0gICAgewotICAgICAgICBKYXhlbk5vZGUgcmV6ID0gKEpheGVuTm9kZSl4Yy5nZXRCb29rbWFyayhKYXhlbk5vZGUuY2xhc3MpOwotICAgICAgICBpZiAocmV6PT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXogPSBuZXcgSmF4ZW5Ob2RlKCk7Ci0gICAgICAgICAgICB4Yy5zZXRCb29rbWFyayhyZXopOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlejsKLSAgICB9Ci0KLSAgICBYbWxDdXJzb3IgZ2V0Q3Vyc29yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfeGM7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRDdXJzb3IoWG1sQ3Vyc29yIHhjKQotICAgIHsKLSAgICAgICAgdGhpcy5feGMgPSB4YzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc1hQYXRoLmphdmEgYi92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc1hQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MGYxMmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbjsKLQotaW1wb3J0IG9yZy5qYXhlbi5CYXNlWFBhdGg7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKLQotLyoqCi0gKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCi0gKiBEYXRlOiBPY3QgMTAsIDIwMDMKLSAqLwotcHVibGljIGNsYXNzIFhCZWFuc1hQYXRoIGV4dGVuZHMgQmFzZVhQYXRoCi17Ci0gICAgLyoqIENvbnN0cnVjdCBnaXZlbiBhbiBYUGF0aCBleHByZXNzaW9uIHN0cmluZy4KLSAgICAgKgotICAgICAqICBAcGFyYW0geHBhdGhFeHByIFRoZSBYUGF0aCBleHByZXNzaW9uLgotICAgICAqCi0gICAgICogIEB0aHJvd3Mgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgc3ludGF4IGVycm9yIHdoaWxlCi0gICAgICogICAgICAgICAgcGFyc2luZyB0aGUgZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgWEJlYW5zWFBhdGgoU3RyaW5nIHhwYXRoRXhwcikgdGhyb3dzIEpheGVuRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlciggeHBhdGhFeHByLCBYQmVhbnNOYXZpZ2F0b3IuZ2V0SW5zdGFuY2UoKSApOwotICAgIH0KLQotICAgIC8qKiBTZWxlY3QgYWxsIG5vZGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgYnkgdGhpcyBYUGF0aAotICAgICAqICBleHByZXNzaW9uLiBJZiBtdWx0aXBsZSBub2RlcyBtYXRjaCwgbXVsdGlwbGUgbm9kZXMKLSAgICAgKiAgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKgotICAgICAqICA8cD4KLSAgICAgKiAgPGI+Tk9URTo8L2I+IEluIG1vc3QgY2FzZXMsIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWQKLSAgICAgKiAgaW4gZG9jdW1lbnQtb3JkZXIsIGFzIGRlZmluZWQgYnkgdGhlIFhNTCBDYW5vbmljYWxpemF0aW9uCi0gICAgICogIHNwZWNpZmljYXRpb24uICBUaGUgZXhjZXB0aW9uIG9jY3VycyB3aGVuIHVzaW5nIFhQYXRoCi0gICAgICogIGV4cHJlc3Npb25zIGludm9sdmluZyB0aGUgPGNvZGU+dW5pb248L2NvZGU+IG9wZXJhdG9yCi0gICAgICogIChkZW5vdGVkIHdpdGggdGhlIHBpcGUgJ3wnIGNoYXJhY3RlcikuCi0gICAgICogIDwvcD4KLSAgICAgKgotICAgICAqICBAcGFyYW0gbm9kZSBUaGUgbm9kZSwgbm9kZXNldCBvciBDb250ZXh0IG9iamVjdCBmb3IgZXZhbHVhdGlvbi4gVGhpcyB2YWx1ZSBjYW4gYmUgbnVsbC4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSA8Y29kZT5ub2RlLXNldDwvY29kZT4gb2YgYWxsIGl0ZW1zIHNlbGVjdGVkCi0gICAgICogICAgICAgICAgYnkgdGhpcyBYUGF0aCBleHByZXNzaW9uLgotICAgICAqCi0gICAgICogIEBzZWUgI3NlbGVjdFNpbmdsZU5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBzZWxlY3ROb2RlcyhPYmplY3Qgbm9kZSkgdGhyb3dzIEpheGVuRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgeGM7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgWG1sT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICB4YyA9ICgoWG1sT2JqZWN0KW5vZGUpLm5ld0N1cnNvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBYbWxDdXJzb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhjID0gKChYbWxDdXJzb3Ipbm9kZSkubmV3Q3Vyc29yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9kZSBtdXN0IGJlIGFuIFhtbE9iamVjdCBvciBhbiBYbWxDdXJzb3IsIGZvdW5kOiAiICsgbm9kZS5nZXRDbGFzcygpKTsKLQotICAgICAgICAoKFhCZWFuc05hdmlnYXRvcilnZXROYXZpZ2F0b3IoKSkuc2V0Q3Vyc29yKHhjKTsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXN0SW1wbChzdXBlci5zZWxlY3ROb2RlcyggWEJlYW5zTmF2aWdhdG9yLmdldEJvb2ttYXJrSW5UaGlzUGxhY2UoeGMpICkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RMaXN0Ci0gICAgewotICAgICAgICBwcml2YXRlIExpc3QgX3Jlc3VsdHM7Ci0KLSAgICAgICAgcHJpdmF0ZSBMaXN0SW1wbChMaXN0IHJlc3VsdHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZXN1bHRzID0gcmVzdWx0czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9yZXN1bHRzPT1udWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gKChYQmVhbnNOYXZpZ2F0b3IuSmF4ZW5Ob2RlKV9yZXN1bHRzLmdldChpbmRleCkpLmNyZWF0ZUN1cnNvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChfcmVzdWx0cz09bnVsbCA/IDAgOiBfcmVzdWx0cy5zaXplKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aEFkdi5qYXZhIGIvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aEFkdi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDhiNjE5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWEJlYW5zWFBhdGhBZHYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbjsKLQotaW1wb3J0IG9yZy5qYXhlbi5CYXNlWFBhdGg7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5KYXhlblhCZWFuc0RlbGVnYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQotICogRGF0ZTogT2N0IDEwLCAyMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBYQmVhbnNYUGF0aEFkdgotICAgIGV4dGVuZHMgQmFzZVhQYXRoCi0gICAgaW1wbGVtZW50cyBKYXhlblhCZWFuc0RlbGVnYXRlLlNlbGVjdFBhdGhJbnRlcmZhY2UKLXsKLSAgICAvKiogQ29uc3RydWN0IGdpdmVuIGFuIFhQYXRoIGV4cHJlc3Npb24gc3RyaW5nLgotICAgICAqCi0gICAgICogIEBwYXJhbSB4cGF0aEV4cHIgVGhlIFhQYXRoIGV4cHJlc3Npb24uCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3Igd2hpbGUKLSAgICAgKiAgICAgICAgICBwYXJzaW5nIHRoZSBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBYQmVhbnNYUGF0aEFkdihTdHJpbmcgeHBhdGhFeHByKSB0aHJvd3MgSmF4ZW5FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyKCB4cGF0aEV4cHIsIFhCZWFuc05hdmlnYXRvci5nZXRJbnN0YW5jZSgpICk7Ci0gICAgfQotCi0gICAgLyoqIFNlbGVjdCBhbGwgbm9kZXMgdGhhdCBhcmUgc2VsZWN0YWJsZSBieSB0aGlzIFhQYXRoCi0gICAgICogIGV4cHJlc3Npb24uIElmIG11bHRpcGxlIG5vZGVzIG1hdGNoLCBtdWx0aXBsZSBub2RlcwotICAgICAqICB3aWxsIGJlIHJldHVybmVkLgotICAgICAqCi0gICAgICogIDxwPgotICAgICAqICA8Yj5OT1RFOjwvYj4gSW4gbW9zdCBjYXNlcywgbm9kZXMgd2lsbCBiZSByZXR1cm5lZAotICAgICAqICBpbiBkb2N1bWVudC1vcmRlciwgYXMgZGVmaW5lZCBieSB0aGUgWE1MIENhbm9uaWNhbGl6YXRpb24KLSAgICAgKiAgc3BlY2lmaWNhdGlvbi4gIFRoZSBleGNlcHRpb24gb2NjdXJzIHdoZW4gdXNpbmcgWFBhdGgKLSAgICAgKiAgZXhwcmVzc2lvbnMgaW52b2x2aW5nIHRoZSA8Y29kZT51bmlvbjwvY29kZT4gb3BlcmF0b3IKLSAgICAgKiAgKGRlbm90ZWQgd2l0aCB0aGUgcGlwZSAnfCcgY2hhcmFjdGVyKS4KLSAgICAgKiAgPC9wPgotICAgICAqCi0gICAgICogIDxwPgotICAgICAqICA8Yj5OT1RFOjwvYj4gUGFyYW0gbm9kZSBtdXN0IGJlIGFuIFhtbEN1cnNvciwgd2hpY2ggd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgeHBhdGgKLSAgICAgKiAgZXhlY3V0aW9uIGFuZCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgcmVzdWx0cy4gQSBjYWxsIG9mIG5vZGUuZGlzcG9zZSgpIG11c3QgYmUgZG9uZQotICAgICAqICBhZnRlciByZWFkaW5nIGFsbCByZXN1bHRzLgotICAgICAqICA8L3A+Ci0gICAgICoKLSAgICAgKiAgQHBhcmFtIG5vZGUgVGhlIG5vZGUsIG5vZGVzZXQgb3IgQ29udGV4dCBvYmplY3QgZm9yIGV2YWx1YXRpb24uIFRoaXMgdmFsdWUgY2FuIGJlIG51bGwuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgPGNvZGU+bm9kZS1zZXQ8L2NvZGU+IG9mIGFsbCBpdGVtcyBzZWxlY3RlZAotICAgICAqICAgICAgICAgIGJ5IHRoaXMgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAgKgotICAgICAqICBAc2VlICNzZWxlY3RTaW5nbGVOb2RlCi0gICAgICovCi0gICAgcHVibGljIExpc3Qgc2VsZWN0Tm9kZXMoT2JqZWN0IG5vZGUpIHRocm93cyBKYXhlbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIHhjOwotICAgICAgICB4YyA9ICgoWG1sQ3Vyc29yKW5vZGUpOwotCi0gICAgICAgICgoWEJlYW5zTmF2aWdhdG9yKWdldE5hdmlnYXRvcigpKS5zZXRDdXJzb3IoeGMpOwotICAgICAgICByZXR1cm4gc3VwZXIuc2VsZWN0Tm9kZXMoIFhCZWFuc05hdmlnYXRvci5nZXRCb29rbWFya0luVGhpc1BsYWNlKHhjKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IHNlbGVjdFBhdGgoT2JqZWN0IG5vZGUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdE5vZGVzKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QgYi92MS9zcmMveHNkc2NoZW1hL3NjaGVtYS9YTUxTY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUwM2FjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFhNTCBTY2hlbWEgc2NoZW1hIGZvciBYTUwgU2NoZW1hczogUGFydCAxOiBTdHJ1Y3R1cmVzIC0tPgotPCEtLSBOb3RlIHRoaXMgc2NoZW1hIGlzIE5PVCB0aGUgbm9ybWF0aXZlIHN0cnVjdHVyZXMgc2NoZW1hLiAtLT4KLQotPCEtLSBUaGUgcHJvc2UgY29weSBpbiB0aGUgc3RydWN0dXJlcyBSRUMgaXMgdGhlIG5vcm1hdGl2ZSAtLT4KLQotPCEtLSB2ZXJzaW9uICh3aGljaCBzaG91bGRuJ3QgZGlmZmVyIGZyb20gdGhpcyBvbmUgZXhjZXB0IGZvciAtLT4KLQotPCEtLSB0aGlzIGNvbW1lbnQgYW5kIGVudGl0eSBleHBhbnNpb25zLCBidXQganVzdCBpbiBjYXNlIC0tPgotCi08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiBbCi0KLTwhLS0gcHJvdmlkZSBJRCB0eXBlIGluZm9ybWF0aW9uIGV2ZW4gZm9yIHBhcnNlcnMgd2hpY2ggb25seSByZWFkIHRoZQotICAgICBpbnRlcm5hbCBzdWJzZXQgLS0+Ci08IUFUVExJU1QgeHM6c2NoZW1hICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y29tcGxleFR5cGUgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y29tcGxleENvbnRlbnQgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2ltcGxlQ29udGVudCAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZXh0ZW5zaW9uICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZWxlbWVudCAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Z3JvdXAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YWxsICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y2hvaWNlICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2VxdWVuY2UgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YW55ICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YW55QXR0cmlidXRlICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YXR0cmlidXRlICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YXR0cmlidXRlR3JvdXAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6dW5pcXVlICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6a2V5ICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6a2V5cmVmICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2VsZWN0b3IgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZmllbGQgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6aW5jbHVkZSAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6aW1wb3J0ICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6cmVkZWZpbmUgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6bm90YXRpb24gICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IS0tCi0gICAgIGtlZXAgdGhpcyBzY2hlbWEgWE1MMS4wIERURCB2YWxpZAotICAtLT4KLSAgICAgICAgPCFFTlRJVFkgJSBzY2hlbWFBdHRycyAneG1sbnM6aGZwIENEQVRBICNJTVBMSUVEJz4KLQotICAgICAgICA8IUVMRU1FTlQgaGZwOmhhc0ZhY2V0IEVNUFRZPgotICAgICAgICA8IUFUVExJU1QgaGZwOmhhc0ZhY2V0Ci0gICAgICAgICAgICAgICAgbmFtZSBOTVRPS0VOICNSRVFVSVJFRD4KLQotICAgICAgICA8IUVMRU1FTlQgaGZwOmhhc1Byb3BlcnR5IEVNUFRZPgotICAgICAgICA8IUFUVExJU1QgaGZwOmhhc1Byb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZSBOTVRPS0VOICNSRVFVSVJFRAotICAgICAgICAgICAgICAgIHZhbHVlIENEQVRBICNSRVFVSVJFRD4KLTwhLS0KLSAgICAgICAgTWFrZSBzdXJlIHRoYXQgcHJvY2Vzc29ycyB0aGF0IGRvIG5vdCByZWFkIHRoZSBleHRlcm5hbAotICAgICAgICBzdWJzZXQgd2lsbCBrbm93IGFib3V0IHRoZSB2YXJpb3VzIElEcyB3ZSBkZWNsYXJlCi0gIC0tPgotICAgICAgICA8IUFUVExJU1QgeHM6c2ltcGxlVHlwZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heEV4Y2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkV4Y2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heEluY2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkluY2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnRvdGFsRGlnaXRzIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZnJhY3Rpb25EaWdpdHMgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpsZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptaW5MZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptYXhMZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czplbnVtZXJhdGlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czphcHBpbmZvIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZG9jdW1lbnRhdGlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmxpc3QgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czp1bmlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgXT4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYmxvY2tEZWZhdWx0PSIjYWxsIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4wIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJFTiIgeG1sbnM6aGZwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1oYXNGYWNldEFuZFByb3BlcnR5Ij4KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUGFydCAxIHZlcnNpb246IElkOiBYTUxTY2hlbWEueHNkLHYgMS41MyAyMDAzLzAyLzI0IDE3OjQwOjA3IGh0IEV4cAotICAgIFBhcnQgMiB2ZXJzaW9uOiBJZDogZGF0YXR5cGVzLnhzZCx2IDEuNjAgMjAwMy8wNC8wNSAxMTowMjozMCBodCBFeHAKLSAgPC94czpkb2N1bWVudGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBBcGFjaGUgWE1MQmVhbiBjaGFuZ2VzOgotCi0gICAgMjAwMy8wNS8xNDogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBkZXNjcmliZSBpbnRlZ3JpdHkgY29uc3RyYWludAotICAgIHhwYXRocyBoYXMgYmVlbiBtb2RpZmllZCB0byBwZXJtaXQgd2hpdGVzcGFjZXMgaW4gY2VydGFpbiBwbGFjZXMsIGFzCi0gICAgZGlzY3Vzc2VkIGluIG9uZSBvZiB0aGUgZXJyYXRhLgotCi0gICAgMjAwMy8wNS8yODogdGhlIHR5cGUgb2YgdGhlICZsdDtlbGVtZW50PiBlbGVtZW50IGluIGFuICZsdDthbGw+IGdyb3VwIGhhcwotICAgIGJlZW4gZ2l2ZW4gYSBuYW1lIHNvIHRoYXQgaXQgaXMgbGVnYWwgdG8gdXNlIHRoZSB0eXBlIGluIGJvdGggYSBiYXNlIHR5cGUKLSAgICBhbmQgYSByZXN0cmljdGlvbiB3aGVuIHVzaW5nIHRoZSBhbGxNb2RlbCAob3RoZXJ3aXNlIGl0IGJyZWFrcyBvbmUgb2YgdGhlCi0gICAgcGFydGljbGUtdmFsaWQgKHJlc3RyaWN0aW9uKSBydWxlcykuCi0KLSAgICAyMDAzLzA5LzE1OiBmaW5hbERlZmF1bHQgaGFzIGJlZW4gY2hhbmdlZCB0byBwZXJtaXQgImxpc3QiIGFuZCAidW5pb24iCi0KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotCi0gPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC9Hcm91cC8yMDAyLzA5L3htbHNjaGVtYS0xL3N0cnVjdHVyZXMtd2l0aC1lcnJhdGEuaHRtbCI+Ci0gICBUaGUgc2NoZW1hIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBkb2N1bWVudCBpcyBub3JtYXRpdmUsCi0gICB3aXRoIHJlc3BlY3QgdG8gdGhlIHN5bnRhY3RpYyBjb25zdHJhaW50cyBpdCBleHByZXNzZXMgaW4gdGhlCi0gICBYTUwgU2NoZW1hIGxhbmd1YWdlLiAgVGhlIGRvY3VtZW50YXRpb24gKHdpdGhpbiAmbHQ7ZG9jdW1lbnRhdGlvbj4gZWxlbWVudHMpCi0gICBiZWxvdywgaXMgbm90IG5vcm1hdGl2ZSwgYnV0IHJhdGhlciBoaWdobGlnaHRzIGltcG9ydGFudCBhc3BlY3RzIG9mCi0gICB0aGUgVzNDIFJlY29tbWVuZGF0aW9uIG9mIHdoaWNoIHRoaXMgaXMgYSBwYXJ0PC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGUgc2ltcGxlVHlwZSBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIG1lbWJlcnMgYXJlIGRlZmluZWQKLSAgICAgIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGlzIHNjaGVtYSBkb2N1bWVudDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBHZXQgYWNjZXNzIHRvIHRoZSB4bWw6IGF0dHJpYnV0ZSBncm91cHMgZm9yIHhtbDpsYW5nCi0gICAgICAgYXMgZGVjbGFyZWQgb24gJ3NjaGVtYScgYW5kICdkb2N1bWVudGF0aW9uJyBiZWxvdwotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gPC94czppbXBvcnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ib3BlbkF0dHJzIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgYWxtb3N0IGFsbCBzY2hlbWEgdHlwZXMKLSAgICAgICB0byBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gb3RoZXIgbmFtZXNwYWNlcyB0byBiZQotICAgICAgIGFkZGVkIHRvIHVzZXIgc2NoZW1hcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW5ub3RhdGVkIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgYWxsIHR5cGVzIHdoaWNoIGFsbG93IGFubm90YXRpb24KLSAgICAgICBvdGhlciB0aGFuICZsdDtzY2hlbWEmZ3Q7IGl0c2VsZgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0ic2NoZW1hVG9wIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoaXMgZ3JvdXAgaXMgZm9yIHRoZQotICAgZWxlbWVudHMgd2hpY2ggb2NjdXIgZnJlZWx5IGF0IHRoZSB0b3AgbGV2ZWwgb2Ygc2NoZW1hcy4KLSAgIEFsbCBvZiB0aGVpciB0eXBlcyBhcmUgYmFzZWQgb24gdGhlICJhbm5vdGF0ZWQiIHR5cGUgYnkgZXh0ZW5zaW9uLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6ZWxlbWVudCIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphdHRyaWJ1dGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6bm90YXRpb24iLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpncm91cCBuYW1lPSJyZWRlZmluYWJsZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGdyb3VwIGlzIGZvciB0aGUKLSAgIGVsZW1lbnRzIHdoaWNoIGNhbiBzZWxmLXJlZGVmaW5lIChzZWUgJmx0O3JlZGVmaW5lPiBiZWxvdykuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y29tcGxleFR5cGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Z3JvdXAiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YXR0cmlidXRlR3JvdXAiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImZvcm1DaG9pY2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InF1YWxpZmllZCIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bnF1YWxpZmllZCIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlZmF1bHREZXJpdmF0aW9uQ29udHJvbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsaXN0Ii8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuaW9uIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVmYXVsdERlcml2YXRpb25TZXQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7ZXh0ZW5zaW9uLCByZXN0cmljdGlvbiwgbGlzdCwgdW5pb259PC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6ZGVmYXVsdERlcml2YXRpb25Db250cm9sIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0icmVkdWNlZERlcml2YXRpb25Db250cm9sIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlcml2YXRpb25Db250cm9sIj4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVyaXZhdGlvblNldCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtleHRlbnNpb24sIHJlc3RyaWN0aW9ufTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnJlZHVjZWREZXJpdmF0aW9uQ29udHJvbCIvPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9InNjaGVtYSIgaWQ9InNjaGVtYSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2NoZW1hIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmluY2x1ZGUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmltcG9ydCIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6cmVkZWZpbmUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czpncm91cCByZWY9InhzOnNjaGVtYVRvcCIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOm5vcm1hbGl6ZWRTdHJpbmciLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbERlZmF1bHQiIHR5cGU9InhzOmRlZmF1bHREZXJpdmF0aW9uU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9ja0RlZmF1bHQiIHR5cGU9InhzOmJsb2NrU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIgdHlwZT0ieHM6Zm9ybUNob2ljZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0idW5xdWFsaWZpZWQiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50Rm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6a2V5IG5hbWU9ImVsZW1lbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czplbGVtZW50Ii8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6YXR0cmlidXRlIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0idHlwZSI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmNvbXBsZXhUeXBlfHhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSAgPHhzOmtleSBuYW1lPSJncm91cCI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmdyb3VwIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlR3JvdXAiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czphdHRyaWJ1dGVHcm91cCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotICA8eHM6a2V5IG5hbWU9Im5vdGF0aW9uIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6bm90YXRpb24iLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSAgPHhzOmtleSBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSIuLy94czprZXl8Li8veHM6dW5pcXVlfC4vL3hzOmtleXJlZiIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotIDwveHM6ZWxlbWVudD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE5OSSI+Ci0gIDx4czphbm5vdGF0aW9uPjx4czpkb2N1bWVudGF0aW9uPgotICAgZm9yIG1heE9jY3VyczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJvY2N1cnMiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBhbGwgcGFydGljbGVzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdHlwZT0ieHM6YWxsTk5JIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJkZWZSZWYiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBlbGVtZW50LCBncm91cCBhbmQgYXR0cmlidXRlR3JvdXAsCi0gICB3aGljaCBib3RoIGRlZmluZSBhbmQgcmVmZXJlbmNlPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzOlFOYW1lIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czpncm91cCBuYW1lPSJ0eXBlRGVmUGFydGljbGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICdjb21wbGV4VHlwZScgdXNlcyB0aGlzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLQotCi0gPHhzOmdyb3VwIG5hbWU9Im5lc3RlZFBhcnRpY2xlIj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmxvY2FsRWxlbWVudCIvPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9InhzOmdyb3VwUmVmIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnkiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpncm91cCBuYW1lPSJwYXJ0aWNsZSI+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czpsb2NhbEVsZW1lbnQiLz4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpkZWZSZWYiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9Im9wdGlvbmFsIj4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcm9oaWJpdGVkIi8+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvcHRpb25hbCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZml4ZWQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdHlwZT0ieHM6Zm9ybUNob2ljZSIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEF0dHJpYnV0ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9ImF0dHJEZWNscyI+Ci0gIDx4czpzZXF1ZW5jZT4KLSAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiB0eXBlPSJ4czphdHRyaWJ1dGUiLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVHcm91cCIgdHlwZT0ieHM6YXR0cmlidXRlR3JvdXBSZWYiLz4KLSAgIDwveHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnlBdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICA8L3hzOnNlcXVlbmNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbnlBdHRyaWJ1dGUiIHR5cGU9InhzOndpbGRjYXJkIiBpZD0iYW55QXR0cmlidXRlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFueUF0dHJpYnV0ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmdyb3VwIG5hbWU9ImNvbXBsZXhUeXBlTW9kZWwiPgotICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzaW1wbGVDb250ZW50Ii8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmNvbXBsZXhDb250ZW50Ii8+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhpcyBicmFuY2ggaXMgc2hvcnQgZm9yCi0gICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+Ci0gICAuLi4KLSAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gICAmbHQ7L2NvbXBsZXhDb250ZW50PjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmNvbXBsZXhUeXBlTW9kZWwiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSI+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBXaWxsIGJlIHJlc3RyaWN0ZWQgdG8gcmVxdWlyZWQgb3IgZm9yYmlkZGVuPC94czpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiPgotICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgTm90IGFsbG93ZWQgaWYgc2ltcGxlQ29udGVudCBjaGlsZCBpcyBjaG9zZW4uCi0gICAgICBNYXkgYmUgb3ZlcnJpZGVuIGJ5IHNldHRpbmcgb24gY29tcGxleENvbnRlbnQgY2hpbGQuPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB0eXBlPSJ4czpkZXJpdmF0aW9uU2V0Ii8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQ29tcGxleFR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Y29tcGxleFR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbENvbXBsZXhUeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmNvbXBsZXhUeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmNvbXBsZXhUeXBlTW9kZWwiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhYnN0cmFjdCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9jayIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmVzdHJpY3Rpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVSZXN0cmljdGlvbk1vZGVsIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFJlc3RyaWN0aW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZXN0cmljdGlvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2UgaXMgYWRkZWQgc2ltcGx5IHRvCi0gICAgICAgICAgICAgICAgICAgbWFrZSB0aGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gcGVyIHRoZSBSRUM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZXh0ZW5zaW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOnR5cGVEZWZQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhDb250ZW50IiBpZD0iY29tcGxleENvbnRlbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleENvbnRlbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOmNvbXBsZXhSZXN0cmljdGlvblR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ieHM6ZXh0ZW5zaW9uVHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiI+Ci0gICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBPdmVycmlkZXMgYW55IHNldHRpbmcgb24gY29tcGxleFR5cGUgcGFyZW50LjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZVJlc3RyaWN0aW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZXN0cmljdGlvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2UgaXMgYWRkZWQgc2ltcGx5IHRvCi0gICAgICAgICAgICAgICAgICAgbWFrZSB0aGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gcGVyIHRoZSBSRUM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVSZXN0cmljdGlvbk1vZGVsIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZUV4dGVuc2lvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXh0ZW5zaW9uVHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgTm8gdHlwZURlZlBhcnRpY2xlIGdyb3VwIHJlZmVyZW5jZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94czphbm5vdGF0aW9uPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlQ29udGVudCIgaWQ9InNpbXBsZUNvbnRlbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2ltcGxlQ29udGVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXN0cmljdGlvbiIgdHlwZT0ieHM6c2ltcGxlUmVzdHJpY3Rpb25UeXBlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9InhzOnNpbXBsZUV4dGVuc2lvblR5cGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czp0b3BMZXZlbENvbXBsZXhUeXBlIiBpZD0iY29tcGxleFR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleFR5cGUiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJsb2NrU2V0Ij4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7c3Vic3RpdHV0aW9uLCBleHRlbnNpb24sCi0gICAgcmVzdHJpY3Rpb259PC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOnVuaW9uPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICA8eHM6bGlzdD4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdWJzdGl0dXRpb24iLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmxpc3Q+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgPC94czp1bmlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoZSBlbGVtZW50IGVsZW1lbnQgY2FuIGJlIHVzZWQgZWl0aGVyCi0gICBhdCB0aGUgdG9wIGxldmVsIHRvIGRlZmluZSBhbiBlbGVtZW50LXR5cGUgYmluZGluZyBnbG9iYWxseSwKLSAgIG9yIHdpdGhpbiBhIGNvbnRlbnQgbW9kZWwgdG8gZWl0aGVyIHJlZmVyZW5jZSBhIGdsb2JhbGx5LWRlZmluZWQKLSAgIGVsZW1lbnQgb3IgdHlwZSBvciBkZWNsYXJlIGFuIGVsZW1lbnQtdHlwZSBiaW5kaW5nIGxvY2FsbHkuCi0gICBUaGUgcmVmIGZvcm0gaXMgbm90IGFsbG93ZWQgYXQgdGhlIHRvcCBsZXZlbC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB0eXBlPSJ4czpibG9ja1NldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdHlwZT0ieHM6Zm9ybUNob2ljZSIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEVsZW1lbnQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZWxlbWVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbEVsZW1lbnQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZWxlbWVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uR3JvdXAiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6dG9wTGV2ZWxFbGVtZW50IiBpZD0iZWxlbWVudCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1lbGVtZW50Ii8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ3JvdXAiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGdyb3VwIHR5cGUgZm9yIGV4cGxpY2l0IGdyb3VwcywgbmFtZWQgdG9wLWxldmVsIGdyb3VwcyBhbmQKLSAgIGdyb3VwIHJlZmVyZW5jZXM8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOnBhcnRpY2xlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlYWxHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpncm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkR3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVhbEdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYWxsIj4KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGwiPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzOmFsbE1vZGVsIi8+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNob2ljZSIgdHlwZT0ieHM6c2ltcGxlRXhwbGljaXRHcm91cCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InhzOnNpbXBsZUV4cGxpY2l0R3JvdXAiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwUmVmIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnJlYWxHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJleHBsaWNpdEdyb3VwIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGdyb3VwIHR5cGUgZm9yIHRoZSB0aHJlZSBraW5kcyBvZiBncm91cDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Z3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6bmVzdGVkUGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZUV4cGxpY2l0R3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJhbGxNb2RlbCI+Ci0gIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIGNob2ljZSB3aXRoIG1pbi9tYXggaXMgaGVyZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZCBhIHBibG0gd2l0aCB0aGUgRWx0OkFsbC9DaG9pY2UvU2VxCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpY2xlIGRlcml2YXRpb24gY29uc3RyYWludDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6ZWxlbWVudEluQWxsIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSA8L3hzOmdyb3VwPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlbGVtZW50SW5BbGwiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+cmVzdHJpY3RlZCBtYXgvbWluPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpsb2NhbEVsZW1lbnQiPgotICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czpncm91cCByZWY9InhzOmlkZW50aXR5Q29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8L3hzOnNlcXVlbmNlPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIwIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YWxsTk5JIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIwIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWxsIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgT25seSBlbGVtZW50cyBhbGxvd2VkIGluc2lkZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmFsbE1vZGVsIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGxOTkkiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiIGlkPSJhbGwiIHR5cGU9InhzOmFsbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbGwiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImNob2ljZSIgdHlwZT0ieHM6ZXhwbGljaXRHcm91cCIgaWQ9ImNob2ljZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jaG9pY2UiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlIiB0eXBlPSJ4czpleHBsaWNpdEdyb3VwIiBpZD0ic2VxdWVuY2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2VxdWVuY2UiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpuYW1lZEdyb3VwIiBpZD0iZ3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZ3JvdXAiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ3aWxkY2FyZCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6bmFtZXNwYWNlTGlzdCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIyNhbnkiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb2Nlc3NDb250ZW50cyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0ic3RyaWN0Ij4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJza2lwIi8+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsYXgiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmljdCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFueSIgaWQ9ImFueSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbnkiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp3aWxkY2FyZCI+Ci0gICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIHNpbXBsZSB0eXBlIGZvciB0aGUgdmFsdWUgb2YgdGhlICduYW1lc3BhY2UnIGF0dHIgb2YKLSAgICdhbnknIGFuZCAnYW55QXR0cmlidXRlJzwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVmFsdWUgaXMKLSAgICAgICAgICAgICAgIyNhbnkgICAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTC9hdHRyaWJ1dGUgYXQgYWxsCi0KLSAgICAgICAgICAgICAgIyNvdGhlciAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTC9hdHRyaWJ1dGUgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIG90aGVyIHRoYW4gdGFyZ2V0TlMKLQotICAgICAgICAgICAgICAjI2xvY2FsICAgIC0gLSBhbnkgdW5xdWFsaWZpZWQgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZQotCi0gICAgICAgICAgICAgIG9uZSBvciAgICAgLSAtIGFueSBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIGZyb20KLSAgICAgICAgICAgICAgbW9yZSBVUkkgICAgICAgIHRoZSBsaXN0ZWQgbmFtZXNwYWNlcwotICAgICAgICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgICAgICAgIChzcGFjZSBzZXBhcmF0ZWQpCi0KLSAgICAjI3RhcmdldE5hbWVzcGFjZSBvciAjI2xvY2FsIG1heSBhcHBlYXIgaW4gdGhlIGFib3ZlIGxpc3QsIHRvCi0gICAgICAgIHJlZmVyIHRvIHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZwotICAgICAgICBzY2hlbWEgb3IgYW4gYWJzZW50IHRhcmdldE5hbWVzcGFjZSByZXNwZWN0aXZlbHk8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5hbWVzcGFjZUxpc3QiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNvdGhlciIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdD4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmFueVVSSSI+Ci0gICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjbG9jYWwiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOnVuaW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czpsaXN0PgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ieHM6dG9wTGV2ZWxBdHRyaWJ1dGUiIGlkPSJhdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlR3JvdXAiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZEF0dHJpYnV0ZUdyb3VwIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZUdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlR3JvdXBSZWYiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YXR0cmlidXRlR3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVHcm91cCIgdHlwZT0ieHM6bmFtZWRBdHRyaWJ1dGVHcm91cCIgaWQ9ImF0dHJpYnV0ZUdyb3VwIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWF0dHJpYnV0ZUdyb3VwIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiBpZD0iaW5jbHVkZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1pbmNsdWRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWFMb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9InJlZGVmaW5lIiBpZD0icmVkZWZpbmUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtcmVkZWZpbmUiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpvcGVuQXR0cnMiPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpyZWRlZmluYWJsZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWFMb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImltcG9ydCIgaWQ9ImltcG9ydCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1pbXBvcnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJzZWxlY3RvciIgaWQ9InNlbGVjdG9yIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNlbGVjdG9yIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgiIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgc3Vic2V0IG9mIFhQYXRoIGV4cHJlc3Npb25zIGZvciB1c2UKLWluIHNlbGVjdG9yczwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljCi11c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIGZvbGxvd2luZyBwYXR0ZXJuIGlzIGludGVuZGVkIHRvIGFsbG93IFhQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucyBwZXIgdGhlIGZvbGxvd2luZyBFQk5GOgotICAgICAgICAgIFNlbGVjdG9yICAgIDo6PSAgICBQYXRoICggJ3wnIFBhdGggKSoKLSAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyBTdGVwICggJy8nIFN0ZXAgKSoKLSAgICAgICAgICBTdGVwICAgIDo6PSAgICAnLicgfCBOYW1lVGVzdAotICAgICAgICAgIE5hbWVUZXN0ICAgIDo6PSAgICBRTmFtZSB8ICcqJyB8IE5DTmFtZSAnOicgJyonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDo6IGlzIGFsc28gYWxsb3dlZAotICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwhLS0gVFNIIG1vZGlmaWVkIHRvIGFsbG93IHdoaXRlIHNwYWNlIC0tPgotICAgICAgICA8eHM6cGF0dGVybgotICAgICAgICAgICAgdmFsdWU9IihcLlxzKi8vXHMqKT8oKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKShccyovXHMqKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKihccypcfFxzKihcLlxzKi8vXHMqKT8oKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKShccyovXHMqKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKikqIj4KLSAgICAgICAgPC94czpwYXR0ZXJuPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJmaWVsZCIgaWQ9ImZpZWxkIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWZpZWxkIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgiIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgc3Vic2V0IG9mIFhQYXRoIGV4cHJlc3Npb25zIGZvciB1c2UKLWluIGZpZWxkczwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljCi11c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIGZvbGxvd2luZyBwYXR0ZXJuIGlzIGludGVuZGVkIHRvIGFsbG93IFhQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucyBwZXIgdGhlIHNhbWUgRUJORiBhcyBmb3Igc2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlOgotICAgICAgICAgIFBhdGggICAgOjo9ICAgICgnLi8vJyk/ICggU3RlcCAnLycgKSogKCBTdGVwIHwgJ0AnIE5hbWVUZXN0ICkKLSAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8IS0tIFRTSCBtb2RpZmllZCB0byBhbGxvdyB3aGl0ZSBzcGFjZSAtLT4KLSAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IihcLlxzKi8vXHMqKT8oKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLilccyovXHMqKSooKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLil8KChhdHRyaWJ1dGVccyo6OlxzKnxAXHMqKSgoXGlcYyo6KT8oXGlcYyp8XCopKSkpKFxzKlx8XHMqKFxzKlwuLy9ccyopPygoKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKS8pKigoKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKXwoKGF0dHJpYnV0ZVxzKjo6XHMqfEBccyopKChcaVxjKjopPyhcaVxjKnxcKikpKSkpKiI+Ci0gICAgICAgIDwveHM6cGF0dGVybj4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+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+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgTm90IHRoZSByZWFsIHVyVHlwZSwgYnV0IGFzIGNsb3NlIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2FuCi0gICBnZXQgaW4gdGhlIFhNTCByZXByZXNlbnRhdGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6c2VxdWVuY2U+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+CmRpZmYgLS1naXQgYS92MS9zcmMveHNkc2NoZW1hL3NjaGVtYS93M2Mtc2NoZW1hLWxpY2Vuc2UuaHRtbCBiL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL3czYy1zY2hlbWEtbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDkxNDBhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL3czYy1zY2hlbWEtbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci0gIDx0aXRsZT5XM0MgU29mdHdhcmUgTGljZW5zZTwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9TdHlsZVNoZWV0cy9iYXNlLmNzcyIgLz4KLSAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSA8IS0tCi1oMyN2ZXJzaW9uIHsgbWFyZ2luLXRvcDogLTAuOGVtO30KLS0tPgotICA8L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIj4KLQotPGgxPlczQyBYTUwgU2NoZW1hLCBTY2hlbWEgZm9yIFNjaGVtYXM6IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLnhzZCI+aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkPC9hPjwvaDE+Ci08ZGw+Ci0gICAgPGRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvaXByLW5vdGljZSI+Q29weXJpZ2h0PC9hPgotICAgICAgqSAyMDAxLTIwMDMgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvIj5Xb3JsZCBXaWRlIFdlYgotICAgICAgQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cwotICAgICAgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3k8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmVyY2ltLm9yZy8iPkV1cm9wZWFuCi0gICAgICBSZXNlYXJjaCBDb25zb3J0aXVtIGZvciBJbmZvcm1hdGljcyBhbmQgTWF0aGVtYXRpY3M8L2E+LCA8YQotICAgICAgaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbyBVbml2ZXJzaXR5PC9hPikuIEFsbCBSaWdodHMKLSAgICAgIFJlc2VydmVkLiBUaGlzIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIDxhCi0gICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxIj5XM0M8c3VwPq48L3N1cD4KLSAgICAgIFNvZnR3YXJlIExpY2Vuc2U8L2E+IFsxXSBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgICAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgICAgIDxwPlsxXSA8YQotICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMS5odG1sIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxPC9hPjwvcD4KLSAgICA8L2RkPgotPC9kbD4KLQotCi08aHIvPgotCi08aDE+VzNDPHN1cD6uPC9zdXA+IFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRTwvaDE+Ci0KLTxoMyBpZD0idmVyc2lvbiI+PGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzE8L2E+PC9oMz4KLQotPHA+VGhpcyB3b3JrIChhbmQgaW5jbHVkZWQgc29mdHdhcmUsIGRvY3VtZW50YXRpb24gc3VjaCBhcyBSRUFETUVzLCBvciBvdGhlcgotcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcKLWxpY2Vuc2UuIEJ5IG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkKLWFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZwotdGVybXMgYW5kIGNvbmRpdGlvbnMuPC9wPgotCi08cD5QZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCZuYnNwO2ZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAotZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbgotQUxMIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgdGhlcmVvZiwgaW5jbHVkaW5nCi1tb2RpZmljYXRpb25zOjwvcD4KLTxvbD4KLSAgPGxpPlRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUKLSAgICByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay48L2xpPgotICA8bGk+QW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCi0gICAgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIHRoZSA8YQotICAgIGhyZWY9ImNvcHlyaWdodC1zb2Z0d2FyZS1zaG9ydC1ub3RpY2UtMjAwMjEyMzEuaHRtbCI+VzNDIFNvZnR3YXJlIFNob3J0Ci0gICAgTm90aWNlPC9hPiBzaG91bGQgYmUgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKQotICAgIHdpdGhpbiB0aGUgYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGUuPC9saT4KLSAgPGxpPk5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlCi0gICAgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUgVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbQotICAgIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKTwvbGk+Ci08L29sPgotCi08cD5USElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUwotTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFCi1BTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuPC9wPgotCi08cD5DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IKLURPQ1VNRU5UQVRJT04uPC9wPgotCi08cD5UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4KLWFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuCi1wcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQKLWRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuPC9wPgotCi08cD48L3A+Ci0KLTxwPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvcD4KLQotPHA+VGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbiBEZWNlbWJlciAzMQotMjAwMi4gVGhpcyB2ZXJzaW9uIHJlbW92ZXMgdGhlIGNvcHlyaWdodCBvd25lcnNoaXAgbm90aWNlIHN1Y2ggdGhhdCB0aGlzCi1saWNlbnNlIGNhbiBiZSB1c2VkIHdpdGggbWF0ZXJpYWxzIG90aGVyIHRoYW4gdGhvc2Ugb3duZWQgYnkgdGhlIFczQywKLXJlZmxlY3RzIHRoYXQgRVJDSU0gaXMgbm93IGEgaG9zdCBvZiB0aGUgVzNDLCBpbmNsdWRlcyByZWZlcmVuY2VzIHRvIHRoaXMKLXNwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UsIGFuZCByZW1vdmVzIHRoZSBhbWJpZ3VvdXMgZ3JhbnQgb2YKLSJ1c2UiLiBPdGhlcndpc2UsIHRoaXMgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwIj5wcmV2aW91cwotdmVyc2lvbjwvYT4gYW5kIGlzIHdyaXR0ZW4gc28gYXMgdG8gcHJlc2VydmUgdGhlIDxhCi1ocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS9saWNlbnNlLWxpc3QuaHRtbCNHUExDb21wYXRpYmxlTGljZW5zZXMiPkZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5PC9hPiBhbmQgPGEKLWhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvVzNDLnBocCI+T1NJJ3MgY2VydGlmaWNhdGlvbjwvYT4KLXVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2RvY3MvZGVmaW5pdGlvbi5waHAiPk9wZW4gU291cmNlCi1EZWZpbml0aW9uPC9hPi4gUGxlYXNlIHNlZSBvdXIgPGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUSI+Q29weXJpZ2h0IEZBUTwvYT4gZm9yCi1jb21tb24gcXVlc3Rpb25zIGFib3V0IHVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMKLXRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBwYWNrYWdlcyBsaWtlIGxpYnd3dywgQW1heWEsIGFuZCBKaWdzYXcuIE90aGVyCi1xdWVzdGlvbnMgYWJvdXQgdGhpcyBub3RpY2UgY2FuIGJlIGRpcmVjdGVkIHRvIDxhCi1ocmVmPSJtYWlsdG86c2l0ZS1wb2xpY3lAdzMub3JnIj5zaXRlLXBvbGljeUB3My5vcmc8L2E+LjxiciAvPgotJm5ic3A7PC9wPgotPGFkZHJlc3M+Ci0gIEpvc2VwaCBSZWFnbGUgJmx0OzxhCi0gIGhyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZyZndDs8L2E+Ci08L2FkZHJlc3M+Ci0KLTxwPkxhc3QgcmV2aXNlZCBieSBSZWFnbGUgJERhdGU6IDIwMDQvMDQvMTAgMDA6MTc6MTAgJDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhIGIvdjEvc3JjL3ppcGNvbXBhcmUvemlwY29tcGFyZS9aaXBDb21wYXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjkwMmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3ppcGNvbXBhcmUvemlwY29tcGFyZS9aaXBDb21wYXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgemlwY29tcGFyZTsKLQotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFppcENvbXBhcmUKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHppcGNvbXBhcmUgW2ZpbGUxXSBbZmlsZTJdIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIFppcEZpbGUgZmlsZTE7Ci0gICAgICAgIHRyeSB7IGZpbGUxID0gbmV3IFppcEZpbGUoYXJnc1swXSk7IH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3Qgb3BlbiB6aXAgZmlsZSAiICsgYXJnc1swXSArICI6ICIgKyBlKTsgU3lzdGVtLmV4aXQoMSk7IHJldHVybjsgfQotCi0gICAgICAgIFppcEZpbGUgZmlsZTI7Ci0gICAgICAgIHRyeSB7IGZpbGUyID0gbmV3IFppcEZpbGUoYXJnc1sxXSk7IH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3Qgb3BlbiB6aXAgZmlsZSAiICsgYXJnc1swXSArICI6ICIgKyBlKTsgU3lzdGVtLmV4aXQoMSk7IHJldHVybjsgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGFyaW5nICIgKyBhcmdzWzBdICsgIiB3aXRoICIgKyBhcmdzWzFdICsgIjoiKTsKLQotICAgICAgICBTZXQgc2V0MSA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGZpbGUxLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKQotICAgICAgICAgICAgc2V0MS5hZGQoKChaaXBFbnRyeSllLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU2V0IHNldDIgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlMi5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKLSAgICAgICAgICAgIHNldDIuYWRkKCgoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCkpOwotCi0gICAgICAgIGludCBlcnJjb3VudCA9IDA7Ci0gICAgICAgIGludCBmaWxlY291bnQgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQxLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghc2V0Mi5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICIgbm90IGZvdW5kIGluICIgKyBhcmdzWzFdKTsKLSAgICAgICAgICAgICAgICBlcnJjb3VudCArPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0Mi5yZW1vdmUobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1zRXF1YWwoZmlsZTEuZ2V0SW5wdXRTdHJlYW0oZmlsZTEuZ2V0RW50cnkobmFtZSkpLCBmaWxlMi5nZXRJbnB1dFN0cmVhbShmaWxlMi5nZXRFbnRyeShuYW1lKSkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiIGRvZXMgbm90IG1hdGNoIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycmNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICI6IElPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGVycmNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlY291bnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIiBub3QgZm91bmQgaW4gIiArIGFyZ3NbMF0pOwotICAgICAgICAgICAgZXJyY291bnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZWNvdW50ICsgIiBlbnRyaWVzIG1hdGNoZWQiKTsKLSAgICAgICAgaWYgKGVycmNvdW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVycmNvdW50ICsgIiBlbnRyaWVzIGRpZCBub3QgbWF0Y2giKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIHN0cmVhbXNFcXVhbChJbnB1dFN0cmVhbSBzdHJlYW0xLCBJbnB1dFN0cmVhbSBzdHJlYW0yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgIGJvb2xlYW4gZG9uZTEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBkb25lMiA9IGZhbHNlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgIHdoaWxlICghZG9uZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBvZmYxID0gMDsKLSAgICAgICAgICAgIGludCBvZmYyID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKG9mZjEgPCBidWYxLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBzdHJlYW0xLnJlYWQoYnVmMSwgb2ZmMSwgYnVmMS5sZW5ndGggLSBvZmYxKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZTEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2ZmMSArPSBjb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChvZmYyIDwgYnVmMi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gc3RyZWFtMi5yZWFkKGJ1ZjIsIG9mZjIsIGJ1ZjIubGVuZ3RoIC0gb2ZmMik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZjIgKz0gY291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2ZmMSAhPSBvZmYyIHx8IGRvbmUxICE9IGRvbmUyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2ZmMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChidWYxW2ldICE9IGJ1ZjJbaV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsgc3RyZWFtMS5jbG9zZSgpOyBzdHJlYW0yLmNsb3NlKCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL2VudW10ZXN0L3JlcG9ydDEueG1sIGIvdjEvdGVzdC9jYXNlcy9lbnVtdGVzdC9yZXBvcnQxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2YzFiOC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL2VudW10ZXN0L3JlcG9ydDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08c3RhdHVzcmVwb3J0IHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiPgotICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9ImFsbCI+YWxsPC9zdGF0dXM+Ci0gIDxzdGF0dXMgbmFtZT0ic2Vjb25kIiB0YXJnZXQ9ImFsbCI+ZmV3PC9zdGF0dXM+Ci0gIDxzdGF0dXMgbmFtZT0idGhpcmQiIHRhcmdldD0ibm9uZSI+bW9zdDwvc3RhdHVzPgotICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9Im5vbmUiPm5vbmU8L3N0YXR1cz4KLTwvc3RhdHVzcmVwb3J0PgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9uYW1ld29ybGQvd29ybGQxLnhtbCBiL3YxL3Rlc3QvY2FzZXMvbmFtZXdvcmxkL3dvcmxkMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MWM1MDcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9uYW1ld29ybGQvd29ybGQxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPG53Om5hbWV3b3JsZCB4bWxuczpudz0iaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIKLSAgICAgICAgICAgICAgeG1sbnM6Zm9vPSJodHRwOi8vZm9vLmNvbS8iCi0gICAgICAgICAgICAgIHhtbG5zOmJhcj0iaHR0cDovL2Jhci5jb20vIj4KLQotICA8bnc6aXNsYW5kIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Zvby5jb20vIj4KLSAgICA8bnc6bG9jYXRpb24gbmFtZT0iZm9vY2l0eSI+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFyY2l0eSIvPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb3Rvd24iLz4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImJhcjpiYXJ2aWxsYWdlIi8+Ci0gICAgPC9udzpsb2NhdGlvbj4KLSAgICA8bnc6bG9jYXRpb24gbmFtZT0iZm9vdG93biI+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydG93biIvPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb3ZpbGxhZ2UiLz4KLSAgICA8L253OmxvY2F0aW9uPgotICAgIDxudzpsb2NhdGlvbiBuYW1lPSJmb292aWxsYWdlIj4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImJhcjpiYXJ2aWxsYWdlIi8+Ci0gICAgPC9udzpsb2NhdGlvbj4KLSAgPC9udzppc2xhbmQ+Ci0KLSAgPG53OmlzbGFuZCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9iYXIuY29tLyI+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImJhcmNpdHkiPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb2NpdHkiLz4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImJhcjpiYXJ0b3duIi8+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJmb286Zm9vdmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImJhcnRvd24iPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb3Rvd24iLz4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImJhcjpiYXJ2aWxsYWdlIi8+Ci0gICAgPC9udzpsb2NhdGlvbj4KLSAgICA8bnc6bG9jYXRpb24gbmFtZT0iYmFydmlsbGFnZSI+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJmb286Zm9vdmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gIDwvbnc6aXNsYW5kPgotPC9udzpuYW1ld29ybGQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLWRzYS54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtZHNhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0OTU0ZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtZHNhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICA8U2lnbmVkSW5mbz4KLSAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgotICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+Ci0gICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KLSAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KLSAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KLSAgICA8L1JlZmVyZW5jZT4KLSAgPC9TaWduZWRJbmZvPgotICA8U2lnbmF0dXJlVmFsdWU+Ci0gICAgcVVBRERNSFpreWVidlJkTHMrNkR2N1J2Z01MUmxVYURCNFE5eW45WG9KQTc5YTI4ODJmZlRnPT0KLSAgPC9TaWduYXR1cmVWYWx1ZT4KLSAgPEtleUluZm8+Ci0gICAgPEtleVZhbHVlPgotICAgICAgPERTQUtleVZhbHVlPgotICAgICAgICA8UD4KLSAgICAgICAgICAyaVkzdzA2MnNEQjMvRElsTFdPZUc5KzRVcG1EWjBkeXFSazlkTGxOUTZxYVhJN3RPcmpkSWhtNm4vZU93NDVBCi0gICAgICAgICAgUXR1WVNwNnNwQ3Q5Y1FjTkJBajIyS3Z5Z3ZmSklJWFg5c1NRcnVnZkdxaWZlU3ZZM1ZYNVNkMWorejBNU1ovbgotICAgICAgICAgIDVqTnQ4OHVoMkMxMVNBcVg2bnJYVFkvMVJ3a29XUk4yM1NZaE9sYUcwaFU9Ci0gICAgICAgIDwvUD4KLSAgICAgICAgPFE+Ci0gICAgICAgICAgOUI1eXBMWTlwTU9tdHhDZVRESGd3ZE5GZUdzPQotICAgICAgICA8L1E+Ci0gICAgICAgIDxHPgotICAgICAgICAgIE11R0FscWVCMWF4K3Z5TzIrT3N1YmpobDdwSHhMdTQ3UklIKy9NNTJEakVTQTlLTVNyd3pzWXg4eU5SMldvb0IKLSAgICAgICAgICB5ckUwdDZmdTBWbmNLN1VLOG9sTzR0N3dwdjJ6NEFGUVBSVkNLRndvMHFnbjVhS0lrSUNHTWxyUnk4MWF2YjI3Ci0gICAgICAgICAgd0djV290aHgzaVBQTXRGWHRvRHFLMEpJdGFJOVI4emMxbXNGaE0xR0tNWT0KLSAgICAgICAgPC9HPgotICAgICAgICA8WT4KLSAgICAgICAgICBjdEE4WUd4cnRuZ2cvektWdnFFT2VmbndtVmlGenRjblBCWVBsSnN2aDZ5S0k0aURtNjhmbnA0TWkzUnJKNmJaCi0gICAgICAgICAgQXlnRnJVSVFMeExqVitPSnRnSkFFdG8weEFzK01laHVxMURrU0ZFcFAzb0R6Q1RPc3JPaVMxRHdRZTRvSWI3egotICAgICAgICAgIFZrLzlsN2FQdEpNSFcwTFZsTWR3Wk5GTk5Kb3FNY1QyWmZDUHJmdll2UTA9Ci0gICAgICAgIDwvWT4KLSAgICAgIDwvRFNBS2V5VmFsdWU+Ci0gICAgPC9LZXlWYWx1ZT4KLSAgICA8WDUwOURhdGE+Ci0gICAgICA8WDUwOVN1YmplY3ROYW1lPgotICAgICAgICBDTj1NZXJsaW4gSHVnaGVzLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKLSAgICAgIDwvWDUwOVN1YmplY3ROYW1lPgotICAgICAgPFg1MDlJc3N1ZXJTZXJpYWw+Ci0gICAgICAgIDxYNTA5SXNzdWVyTmFtZT4KLSAgICAgICAgICBDTj1UZXN0IERTQSBDQSxPPUJhbHRpbW9yZSBUZWNobm9sb2dpZXNcLCBMdGQuLFNUPUR1YmxpbixDPUlFCi0gICAgICAgIDwvWDUwOUlzc3Vlck5hbWU+Ci0gICAgICAgIDxYNTA5U2VyaWFsTnVtYmVyPjk3MDg0OTkzNjwvWDUwOVNlcmlhbE51bWJlcj4KLSAgICAgIDwvWDUwOUlzc3VlclNlcmlhbD4KLSAgICAgIDxYNTA5Q2VydGlmaWNhdGU+Ci0gICAgICAgIE1JSUROekNDQXZXZ0F3SUJBZ0lFT2QzK2tEQUpCZ2NxaGtqT09BUURNRnN4Q3pBSkJnTlZCQVlUQWtsRk1ROHcKLSAgICAgICAgRFFZRFZRUUlFd1pFZFdKc2FXNHhKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXNiMmRwWlhNcwotICAgICAgICBJRXgwWkM0eEZEQVNCZ05WQkFNVEMxUmxjM1FnUkZOQklFTkJNQjRYRFRBd01UQXdOakUyTXpJeE5Wb1hEVEF4Ci0gICAgICAgIE1UQXdOakUyTXpJeE5Gb3dYVEVMTUFrR0ExVUVCaE1DU1VVeER6QU5CZ05WQkFnVEJrUjFZbXhwYmpFbE1DTUcKLSAgICAgICAgQTFVRUNoTWNRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsY3l3Z1RIUmtMakVXTUJRR0ExVUVBeE1OVFdWeQotICAgICAgICBiR2x1SUVoMVoyaGxjekNDQWJZd2dnRXJCZ2NxaGtqT09BUUJNSUlCSGdLQmdRRGFKamZEVHJhd01IZjhNaVV0Ci0gICAgICAgIFk1NGIzN2hTbVlOblIzS3BHVDEwdVUxRHFwcGNqdTA2dU4waUdicWY5NDdEamtCQzI1aEtucXlrSzMxeEJ3MEUKLSAgICAgICAgQ1BiWXEvS0M5OGtnaGRmMnhKQ3U2QjhhcUo5NUs5amRWZmxKM1dQN1BReEpuK2ZtTTIzenk2SFlMWFZJQ3BmcQotICAgICAgICBldGROai9WSENTaFpFM2JkSmlFNlZvYlNGUUlWQVBRZWNxUzJQYVREcHJjUW5rd3g0TUhUUlhockFvR0FNdUdBCi0gICAgICAgIGxxZUIxYXgrdnlPMitPc3ViamhsN3BIeEx1NDdSSUgrL001MkRqRVNBOUtNU3J3enNZeDh5TlIyV29vQnlyRTAKLSAgICAgICAgdDZmdTBWbmNLN1VLOG9sTzR0N3dwdjJ6NEFGUVBSVkNLRndvMHFnbjVhS0lrSUNHTWxyUnk4MWF2YjI3d0djVwotICAgICAgICBvdGh4M2lQUE10Rlh0b0RxSzBKSXRhSTlSOHpjMW1zRmhNMUdLTVlEZ1lRQUFvR0FjdEE4WUd4cnRuZ2cvektWCi0gICAgICAgIHZxRU9lZm53bVZpRnp0Y25QQllQbEpzdmg2eUtJNGlEbTY4Zm5wNE1pM1JySjZiWkF5Z0ZyVUlRTHhMalYrT0oKLSAgICAgICAgdGdKQUV0bzB4QXMrTWVodXExRGtTRkVwUDNvRHpDVE9zck9pUzFEd1FlNG9JYjd6VmsvOWw3YVB0Sk1IVzBMVgotICAgICAgICBsTWR3Wk5GTk5Kb3FNY1QyWmZDUHJmdll2UTJqUnpCRk1CNEdBMVVkRVFRWE1CV0JFMjFsY214cGJrQmlZV3gwCi0gICAgICAgIGFXMXZjbVV1YVdVd0RnWURWUjBQQVFIL0JBUURBZ2VBTUJNR0ExVWRJd1FNTUFxQUNFSlpRRzBLd1JiUE1Ba0cKLSAgICAgICAgQnlxR1NNNDRCQU1ETVFBd0xnSVZBSzRza1dFRllncmdnYUpBOHZZQXdTamcxMitLQWhVQXdIVG83d2Q0dEVOdwotICAgICAgICA5TEFLUGtsUS83NGZIMTg9Ci0gICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KLSAgICA8L1g1MDlEYXRhPgotICA8L0tleUluZm8+Ci08L1NpZ25hdHVyZT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLXJzYS54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtcnNhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2OGQ3Ny4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtcnNhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICA8U2lnbmVkSW5mbz4KLSAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgotICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+Ci0gICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KLSAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KLSAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KLSAgICA8L1JlZmVyZW5jZT4KLSAgPC9TaWduZWRJbmZvPgotICA8U2lnbmF0dXJlVmFsdWU+Ci0gICAganVTNVJoSjg4NHFvRlI4ZmxWWGQvcmJyU0RWR240MENhcGdCN3FlUWlUK3JyME5la0VRNkJIaFVBOGRUMytCQwotICAgIFRCVVFJMGRCamxtbDlsd3pFTlh2UzgzelJFQ2p6WGJNUlRVdFZaaVBaRzJwcUtQbkwyWVUzQTk2NDVVQ2pUWFUKLSAgICAramdGdW12N2s3OGhpZUFHRHpOY2krUFE5S1JtbS8vaWNUN0phWXp0Z3Q0PQotICA8L1NpZ25hdHVyZVZhbHVlPgotICA8S2V5SW5mbz4KLSAgICA8S2V5VmFsdWU+Ci0gICAgICA8UlNBS2V5VmFsdWU+Ci0gICAgICAgIDxNb2R1bHVzPgotICAgICAgICAgIHVDaXVrcGdPYU9tcnExZlBVVEgzQ0FYeHVGbVBqc21TNGpuVEt4cnYwdzFKS2NYdEoyTTNha2FWMWQva2FydkoKLSAgICAgICAgICBsbWVhbzIwak55OXIrL3ZLd2liak03N0YrM2JJa2VNRUdtQUlVbkZjaUprUitpaE83YjRjVHVZbkVpOHhIdHU0Ci0gICAgICAgICAgaU1uNkdPREJvRXpxRlFZZGQ4cDR2clpCc3ZzNDRuVHJTOHF5eWhiYTY0OD0KLSAgICAgICAgPC9Nb2R1bHVzPgotICAgICAgICA8RXhwb25lbnQ+Ci0gICAgICAgICAgQVFBQgotICAgICAgICA8L0V4cG9uZW50PgotICAgICAgPC9SU0FLZXlWYWx1ZT4KLSAgICA8L0tleVZhbHVlPgotICAgIDxYNTA5RGF0YT4KLSAgICAgIDxYNTA5U3ViamVjdE5hbWU+Ci0gICAgICAgIENOPU1lcmxpbiBIdWdoZXMsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQotICAgICAgPC9YNTA5U3ViamVjdE5hbWU+Ci0gICAgICA8WDUwOUlzc3VlclNlcmlhbD4KLSAgICAgICAgPFg1MDlJc3N1ZXJOYW1lPgotICAgICAgICAgIENOPVRlc3QgUlNBIENBLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKLSAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KLSAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+OTcwODQ5OTI4PC9YNTA5U2VyaWFsTnVtYmVyPgotICAgICAgPC9YNTA5SXNzdWVyU2VyaWFsPgotICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KLSAgICAgICAgTUlJQ2VEQ0NBZUdnQXdJQkFnSUVPZDMraURBTkJna3Foa2lHOXcwQkFRUUZBREJiTVFzd0NRWURWUVFHRXdKSgotICAgICAgICBSVEVQTUEwR0ExVUVDQk1HUkhWaWJHbHVNU1V3SXdZRFZRUUtFeHhDWVd4MGFXMXZjbVVnVkdWamFHNXZiRzluCi0gICAgICAgIGFXVnpMQ0JNZEdRdU1SUXdFZ1lEVlFRREV3dFVaWE4wSUZKVFFTQkRRVEFlRncwd01ERXdNRFl4TmpNeU1EZGEKLSAgICAgICAgRncwd01URXdNRFl4TmpNeU1EUmFNRjB4Q3pBSkJnTlZCQVlUQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eAotICAgICAgICBKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXNiMmRwWlhNc0lFeDBaQzR4RmpBVUJnTlZCQU1UCi0gICAgICAgIERVMWxjbXhwYmlCSWRXZG9aWE13Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQUxnb3JwS1kKLSAgICAgICAgRG1qcHE2dFh6MUV4OXdnRjhiaFpqNDdKa3VJNTB5c2E3OU1OU1NuRjdTZGpOMnBHbGRYZjVHcTd5WlpubXFOdAotICAgICAgICBJemN2YS92N3lzSW00ek8reGZ0MnlKSGpCQnBnQ0ZKeFhJaVpFZm9vVHUyK0hFN21KeEl2TVI3YnVJakoraGpnCi0gICAgICAgIHdhQk02aFVHSFhmS2VMNjJRYkw3T09KMDYwdktzc29XMnV1UEFnTUJBQUdqUnpCRk1CNEdBMVVkRVFRWE1CV0IKLSAgICAgICAgRTIxbGNteHBia0JpWVd4MGFXMXZjbVV1YVdVd0RnWURWUjBQQVFIL0JBUURBZ2VBTUJNR0ExVWRJd1FNTUFxQQotICAgICAgICBDRW5nclpJVmd1MDNNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBSEp1NEpWcS9XblhLMm9xcWZMV3FlczV2SE90Ci0gICAgICAgIGZYL1poQ2pGeURNaHpzbEk4YW02MmdaZWR3WjlJSVpJd2xOUk12RURRQjJ6ZHMvZUVCbklBUVBsL3lSTENMT2YKLSAgICAgICAgWm5iQThQWHJiRlA1aWdzM3FRV1NjQlVqWlZqaWs3NDhIVTJzVVZaT2E5MGMwbUpsMnZKcy9Sd3lMVzcvdUNBZgotICAgICAgICBDL0kvazl4R3I3Zm5lb0lXCi0gICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KLSAgICA8L1g1MDlEYXRhPgotICA8L0tleUluZm8+Ci08L1NpZ25hdHVyZT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGIxMzAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08IURPQ1RZUEUgU2lnbmF0dXJlIFNZU1RFTSAieG1sZHNpZy1jb3JlLXNjaGVtYS5kdGQiIFsKLTwhRU5USVRZIGRzaWcgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICAgPCFFTlRJVFkgJSBTaWduYXR1cmVQcm9wZXJ0eS5BTlkgJ3wgdHM6dGltZXN0YW1wJz4KLSAgIDwhRUxFTUVOVCB0czp0aW1lc3RhbXAgKCNQQ0RBVEEpPgotICAgPCFBVFRMSVNUIHRzOnRpbWVzdGFtcAotICAgICAgICAgICAgIHhtbG5zOnRzCUNEQVRBCSNGSVhFRCAgICdodHRwOi8vd3d3LmV4YW1wbGUub3JnL3JmYy9yZmN4eHh4LnR4dCc+Ci0gICA8IUFUVExJU1QgU2lnbmF0dXJlCi0gICAgICAgICAgICAgeG1sbnM6eHNpICBDREFUQSAjRklYRUQgICAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnCi0gICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uCUNEQVRBCSNSRVFVSVJFRD4KLV0+Ci08U2lnbmF0dXJlIElkPSJNeUZpcnN0U2lnbmF0dXJlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMKLSAgIHhtbGRzaWctY29yZS1zY2hlbWEueHNkIj4KLSAgPFNpZ25lZEluZm8+Ci0JIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9XRC14bWwtYzE0bi0yMDAwMDcxMCI+Ci0JIDwvQ2Fub25pY2FsaXphdGlvbk1ldGhvZD4KLQkgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2EiPgotCSA8L1NpZ25hdHVyZU1ldGhvZD4KLQkgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0LyI+Ci0JCTxUcmFuc2Zvcm1zPgotCQkgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjYmFzZTY0Ii8+Ci0JCSAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNudWxsIi8+Ci0JCTwvVHJhbnNmb3Jtcz4KLQkJPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIj4KLQkJPC9EaWdlc3RNZXRob2Q+Ci0JCTxEaWdlc3RWYWx1ZT5qNmx3eDNydkVQTzB2S3RNdXA0TmJlVnU4bms9PC9EaWdlc3RWYWx1ZT4KLQkgPC9SZWZlcmVuY2U+Ci0JIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyI+Ci0JCTxUcmFuc2Zvcm1zPgotCQkgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjYmFzZTY0Ii8+Ci0JCTwvVHJhbnNmb3Jtcz4KLQkJPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIj4KLQkJPC9EaWdlc3RNZXRob2Q+Ci0JCTxEaWdlc3RWYWx1ZT5VclhMRExCSXRhNnNrb1Y1L0E4UTM4R0V3NDQ9PC9EaWdlc3RWYWx1ZT4KLQkgPC9SZWZlcmVuY2U+Ci0gIDwvU2lnbmVkSW5mbz4KLSAgPFNpZ25hdHVyZVZhbHVlPk1DMENGRnJWTHRSbGtNYzNEYW9uNEJxcW5raENPbEVhQWhVQWs4cEgxaVJOSytxMUkrc2lzRFR6MlRGRUFMRT08L1NpZ25hdHVyZVZhbHVlPgotICA8S2V5SW5mbz4KLSAgICA8S2V5VmFsdWU+Ci0gICAgICA8RFNBS2V5VmFsdWU+Ci0gICAgICAgIDxQPi4uLjwvUD48UT4uLi48L1E+PEc+Li4uPC9HPjxZPi4uLjwvWT4KLSAgICAgIDwvRFNBS2V5VmFsdWU+Ci0gICAgPC9LZXlWYWx1ZT4KLSAgPC9LZXlJbmZvPgotICA8T2JqZWN0PgotICAgICA8U2lnbmF0dXJlUHJvcGVydGllcz4KLSAgICAgICAgPFNpZ25hdHVyZVByb3BlcnR5IFRhcmdldD0iI015Rmlyc3RTaWduYXR1cmUiPgotICAgICAgICAgIDx0czp0aW1lc3RhbXAgeG1sbnM6dHM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvcmZjL3JmY3h4eHgudHh0Ij4KLSAgICAgICAgICAgdGhpcyBpcyBhIHRlc3Qgb2YgdGhlIG1peGVkIGNvbnRlbnQgbW9kZWw8L3RzOnRpbWVzdGFtcD4KLSAgICAgICAgPC9TaWduYXR1cmVQcm9wZXJ0eT4KLSAgICAgIDwvU2lnbmF0dXJlUHJvcGVydGllcz4KLSAgPC9PYmplY3Q+Ci08L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS94a21zLTEuMC53c2RsIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Y2EwNWYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2OTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxkZWZpbml0aW9ucyBuYW1lPSJYTUxLZXlNYW5hZ2VtZW50IiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0geG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiCi0geG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotIHhtbG5zOnhrbXM9Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCIKLSB4bWxuczp0bnM9Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCIKLSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCI+Ci0KLSAgPHR5cGVzPgotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICAgICAgdmVyc2lvbj0iMC4xIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+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+Ci0gIDxyZXN0cmljdGlvbiBiYXNlPSJiYXNlNjRCaW5hcnkiLz4KLTwvc2ltcGxlVHlwZT4KLQotPCEtLSBFbmQgU2lnbmVkSW5mbyAtLT4KLQotPCEtLSBTdGFydCBLZXlJbmZvIC0tPgotCi08ZWxlbWVudCBuYW1lPSJLZXlJbmZvIiB0eXBlPSJkczpLZXlJbmZvVHlwZSIvPiAKLQotPGNvbXBsZXhUeXBlIG5hbWU9IktleUluZm9UeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDxzZXF1ZW5jZT4KLTwhLS0gICAgPGVsZW1lbnQgcmVmPSJkczpLZXlOYW1lIi8+ICAgICAtLT4KLSAgICA8ZWxlbWVudCByZWY9ImRzOktleU5hbWUiLz4KLSAgICA8ZWxlbWVudCByZWY9ImRzOktleVZhbHVlIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6UmV0cmlldmFsTWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6WDUwOURhdGEiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpQR1BEYXRhIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U1BLSURhdGEiLz4KLSAgICA8ZWxlbWVudCByZWY9ImRzOk1nbXREYXRhIi8+Ci0gICAgPGFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIi8+ICAKLSAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+Ci0gIDxlbGVtZW50IG5hbWU9Ik1nbXREYXRhIiB0eXBlPSJzdHJpbmciLz4KLQotICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+IAotICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5VmFsdWVUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICA8Y2hvaWNlPgotICAgICA8ZWxlbWVudCByZWY9ImRzOkRTQUtleVZhbHVlIi8+Ci0gICAgIDxlbGVtZW50IHJlZj0iZHM6UlNBS2V5VmFsdWUiLz4KLSAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L2Nob2ljZT4KLSAgPC9jb21wbGV4VHlwZT4KLQotICA8ZWxlbWVudCBuYW1lPSJSZXRyaWV2YWxNZXRob2QiIHR5cGU9ImRzOlJldHJpZXZhbE1ldGhvZFR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJSZXRyaWV2YWxNZXRob2RUeXBlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJUcmFuc2Zvcm1zIiB0eXBlPSJkczpUcmFuc2Zvcm1zVHlwZSIgbWluT2NjdXJzPSIwIi8+IAotICAgIDwvc2VxdWVuY2U+ICAKLSAgICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0iYW55VVJJIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLSAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBTdGFydCBYNTA5RGF0YSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iWDUwOURhdGEiIHR5cGU9ImRzOlg1MDlEYXRhVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJYNTA5RGF0YVR5cGUiPgotICA8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgIDxjaG9pY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyU2VyaWFsIiB0eXBlPSJkczpYNTA5SXNzdWVyU2VyaWFsVHlwZSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVNLSSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U3ViamVjdE5hbWUiIHR5cGU9InN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUNlcnRpZmljYXRlIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDUkwiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC9jaG9pY2U+Ci0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08Y29tcGxleFR5cGUgbmFtZT0iWDUwOUlzc3VlclNlcmlhbFR5cGUiPiAKLSAgPHNlcXVlbmNlPiAKLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyTmFtZSIgdHlwZT0ic3RyaW5nIi8+IAotICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTZXJpYWxOdW1iZXIiIHR5cGU9ImludGVnZXIiLz4gCi0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBYNTA5RGF0YSAtLT4KLQotPCEtLSBCZWdpbiBQR1BEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJQR1BEYXRhIiB0eXBlPSJkczpQR1BEYXRhVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJQR1BEYXRhVHlwZSI+IAotICA8Y2hvaWNlPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleUlEIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4gCi0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIi8+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+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJKIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDxlbGVtZW50IG5hbWU9IkciIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iWSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJTZWVkIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBnZW5Db3VudGVyIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICA8L3NlcXVlbmNlPgotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotCi08ZWxlbWVudCBuYW1lPSJSU0FLZXlWYWx1ZSIgdHlwZT0iZHM6UlNBS2V5VmFsdWVUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iUlNBS2V5VmFsdWVUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IG5hbWU9Ik1vZHVsdXMiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPiAKLSAgICA8ZWxlbWVudCBuYW1lPSJFeHBvbmVudCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+IAotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4gCi0KLTwhLS0gRW5kIEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+Ci0KLTwhLS0gRW5kIFNpZ25hdHVyZSAtLT4KLQotPC9zY2hlbWE+Ci0KLTxzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAiCi0geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIvPgotICAgPGVsZW1lbnQgbmFtZT0iUmVjb3ZlciIgdHlwZT0ieGttczpSZWNvdmVyVHlwZSIvPgotICAgPGVsZW1lbnQgbmFtZT0iUmV2b2tlIiB0eXBlPSJ4a21zOlJldm9rZVR5cGUiLz4KLSAgIDxlbGVtZW50IG5hbWU9IkxvY2F0ZSIgdHlwZT0ieGttczpMb2NhdGVUeXBlIi8+Ci0gICA8ZWxlbWVudCBuYW1lPSJSZWdpc3RlciIgdHlwZT0ieGttczpSZWdpc3RlclR5cGUiLz4KLSAgIDxlbGVtZW50IG5hbWU9IlZhbGlkYXRlIiB0eXBlPSJ4a21zOlZhbGlkYXRlVHlwZSIvPgotICAgPGVsZW1lbnQgbmFtZT0iUmVnaXN0ZXJSZXN1bHQiIHR5cGU9InhrbXM6UmVnaXN0ZXJSZXN1bHRUeXBlIi8+Ci0gICA8ZWxlbWVudCBuYW1lPSJSZWNvdmVyUmVzdWx0IiB0eXBlPSJ4a21zOlJlY292ZXJSZXN1bHRUeXBlIi8+Ci0gICA8ZWxlbWVudCBuYW1lPSJSZXZva2VSZXN1bHQiIHR5cGU9InhrbXM6UmV2b2tlUmVzdWx0VHlwZSIvPgotICAgPGVsZW1lbnQgbmFtZT0iTG9jYXRlUmVzdWx0IiB0eXBlPSJ4a21zOkxvY2F0ZVJlc3VsdFR5cGUiLz4KLSAgIDxlbGVtZW50IG5hbWU9IlZhbGlkYXRlUmVzdWx0IiB0eXBlPSJ4a21zOlZhbGlkYXRlUmVzdWx0VHlwZSIvPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0ZVR5cGUiPgotICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2FjdGlvbklEIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlF1ZXJ5IiB0eXBlPSJ4a21zOktleUluZm9UeXBlIi8+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc3BvbmQiIHR5cGU9InhrbXM6UmVzcG9uZFR5cGUiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0ZVJlc3VsdFR5cGUiPgotICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2FjdGlvbklEIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3VsdCIgdHlwZT0ieGttczpSZXN1bHRDb2RlVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBbnN3ZXIiIHR5cGU9InhrbXM6TG9jYXRlUmVzdWx0QW5zd2VyVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcnJvckluZm8iIHR5cGU9InhrbXM6RXJyb3JJbmZvVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+Ci0gICAgICA8L3NlcXVlbmNlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iVmFsaWRhdGVUeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlF1ZXJ5IiB0eXBlPSJ4a21zOktleUJpbmRpbmdUeXBlIi8+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc3BvbmQiIHR5cGU9InhrbXM6UmVzcG9uZFR5cGUiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkYXRlUmVzdWx0VHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZXN1bHQiIHR5cGU9InhrbXM6UmVzdWx0Q29kZVR5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQW5zd2VyIiB0eXBlPSJ4a21zOlZhbGlkYXRlUmVzdWx0QW5zd2VyVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcnJvckluZm8iIHR5cGU9InhrbXM6RXJyb3JJbmZvVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+Ci0gICAgICA8L3NlcXVlbmNlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iVmFsaWRhdGVSZXN1bHRBbnN3ZXJUeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IktleUJpbmRpbmciIHR5cGU9InhrbXM6S2V5QmluZGluZ1R5cGUiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcm90b3R5cGUiIHR5cGU9InhrbXM6S2V5QmluZGluZ1R5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF1dGhJbmZvIiB0eXBlPSJ4a21zOkF1dGhJbmZvVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVzcG9uZCIgdHlwZT0ieGttczpSZXNwb25kVHlwZSIvPgotICAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUmVnaXN0ZXJSZXN1bHRUeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3VsdCIgdHlwZT0ieGttczpSZXN1bHRDb2RlVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBbnN3ZXIiIHR5cGU9InhrbXM6UmVnaXN0ZXJSZXN1bHRBbnN3ZXJUeXBlIi8+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaXZhdGUiIHR5cGU9InhrbXM6UHJpdmF0ZVR5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JJbmZvIiB0eXBlPSJ4a21zOkVycm9ySW5mb1R5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiByZWY9ImRzOlNpZ25hdHVyZSIvPgotICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyUmVzdWx0QW5zd2VyVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJLZXlCaW5kaW5nIiB0eXBlPSJ4a21zOktleUJpbmRpbmdUeXBlIi8+Ci0gICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZWNvdmVyVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXIiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlY292ZXJSZXN1bHRUeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IHJlZj0ieGttczpSZWdpc3RlclJlc3VsdCIvPgotICAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUmV2b2tlVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXIiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iUHJpdmF0ZVR5cGUiPgotICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPGFueSBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiICAKLQkgICAgICBtaW5PY2N1cnM9IjAiIG5hbWVzcGFjZT0iIyNhbnkiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L2NvbXBsZXhUeXBlPgotCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iUmV2b2tlUmVzdWx0VHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXJSZXN1bHQiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVycm9ySW5mb1R5cGUiPgotICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRXJyb3JEZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9yQWN0b3IiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcnJvckRldGFpbCIgdHlwZT0ieGttczpFcnJvckRldGFpbFR5cGUiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yQ29kZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVycm9yRGV0YWlsVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJzdHJpY3QiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJzdHJpY3QiLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8c2ltcGxlVHlwZSBuYW1lPSJFcnJvckNvZGVUeXBlIj4KLSAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnQiLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmVyIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudC5NYWxmb3JtZWRLZXlOYW1lUGFzc2VkIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudC5JbnZhbGlkUGFzc1BocmFzZUF1dGgiLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iKiIvPgotICAgICAgPC9yZXN0cmljdGlvbj4KLSAgIDwvc2ltcGxlVHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJLZXlCaW5kaW5nVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zYWN0aW9uSUQiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdHVzIiB0eXBlPSJ4a21zOkFzc2VydGlvblN0YXR1c1R5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUlEIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkczpLZXlJbmZvIi8+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhc3NQaHJhc2UiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9jZXNzSW5mbyIgdHlwZT0ieGttczpQcm9jZXNzSW5mb1R5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVmFsaWRpdHlJbnRlcnZhbCIgdHlwZT0ieGttczpWYWxpZGl0eUludGVydmFsVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iS2V5VXNhZ2UiIHR5cGU9InhrbXM6S2V5VXNhZ2VUeXBlIi8+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaXZhdGUiIHR5cGU9InhrbXM6UHJpdmF0ZVR5cGUiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJLZXlJbmZvVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCByZWY9ImRzOktleUluZm8iLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlc3BvbmRUeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cmluZyIgdHlwZT0ieGttczpSZXNwb25kRW51bSIvPgotICAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8c2ltcGxlVHlwZSBuYW1lPSJSZXNwb25kRW51bSI+Ci0gICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iS2V5TmFtZSIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJLZXlWYWx1ZSIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJYNTA5Q2VydCIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJYNTA5Q2hhaW4iLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iWDUwOUNSTCIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJPQ1NQIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlJldHJpZXZhbE1ldGhvZCIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNZ210RGF0YSIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQR1BEYXRhIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBHUFdlYiIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJTUEtJRGF0YSIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZSIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkaXR5SW50ZXJ2YWwiLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iS2V5VXNhZ2UiLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25lZFJlc3VsdCIvPgotICAgICAgPC9yZXN0cmljdGlvbj4KLSAgIDwvc2ltcGxlVHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJMb2NhdGVSZXN1bHRBbnN3ZXJUeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6S2V5SW5mbyIvPgotICAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8c2ltcGxlVHlwZSBuYW1lPSJSZXN1bHRDb2RlVHlwZSI+Ci0gICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2VzcyIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJOb01hdGNoIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvdW5kIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkluY29tcGxldGUiLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZSIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1c2VkIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmciLz4KLSAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICA8L3NpbXBsZVR5cGU+Ci0gICA8c2ltcGxlVHlwZSBuYW1lPSJBc3NlcnRpb25TdGF0dXNUeXBlIj4KLSAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZCIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJbnZhbGlkIi8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkluZGV0ZXJtaW5hdGUiLz4KLSAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICA8L3NpbXBsZVR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0luZm9UeXBlIj4KLSAgICAgIDxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIi8+Ci0gICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGl0eUludGVydmFsVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5vdEJlZm9yZSIgdHlwZT0idGltZUluc3RhbnQiLz4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90QWZ0ZXIiIHR5cGU9InRpbWVJbnN0YW50Ii8+Ci0gICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxzaW1wbGVUeXBlIG5hbWU9IktleVVzYWdlVHlwZSI+Ci0gICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRW5jcnlwdGlvbiIvPgotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmUiLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2UiLz4KLSAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICA8L3NpbXBsZVR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQXV0aEluZm9UeXBlIj4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJBdXRoVXNlckluZm8iIHR5cGU9InhrbXM6QXV0aFVzZXJJbmZvVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXV0aFNlcnZlckluZm8iIHR5cGU9InhrbXM6QXV0aFNlcnZlckluZm9UeXBlIi8+Ci0gICAgICA8L2Nob2ljZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUHJvb2ZPZlBvc3Nlc3Npb25UeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IktleUJpbmRpbmdBdXRoVHlwZSI+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+Ci0gICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBdXRoVXNlckluZm9UeXBlIj4KLSAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvb2ZPZlBvc3Nlc3Npb24iIHR5cGU9InhrbXM6UHJvb2ZPZlBvc3Nlc3Npb25UeXBlIi8+Ci0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUJpbmRpbmdBdXRoIiB0eXBlPSJ4a21zOktleUJpbmRpbmdBdXRoVHlwZSIvPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXNzUGhyYXNlQXV0aCIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBdXRoU2VydmVySW5mb1R5cGUiPgotICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJLZXlCaW5kaW5nQXV0aCIgdHlwZT0ieGttczpLZXlCaW5kaW5nQXV0aFR5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFzc1BocmFzZUF1dGgiIHR5cGU9InN0cmluZyIvPgotICAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci08L3NjaGVtYT4KLSAgPC90eXBlcz4KLQotICA8bWVzc2FnZSBuYW1lPSJSZWdpc3RlciI+Ci0gICAgPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0ieGttczpSZWdpc3RlciIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iUmVnaXN0ZXJSZXN1bHQiPgotICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6UmVnaXN0ZXJSZXN1bHQiLz4KLSAgPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIG5hbWU9IlZhbGlkYXRlIj4KLSAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOlZhbGlkYXRlIi8+Ci0gIDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBuYW1lPSJWYWxpZGF0ZVJlc3VsdCI+Ci0gICAgPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0ieGttczpWYWxpZGF0ZVJlc3VsdCIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iTG9jYXRlIj4KLSAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOkxvY2F0ZSIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iTG9jYXRlUmVzdWx0Ij4KLSAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOkxvY2F0ZVJlc3VsdCIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPHBvcnRUeXBlIG5hbWU9IktleVNlcnZpY2VQb3J0VHlwZSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJSZWdpc3RlciI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyIi8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlclJlc3VsdCIvPgotCTxmYXVsdCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXJSZXN1bHQiLz4KLSAgICA8L29wZXJhdGlvbj4KLQotICAgIDxvcGVyYXRpb24gbmFtZT0iVmFsaWRhdGUiPgotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZSIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGVSZXN1bHQiLz4KLQk8ZmF1bHQgbWVzc2FnZT0idG5zOlZhbGlkYXRlUmVzdWx0Ii8+Ci0gICAgPC9vcGVyYXRpb24+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkxvY2F0ZSI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOkxvY2F0ZSIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ii8+Ci0JPGZhdWx0IG1lc3NhZ2U9InRuczpMb2NhdGVSZXN1bHQiLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9wb3J0VHlwZT4KLQotICA8YmluZGluZyBuYW1lPSJLZXlTZXJ2aWNlU29hcEJpbmRpbmciIHR5cGU9InRuczpLZXlTZXJ2aWNlUG9ydFR5cGUiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJSZWdpc3RlciI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwI1JlZ2lzdGVyIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXIiPgotICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlclJlc3VsdCI+Ci0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlZhbGlkYXRlIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAjVmFsaWRhdGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZSI+Ci0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlUmVzdWx0Ij4KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLQotICAgIDxvcGVyYXRpb24gbmFtZT0iTG9jYXRlIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAjTG9jYXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlIj4KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ij4KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9iaW5kaW5nPgotCi0gIDxiaW5kaW5nIG5hbWU9IktleVNlcnZpY2VIdHRwUG9zdEJpbmRpbmciIHR5cGU9InRuczpLZXlTZXJ2aWNlUG9ydFR5cGUiPgotICAgIDxodHRwOmJpbmRpbmcgdmVyYj0iUE9TVCIvPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJSZWdpc3RlciI+Ci0gICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249InhrbXMvQWNjZXB0b3IubmFubyIvPgotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlciI+Ci0gICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXJSZXN1bHQiPgotICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlZhbGlkYXRlIj4KLSAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0ieGttcy9BY2NlcHRvci5uYW5vIi8+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlIj4KLSAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0cz0iYm9keSIgdHlwZT0idGV4dC94bWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZVJlc3VsdCI+Ci0gICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLQotICAgIDxvcGVyYXRpb24gbmFtZT0iTG9jYXRlIj4KLSAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0ieGttcy9BY2NlcHRvci5uYW5vIi8+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOkxvY2F0ZSI+Ci0gICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ij4KLSAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0cz0iYm9keSIgdHlwZT0idGV4dC94bWwiLz4KLSAgICAgIDwvb3V0cHV0PgotICAgIDwvb3BlcmF0aW9uPgotICA8L2JpbmRpbmc+Ci0KLSAgPHNlcnZpY2UgbmFtZT0iWE1MS2V5TWFuYWdlbWVudFNlcnZpY2UiPgotCTxkb2N1bWVudGF0aW9uPlZlcmlzaWduJ3MgWE1MIEtleSBNYW5hZ2VtZW50IFNlcnZpY2UgKFhLTVMpPC9kb2N1bWVudGF0aW9uPgotCi0gICAgPHBvcnQgbmFtZT0iS2V5U2VydmljZVNvYXBQb3J0IiBiaW5kaW5nPSJ0bnM6S2V5U2VydmljZVNvYXBCaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly94a21zLnZlcmlzaWduLmNvbS94a21zL0FjY2VwdG9yLm5hbm8iLz4KLSAgICA8L3BvcnQ+Ci0KLSAgICA8cG9ydCBuYW1lPSJLZXlTZXJ2aWNlSHR0cFBvc3RQb3J0IiBiaW5kaW5nPSJ0bnM6S2V5U2VydmljZUh0dHBQb3N0QmluZGluZyI+Ci0gICAgICA8aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8veGttcy52ZXJpc2lnbi5jb20vIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci0KLSAgPHNlcnZpY2UgbmFtZT0iUGlsb3RYTUxLZXlNYW5hZ2VtZW50U2VydmljZSI+Ci0JPGRvY3VtZW50YXRpb24+VmVyaXNpZ24ncyBQaWxvdCBYTUwgS2V5IE1hbmFnZW1lbnQgU2VydmljZSAoWEtNUyk8L2RvY3VtZW50YXRpb24+Ci0KLSAgICA8cG9ydCBuYW1lPSJLZXlTZXJ2aWNlU29hcFBvcnQiIGJpbmRpbmc9InRuczpLZXlTZXJ2aWNlU29hcEJpbmRpbmciPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3BpbG90LXhrbXMudmVyaXNpZ24uY29tL3hrbXMvQWNjZXB0b3IubmFubyIvPgotICAgIDwvcG9ydD4KLQotICAgIDxwb3J0IG5hbWU9IktleVNlcnZpY2VIdHRwUG9zdFBvcnQiIGJpbmRpbmc9InRuczpLZXlTZXJ2aWNlSHR0cFBvc3RCaW5kaW5nIj4KLSAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9waWxvdC14a21zLnZlcmlzaWduLmNvbS8iLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDgwYzAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IURPQ1RZUEUgc2NoZW1hCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU2NoZW1hIDIwMDEwMi8vRU4iICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS5kdGQiCi0gWwotICAgPCFBVFRMSVNUIHNjaGVtYQotICAgICB4bWxuczpkcyBDREFUQSAjRklYRUQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICAgPCFFTlRJVFkgZHNpZyAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+Ci0gICA8IUVOVElUWSAlIHAgJyc+Ci0gICA8IUVOVElUWSAlIHMgJyc+Ci0gIF0+Ci0KLTwhLS0gU2NoZW1hIGZvciBYTUwgU2lnbmF0dXJlcwotICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMKLSAgICAkUmV2aXNpb246IDEuMyAkIG9uICREYXRlOiAyMDA0LzA0LzA2IDE5OjU1OjEyICQgYnkgJEF1dGhvcjogY2V6YXIgJAotCi0gICAgQ29weXJpZ2h0IDIwMDEgVGhlIEludGVybmV0IFNvY2lldHkgYW5kIFczQyAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUKLSAgICBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuCi0gICAgQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KLQotICAgIFRoaXMgZG9jdW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBhcyBkZXNjcmliZWQKLSAgICBpbiB0aGUgRkFRIFsyXS4KLQotICAgIFsxXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAotICAgIFsyXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQKLS0tPgotCi0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotICAgICAgICB2ZXJzaW9uPSIwLjEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPgotCi08c2ltcGxlVHlwZSBuYW1lPSJDcnlwdG9CaW5hcnkiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KLSAgPC9yZXN0cmljdGlvbj4KLTwvc2ltcGxlVHlwZT4KLQotPCEtLSBTdGFydCBTaWduYXR1cmUgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduZWRJbmZvIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVWYWx1ZSIvPgotICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpPYmplY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgPC9zZXF1ZW5jZT4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlVmFsdWUiIHR5cGU9ImRzOlNpZ25hdHVyZVZhbHVlVHlwZSIvPgotICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlVmFsdWVUeXBlIj4KLSAgICA8c2ltcGxlQ29udGVudD4KLSAgICAgIDxleHRlbnNpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgIDwvc2ltcGxlQ29udGVudD4KLSAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBTdGFydCBTaWduZWRJbmZvIC0tPgotCi08ZWxlbWVudCBuYW1lPSJTaWduZWRJbmZvIiB0eXBlPSJkczpTaWduZWRJbmZvVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25lZEluZm9UeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IHJlZj0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCIvPgotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlTWV0aG9kIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci08L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IkNhbm9uaWNhbGl6YXRpb25NZXRob2QiIHR5cGU9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPCEtLSAoMCx1bmJvdW5kZWQpIGVsZW1lbnRzIGZyb20gKDEsMSkgbmFtZXNwYWNlIC0tPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICA8L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZU1ldGhvZCIgdHlwZT0iZHM6U2lnbmF0dXJlTWV0aG9kVHlwZSIvPgotICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlTWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IkhNQUNPdXRwdXRMZW5ndGgiIG1pbk9jY3Vycz0iMCIgdHlwZT0iZHM6SE1BQ091dHB1dExlbmd0aFR5cGUiLz4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8IS0tICgwLHVuYm91bmRlZCkgZWxlbWVudHMgZnJvbSAoMSwxKSBleHRlcm5hbCBuYW1lc3BhY2UgLS0+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPgotCi08ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9ImRzOlJlZmVyZW5jZVR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpEaWdlc3RNZXRob2QiLz4KLSAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdFZhbHVlIi8+Ci0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtcyIgdHlwZT0iZHM6VHJhbnNmb3Jtc1R5cGUiLz4KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybXNUeXBlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3NlcXVlbmNlPgotICA8L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPgotICA8Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmb3JtVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMCx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYUGF0aCIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgPC9jaG9pY2U+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICA8L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBSZWZlcmVuY2UgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IkRpZ2VzdE1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci08L2NvbXBsZXhUeXBlPgotCi08ZWxlbWVudCBuYW1lPSJEaWdlc3RWYWx1ZSIgdHlwZT0iZHM6RGlnZXN0VmFsdWVUeXBlIi8+Ci08c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ii8+Ci08L3NpbXBsZVR5cGU+Ci0KLTwhLS0gRW5kIFNpZ25lZEluZm8gLS0+Ci0KLTwhLS0gU3RhcnQgS2V5SW5mbyAtLT4KLQotPGVsZW1lbnQgbmFtZT0iS2V5SW5mbyIgdHlwZT0iZHM6S2V5SW5mb1R5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJLZXlJbmZvVHlwZSIgbWl4ZWQ9InRydWUiPgotICA8Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8ZWxlbWVudCByZWY9ImRzOktleU5hbWUiLz4KLSAgICA8ZWxlbWVudCByZWY9ImRzOktleVZhbHVlIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpSZXRyaWV2YWxNZXRob2QiLz4KLSAgICA8ZWxlbWVudCByZWY9ImRzOlg1MDlEYXRhIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpQR1BEYXRhIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpTUEtJRGF0YSIvPgotICAgIDxlbGVtZW50IHJlZj0iZHM6TWdtdERhdGEiLz4KLSAgICA8YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiLz4KLSAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgotICA8L2Nob2ljZT4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+Ci0gIDxlbGVtZW50IG5hbWU9Ik1nbXREYXRhIiB0eXBlPSJzdHJpbmciLz4KLQotICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJLZXlWYWx1ZVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgIDxjaG9pY2U+Ci0gICAgIDxlbGVtZW50IHJlZj0iZHM6RFNBS2V5VmFsdWUiLz4KLSAgICAgPGVsZW1lbnQgcmVmPSJkczpSU0FLZXlWYWx1ZSIvPgotICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwvY2hvaWNlPgotICA8L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlJldHJpZXZhbE1ldGhvZCIgdHlwZT0iZHM6UmV0cmlldmFsTWV0aG9kVHlwZSIvPgotICA8Y29tcGxleFR5cGUgbmFtZT0iUmV0cmlldmFsTWV0aG9kVHlwZSI+Ci0gICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPgotICA8L2NvbXBsZXhUeXBlPgotCi08IS0tIFN0YXJ0IFg1MDlEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJYNTA5RGF0YSIgdHlwZT0iZHM6WDUwOURhdGFUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iWDUwOURhdGFUeXBlIj4KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8Y2hvaWNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3VlclNlcmlhbCIgdHlwZT0iZHM6WDUwOUlzc3VlclNlcmlhbFR5cGUiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVN1YmplY3ROYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDZXJ0aWZpY2F0ZSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwvY2hvaWNlPgotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlJc3N1ZXJOYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+Ci0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBYNTA5RGF0YSAtLT4KLQotPCEtLSBCZWdpbiBQR1BEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJQR1BEYXRhIiB0eXBlPSJkczpQR1BEYXRhVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlBHUERhdGFUeXBlIj4KLSAgPGNob2ljZT4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLSAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5UGFja2V0IiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgPC9jaG9pY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBQR1BEYXRhIC0tPgotCi08IS0tIEJlZ2luIFNQS0lEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iU1BLSURhdGFUeXBlIj4KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8ZWxlbWVudCBuYW1lPSJTUEtJU2V4cCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiLz4KLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIFNQS0lEYXRhIC0tPgotCi08IS0tIEVuZCBLZXlJbmZvIC0tPgotCi08IS0tIFN0YXJ0IE9iamVjdCAoTWFuaWZlc3QsIFNpZ25hdHVyZVByb3BlcnR5KSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iT2JqZWN0IiB0eXBlPSJkczpPYmplY3RUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPGFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgotICA8YXR0cmlidXRlIG5hbWU9Ik1pbWVUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4gPCEtLSBhZGQgYSBncmVwIGZhY2V0IC0tPgotICA8YXR0cmlidXRlIG5hbWU9IkVuY29kaW5nIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLTwvY29tcGxleFR5cGU+Ci0KLTxlbGVtZW50IG5hbWU9Ik1hbmlmZXN0IiB0eXBlPSJkczpNYW5pZmVzdFR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJNYW5pZmVzdFR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci08L2NvbXBsZXhUeXBlPgotCi08ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0aWVzIiB0eXBlPSJkczpTaWduYXR1cmVQcm9wZXJ0aWVzVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlUHJvcGVydHkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci08L2NvbXBsZXhUeXBlPgotCi0gICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eSIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydHlUeXBlIi8+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHlUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMSx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gICAgIDwvY2hvaWNlPgotICAgICA8YXR0cmlidXRlIG5hbWU9IlRhcmdldCIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICA8L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBPYmplY3QgKE1hbmlmZXN0LCBTaWduYXR1cmVQcm9wZXJ0eSkgLS0+Ci0KLTwhLS0gU3RhcnQgQWxnb3JpdGhtIFBhcmFtZXRlcnMgLS0+Ci0KLTxzaW1wbGVUeXBlIG5hbWU9IkhNQUNPdXRwdXRMZW5ndGhUeXBlIj4KLSAgPHJlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiLz4KLTwvc2ltcGxlVHlwZT4KLQotPCEtLSBTdGFydCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPgotCi08ZWxlbWVudCBuYW1lPSJEU0FLZXlWYWx1ZSIgdHlwZT0iZHM6RFNBS2V5VmFsdWVUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iRFNBS2V5VmFsdWVUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPGVsZW1lbnQgbmFtZT0iUCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJRIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxlbGVtZW50IG5hbWU9IkciIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iWSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iSiIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlNlZWQiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iUGdlbkNvdW50ZXIiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgIDwvc2VxdWVuY2U+Ci0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08ZWxlbWVudCBuYW1lPSJSU0FLZXlWYWx1ZSIgdHlwZT0iZHM6UlNBS2V5VmFsdWVUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iUlNBS2V5VmFsdWVUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IG5hbWU9Ik1vZHVsdXMiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgIDxlbGVtZW50IG5hbWU9IkV4cG9uZW50IiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+Ci0KLTwhLS0gRW5kIFNpZ25hdHVyZSAtLT4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDI3YzUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9BZGRfQWNjdFNpZWJlbDcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPCEtLSBlZGl0ZWQgd2l0aCBYTUwgU3B5IHY0LjQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKSAtLT4KLTw/U2llYmVsLVByb3BlcnR5LVNldCBFc2NhcGVOYW1lcz0iZmFsc2UiPz4KLTxTaWViZWxNZXNzYWdlIE1lc3NhZ2VJZD0iMS1OIiBJbnRPYmplY3RGb3JtYXQ9IlNpZWJlbCBIaWVyYXJjaGljYWwiIE1lc3NhZ2VUeXBlPSJJbnRlZ3JhdGlvbiBPYmplY3QiIEludE9iamVjdE5hbWU9IlNhbXBsZSBBY2NvdW50IiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iRjpcQWRhcHRlcnNcc2llYmVsXEFkZF9BY2N0U2llYmVsN18xLnhzZCI+Ci0JPExpc3RPZlNhbXBsZUFjY291bnQ+Ci0JCTxBY2NvdW50PgotCQkJPEN1bHR1cmUvPgotCQkJPEN1cnJlbmN5Q29kZT5VU0Q8L0N1cnJlbmN5Q29kZT4KLQkJCTxEZXNjcmlwdGlvbi8+Ci0JCQk8RGl2aXNpb24vPgotCQkJPEhvbWVQYWdlLz4KLQkJCTxJbnRlZ3JhdGlvbklkLz4KLQkJCTxMaW5lb2ZCdXNpbmVzcy8+Ci0JCQk8TG9jYXRpb24vPgotCQkJPE5hbWU+RGVtbzwvTmFtZT4KLQkJCTxQcm9qZWN0TmFtZS8+Ci0JCQk8VHlwZT5Db21tZXJjaWFsPC9UeXBlPgotCQkJPExpc3RPZkFjY291bnRfT3JnYW5pemF0aW9uPgotCQkJCTxBY2NvdW50X09yZ2FuaXphdGlvbiBJc1ByaW1hcnlNVkc9IlkiPgotCQkJCQk8SW50ZWdyYXRpb25JZC8+Ci0JCQkJCTxPcmdhbml6YXRpb24+RGVmYXVsdCBPcmdhbml6YXRpb248L09yZ2FuaXphdGlvbj4KLQkJCQk8L0FjY291bnRfT3JnYW5pemF0aW9uPgotCQkJPC9MaXN0T2ZBY2NvdW50X09yZ2FuaXphdGlvbj4KLQkJCTxMaXN0T2ZBY2NvdW50QXR0YWNobWVudC8+Ci0JCQk8TGlzdE9mQnVzaW5lc3NBZGRyZXNzPgotCQkJCTxCdXNpbmVzc0FkZHJlc3M+Ci0JCQkJCTxBZGRyZXNzTmFtZT5OWTwvQWRkcmVzc05hbWU+Ci0JCQkJCTxDaXR5Pk5ZPC9DaXR5PgotCQkJCQk8Q291bnRyeT5VU0E8L0NvdW50cnk+Ci0JCQkJCTxGYXhOdW1iZXI+OTg3NjU0MzIxMTwvRmF4TnVtYmVyPgotCQkJCQk8SW50ZWdyYXRpb25JZC8+Ci0JCQkJCTxQaG9uZU51bWJlcj4xMjM0NTY3ODkwPC9QaG9uZU51bWJlcj4KLQkJCQkJPFBvc3RhbENvZGU+MDczMDE8L1Bvc3RhbENvZGU+Ci0JCQkJCTxQcm92aW5jZS8+Ci0JCQkJCTxTdGF0ZT5OWTwvU3RhdGU+Ci0JCQkJCTxTdHJlZXRBZGRyZXNzPjIgTWFkaXNpb24gU3F1YXJlPC9TdHJlZXRBZGRyZXNzPgotCQkJCTwvQnVzaW5lc3NBZGRyZXNzPgotCQkJPC9MaXN0T2ZCdXNpbmVzc0FkZHJlc3M+Ci0JCQk8TGlzdE9mQ29udGFjdC8+Ci0JCTwvQWNjb3VudD4KLQk8L0xpc3RPZlNhbXBsZUFjY291bnQ+Ci08L1NpZWJlbE1lc3NhZ2U+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NjZiNmYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9BZGRfQWNjdFNpZWJlbDcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0JPHhzZDplbGVtZW50IG5hbWU9IlNpZWJlbE1lc3NhZ2UiPgotCSAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0JCQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTYW1wbGVBY2NvdW50IiB0eXBlPSJMaXN0T2ZTYW1wbGVBY2NvdW50X3R5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Ik1lc3NhZ2VJZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iTWVzc2FnZVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IkludE9iamVjdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIGZpeGVkPSJTYW1wbGUgQWNjb3VudCIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSW50T2JqZWN0Rm9ybWF0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNhbXBsZUFjY291bnRfdHlwZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50IiB0eXBlPSJBY2NvdW50X3R5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudF90eXBlIj4KLQkJIDx4c2Q6c2VxdWVuY2U+Ci0JCQkJPCEtLXhzZDplbGVtZW50IG5hbWU9IlN5c3RlbSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8tLT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ3VsdHVyZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5Q29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGl2aXNpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb21lUGFnZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkxpbmVvZkJ1c2luZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkFjY291bnRfT3JnYW5pemF0aW9uIiB0eXBlPSJMaXN0T2ZBY2NvdW50X09yZ2FuaXphdGlvbl90eXBlIiBtaW5PY2N1cnM9IjAiLz4KLQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBY2NvdW50QXR0YWNobWVudCIgdHlwZT0iTGlzdE9mQWNjb3VudEF0dGFjaG1lbnRfdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLXhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkFjY291bnRBdHRhY2htZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLy0tPgotCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkJ1c2luZXNzQWRkcmVzcyIgdHlwZT0iTGlzdE9mQnVzaW5lc3NBZGRyZXNzX3R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRhY3QiIHR5cGU9Ikxpc3RPZkNvbnRhY3RfdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLXhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvLS0+Ci0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU3ViQWNjb3VudCIgdHlwZT0iTGlzdE9mU3ViQWNjb3VudF90eXBlIiBtaW5PY2N1cnM9IjAiLz4KLQkJICA8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQWNjb3VudF9Pcmdhbml6YXRpb25fdHlwZSI+Ci0JICAJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudF9Pcmdhbml6YXRpb24iIHR5cGU9IkFjY291bnRfT3JnYW5pemF0aW9uX3R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQWNjb3VudEF0dGFjaG1lbnRfdHlwZSI+Ci0JCSAgPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudEF0dGFjaG1lbnQiIHR5cGU9IkFjY291bnRBdHRhY2htZW50X3R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJICA8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0JICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkJ1c2luZXNzQWRkcmVzc190eXBlIj4KLQkJICA8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCdXNpbmVzc0FkZHJlc3MiIHR5cGU9IkJ1c2luZXNzQWRkcmVzc190eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCSAgPC94c2Q6c2VxdWVuY2U+Ci0JICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0X3R5cGUiPgotCSAgCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHR5cGU9IkNvbnRhY3RfdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0X0J1c2luZXNzQWRkcmVzc190eXBlIj4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RfQnVzaW5lc3NBZGRyZXNzIiB0eXBlPSJDb250YWN0X0J1c2luZXNzQWRkcmVzc190eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0JICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN1YkFjY291bnRfdHlwZSI+Ci0JCSA8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJBY2NvdW50IiB0eXBlPSJTdWJBY2NvdW50X3R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJIDwveHNkOnNlcXVlbmNlPgotCSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudEF0dGFjaG1lbnRfdHlwZSIgPgotCQkgIDx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjY250RmlsZUV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjY250RmlsZU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudElkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJICA8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0JIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudF9Pcmdhbml6YXRpb25fdHlwZSI+Ci0JCSA8eHNkOnNlcXVlbmNlPgotCQkJIDx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCSA8eHNkOmVsZW1lbnQgbmFtZT0iT3JnYW5pemF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJIDwveHNkOnNlcXVlbmNlPgotCQkgPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNQcmltYXJ5TVZHIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotCSA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJ1c2luZXNzQWRkcmVzc190eXBlIj4KLQkJIDx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZHJlc3NOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2l0eSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvdW50cnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGYXhOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGhvbmVOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0YWxDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvdmluY2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmVldEFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0X3R5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDZWxsdWxhclBob25lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbWVudDIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaXJzdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb21lUGhvbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSm9iVGl0bGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMYXN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1pZGRsZU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcmdhbml6YXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJzb25hbENvbnRhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0X0J1c2luZXNzQWRkcmVzcyIgdHlwZT0iTGlzdE9mQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0X0J1c2luZXNzQWRkcmVzc190eXBlIj4KLQkJIDx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3VudHJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGFsQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyZWV0QWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmVldEFkZHJlc3MyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkcmVzc05hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNQcmltYXJ5TVZHIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3ViQWNjb3VudF90eXBlIj4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ3JlYXRlZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlVwZGF0ZWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25mbGljdElkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTW9kSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50U3RhdHVzMiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsaWFzMiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcmVhQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRDb3VudHJ5Q29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNTTjIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wZXRpdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ3VycmVuY3lDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXZpc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikdyb3VwVHlwZUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcm5hbE9yZ0ZsYWciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluRmF4TnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpblBob25lTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcmVudEFjY291bnREaXZpc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcmVudEFjY291bnRJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcmVudEFjY291bnRMb2NhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcmVudEFjY291bnRMb2NhdGlvbkxldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJlbnRBY2NvdW50UmVnaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlUeXBlQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5VUlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeUluZHVzdHJ5SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5T3JnYW5pemF0aW9uSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5UG9zaXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlTZXJ2aWNlQWdyZWVtZW50SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5U3lub255bUlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVnaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUy1TSW5zdGFuY2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTLVNJbnN0YW5jZUlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUy1TS2V5SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIAk8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3JlcXVlc3QueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9BZGRDdXN0b21lcl9yZXF1ZXN0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiNWFmOS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3JlcXVlc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iSW5wdXQiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRklSU1ROQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMQVNUTkFNRSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRE9CIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3Jlc3BvbnNlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvREJNUzFfQWRkQ3VzdG9tZXJfcmVzcG9uc2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGI0ZmNlLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvREJNUzFfQWRkQ3VzdG9tZXJfcmVzcG9uc2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iUm93c0FmZmVjdGVkIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvREJNUzFfR2V0QWxsQ3VzdG9tZXJzX3Jlc3BvbnNlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvREJNUzFfR2V0QWxsQ3VzdG9tZXJzX3Jlc3BvbnNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzZTNkZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0dldEFsbEN1c3RvbWVyc19yZXNwb25zZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJSb3dzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJvdyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBRERSRVNTMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUREUkVTUzIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFERFJFU1MzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDSVRZIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT1VOVFJZIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJET0IiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRU1BSUwiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZBWCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRklSU1ROQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMQVNUTkFNRSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTUlERExFTkFNRSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEhPTkUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBPU1RBTENPREUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hJUEFBMjcwLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWNkYzVjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+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+Ci0gIDwvSUVBPgotPC9ISVBBQTI3MD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hJUEFBMjcwLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmM3OGNlLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLQotCi08eHNkOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRNR1R5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0RhdGVfVGltZV9QZXJpb2RfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0dlbmRlcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRUUFR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9EYXRlX1RpbWVfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0RhdGVfVGltZV9QZXJpb2RfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRVFUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfU2VydmljZV9UeXBlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0NvbXBvc2l0ZV9NZWRpY2FsX1Byb2NlZHVyZV9JZGVudGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19Db3ZlcmFnZV9MZXZlbF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9JbnN1cmFuY2VfVHlwZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iR0UiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX051bWJlcl9vZl9UcmFuc2FjdGlvbl9TZXRzX0luY2x1ZGVkXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfR3JvdXBfQ29udHJvbF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iR1MiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0Z1bmN0aW9uYWxfSWRlbnRpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfQXBwbGljYXRpb25fU2VuZGVyc19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfQXBwbGljYXRpb25fUmVjZWl2ZXJzX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iXzA0X0RhdGVfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iXzA1X1RpbWVfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9Hcm91cF9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA3X1Jlc3BvbnNpYmxlX0FnZW5jeV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfVmVyc2lvbl9fUmVsZWFzZV9fSW5kdXN0cnlfSWRlbnRpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkhJUEFBMjcwIj4KLQkJPHhzZDpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IklTQSIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkdTIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iXzI3MCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkdFIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iSUVBIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhMVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0hpZXJhcmNoaWNhbF9JRF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJJRUEiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX051bWJlcl9vZl9JbmNsdWRlZF9GdW5jdGlvbmFsX0dyb3Vwc18iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJSUlUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfQ29kZV9MaXN0X1F1YWxpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9JbmR1c3RyeV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IklOU1R5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9ZZXNfTm9fQ29uZGl0aW9uX29yX1Jlc3BvbnNlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0luZGl2aWR1YWxfUmVsYXRpb25zaGlwX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX01haW50ZW5hbmNlX1R5cGVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfTWFpbnRlbmFuY2VfUmVhc29uX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA1X0JlbmVmaXRfU3RhdHVzX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X01lZGljYXJlX1N0YXR1c19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wN19Db25zb2xpZGF0ZWRfT21uaWJ1c19CdWRnZXRfUmVjb25jaWxpYXRpb25fQWN0X19DT0JSQV9fUXVhbGlmeWluZ19FdmVudF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOF9FbXBsb3ltZW50X1N0YXR1c19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOV9TdHVkZW50X1N0YXR1c19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMF9ZZXNfTm9fQ29uZGl0aW9uX29yX1Jlc3BvbnNlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzExX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTJfRGF0ZV9UaW1lX1BlcmlvZF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTNfQ29uZmlkZW50aWFsaXR5X0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE0X0NpdHlfTmFtZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTVfU3RhdGVfb3JfUHJvdmluY2VfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTZfQ291bnRyeV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xN19OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJJU0EiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0F1dGhvcml6YXRpb25fSW5mb3JtYXRpb25fUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfQXV0aG9yaXphdGlvbl9JbmZvcm1hdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX1NlY3VyaXR5X0luZm9ybWF0aW9uX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X1NlY3VyaXR5X0luZm9ybWF0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDVfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDZfSW50ZXJjaGFuZ2VfU2VuZGVyX0lEXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDdfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfSW50ZXJjaGFuZ2VfUmVjZWl2ZXJfSURfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOV9JbnRlcmNoYW5nZV9EYXRlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTBfSW50ZXJjaGFuZ2VfVGltZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzExX1JlcGV0aXRpb25fU2VwYXJhdG9yXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTJfSW50ZXJjaGFuZ2VfQ29udHJvbF9WZXJzaW9uX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEzX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTRfQWNrbm93bGVkZ2VtZW50X1JlcXVlc3RlZF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE1X1VzYWdlX0luZGljYXRvcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE2X0NvbXBvbmVudF9FbGVtZW50X1NlcGFyYXRvcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTjNUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfQWRkcmVzc19JbmZvcm1hdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfQWRkcmVzc19JbmZvcm1hdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJONFR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9DaXR5X05hbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX1Bvc3RhbF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9Db3VudHJ5X0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTk0xVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfTmFtZV9MYXN0X29yX09yZ2FuaXphdGlvbl9OYW1lXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9OYW1lX0ZpcnN0XyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNV9OYW1lX01pZGRsZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDZfTmFtZV9QcmVmaXhfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA3X05hbWVfU3VmZml4XyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOF9JZGVudGlmaWNhdGlvbl9Db2RlX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDlfSWRlbnRpZmljYXRpb25fQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQUlZUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfUHJvdmlkZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wM19SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUkVGVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19EZXNjcmlwdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUUk5UeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfVHJhY2VfVHlwZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IHJlZj0iXzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfT3JpZ2luYXRpbmdfQ29tcGFueV9JZGVudGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfVHJhbnNhY3Rpb25fU2V0X0NvbnRyb2xfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfRGF0ZV8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA1X1RpbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9Il8yNzAiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU1QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1RyYW5zYWN0aW9uX1NldF9JZGVudGlmaWVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCSFQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0hpZXJhcmNoaWNhbF9TdHJ1Y3R1cmVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1RyYW5zYWN0aW9uX1NldF9QdXJwb3NlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzAzX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDRfRGF0ZV8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDVfVGltZV8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X1RyYW5zYWN0aW9uX1R5cGVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjAwMEEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSEwiIHR5cGU9IkhMVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjEwMEEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTk0xIiB0eXBlPSJOTTFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIwMDBCIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkhMIiB0eXBlPSJITFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMDBCIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5NMSIgdHlwZT0iTk0xVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSRUYiIHR5cGU9IlJFRlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjMiIHR5cGU9Ik4zVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJONCIgdHlwZT0iTjRUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBFUiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfQ29udGFjdF9GdW5jdGlvbl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfTmFtZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X0NvbW11bmljYXRpb25fTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDVfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDZfQ29tbXVuaWNhdGlvbl9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wN19Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOF9Db21tdW5pY2F0aW9uX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQUlYiIHR5cGU9IlBSVlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjAwMEMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSEwiIHR5cGU9IkhMVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUUk4iIHR5cGU9IlRSTlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMDBDIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5NMSIgdHlwZT0iTk0xVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSRUYiIHR5cGU9IlJFRlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjMiIHR5cGU9Ik4zVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJONCIgdHlwZT0iTjRUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBSViIgdHlwZT0iUFJWVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJETUciIHR5cGU9IkRNR1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSU5TIiB0eXBlPSJJTlNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRUUCIgdHlwZT0iRFRQVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjExMEMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRVEiIHR5cGU9IkVRVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBTVQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0Ftb3VudF9RdWFsaWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX01vbmV0YXJ5X0Ftb3VudF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJSUkiIHR5cGU9IklJSVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUkVGIiB0eXBlPSJSRUZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRUUCIgdHlwZT0iRFRQVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIwMDBEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkhMIiB0eXBlPSJITFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVFJOIiB0eXBlPSJUUk5UeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTAwRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOTTEiIHR5cGU9Ik5NMVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUkVGIiB0eXBlPSJSRUZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik4zIiB0eXBlPSJOM1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjQiIHR5cGU9Ik40VHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQUlYiIHR5cGU9IlBSVlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRE1HIiB0eXBlPSJETUdUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IklOUyIgdHlwZT0iSU5TVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEVFAiIHR5cGU9IkRUUFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMTBEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVRIiB0eXBlPSJFUVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSUlJIiB0eXBlPSJJSUlUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJFRiIgdHlwZT0iUkVGVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEVFAiIHR5cGU9IkRUUFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU0UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX051bWJlcl9vZl9JbmNsdWRlZF9TZWdtZW50c18iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDJfVHJhbnNhY3Rpb25fU2V0X0NvbnRyb2xfTnVtYmVyXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSGVhZGVycy54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NlMGFmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSGVhZGVycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHdvcmtib29rPgotICAgIDxTaGVldDE+Ci0gICAgICAgIDxyb3c+Ci0gICAgICAgICAgICA8Y29sMT5GSVJTVCBOQU1FPC9jb2wxPgotICAgICAgICAgICAgPGNvbDI+TEFTVCBOQU1FPC9jb2wyPgotICAgICAgICAgICAgPGNvbDM+VElUTEU8L2NvbDM+Ci0gICAgICAgICAgICA8Y29sND5BRERSRVNTPC9jb2w0PgotICAgICAgICAgICAgPGNvbDU+Q0lUWTwvY29sNT4KLSAgICAgICAgICAgIDxjb2w2PlNUQVRFPC9jb2w2PgotICAgICAgICAgICAgPGNvbDc+Q09VTlRSWTwvY29sNz4KLSAgICAgICAgPC9yb3c+Ci0gICAgICAgIDxyb3c+Ci0gICAgICAgICAgICA8Y29sMT5QYXVsPC9jb2wxPgotICAgICAgICAgICAgPGNvbDI+RmVhcm9uPC9jb2wyPgotICAgICAgICAgICAgPGNvbDM+TXI8L2NvbDM+Ci0gICAgICAgICAgICA8Y29sND4yIFBlbm4gUGxhemE8L2NvbDQ+Ci0gICAgICAgICAgICA8Y29sNT5OZXcgWW9yazwvY29sNT4KLSAgICAgICAgICAgIDxjb2w2Pk5ldyBZb3JrPC9jb2w2PgotICAgICAgICAgICAgPGNvbDc+VVNBPC9jb2w3PgotICAgICAgICA8L3Jvdz4KLSAgICAgICAgPHJvdz4KLSAgICAgICAgICAgIDxjb2wxPkplZmY8L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5QYW9sZXR0aTwvY29sMj4KLSAgICAgICAgICAgIDxjb2wzPlNpcjwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PjIgUGVubiBQbGF6YTwvY29sND4KLSAgICAgICAgICAgIDxjb2w1Pk5ldyBZb3JrPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+TmV3IFlvcms8L2NvbDY+Ci0gICAgICAgICAgICA8Y29sNz5VU0E8L2NvbDc+Ci0gICAgICAgIDwvcm93PgotICAgICAgICA8cm93PgotICAgICAgICAgICAgPGNvbDE+Sm9uYXRob248L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5QbGF0dDwvY29sMj4KLSAgICAgICAgICAgIDxjb2wzPkxvcmQ8L2NvbDM+Ci0gICAgICAgICAgICA8Y29sND5XZW1ibGV5IFBvaW50LCBIYXJyb3cgUm9hZDwvY29sND4KLSAgICAgICAgICAgIDxjb2w1PkxvbmRvbjwvY29sNT4KLSAgICAgICAgICAgIDxjb2w2Pk1JRERYPC9jb2w2PgotICAgICAgICAgICAgPGNvbDc+VUs8L2NvbDc+Ci0gICAgICAgIDwvcm93PgotICAgICAgICA8cm93PgotICAgICAgICAgICAgPGNvbDE+RWlsZWVuPC9jb2wxPgotICAgICAgICAgICAgPGNvbDI+QW5kZXJzb248L2NvbDI+Ci0gICAgICAgICAgICA8Y29sMz5NcnM8L2NvbDM+Ci0gICAgICAgICAgICA8Y29sND5CZWxsZSBQbGFpbjwvY29sND4KLSAgICAgICAgICAgIDxjb2w1Pk1heXBlbjwvY29sNT4KLSAgICAgICAgICAgIDxjb2w2PkNsYXJlbmRvbjwvY29sNj4KLSAgICAgICAgICAgIDxjb2w3PkphbWFpY2E8L2NvbDc+Ci0gICAgICAgIDwvcm93PgotICAgIDwvU2hlZXQxPgotPC93b3JrYm9vaz4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9IZWFkZXJzLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSGVhZGVycy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMWM2N2YuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9IZWFkZXJzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjMgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJTaGVldDEiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJyb3ciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbDMiPgotCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvcmQiLz4KLQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNciIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ycyIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpciIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJVExFIi8+Ci0JCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbDUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29sNiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w3Ij4KLQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1VOVFJZIi8+Ci0JCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFtYWljYSIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVLIi8+Ci0JCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBIi8+Ci0JCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJyb3ciPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2wxIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iY29sMiIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDMiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w0Ii8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iY29sNSIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDYiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w3Ii8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0id29ya2Jvb2siPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTaGVldDEiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTJhNzUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxkb2M6UkZDX0NVU1RPTUVSX0dFVCB4bWxuczpkb2M9InVybjpzYXAtY29tOmRvY3VtZW50OnNhcDpidXNpbmVzczpyZmMiPgotPEtVTk5SPio8L0tVTk5SPgotPE5BTUUxPkEqPC9OQU1FMT4KLTxDVVNUT01FUl9UPgotPGl0ZW0+Ci08S1VOTlI+PC9LVU5OUj4KLTxBTlJFRD48L0FOUkVEPgotPE5BTUUxPjwvTkFNRTE+Ci08UEZBQ0g+PC9QRkFDSD4KLTxTVFJBUz48L1NUUkFTPgotPFBTVExaPjwvUFNUTFo+Ci08T1JUMDE+PC9PUlQwMT4KLTxURUxGMT48L1RFTEYxPgotPFRFTEZYPjwvVEVMRlg+Ci08L2l0ZW0+Ci08L0NVU1RPTUVSX1Q+Ci08L2RvYzpSRkNfQ1VTVE9NRVJfR0VUPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjZmNjkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpkb2M9InVybjpzYXAtY29tOmRvY3VtZW50Ci06c2FwOmJ1c2luZXNzOnJmYyIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0idXJuOnNhcC1jb206ZG9jdW1lbnQ6c2FwOgotYnVzaW5lc3M6cmZjIj4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCUkZDS05BMSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJLVU5OUiI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFOUkVEIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTEiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQRkFDSCI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUUkFTIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFNUTFoiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUlQwMSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRFTEYxIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVEVMRlgiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMSIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9IlJGQ19DVVNUT01FUl9HRVQiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFsbD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IktVTk5SIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPgotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUxIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPgotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNVU1RPTUVSX1QiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0iZG9jOkJSRkNLTkExIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6YWxsPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L2V2ZW50X0RFQk1BUzAxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzZTAxMy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L2V2ZW50X0RFQk1BUzAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxERUJNQVMwMT48SURPQyBCRUdJTj0iMSI+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+PC9FMUtOQTFNPjwvSURPQz48L0RFQk1BUzAxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWU2ZDAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+PHhzZDplbGVtZW50IG5hbWU9IkRFQk1BUzAxIj48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9IklET0MiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iRURJX0RDNDAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9IlRBQk5BTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BTkRUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0NOVU0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0NSRUwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQVRVUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElSRUNUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJPVVRNT0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkVYUFJTUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVTVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSURPQ1RZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNJTVRZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1FU1RZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1FU0NPRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUVTRkNUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVEQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNURFZSUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RETUVTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTTkRQT1IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTTkRQUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORFBGQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05EUFJOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05EU0FEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05ETEFEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI3MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkNWUE9SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkNWUFJUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZQRkMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVlBSTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVlNBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVkxBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNSRURBVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZSIvPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ1JFVElNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0aW1lIi8+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSRUZJTlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSRUZHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSRUZNRVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBUkNLRVkiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjcwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJJQUwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOQTFNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VOTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBTlJFRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFVRlNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQUhORSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBSE5TIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkJCTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjciLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJCU05SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCRUdSVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJTQ0giIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJVQktaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQVRMVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZBS1NEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGSVNLTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktOUlpBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS09OWlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVE9LRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VLTEEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxBTkQxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMSUZOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxJRlNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMT0NDTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxPRVZNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUUyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FNCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5JRUxTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJPUlQwMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik9SVDAyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEZBQ0giIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQU1RMMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBTVExaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVHSU8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNPVU5DIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDSVRZQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUlBNS1IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPUlRMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BFUlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQUkFTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVENEMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQ0QyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RLWkEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUS1pVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVFJBUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTEJYIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMRjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTEZYIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMVFgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxYMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxaT05FIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFpFTVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZCVU5EIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVENFRyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdGT1JNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUkFOMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSQU4yIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJBTjMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUkFONCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSQU41IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVU1KQUgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVXQUVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJKTVpBSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSk1KQUgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSNSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI3IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSOCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjkiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFIxMCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RLWk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVNU0ExIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVFhKQ0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRVJJViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1RPQ0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBGT1JUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRFRBTVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRUQVdTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJIWlVPUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0lWVkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JTFZFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUFJBU19JU08iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZJVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVENEVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRDMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVENENCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhJQ01TIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYWElQSSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFNVQlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNGT1BDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUWExXMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVFhMVzIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNDQzAxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQ0MwMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0NDMDMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNDQzA0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQVNTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RLRzEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktES0cyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREtHMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RLRzQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktES0c1IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVlZNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVktPUkciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZUV0VHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUEFSVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkVHUlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxPRVZNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWRVJTRyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQVVGU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBTEtTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREdSUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlpJUksiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktPTkRBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQTFRZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQVdBSFIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IklOQ08xIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJJTkNPMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxJRlNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBVVRMRiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQU5UTEYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktaVExGIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLWkFaVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0hTUEwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxQUklPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFSUtUTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZTQkVEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGQUtTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTVJOS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBFUkZLIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRVJSTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iV0FFUlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktUR1JEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaVEVSTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVldFUksiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZLR1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWS0JVUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlNPUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkdSMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZHUjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWR1IzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkdSNCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZHUjUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJPS1JFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVVJTVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUFJGUkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktMQUJDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQUJTUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0tCRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNBU1NEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSRE9GRiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZQTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUlZXIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVU5OMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRFRlBBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTlJFRiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WRE0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0NUUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BSQVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQU5aIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET1ZFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFDSEEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQUkFTX0lTTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZJTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFMQU5EIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUQVRZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEFYS0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WTE0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBTEFORCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEFUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxJQ05SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREFUQUIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRBVEJJIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCRUxJQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTkIxTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJVS1JTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUEVSUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTE9FVk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpVQVdBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNBQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUtPTlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCRUdSVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05SWkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTlJaQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBTUlNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQU1JViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFNSVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBTUlCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQU1JTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWldFTFMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYVkVSUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFITFMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpURVJNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJXQUtPTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlpTS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpJTkRUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaSU5SVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRUlLVE8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaU0FCRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWRVJNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRkRHUlYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUkJLWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVkxJQkIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUlNaTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJTUFIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSU05SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVkVSRFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBFUktaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYREVaViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWEFVU1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IldFQlRSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVNSVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQVRMWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFpWRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRPR1JVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVUxURyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSEJLSUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhQT1JFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCTE5LWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUxUS04iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaR1JVUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVVJMSUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1HUlVQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMT0NLQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVVpBV0UiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkVLVkJEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1JFR0wiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhFRElQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkdSUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJTREciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRMRlhTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEVSTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IklOVEFEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdVWlRFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHUklDRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR1JJRFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05CNU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQUJFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFITkEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BTlNQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQURBVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFITlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktOUk1BIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR01WRFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJVU0FCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOQktNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkFOS1MiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBTktMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkFOS04iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCS09OVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlZUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhFWkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCS1JFRiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBTktBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RSQVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJPUlQwMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNXSUZUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkdSVVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhQR1JPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCTktMWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBTS1RPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJOQ0giIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9WWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS09JTkgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVkFNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUJMQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTkZBSyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iV0FOSUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0JJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9BQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0JJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9BQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0JJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09BQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJERUZBQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZLTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRVYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFCVFBBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUJUTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVFUEFSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMRjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBTlJFRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBRktUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJWTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFWSVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkdFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJMQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR0JEQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSVE5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJZVEgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFLVkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOTUFJTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSQVUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJIMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSSDIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkgzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJINCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSSDUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0JJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9BQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0JJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9BQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0JJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09BQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUtOMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFLTjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBS04zIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUtONCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFLTjUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPUlRMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRkFNU1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQTkFNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVElURUxfQVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOS0FNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0xJTUciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTElNRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IldBRVJTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJETEFVUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTktLTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktLQkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTElNSyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktOS0xJIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ1RMUEMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRUUkVWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDUkJMQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0JHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5YVFJWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLUkFVUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBWURCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQlJBVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVWREIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdSVVBQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQkRBVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCUEFZIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQlJURyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJFS1IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE3Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQldBRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJNT04iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iQkVHSU4iIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzdlMmQ1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxkdDp3cmFwcGVkaW5zdGFuY2UgeG1sbnM6ZHQ9Imh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiPgotICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9xdWFudCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvPgotICA8L3hzOnNjaGVtYT4KLSAgPHF0OnF1YW50aXR5IHhtbG5zOnF0PSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9xdWFudCI+Ci0gICAgNDIKLSAgPC9xdDpxdWFudGl0eT4KLTwvZHQ6d3JhcHBlZGluc3RhbmNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2E3ZjgxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IgotICBibG9ja0RlZmF1bHQ9IiNhbGwiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sOmxhbmc9IkVOIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ3cmFwcGVkaW5zdGFuY2UiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzY2hlbWEiLz4KLSAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzk4N2I2Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdDIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08ZHQ6d3JhcHBlZHdpbGRjYXJkIHhtbG5zOmR0PSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0Ij4KLSAgPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvcXVhbnQiPgotICAgIDx4czplbGVtZW50IG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czppbnQiLz4KLSAgPC94czpzY2hlbWE+Ci08L2R0OndyYXBwZWR3aWxkY2FyZD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk3Y2IyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdDIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCIKLSAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICBibG9ja0RlZmF1bHQ9IiNhbGwiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICB2ZXJzaW9uPSIxLjAiCi0gIHhtbDpsYW5nPSJFTiI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0id3JhcHBlZHdpbGRjYXJkIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3ByaWNlcXVvdGUvUHJpY2VRdW90ZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWZlODMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InByaWNlLXF1b3RlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic3RvY2stc3ltYm9sIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InN0b2NrLXByaWNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPCEtLSBYWFhTSk0gY2hhbmdlIGZvbGxvd2luZyB0byB1c2UgcmVmaW5lZCBkYXRhdHlwZXMgLS0+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InN0b2NrLXN5bWJvbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdG9jay1wcmljZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9yYS9yYS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9yYS9yYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTJmZjkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcmEvcmEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL215dGVzdC9yb3dzYWZmZWN0ZWQiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3Qvcm93c2FmZmVjdGVkIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icm93c0FmZmVjdGVkIiB0eXBlPSJ4czppbnQiLz4KLQotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9qYXZhc3JjL1NpbXBsZVBlcnNvblRlc3QuamF2YSBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9qYXZhc3JjL1NpbXBsZVBlcnNvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyZjJmNS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvamF2YXNyYy9TaW1wbGVQZXJzb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcub3BlbnVyaS5teXRlc3QuUGVyc29uOwotaW1wb3J0IG9yZy5vcGVudXJpLm15dGVzdC5DdXN0b21lckRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBkcnRjYXNlcy5UZXN0RW52OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBlcnNvblRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0ZXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDdXN0b21lckRvY3VtZW50IGRvYyA9Ci0gICAgICAgICAgICBDdXN0b21lckRvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zaW1wbGUvcGVyc29uLnhtbCIpLCBudWxsKTsKLQotICAgICAgICAvLyBNb3ZlIGZyb20gdGhlIHJvb3QgdG8gdGhlIHJvb3QgY3VzdG9tZXIgZWxlbWVudAotICAgICAgICBQZXJzb24gcGVyc29uID0gZG9jLmdldEN1c3RvbWVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhvd2R5IiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0LCAgIHBlcnNvbi5zaXplT2ZOdW1iZXJBcnJheSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MzYsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTIzLCBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQ0LCAgcGVyc29uLmdldE51bWJlckFycmF5KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg5MzMsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgzKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgICBwZXJzb24uc2l6ZU9mQmlydGhkYXlBcnJheSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgRGF0ZSgiVHVlIEF1ZyAyNSAxNzowMDowMCBQRFQgMTk5OCIpLCBwZXJzb24uZ2V0QmlydGhkYXlBcnJheSgwKSk7Ci0KLSAgICAgICAgUGVyc29uLkdlbmRlci5FbnVtIGcgPSBwZXJzb24uZ2V0R2VuZGVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUGVyc29uLkdlbmRlci5NQUxFLCBnKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJFR0lRVFdZWkoiLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXgoKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NCgpKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR0dJUVRXWUdHIiwgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4QXR0KCkpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhpcyBzdHJpbmcgaXMgYmFzZTY0QmluYXJ5IGVuY29kZWQhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjRBdHQoKSkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRGaXJzdG5hbWUoIkdlb3JnZSIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHZW9yZ2UiLCBwZXJzb24uZ2V0Rmlyc3RuYW1lKCkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRIZXgoImhleCBlbmNvZGluZyIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImhleCBlbmNvZGluZyIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEJhc2U2NCgiYmFzZTY0IGVuY29kZWQiLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJiYXNlNjQgZW5jb2RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0KCkpKTsKLQotICAgICAgICAvL3BlcnNvbi5zZXRIZXhBdHQoImhleCBlbmNvZGluZyBpbiBhdHRyaWJ1dGVzIi5nZXRCeXRlcygpKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmcgaW4gYXR0cmlidXRlcyIsCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXhBdHQoKSkpOwotCi0gICAgICAgIC8vcGVyc29uLnNldEJhc2U2NEF0dCgiYmFzZTY0IGVuY29kZWQgaW4gYXR0cmlidXRlcyIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiYmFzZTY0IGVuY29kZWQgaW4gYXR0cmlidXRlcyIsCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjRBdHQoKSkpOwotLy8KLS8vICAgICAgICBYbWxDdXJzb3IgY3AgPSBwZXJzb24ubmV3WG1sQ3Vyc29yKCk7Ci0vLyAgICAgICAgUm9vdC5kdW1wKCBjcCApOwotCi0vLyAgICAgICAgWG1sQ3Vyc29yIGMgPSBwZXJzb24ueGdldEJpcnRoZGF5QXJyYXkoMCkubmV3WG1sQ3Vyc29yKCk7Ci0KLS8vICAgICAgICBSb290LmR1bXAoIGMgKTsKLQotLy8gICAgICAgIHBlcnNvbi5zZXRCaXJ0aGRheSgwLG5ldyBEYXRlKCJUdWUgQXVnIDI1IDE2OjAwOjAwIFBEVCAyMDAxIikpOwotCi0vLyAgICAgICAgUm9vdC5kdW1wKCBjICk7Ci0KLS8vICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICItLS0iICsgYy5nZXRUZXh0KCkgKyAiLS0tIiApOwotCi0vLyAgICAgICAgUm9vdC5kdW1wKCBjICk7Ci0KLS8vICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRCaXJ0aGRheUFycmF5KDApLCBuZXcgRGF0ZSgiVHVlIEF1ZyAyNSAxNjowMDowMCBQRFQgMjAwMiIpKTsKLS8vCi0vLyAgICAgICAgcGVyc29uLnNldEZpcnN0bmFtZSgiR2VvcmdlIik7Ci0vLyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwZXJzb24uZ2V0Rmlyc3RuYW1lKCksICJHZW9yZ2UiKTsKLS8vCi0vLyAgICAgICAgcGVyc29uLmFkZE51bWJlciggKHNob3J0KSA2OSApOwotLy8gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGVyc29uLmNvdW50TnVtYmVyKCksIDUpOwotLy8gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGVyc29uLmdldE51bWJlckFycmF5KDQpLCA2OSk7Ci0vLwotLy8KLS8vICAgICAgICB3aGlsZSAoIGMuaGFzTmV4dFRva2VuKCkgKQotLy8gICAgICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvcGVyc29uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzNTRkMi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvcGVyc29uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGN1c3RvbWVyIHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICBnZW5kZXI9Im1hbGUiCi0gIGhleEF0dD0iNDc0NzQ5NTE1NDU3NTk0NzQ3IgotICBiYXNlNjRBdHQ9IiAgICAgICAgCi0JVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoCi0JICAiPgotICA8Zmlyc3RuYW1lPkhvd2R5PC9maXJzdG5hbWU+Ci0gIDxudW1iZXI+NDM2PC9udW1iZXI+Ci0gIDxudW1iZXI+MTIzPC9udW1iZXI+Ci0gIDxiaXJ0aGRheT4xOTk4LTA4LTI2WjwvYmlydGhkYXk+Ci0gIDxudW1iZXI+NDQ8L251bWJlcj4KLSAgPG51bWJlcj45MzM8L251bWJlcj4KLSAgPGJpcnRoZGF5PjIwMDAtMDgtMDYtMDg6MDA8L2JpcnRoZGF5PgotICA8aGV4PjQ1NDc0OTUxNTQ1NzU5NUE0QTwvaGV4PgotICA8YmFzZTY0PlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaDwvYmFzZTY0PgotPC9jdXN0b21lcj4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTJlODYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiID4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0icGVyc29uIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmaXJzdG5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9Im51bWJlciI+Ci0gICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgICAgICAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMDAiLz4KLSAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYmlydGhkYXkiIHR5cGU9InhzOmRhdGUiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaGV4IiB0eXBlPSJ4czpoZXhCaW5hcnkiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImJhc2U2NCIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImdlbmRlciI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFsZSIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmVtYWxlIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJoZXhBdHQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpoZXhCaW5hcnkiPgotICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIoWzQ1XVswLTlBLUZdKSoiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZTY0QXR0Ij4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5Ij4KLSAgICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaCIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iY3VzdG9tZXIiIHR5cGU9Im10OnBlcnNvbiIvPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImVtcGxveWVlIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ibXQ6cGVyc29uIj4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJlaWQiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvc2ltcGxlYy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvc2ltcGxlYy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmNkZWIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3NpbXBsZWMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGljaXR5Ij4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJtdDp0aG91c2FuZCI+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJub3RlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InRob3VzYW5kIj4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgotICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlIiB0eXBlPSJtdDpzaW1wbGljaXR5Ii8+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDAzX3Byb2Nlc3NfcG9fMDA3LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS8wMDNfcHJvY2Vzc19wb18wMDcueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjFmNDk4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS8wMDNfcHJvY2Vzc19wb18wMDcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIExpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCi0gICAgICBvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCi0gICAgICBGb3Igc3VwcG9ydCwgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gcmVwb3J0IGltcGxlbWVudGF0aW9uIGJ1Z3MsCi0gICAgICBwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCi0KLSAgICAkUmV2aXNpb246IDEuMiAkCi0gICAgJERhdGU6IDIwMDQvMDIvMjYgMDA6NTk6NTYgJAotICAgIE9wZW4gQXBwbGljYXRpb25zIEdyb3VwIFhTRAotICAgIENvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotICAgJE5hbWU6ICAkCi0KLWNtawk2LjIuMCAgIAkxMS8yMi8xOTk5CUluaXRpYWwgUmVsZWFzZSAtIHVwZGF0ZSBmcm9tIHZlcnNpb24gMDAzCi0JCQkJCQkJQWRkIFBPTE5TVEFUVVMsIERBVEVUSU1FLk5FRURERUxWIHRvIFBPT1JERVJMSU4KLQkJCQkJCQlGaXggcHJvY2Vzc2luZyBub3RlIHJ1bGVzCi1yamoJNy4wLjAJCTEwLzE1LzIwMDAJU3BlY2lhbCBSZXZpc2lvbiBVcGRhdGUKLXJqagk3LjAuMgkJMTEvMjQvMjAwMAlBbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTk9URVMuCi1tbHIJNy4xCQkwNC8xNi8yMDAxCUFkZCBBVFRDSFJFRiB0byBCT0QuCi1hancJCTcuMi4xCQkJMTAvMzEvMjAwMQkJVzNDIFNjaGVtYSBSZWxlYXNlCi0KLVN0cnVjdHVyZSBPdmVydmlldwotCi0JUFJPQ0VTU19QTyAoUE9PUkRFUkhEUiwgUE9PUkRFUkxJTispCi0JCVBPT1JERVJIRFIgKFBBUlRORVIrLCBBVFRDSFJFRiosIENIQVJHRSosIFBPVEVSTSopCi0JCQlQT1RFUk0gKCkKLQkJUE9PUkRFUkxJTiAoQVRUQ0hSRUYqLCBDSEFSR0UqLCBESVNUUklCVVROKiwgUEFSVE5FUiosIFBPVEVSTSosCi0JCSAgUE9CU1VCTElORSosIFBPTElORVNDSEQqKQotCQkJUE9URVJNICgpCi0JCQlQT1NVQkxJTkUgKCkKLQkJCVBPTElORVNDSEQgKCkKLQotTm90ZXM6Ci0KLS0tPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDAzX3Byb2Nlc3NfcG9fMDA3IiB4bWxuczpvcz0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgeG1sbnM6b2Y9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfZmllbGRzIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnLzAwM19wcm9jZXNzX3BvXzAwNyI+Ci0JPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfc2VnbWVudHMiIHNjaGVtYUxvY2F0aW9uPSJvYWdpc19zZWdtZW50cy54c2QiLz4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHNjaGVtYUxvY2F0aW9uPSJvYWdpc19maWVsZHMueHNkIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPQ0VTU19QT18wMDciPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDTlRST0xBUkVBIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJEQVRBQVJFQSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRBVEFBUkVBIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iUFJPQ0VTU19QTyIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPQ0VTU19QTyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPT1JERVJIRFIiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPT1JERVJMSU4iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT09SREVSSERSIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6REFURVRJTUVBTlkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6T1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT0lEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT1RZUEUiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDS1JFUVVFU1QiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09OVFJBQ1RCIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTlRSQUNUUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Tk9URVMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk9QUkFNVEFVVEgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9SRUxFQVNFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWFdIRVhNUFQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UEFSVE5FUiIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkFUVENIUkVGIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDSEFSR0UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPVEVSTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwhLS0gKCVEQVRFVElNRS5ET0NVTUVOVDspPyAtLT4KLQkJCQk8IS0tICglT1BFUkFNVC5FWFRFTkRFRC5UOyk/IC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9URVJNIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRFUk1JRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmNob2ljZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEQVlPRk1PTlRIIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBST1hNT05USCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRBWVNOVU0iLz4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8eHM6Y2hvaWNlPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOk9QRVJBTVQiLz4KLQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpRVUFOVElUWSIvPgotCQkJCQk8IS0tICglT1BFUkFNVC5FWFRFTkRFRC5UOyk/IC0tPgotCQkJCQk8IS0tICglUVVBTlRJVFkuUEVSQ0VOVDspIC0tPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwhLS0gKChEQVlPRk1PTlRILCBQUk9YTU9OVEgpIHwgREFZU05VTSksICgoJU9QRVJBTVQuRVhURU5ERUQuVDspIHwgKCVRVUFOVElUWS5QRVJDRU5UOykpIC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9PUkRFUkxJTiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpEQVRFVElNRUFOWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpPUEVSQU1UIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPTElORU5VTSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RFJBV0lORyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpIQVpSRE1BVEwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SVlgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Tk9URVMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBQ0tJTkciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9MTlNUQVRVUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVhXSEVYTVBUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6Y2hvaWNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpBVFRDSFJFRiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6Q0hBUkdFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpESVNUUklCVVROIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpQQVJUTkVSIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJQT1RFUk0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPU1VCTElORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9MSU5FU0NIRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwhLS0gKCVRVUFOVElUWS5QRVJDRU5UOykpIC0tPgotCQkJCTwhLS0gKCVEQVRFVElNRS5ORUVEREVMVjspPyAtLT4KLQkJCQk8IS0tICglT1BFUkFNVC5VTklULlQ7KT8gLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1NVQkxJTkUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpRVUFOVElUWSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RFJBV0lORyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlYiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQU0JMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6Y2hvaWNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLSAoJVFVQU5USVRZLklURU07KSAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPTElORVNDSEQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpEQVRFVElNRUFOWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpRVUFOVElUWSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBTQ0xJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwhLS0gKCVEQVRFVElNRS5ORUVEREVMVjspIC0tPgotCQkJCTwhLS0gKCVRVUFOVElUWS5PUkRFUkVEOykgLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwNF9hY2tub3dsZWRnZV9wb18wMDgueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwNF9hY2tub3dsZWRnZV9wb18wMDgueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJkMWYzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS8wMDRfYWNrbm93bGVkZ2VfcG9fMDA4LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmaWxlIGlzIHByb3ZpZGVkIGluIExJQ0VOU0UuVFhULCBhcyBwdWJsaXNoZWQKLQlvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCi0JRm9yIHN1cHBvcnQsIG1vcmUgaW5mb3JtYXRpb24sIG9yIHRvIHJlcG9ydCBpbXBsZW1lbnRhdGlvbiBidWdzLAotCXBsZWFzZSBjb250YWN0IHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBhdCB4bWxAb3BlbmFwcGxpY2F0aW9ucy5vcmcKLQotCSRSZXZpc2lvbjogMS4yICQKLQkkRGF0ZTogMjAwNC8wMi8yNiAwMDo1OTo1NiAkCi0JT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWFNECi0JQ29weXJpZ2h0IDE5OTgtMjAwMSwgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi0JJE5hbWU6ICAkCi0KLQljbWsJNi4yLjAgICAJMTEvMjIvMTk5OQlJbml0aWFsIFJlbGVhc2UgLSBVcGRhdGUgZnJvbSB2ZXJzaW9uIDAwMwotCQkJCQkJCQlBZGQgUE9MTlNUQVRVUywgREFURVRJTUUuTkVFRERFTFYgdG8gUE9PUkRFUkxJTgotCQkJCQkJCQlGaXggcHJvY2Vzc2luZyBub3RlIHJ1bGVzCi0JcmpqCTcuMC4wCTEwLzE1LzIwMDAJU3BlY2lhbCBSZXZpc2lvbiBVcGRhdGUKLQlyamoJNy4wLjIJMTEvMjQvMjAwMAlBbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTk9URVMuCi0JbWxyCTcuMQkJMDQvMTYvMjAwMQlBZGQgQVRUQ0hSRUYgdG8gQk9ELgotCWFqdyA3LjIJCTA5LzMwLzIwMDEgCU1hZGUgQUNLTElORSBzZWdtZW50ICcwIHRvIG1hbnknIHRpbWVzCi0JYWp3CTcuMi4xCTA5LzAxLzAwCVczQyBTY2hlbWEgUmVsZWFzZQotCi0gICAgU3RydWN0dXJlIE92ZXJ2aWV3Ci0KLSAgICBBQ0tOT1dMRURHRV9QTyAoUE9PUkRFUkhEUiwgUE9PUkRFUkxJTiopCi0gICAgICAgIFBPT1JERVJIRFIgKEFDS0hFQURFUiwgQVRUQ0hSRUYqLCBDSEFSR0UqLCBQQVJUTkVSKiwgUE9URVJNKikKLSAgICAgICAgICAgIEFDS0hFQURFUiAoKQotICAgICAgICAgICAgUE9URVJNICgpCi0gICAgICAgIFBPT1JERVJMSU4gKEFDS0xJTkUqLCBBVFRDSFJFRiosIENIQVJHRSosIERJU1RSSUJVVE4qLCBQQVJUTkVSKiwKLSAgICAgICAgICAgIFBPTElORVNDSEQqLCBQT1NVQkxJTkUqLCBQT1RFUk0qKQotICAgICAgICAgICAgQUNLTElORSAoKQotICAgICAgICAgICAgUEFSVE5FUiAoKQotICAgICAgICAgICAgUE9MSU5FU0NIRCAoKQotICAgICAgICAgICAgUE9TVUJMSU5FICgpCi0gICAgICAgICAgICBQT1RFUk0gKCkKLQotTm90ZXM6Ci0KLS0tPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpvZj0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOm9zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIj4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX3NlZ21lbnRzLnhzZCIvPgotCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX2ZpZWxkcy54c2QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tOT1dMRURHRV9QT18wMDgiPgotCQk8eHM6Y29tcGxleFR5cGU+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+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlci54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNjZDI3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlci54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxucz0icHVibGljaWQ6b3JnLnhDQkw6c2NoZW1hcy9YQ0JMMzUvT3JkZXIueHNkIiB0YXJnZXROYW1lc3BhY2U9InB1YmxpY2lkOm9yZy54Q0JMOnNjaGVtYXMvWENCTDM1L09yZGVyLnhzZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICBYTUwgQ29tbW9uIEJ1c2luZXNzIExpYnJhcnkgMy41Ci0gICAgICAgICAgICBDb3B5cmlnaHQgMjAwMCBDb21tZXJjZSBPbmUsIEluYy4KLSAgICAgICAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgICAgICAgIERURCdzLCBzY2hlbWFzIGFuZCBtb2R1bGVzIGluIHRoZSBDb21tZXJjZSBPbmUgWE1MIENvbW1vbiBCdXNpbmVzcwotICAgICAgICAgICAgTGlicmFyeSBWZXJzaW9uIDMuNSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBzcGVjaWZpZWQKLSAgICAgICAgICAgIGF0IGh0dHA6Ly93d3cueGNibC5vcmcvbGljZW5zZS5odG1sCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCVBMRUFTRSBOT1RFOiBUaGlzIHNjaGVtYSwgd2hpbHN0IGl0IGRlc2NyaWJlcyBpbiBlbnRpcmV0eSBhIHZhbGlkLCBzaW5nbGUsCi0gICAgICAgIAl4Q0JMIDMuNSBkb2N1bWVudCwgaXMgZGVmaW5lZCB0byBiZSBpbiBhIG5hbWVzcGFjZSBvdGhlciB0aGFuIHRoZSBtYWluIHhDQkwgMy41Ci0gICAgICAgIAluYW1lc3BhY2UuIFRoZXJlZm9yZSBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBmdWxsIHhDQkwgMy41IHNjaGVtYSBpcyB1c2VkCi0gICAgICAgIAlmb3IgZnVsbCBwcm9kdWN0aW9uIHNpdHVhdGlvbnMuIFBsZWFzZSBzZWUgdGhlIG5vdGVzIGF0Ci0gICAgICAgIAk8YSBocmVmPSJodHRwOi8vd3d3LnhjYmwub3JnL3hjYmwzNS94c2Qvc2NoZW1hcy5odG1sIj53d3cueENCTC5vcmc8L2E+LgotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJPcmRlckhlYWRlciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlckRldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlclN1bW1hcnkiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyIiB0eXBlPSJPcmRlciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJIZWFkZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlcklzc3VlRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyUmVmZXJlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVsZWFzZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUHVycG9zZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSZXF1ZXN0ZWRSZXNwb25zZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckN1cnJlbmN5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4QWNjb3VudGluZ0N1cnJlbmN5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyTGFuZ3VhZ2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlclRheFJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlRheFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckludm9pY2VNZWRpdW1UeXBlQ29kZWQiIHR5cGU9Ik9yZGVySW52b2ljZU1lZGl1bVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckludm9pY2VNZWRpdW1UeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlckRhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0aWFsU2hpcG1lbnRBbGxvd2VkIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydExvY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Ik9yZGVyVGVybXNPZkRlbGl2ZXJ5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVGVybXNPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVySGVhZGVyUHJpY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcmljZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlclBheW1lbnRJbnN0cnVjdGlvbnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXltZW50SW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQWxsb3dhbmNlc09yQ2hhcmdlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJIZWFkZXJOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJIZWFkZXJBdHRhY2htZW50cyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkF0dGFjaG1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJIZWFkZXIiIHR5cGU9Ik9yZGVySGVhZGVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlck51bWJlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQnV5ZXJPcmRlck51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyT3JkZXJOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mTWVzc2FnZUlEIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlck51bWJlciIgdHlwZT0iT3JkZXJOdW1iZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk1lc3NhZ2VJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iTWVzc2FnZUlEIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZNZXNzYWdlSUQiIHR5cGU9Ikxpc3RPZk1lc3NhZ2VJRCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWVzc2FnZUlEIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRE51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSURBc3NpZ25lZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJREFzc2lnbmVkRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZXNzYWdlSUQiIHR5cGU9Ik1lc3NhZ2VJRCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSURBc3NpZ25lZEJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJREFzc2lnbmVkQnlDb2RlZCIgdHlwZT0iUGFydHlSb2xlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSURBc3NpZ25lZEJ5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSURBc3NpZ25lZEJ5IiB0eXBlPSJJREFzc2lnbmVkQnkiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFydHlSb2xlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1N0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9mRGVzdGluYXRpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9mLU9yaWdpblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPd25lcnNTZXJ2aWNpbmdCYW5rT25UaGVSZWNlaXZpbmdTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXJzU2VydmljaW5nQmFua09uVGhlU2VuZGluZ1NpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxQdXJjaGFzZXJzQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJlZmVycmVkQnlPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJlZmVycmVkVG9Pcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlQ2FyZUhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlbGl2ZXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdGlvbkNlbnRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nSGVhbHRoQ2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nU3VyZ2VvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR1bHREYXlDYXJlUHJvZ3JhbUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VUaHJvdWdoQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0ZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5R3JhbnRpbmdTZWN1cml0eUNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSURTT3JBUkNVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJBbWJ1bGFuY2VTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FyZ29Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGb3JjZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9saXNtQW5kT3RoZXJDaGVtaWNhbERlcGVuZGVuY3lGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbE9yRHJ1Z0FidXNlT3JEZXBlbmRlbmN5SW5wYXRpZW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbE9yRHJ1Z0FidXNlT3JEZXBlbmRlbmN5T3V0cGF0aWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpZW5BZmZpbGlhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGVnZWREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxpZWRIZWFsdGhQcm9mZXNzaW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudEN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FibGVSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVJldHVybkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlQWRkcmVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZU1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx6aGVpbWVyc0RpYWdub3N0aWNPckFzc2Vzc21lbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRlZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuSW5kaWFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtaWN1c0N1cmlhZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5lc3RoZXNpb2xvZ3lTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5naW9wbGFzdHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsQmVpbmdJbnZlc3RpZ2F0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50ZW5uYVNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVsbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwZWxsZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Q29tYWtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Rm9ySm9iIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0Nvc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlck5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZEltcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJiaXRyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJjaGl0ZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmNoaXRlY3QtRGVzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRTZXJ2aWNlc0xvY2F0aW9uRGVzaWduYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybXlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aHJpdGlzVHJlYXRtZW50Q2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldEFjY291bnRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lzdGFudFN1cmdlb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lzdGFudFVTVHJ1c3RlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlR2VuZXJhbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kaW5nUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JEZWZlbmRhbnRQcml2YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leUZvckRlZmVuZGFudFB1YmxpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JQbGFpbnRpZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5T2ZSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1Y3Rpb25lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml0eUZvclNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uQXNzaWduZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEFjY2VwdGluZ09mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRXhwb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkSW1wb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRNYXJrZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZE9mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRUcmFkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6aW5nT2ZmaWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZERhdGFQcm9jZXNzaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZFVuZGVyd3JpdGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlV2l0aEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJpbGl0eVNoaXBUb1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsaWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudFdhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbFBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWtlcnlEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lSZWZlcmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5VHJ1c3RlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVBlcmlvZEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXR0ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFsT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE9wZW5pbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZFNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGwtVG9QYXJ0eUZvckRpdmVyc2lvbkNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoaW5nUm9vbU9yTERSUFJvb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhwbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvb2RCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mUmVhbHRvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYnRhaWxTZXJ2aWNlUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRzbWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2trZWVwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlckNyb3NzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9ycm93ZXJzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWtlbWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtCdWxrQmVydGhPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtCdWxrUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2FkY2FzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlckRlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyT3Bpbmlvbk9yQW5hbHlzaXNSZXF1ZXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9yU2FsZXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcnNBc3Npc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ0luc3BlY3RvcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdTaXRlRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZUZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdTaXRlUHVyY2hhc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVPZkxhbmRNYW5hZ2VtZW50UHJvcGVydHlVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJuQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQXNzb2NpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJBc09mZmljaWFsbHlSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1BhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1F1YWxpdHlSZXZpZXdCb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5aW5nR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkN1c3RvbXNCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmRpZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZHlBbmRDb25mZWN0aW9uc0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNDYXRoZXJpemF0aW9uTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY0ludGVuc2l2ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjUmVoYWJpbGl0YXRpb25Qcm9ncmFtRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNSZWhhYmlsaXRhdGlvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJuZXRJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT2ZOZWVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sTGV2ZWxBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sU3ViLUFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xUb3BBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlZGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxCYW5rT3JSZWd1bGF0b3J5QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQ2F0YWxvZ3VlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZEFjY291bnRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZnlpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaXJwZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlc1BheWVyQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlclNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npc1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2luZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVEcmF3bkJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkRlcHV0eUNsZXJrT2ZDb3VydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0Nocm9uaWNEaXNlYXNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0RheUNhcmVDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0V5ZUVhck5vc2VBbmRUaHJvYXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zR2VuZXJhbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNIb3NwaXRhbFVuaXRPZkFuSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc09ydGhvcGVkaWNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zT3RoZXJTcGVjaWFsdHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zUHN5Y2hpYXRyaWNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zUmVoYWJpbGl0YXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zVHViZXJjdWxvc2lzQW5kT3RoZXJSZXNwaXJhdG9yeURpc2Vhc2VzRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaXJvcHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyb25pY0Rpc2Vhc2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyb25pY09ic3RydWN0aXZlUHVsbW9uYXJ5RGlzZWFzZVNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2h1cmNoT3BlcmF0ZWRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lnYXJldHRlc0FuZFRvYmFjY29EZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWl0TG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudEF1dGhvcml6ZWRSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVya09mQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkRG9vclBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdPclBhaW50U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUJvcnJvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Db250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Db3Vuc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1EZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURlZmVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRHJpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnZlc3RpZ2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25QcmluY2lwYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnN1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uYWJsZUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pdHlBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5SGVhbHRoUHJvbW90aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBc3NpZ25lZFdlbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlJbnRlcnZpZXdlcldvcmtzRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SW5XaGljaEludGVyZXN0SGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueU1lcmdlZFdpdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnktT3duZWRPaWxGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueVdoaWNoSG9sZHNGaW5hbmNpYWxJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlMaXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUmVudGFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aW5nUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlUHJvcGVydHlMaXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21waWxhdGlvbkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW5hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWluYW50c0F0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXByZWhlbnNpdmVHZXJpYXRyaWNBc3Nlc3NtZW50RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWN0b3JQaWxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGluZ0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlT2ZWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlVG9CZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlLVRvUmVjZWl2ZUxhcmdlUGFyY2Vsc0FuZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZS1Ub1JlY2VpdmVNYWlsQW5kU21hbGxQYXJjZWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vckNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRhbnRzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0aW5nUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lckNyZWRpdEFjY291bnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclJlZmVycmFsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RCYW5rMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdEJhbmsyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPcGVyYXRvck9yTGVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJSZXR1cm5Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdXJ2ZXlBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudEFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWRtaW5pc3RyYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0ZWRTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdGluZ09mZmljZXJSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3Rvci1HZW5lcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE9yQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItTGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3Rvci1NYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbERlbGl2ZXJ5TWV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsUmVjZWlwdE1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVyUXVhbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252b3lpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tT2NjdXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU9wZXJhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVCdXlpbmdHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1QYXJ0aWNpcGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tUHJvZHVjZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0aW9uRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3NpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXJzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW5jaWxPZkdvdmVybm1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVyQ2xhaW1hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRBcHBvaW50ZWRBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0R3JhbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yc0F0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSYXRpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlcG9ydGluZ0FnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jld01lbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWVWaWN0aW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzQ2xhaW1hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzLVRvd25Td2l0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNUU2Nhbm5lclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRFbXBsb3llci1QcmltYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RW1wbG95ZXItU2Vjb25kYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvZGlhbFBhcmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJGT3JXaG9tU2FtZU9yU2ltaWxhcldPcmtXYXNQZXJGb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVySWRlbnRpZmljYXRpb25GaWxlQ3VzdG9tZXJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlT2ZDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVByb2Nlc3NpbmdTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9ySW5kaXZpZHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yLUluLVBvc3Nlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidFBheW1lbnRBdXRob3Jpc2F0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2lzaW9uTWFrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjb25zb2xpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmF1bHRPckZvcmVjbG9zdXJlU3BlY2lhbGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpY2F0ZXNzZW5EZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Wm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mSnVzdGljZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduYXRlZEhhemFyZG91c1dhc3RlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbkVuZ2luZWVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hDaGFyZ2VQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkRyYXltYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uSW50ZXJtb2RhbFJhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uTWFpbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvblRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zdGljUmFkaW9pc290b3BlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWx5c2lzQ2VudGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlmZmVyZW50UHJlbWlzZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZEluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2lwbGluYXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdGlsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckJyYW5jaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0QXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0SnVzdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3Rvck9mT3B0b21ldHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N0b3JPZk9zdGVvcGF0aHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QWNjb3VudFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY291bnRQYXJ0eXNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFwcGxpY2FudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRCZW5lZmljaWFyeXNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFJlaW1idXJzaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRTZWNvbmRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50T3JNZXNzYWdlSXNzdWVyT3JTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2luZ0J1c2luZXNzQXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1GaXJzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaWxsaW5nQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wLU9mZkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlHcm9jZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyYWJsZU1lZGljYWxFcXVpcG1lbnRTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZEluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNEYXRhSW50ZXJjaGFuZ2VDb29yZGluYXRvclBvaW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0ZpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUmVnaXN0cmF0aW9uVXRpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1JldHVybk9yaWdpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZW1lbnRhcnlTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmxlUGFydHlUb1RoZUNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJsZVBhcnR5VG9UaGVSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEZXBhcnRtZW50U29jaWFsV29ya1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lNZWRpY2FsVGVjaG5pY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5UHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVJlc3BvbnNlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdpbmdTbWFsbEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJSZXNwb25zaWJsZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lclJldHVybkFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUVxdWlwbWVudERlc3BhdGNoUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5RXF1aXBtZW50UmV0dXJuUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW1NYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneUluZm9ybWF0aW9uQWRtaW5pc3RyYXRpb24tT3duZWRPaWxGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLUNvbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXItQ29uc3VsdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyUGlsb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLVJlc2lkZW50Q29uc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnJvbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5SG9sZGluZ1RoZUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlJbldoaWNoQUZpbmFuY2lhbEludGVyZXN0SXNIZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlQcm92aWRpbmdUaGVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlSZXNwb25zaWJsZUZvckZvbGxvdy1VcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludFRlY2huaWNhbEFzc2Vzc21lbnRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50RHJvcC1PZmZQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlcGFpclBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhYmxpc2hlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdWRlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVDb21taXR0ZWVNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dG9yT2ZFc3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZXJ0V2l0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4LVNwb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRDYXJlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhY29ycG9yZWFsU2hvY2stV2F2ZUxpdGhvdHJpcHRlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV5ZUVhck5vc2VBbmRUaHJvYXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yLUNvcnJlc3BvbmRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbWlseU1lbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF0aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsbHlDaGFydGVyZWRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN0YXRlQ291bnR5T3JDaXR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlbGxvd3NoaXBJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVsb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZG9yQnJhbmNoT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlck5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsQ3VzdG9tZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWFpbnRlbmFuY2VQZXJpb2REZXNpZ25hdGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUGxhbm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU3RhdGVtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJlbWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEFwcHJhaXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RCcmVha1Rlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpdG5lc3NDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kQ2VydGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZERldGVybWluYXRpb25Qcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvcmFsRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZFNlcnZpY2VPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3NpbmdMZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25EaXNjbG9zdXJlSW5mb3JtYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25MYW5ndWFnZVN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25SZWdpc3RyYXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lckFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lcmx5RG9pbmdCdXNpbmVzc0FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJseUtub3duQXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUmVnaXN0ZXJlZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yUHJvZml0SGVhbHRoQ2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdW5kYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVvbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRNYW5hZ2VtZW50RmFjaWxpdGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRPckNoYXJnZXNQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWVyT25CZWhhbGZPZlRoZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWVyT25CZWhhbGZPZlRoZUNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnV0dXJlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FpbmluZ0ludmVudG9yeU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybmlzaGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25FbmRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblN0YXJ0aW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGV3YXlQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbElucGF0aWVudENhcmVGb3JBSURTT3JBUkNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lZGljYWxBbmRTdXJnaWNhbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTWVyY2hhbmRpc2VEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5ldGljQ291bnNlbGluZ09yU2NyZWVuaW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlcmlhdHJpY0FjdXRlQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlcmlhdHJpY0NsaW5pY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpZnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ29sbGVjdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0N1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWxlYXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1Db21iaW5lZENvbnRyb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1NaWxpdGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLU90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtVmV0ZXJhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eUZPQlBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50TG9hbkFnZW5jeVNwb25zb3JPckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUxvY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFuZHBhcmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdW5kQW1idWxhbmNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEFmZmlsaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBZmZpbGlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBpbmdDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUHJhY3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUHVyY2hhc2luZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1dhc3RlR2VuZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhBbmRCZWF1dHlEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvZmVzc2lvbmFsU2hvcnRhZ2VBcmVhRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNaXNjZWxsYW5lb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhTY2llbmNlc0xpYnJhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlbW9kaWFseXNpc0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXNvcGF0aG9sb2d5TGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzcGFuaWNTZXJ2aWNlSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXN0b3JpY2FsbHlCbGFja0NvbGxlZ2VPclVuaXZlcnNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhDYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQ29ycG9yYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZVNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZVN0YXRlTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsQXV4aWxpYXJ5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxEaXN0cmljdE9yQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbFVuaXRPZkFuSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsVW5pdFdpdGhpbkFuSW5zdGl0dXRpb25Gb3JUaGVNZW50YWxseVJldGFyZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3N0aWxlV2l0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZWRGcm9tTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkNhcmVPZlBhcnR5Tm8xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkNhcmVPZlBhcnR5Tm8yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25KdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlcGVuZGVudEFkanVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlcGVuZGVudExhYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRQaHlzaWNpYW5zQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxGb3ItUHJvZml0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmVsaWdpYmxlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uRGlzc2VtaW5hdGlvbkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25NYWludGVuYW5jZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Qcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZWZlcmVuY2VBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsTWVkaWNhbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsU3Vic2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qZWN0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVBhdGllbnRQaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TZXJ2aWNlU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFuZEFjY2VwdGFuY2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFuZEFjY2VwdGFuY2VQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25MZWFkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25PblNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlZEF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbmFsUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uRm9yTWVudGFsUmV0YXJkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVN0b3JlQmFrZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNsYWltQWRqdXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkT3JTdWJzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTWF0ZXJpYWxNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlbGxlY3R1YWxQcm9wZXJ0eU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdGVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1GdW5kaW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVHJ1c3RlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJsaW5lU2VydmljZUNvbW1pdG1lbnRDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlCYW5rMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QmFuazIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeU9yQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUxldmVsUGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybnNoaXBFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycHJldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDb250cm9sbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRBZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2x2ZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJyZXZvY2FibGVCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZkRlYml0T3JDcmVkaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck9mV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU2hpcFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50QW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludEFubnVpdGFudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnREZWJ0b3JBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckFubnVpdGFudFBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVySm9pbnRBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJKb2ludEFubnVpdGFudFBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyUGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50VmVudHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bmlvckhpZ2hTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVEZWZlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlVmljdGltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZVdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleVBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2lkbmV5RGlhbHlzaXNVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclN1cnBsdXNBcmVhRmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZGxvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhcmdlQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RCcmVha1Rlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RLbm93blNvdXJjZU9mU3VwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd0VuZm9yY2VtZW50QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFRpdGxlSG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRpbmdJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWVzU3VydmV5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlhYmlsaXR5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbkhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZExpYWJpbGl0eUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRMaWFiaWxpdHlQYXJ0bmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFBhcnRuZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RNYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGl0ZXJhbGx5VHJhbnNsYXRlZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkFwcGxpY2FudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkNvcnJlc3BvbmRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Ib2xkZXJGb3JSZWFsRXN0YXRlQXNzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5PcmlnaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuU2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ2hhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsR292ZXJubWVudFNwb25zb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzRm9yQ3VzdG9tc0V4YW1pbmF0aW9uQmVmb3JlQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mTG9hZEV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mUHJpbmNpcGFsQXNzZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mU3BvdEZvclN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdUZXJtQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nLVRlcm1EaXNhYmlsaXR5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zaW5nSW52ZW50b3J5TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc1BheWVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ2lzdHJhdGVKdWRnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnbmV0aWNSZXNvbmFuY2VJbWFnaW5nRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWRlbk5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5saW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZU9yZ2FuaXphdGlvblVzZWRGb3JFc3RpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFtbW9ncmFwaHlTY3JlZW5pbmdDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudENvbnRyb2xBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudE5vbi1PZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2luZ0dlbmVyYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVN1cnZleW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0VGltZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmstRm9yUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJHZW5lcmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc3Bvc2l0aW9uQXV0aG9yaXphdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbElzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRDaGFydGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXREZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsRG9jdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5zdXJhbmNlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbE51cnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3VyZ2ljYWxPck90aGVySW50ZW5zaXZlQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxUcmVhdG1lbnRFeGVjdXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxUcmVhdG1lbnRQcmVzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWV0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZ2F2b2x0YWdlUmFkaWF0aW9uVGhlcmFweVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbnRCYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZENvbXBhbnlXaXRoUmV0YWluZWRJZGVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VkTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV4aWNhbkN1c3RvbXNCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZGRsZVNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlncmFudEhlYWx0aENsaW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Sb3lhbHR5UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmlzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eS1Pd25lZEJ1c2luZXNzTGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5LU93bmVkQnVzaW5lc3NTbWFsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c0hlYWx0aENhcmVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uaXRvcmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VMaWFiaWxpdHlBY2NvdW50SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50RW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGVSZXBvcnRQcm92aWRlckNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZUNoYW5nZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZU5vdFRvQmVDb25mdXNlZFdpdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVvbkNyZWRpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVVbmRlcldoaWNoRmlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVWYXJpYXRpb25TeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENoYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aXZlSGF3YWlpYW5Pcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdnlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnbGVjdGVkT3JEZWxpbnF1ZW50SW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVpZ2hib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yaG9vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVvbmF0YWxJbnRlbnNpdmVDYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0d29ya05hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0Fzc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1NlY3VyZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdzcGFwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N1cHBseVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0U2NoZWR1bGVkRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pY2tuYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0hlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWluYXRlZEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWluYXRlZEZyZWlnaHRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRG9tZXN0aWNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZW1wbG95bWVudEluY29tZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhlYWx0aENhcmVNaXNjZWxsYW5lb3VzRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1JbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSW52YXNpdmVDYXJkaWFjQXNzZXNzbWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tTW9ydGdhZ2VMaWFiaWxpdHlBY2NvdW50SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tT2NjdXBhbnRDby1Cb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByb2R1Y3Rpb25TdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ucHJvZml0SW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SYWlscm9hZEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUmVnaXN0ZXJlZEJ1c2luZXNzTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlZ2lzdGVyZWRJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudENyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEdyb3VwQ29tcGFueVdpdGhXaG9tRmluYW5jaWFsQWNjb3VudElzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRJbnN0cnVjdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRUaGlyZFBhcnR5Q29tcGFueVdpdGhXaG9tRmluYW5jaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVGVtcG9yYXJ5U3RvcmFnZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyeVB1YmxpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90ZUNvLVNpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90Rm9yUHJvZml0SGVhbHRoQ2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlGb3JTaGlwcGVyc09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eU5vMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlObzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZUNoYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZhdGlvblJvb21TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzdGV0cmljc0FuZEd5bmVjb2xvZ3lGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzdGV0cmljc1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxIZWFsdGhTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsVGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblRhcmlmZkNvbmZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldE9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxBbmRHYXNDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbEFuZEdhc1JlZ3VsYXRvcnlBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZEFzc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFNlY3VyZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25CZWhhbGZPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24tQ2FsbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmNvbG9neUNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1IZWFydFN1cmdlcnlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvci1Db21tdW5pY2F0aW9uQ2hhbm5lbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3ItRXNzZW50aWFsU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZQcm9wZXJ0eU9yRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mUHJvcGVydHlPclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZUaGVTb3VyY2VUcmFuc2ZlclBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlVHJhbnNmZXJQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPZlNoaXBwZXJzT3JkZXJzLVRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck9mVGhlU2hpcHBlclBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcldyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25Db21wbGV0aW5nQ29uZmlndXJhdGlvbkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkhhdmluZ1NvdXJjZUNvbnRyb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplZE91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemVkU29jaWFsV29ya1NlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbk9yVGlzc3VlVHJhbnNwbGFudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsQ2xhaW1hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSW50ZXJtb2RhbFJhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0b3JPZkFydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkRyYXltYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3VibG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob3BlZGljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvcGVkaWNTdXJnZXJ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGVwYXJ0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGlzYWR2YW50YWdlZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckluZGl2aWR1YWxEaXNhYmlsaXR5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck5vdC1Gb3ItUHJvZml0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUGVyc29uT3JFbnRpdHlBc3NvY2lhdGVkV2l0aFN0dWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclJlbGF0ZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJTcGVjaWFsdHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFR5cGVPZk9yZ2FuaXphdGlvbmFsRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1PZi1TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0cGF0aWVudFNvY2lhbFdvcmtTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0cGF0aWVudFN1cmdpY2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlSW5zcGVjdGlvbkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVRlc3RBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJyaWRlSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lckFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJKb2ludEFubnVpdGFudFBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mTWVhbnNPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUHJvcGVydHlPclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9yTGVzc29yc1N1cnZleW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lclBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmluZ0ludmVudG9yeUNvbnRyb2xQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1lZGljYWxDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0xhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyc2hpcEZvci1Qcm9maXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFJlbWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0c0Rpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUFjY29yZGluZ1RvRG9jdW1lbnRhcnlDcmVkaXRUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBc3NpZ25pbmdBU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF0RmluYWxQbGFjZU9mUG9zaXRpb25pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXRQaWNrLVVwTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXplZHRvRGVmaW5pdGl6ZUNvbnRyYWN0QWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6ZWRUb01ha2VEZWZpbml0ZUFDb250cmFjdEFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemluZ0Rpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6aW5nUmVsZWFzZU9mU2VjdXJpdHlJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEYXRhUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZWNsYXJpbmdUaGVWYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlc2lnbmF0ZWRUb0V4ZWN1dGVSZS1JY2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9FeGVjdXRlU2FuaXRhcnlQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlc2lnbmF0ZWRUb1Byb3ZpZGVMaXZpbmdBbmltYWxDYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUV4ZWN1dGluZ0FuZFZlcmlmeWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGaWxsaW5nU2hpcHBlcnNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGb3JXaG9tSXRlbUlzVWx0aW1hdGVseUludGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZyb21XaG9tQ3VzdG9tc0RvY3VtZW50c0FyZVRvQmVQaWNrZWRVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGcm9tV2hvbU5vbi1DdXN0b21zRG9jdW1lbnRzQXJlVG9CZVBpY2tlZFVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZ1bGZpbGxpbmdBbGxPcGVyYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUluUG9zc2Vzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJc3N1aW5nTXV0dWFsbHlBZ3JlZWRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYWludGFpbmluZ1RoZUNvZGVzVXNlZEluVGhlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYWludGFpbmluZ1RoZUlkZW50aWZpZXJzVXNlZEluVGhlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYW5kYXRlZFRvTGlxdWlkYXRlQW5FbnRlcnByaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1hbnVmYWN0dXJlZEZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlOb3RUb0JlQ29uZnVzZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBhc3NpbmdUaGVUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0luc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ1Rhc2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ1ZlcmlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQcm92aWRpbmdGaW5hbmNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UHJvdmlkaW5nR292ZXJubWVudEZ1cm5pc2hlZFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlY292ZXJpbmdUaGVWYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlcHJlc2VudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlc3BvbnNpYmxlRm9yRGlzaW5mZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlc3BvbnNpYmxlRm9yRmluYW5jaWFsU2V0dGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvclJlZnVlbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlTdWJtaXR0aW5nUXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VGhhdFJlY2VpdmVkRGlzY2xvc3VyZVN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUaGF0UmVtaXRzUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b0FwcGVhckJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0FwcHJvdmVTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvYmVhZHZpc2VkLVdyaXR0ZW5PcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9CZUJpbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0JlQmlsbGVkRm9yT3RoZXJUaGFuRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b0NvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvRmlsZVBlcnNvbmFsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9MZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1BlcmZvcm1QYWNrYWdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9QcmludFNvbWVEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1Byb3ZpZGVEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVBbGxEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmljYXRlT2ZDb21wbGlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmljYXRlT2ZDb25mb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpZWRJbnNwZWN0aW9uUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmllZFRlc3RSZXN1bHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvbW1lcmNpYWxJbnZvaWNlUmVtaXR0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb250cmFjdFNlY3VyaXR5Q2xhc3NpZmljYXRpb25TcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29ycmVzcG9uZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUN1c3RvbXNEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlRWxlY3Ryb25pY01lbW9PZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUZyZWlnaHRCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUluc3BlY3Rpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW52aXRhdGlvblRvT2ZmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlSW52b2ljZUZPckdvb2RzT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnZvaWNlRm9yTGVhc2VQYXltZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVMaW1pdGF0aW9uc09mSGVhdnlFbGVtZW50c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVNYXRlcmlhbFJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlTm9uLUN1c3RvbXNEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlT3JkZXJUb1N1cHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQYWNraW5nQ3JhdGluZ0FuZEhhbmRsaW5nQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVBhcGVyTWVtb09mSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVQcm9wb3NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU2NhbGVUaWNrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU2hpcHBpbmdNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTaGlwcGluZ05vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTb2xpY2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU3RhdGVtZW50T2ZBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVN0YXRlbWVudE9mRmVlc0R1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlVGVjaG5pY2FsRG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVUZXN0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVRyYW5zcG9ydGF0aW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvV2hvbUFja25vd2xlZGdtZW50U2hvdWxkQmVTZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvV2hvbURvY3VtZW50c0FyZVRvQmVQcmVzZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9XaG9tUHJvdGVzdFN1Ym1pdHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXYWl2aW5nUmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdoaWNoRGVsaXZlcnNDb25zaWdubWVudHNUb1RoZVRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdoaWNoUGlja3NVcENvbnNpZ25tZW50c0Zyb21UaGVUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaG9TaWduZWRUaGVEZWxpdmVyeVJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2l0aEtub3dsZWRnZU9mQWZmYWlyc09mVGhlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaXRoUG93ZXJUb1ZvdGVTZWN1cml0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRDb21wYW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRFZHVjYXRpb25Vbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRSZXByZXNlbnRhdGl2ZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzQ29tcGFueU5hbWVPcklkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJPZkxhc3RSZXNvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0NvbXBhbnlOYW1lT3JJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWluZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXktVG9Qcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVkZXN0cmlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVkaWF0cmljQWN1dGVJbnBhdGllbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtZWRBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Gb3JXaG9zZUJlbmVmaXRQcm9wZXJ0eXdhc1NlaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29ubmVsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25PbkNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Pck90aGVyRW50aXR5TGVnYWxseVJlc3BvbnNpYmxlRm9yQUNoaWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Pck90aGVyRW50aXR5TGVnYWxseVJlc3BvbnNpYmxlRm9yQW5kV2l0aFdob21BQ2hpbGRSZXNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Pck90aGVyRW50aXR5V2l0aFdob21BQ2hpbGRSZXNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbmluZ0NyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbmluZ0NyZWRpdG9yc0F0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3lEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsVGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbkNsaW5pY09yR3JvdXBQcmFjdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuSG9zcGl0YWxPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbi1TcGVjaWFsaXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllck5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudEJvdW5kYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQm90dGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkRpc3RpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZPY2N1cnJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mUGVyZm9ybWFuY2VDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdPck1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ0NvbW1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nU2NoZWR1bGVPck1hdGVyaWFsUmVsZWFzZUlzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblNwb25zb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudENsZWFyYW5jZU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvZGlhdHJpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvaW50T2ZTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVdyaXRpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sbGluZ1NpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbE1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0c2Vjb25kYXJ5RWR1Y2F0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0c2Vjb25kYXJ5RWR1Y2F0aW9uU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVNlY29uZGFyeUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RlbnRpYWxTb3VyY2VPZlN1cHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJPZkF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUtEYXlDYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUta2luZGVyZ2FydGVuVG9HcmFkZTEyUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUta2luZGVyZ2FydGVuVG9HcmFkZTEyU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUN1c3RvbWVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUluc3BlY3Rpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlNYWludGVuYW5jZVBlcmlvZERlc2lnbmF0aW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeVJlZmVycmVkVG9Pcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQnVzaW5lc3NQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NyZWRpdEdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVidEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01lbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05hbWVPZkZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmVpZ2hib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzT2NjdXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1N0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGl0bGVDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RyYWRlVW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDaGVja1NoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRyb2xQb2ludExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SGVhbHRoQ2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW5zdXJlZE9yU3Vic2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludGVyZXhjaGFuZ2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW50ZXJuYXRpb25hbFRlbGVjb21DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW50cmEtTEFUQUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnZlbnRvcnlDb250cm9sQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U3VwcG9ydE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVN1cmdlb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlUYXhwYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWVDb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbEJvcnJvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxFeGVjdXRpdmVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCYXNlSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5zdXJhbmNlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUaXRsZUV2aWRlbmNlSG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlUHJlLUtFZHVjYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb0Jvbm9BdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudFJlc3BvbnNpYmlsaXR5Rm9yT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbk1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQb3NpdGlvbkhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNlcnZpY2VzQW5kUmVwYWlyc0NlbnRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29vcmRpbmF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlbWVudE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3ROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU9yQnVpbGRpbmdNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9TZUNvdW5zZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNDaGlsZE9yQWRvbGVzY2VudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0NvbnN1bHRhdGlvbi1MaWFpc29uU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljRWR1Y2F0aW9uU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljRW1lcmdlbmN5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljR2VyaWF0cmljU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljSGVhbHRoRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljSW5wYXRpZW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNPdXRwYXRpZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljUGFydGlhbEhvc3BpdGFsaXphdGlvblByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hvbG9naXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNBbHRlcm5hdGl2ZVNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoU2VydmljZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNIZWFsdGhTZXJ2aWNlSW5kaWFuU2VydmljZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNvclByaXZhdGVPcmdhbml6YXRpb25Gb3JUaGVEaXNhYmxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljUHJlLUtFZHVjYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1NjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlZENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNEZXBhcnRtZW50QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZ5aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhdGlvblJlcXVlc3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVJbXBsYW50c1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9TdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdE1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyT2ZDaGVxdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyT2ZGdW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzQ29ycmVzcG9uZGVudEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzU3ViLUVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRmFjaWxpdHlTY2hlZHVsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nUG9pbnRGb3JDdXN0b21lclNhbXBsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1N1Yi1Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaXBpZW50T2ZDaXZpbG9yTGVnYWxMaWFiaWxpdHlQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkLUtlZXBpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeVJvb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3JlYXRpb25hbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmFsUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmluZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyaW5nUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeU9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1c2FsUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCdXNpbmVzc05hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmluZ05vbnBhcmVudFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmluZ1BhcmVudFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblRyaWJ1bmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGFyRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5U3RhdGVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVN0YXRlRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbklucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGFiaWxpdGF0aW9uT3V0cGF0aWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWltYnVyc2luZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlSW50ZXJtZWRpYXJ5T3JCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVuZGVyaW5nUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJpbmdPdXRsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yUmVmdXJiaXNoTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2luZ01hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0NhcnJpZXJzTm9taW5hdGVkQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJvZHVjdGl2ZUhlYWx0aFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRMZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzYWxlQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZURlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWFyY2hJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2Vydm9pciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmNlT3JEb21pY2lsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmN5SW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50SW5zdHJ1Y3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcGlyYXRvcnlUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BpdGVDYXJlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlRXhoaWJpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUdvdmVybm1lbnRBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlSW5zdGFsbGF0aW9uRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlSW5zdGFsbGF0aW9uT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxQaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0cm9jZXNzaW9uYWlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3lhbHR5T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1cmFsSGVhbHRoQ2xpbmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0Fzc2lzdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzcGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1Jlc3BvbnNpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlc1RvQmVSZXR1cm5lZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2wtQmFzZWRTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ29ycG9yYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmVlbmluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5SW52ZW50b3J5Q29udHJvbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlMb2NhdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlUYXhwYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5V2FycmFudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRDb250YWN0T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRIb21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRMZXZlbFBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyaWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uOEFQcm9ncmFtUGFydGljaXBhbnRGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRQYXJ0eUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRQYXJ0eUluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckFzT2ZmaWNpYWxseVJlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlck9mRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNDb3JyZXNwb25kZW50QmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuaW9yTWVtYmVyc2hpcFByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJmb3JtYW5jZVNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJmb3JtZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWx0ZXJlZFdvcmtzaG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdMaW5lU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdTY2hlZHVsZUlzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG93aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpYmxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduaWZpY2FudE90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQaG90b25FbWlzc2lvbkNvbXB1dGVyaXplZFRvbW9ncmFwaHlVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWROdXJzaW5nRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWROdXJzaW5nb3JPdGhlckxvbmctVGVybUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xvdENoYXJ0ZXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCYXNlU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbENvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxseURpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlEaXNhZHZhbnRhZ2VkSW5kaXZpZHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlJbnN1cmVkUGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0aWVzQ29sbGVjdG9yc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWV0eU9mUHJvcGVydHlJbmZvcm1hdGlvbkNvbXBpbGVyc0FuZEFuYWx5c3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0FuZFNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvSWZEaWZmZXJlbnRGcm9tQmlsbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xlUHJvcHJpZXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VNZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VQYXJ0eU9mSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ291bnNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbGl6ZWRNb2JpbGVSYWRpb1NlcnZpY2VMaWNlbnNlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbGl6ZWRPdXRwYXRpZW50UHJvZ3JhbUZvckFJRFNPckFSQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkUmVwb3NpdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWNoVGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9ydHNNZWRpY2luZUNsaW5pY09yU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3B1ZENvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNoYXJ0ZXJlZEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZURpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVhbXNoaXBDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja2hvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eWF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eUF0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVLZWVwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHlTdWJtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdE9yQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3ItTm9taW5hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yV2l0aERpcmVjdFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ymdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0T2ZJbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVyT2ZTYW1wbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJzU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1TZXJ2aWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeURpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Y2Nlc3NmdWxKb2JBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzaW5nSGVhbHRoQ2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc2luZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnlBcHByYWlzZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJPck1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ29ycG9yYXRlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcldvcmtUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbHlTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRpbmdQZXJzb25uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlGb3JBZGRpdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUZvckFudGlkdW1waW5nT3JDb3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEaXNjaGFyZ2VBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VNYW5hZ2VtZW50RW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJwbHVzRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlvci1Qb2Zlc3Npb25hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlvclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlvclRvcG9ncmFwaGljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0Zhcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZklzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDb2xsZWN0b3JzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lQW5zd2VyaW5nU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnRNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcnRpYXJ5UGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNwb25zb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZWF0ZXJDaXJjdWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXBldXRpY1JhZGlvaXNvdG9wZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5QWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUludmVzdG1lbnRBZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5TWFya2V0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXByaWNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXByaWNpbmdQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJldmlld2luZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJldmlld2luZ1ByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZWhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVJbnN1cmFuY2VTZXJ2aWNlc1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVVuZGVyd3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nRGVzaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nRmFicmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcFBhcmVudENvbXBhbnlJblNhbWVDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3dpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlbmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVOYW1lU3lub255bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVVbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRDaGFyZ2VQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdEZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRQcmluY2lwYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRQcmluY2lwYWxzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGVyT2ZIYXphcmRvdXNXYXN0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF1bWFDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmliYWxHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RlZXNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdE9yRXN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWJlcmN1bG9zaXNBbmRPVGhlclJlc3BpcmF0b3J5RGlzZWFzZXNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVTYW1lQ291bnRyeVBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdHJhc291bmRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFzc2lnbmVkQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmV4cGVjdGVkSGFuZGxpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0N1c3RvbXNCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc092ZXJzZWFzU2VjdXJpdHlBZG1pbmlzdHJhdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzaXR5LUNvbGxlZ2VPclNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2VydmljZWFibGVNYXRlcmlhbENvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1NZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1RydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpemF0aW9uTWFuYWdlbWVudE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYXRpb25Ib21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGF0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWROZXR3b3JrUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVTYWx2YWdlQXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxNYXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW4tT3duZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uTG9hbkF1dGhvcml6ZWRTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkxvYW5HdWFyYW50eUF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmluYXJ5SG9zcGl0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpY3RpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlkZW9EZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRlZXJTZXJ2aWNlc0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRWFybmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZURlcG9zaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlS2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyQW1idWxhbmNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbENhc2luZ0RlcHRoQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsUGFkQ29uc3RydWN0aW9uQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGx5LU93bmVkU3Vic2lkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lubmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3NGb3JEZWZlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3NGb3JQbGFpbnRpZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3NGb3JQcm9zZWN1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzc0xhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21hbi1Pd25lZEJ1c2luZXNzU21hbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWVuc0hlYWx0aENlbnRlck9yU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzaXRlSGVhbHRoUHJvbW90aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXRpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWC1SYXlSYWRpYXRpb25UaGVyYXB5VW5pdCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJSZWZlcmVuY2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFjY291bnRDb2RlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0UmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlF1b3RlUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik90aGVyT3JkZXJSZWZlcmVuY2VzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJSZWZlcmVuY2VzIiB0eXBlPSJPcmRlclJlZmVyZW5jZXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZSIgdHlwZT0iUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250cmFjdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udHJhY3QiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRyYWN0IiB0eXBlPSJMaXN0T2ZDb250cmFjdCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0SUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udHJhY3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN5c3RlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdCIgdHlwZT0iQ29udHJhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IklkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSWRlbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IklkZW50aWZpZXIiIHR5cGU9IklkZW50aWZpZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFnZW5jeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWdlbmN5Q29kZWQiIHR5cGU9IkFnZW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFnZW5jeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFnZW5jeURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlZCIgdHlwZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWdlbmN5IiB0eXBlPSJBZ2VuY3kiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWdlbmN5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFBTVZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQkNELVRoZU1pY3JvY29tcHV0ZXJJbmR1c3RyeUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0dJSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNPUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFQ01BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSUhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxhYmFtYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxhc2thIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHVtaW51bUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkFwcGFyZWxNYW51ZmFjdHVyZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuRnVybml0dXJlTWFudWZhY3R1cmVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbklyb25BbmRTdGVlbEluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5MYW5kVGl0bGVBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5NZWRpY2FsQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGFwZXJJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUFdBQW5kT0NTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Tb2NpZXR5Rm9yQXV0b21hdGlvbkluUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVGV4dGlsZU1hbnVmYWN0dXJlcnNJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOU0lBY2NyZWRpdGVkU3RhbmRhcmRzQ29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcml6b25hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmthbnNhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNNRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeUJ1eWVyT3JCdXllcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU1hcmtldFBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5TmF0aW9uYWxUcmFkZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU93bmVyT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlQYXJ0eU9yaWdpbmF0aW5nVGhlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVNlbGxlck9yU2VsbGVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5VHJhbnNwb3J0Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUdlbGRhdXNnYWJlYXV0b21hdGVuU2VydmljZUdlc2VsbHNjaGFmdE1CSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtQXVzdHJpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1BdXN0cmlhblBUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtVmVyYmFuZE9lc3RlcnJlaWNoaXNjaGVyQmFua2VuVW5kQmFua2llcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFDT1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQUlIVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQVBDQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQVFJUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQXVzdHJpYW5DdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtRE9IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ISUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUxJRkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLU5DQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVJPQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtU0FBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1UcmFkZWdhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVlTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFLUJlbGdpYW5CYW5rZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFLUJlbGdpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuTWluaXN0cnlPZkZpbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbGxjb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rSW5kdXN0cnlTeXN0ZW1zQWR2aXNvcnlDb21taXR0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSLUJhbmNvQ2VudHJhbERvQnJhemlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUi1NQUFuZFJBQUFuZExJTU5FVEFuZFJJTkVUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1DUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLUNTSU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGlmb3JuaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGlmb3JuaWFMYW5kVGl0bGVBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5GcmVpZ2h0Q2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJpZGVNYW51ZmFjdHVyZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1SZXZlbnVlQ2FuYWRhQ3VzdG9tc0FuZEV4Y2lzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1TQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hJSUlENSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYWEkwMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYWElCMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYWFhJViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VGSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1BZG1pbmlzdHJhdGlvbkZlZGVyYWxlRGVzQ29udHJpYnV0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQXNzb2NpYXRpb25TdWlzc2VDb2RlRGVzQXJ0aWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUNhcmJ1cmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUNlbnRyYWxlU3Vpc3NlUG91ckxJbXBvcnRhdGlvbkR1Q2hhcmJvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRGlyZWN0aW9uR2VuZXJhbGVEZXNEb3VhbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1EaXZpc2lvbkRlc0ltcG9ydGF0aW9uc0V0RXhwb3J0YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1FbnRyZXByaXNlRGVzUFRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1NaW5pc3RyeU9mVGF4YXRpb25DZW50cmFsQ3VzdG9tc0FuZFRheEFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1PZmZpY2VGaWR1Y2lhaXJlRGVzSW1wb3J0YXRldXJzRGVEZW5yZWVzQWxpbWVudGFpcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1Td2lzc1NlY3VyaXRpZXNDbGVhcmluZ0NvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1UZWxla3Vyc0FHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSURYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSUVDQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29kZUFzc2lnbmVkQnlUaGVPcmdhbml6YXRpb25UaGF0SXNUaGVVbHRpbWF0ZURlc3RpbmF0aW9uT2ZUaGVUcmFuc2FjdGlvblNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08tRElBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3JhZG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1hbmRlclJvbWVBaXJEZXZlbG9wbWVudENlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY29yZEVESUdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aWN1dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbnNPblNBREFuZFRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHBlckFuZEJyYXNzRmFicmljYXRvcnNDb3VuY2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTy1TQkRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlEZXNpZ25hdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1NJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDU0lFeHRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VTSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQVJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CREkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQlJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1ESU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLURUQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUVESUJBVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZUxvZ2lzdGljc0FnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR0RWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HZXJtYW5CYW5rZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdlcm1hbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdNQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGF3YXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZBaXJGb3JjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mQXJteSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mSGVhbHRoQW5kSHVtYW5TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mSG91c2luZ0FuZFVyYmFuRGV2ZWxvcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZUaGVOYXZ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1TaWVtZW5zQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLVZEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREZBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3Rpb25HZW5lcmFsZURlc0RvdWFuZXNFdERyb2l0c0luZGlyZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RPZkNvbHVtYmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1NSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLU5CSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstUEJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaWJ1aWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGllbE5vcmRpY0ZvcnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElGSUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElURVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElURVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVFRzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVJRFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cmljVXRpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljSW5kdXN0cmllc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFU0RYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUy1PREVUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMtU3BhbmlzaEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVLUVESUZJQ0FTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1FVElTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1ST0ZFUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFTTElOQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQ0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEdvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIaWdod2F5QWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1BVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLUZpbm5pc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1UQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktVGhlRmlubmlzaEJhbmtlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvcmlkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUFHRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQXJ2QSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQmFucXVlRGVGcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUNGT05CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1DTkFNVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLURDUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItREdJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElGQ0FTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElGUkFOQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUVESVRSQU5TUE9SVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItR0FMSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUdFTkNPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItSU5TRUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLVJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQUJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1BQlRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1BcnRpY2xlTnVtYmVyQXNzb2NpYXRpb25MaW1pdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1Bc3NvY2lhdGlvbkZvclBheW1lbnRDbGVhcmluZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1CQUNTTGltaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQ0hBUFNBbmRUb3duQ2xlYXJpbmdDb21wYW55TGltaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItRkxFRVRORVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUhNQ3VzdG9tc0FuZEV4Y2lzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItT0RFVFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1UaGVDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9yZ2lhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwaGljc0NvbW11bmljYXRpb25zQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1ItR3JlZWtDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUSU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhd2FpaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEstSG9uZ0tvbmdDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFQU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDQU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGFobyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFLVJldmVudWVDb21taXNzaW9uZXJzQ3VzdG9tc0FFUHJvamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUwtSXNyYWVsQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsaW5vaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaWFuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJDb250YWluZXJJbnRlckZyaWdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzb2NpYXRpb25PZkNvcnBvcmF0aW9uQWRtaW5pc3RyYXRvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3NvY2lhdGlvbk9mSW5kdXN0cmlhbEFjY2lkZW50Qm9hcmRzQW5kQ29tbWlzc2lvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZHNPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklvd2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uQW5kU3RlZWxTdGFuZGFyZHNDb21taXR0ZWVJU00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTLUljZWxhbmRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVNlcnZpY2VzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtQXNzb2NpYXppb25lQmFuY2FyaWFJdGFsaWFuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtSXRhbGlhbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtU29jaWVhdGFJbnRlcmJhbmNhcmlhUGVyTEF1dG9tYXppb25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKYXBhbmVzZVN0YW5kYXJkc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1KYXBhbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU1PVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1OQUNDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2Fuc2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZW50dWNreSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2luZ0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlQW5kQW5udWl0eUluZHVzdHJ5Q29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSS1MaWVjaHRlbnN0ZWluQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMbG95ZHNSZWdpc3Rlck9mU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdWlzaWFuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVLUx1eGVtYm91cmdDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcnlsYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXNzYWNodXNldHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNhZmV0eURhdGFTaGVldFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWNoaWdhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlubmVzb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaXNzaXBwaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc291cmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQmFua2Vyc0Fzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1EYWdhbmdOZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZLU1hbGF5c2lhQ2VudHJhbEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZLU1hbGF5c2lhQ3VzdG9tc0FuZEV4Y2lzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFHUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBbGNvaG9sQmV2ZXJhZ2VDb250cm9sQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkJ1c2luZXNzQW5kRWR1Y2F0aW9uYWxSYWRpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0Zvcm1zQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ2VudGVyZm9yU3RhdGVDb3VydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ290dG9uQ291bmNpbE9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmV0YWlsTWVyY2hhbnRzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsV2hvbGVzYWxlRHJ1Z2dpc3RzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BVE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyYWxHYXNVdGlsaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lYnJhc2thIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORU1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZhZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0hhbXBzaGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SmVyc2V5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdNZXhpY28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld3NwYXBlckFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORlBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSUNCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSU9TSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldGhlcmxhbmRzUmFpbHdheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUJhbmtHaXJvY2VudHJhbGVCViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtQkVBTkVUQlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtSW50ZXJwYXlDYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtSW50ZXJwYXlHaXJhYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLU5ldGhlcmxhbmRzQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtT0RFVFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J3ZWlnaWFuU3RhdGVSYWlsd2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTk9SUFJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5CYW5rZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5vcndlZ2lhbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5vcndlZ2lhbkludGVyYmFua1Jlc2VhcmNoT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2EtVGVsZWNvbW11bmljYXRpb25zSW5kdXN0cnlGb3J1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhDYXJvbGluYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhEYWtvdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5UUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlotTmV3WmVhbGFuZEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZNYW5hZ2VtZW50QW5kQnVkZ2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlUHJvZHVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9oaW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9rbGFob21hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZWdvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1NIQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVubnN5bHZhbmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5uc3lsdmFuaWFDb3VydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtQ0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULVBvcnR1Z3Vlc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1TSUJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlSW5mb3JtYXRpb25JbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmhvZGVJc2xhbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJJTkVUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUtQklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVS1TRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0EtU2F1ZGlBcmFiaWFDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtQ2VudHJhbEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtU3ZlbnNrYUJhbmtmb2VyZW5pbmdlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtU3dlZGlzaEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJU0FDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291dGhDYXJvbGluYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291dGhEYWtvdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQWdlbmN5QXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRMb2FuR3VhcmFudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeUhlbHBJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVubmVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXhhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXNMYW5kVGl0bGVBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4dGlsZURpc3RyaWJ1dG9yc0Fzc29jaWF0aW9uSW5jIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURENDLUVESUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXLUNoaW5lc2VUYWlwZWlDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVy1UcmFkZS12YW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUlDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5FQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOQ1RBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNNYXJpbmVDb3JwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzTnVjbGVhclJlZ3VsYXRvcnlDb21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFCQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUlBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFJU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BTlNJQVNDWDEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BUEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFTVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFURiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQkFURiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQlhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DSElQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ0lEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNPUEFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1EQW5kQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRENJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ERUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURISFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURJU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURJU0NVUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRExNU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0RBQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1EU0FBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1FSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRkRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GSVBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GTUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZXUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtR1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1IQklDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhMNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1NQVJBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTkFCQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5BSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTmF0aW9uYWxDZW50ZXJGb3JIZWFsdGhTdGF0aXN0aWNzQ29tbWlzc2lvbk9mUHJvZmVzc2lvbmFsQW5kSG9zcGl0YWxBY3Rpdml0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OYXRpb25hbE1vdG9yRnJlaWdodENsYXNzaWZpY2F0aW9uQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5hdGlvbmFsUmV0YWlsRmVkZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTkNDTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5JU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5SQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTldEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtT0RUQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtT0ZBQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtT01CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1TdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVREQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVU4tU1BTQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVU9QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VU0NlbnN1c0J1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNDdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVZJQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVdTU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0YWgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpdHlJbmR1c3RyeUdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJtb250Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXJnaW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzaGluZ3RvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VzdFZpcmdpbmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSE1JUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lzY29uc2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXeW9taW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvckdlbmVyYWxPZkNhbmFkYSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZVNpdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudFBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY29yZEV1cm9wZWVuUmVsYXRpZkF1VHJhbnNwb3J0SW50ZXJuYXRpb25hbERlc01hcmNoYW5kaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudEFuYWx5c2lzQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UmVsYXRpb25zaGlwVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25BZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbk1ldGhvZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uTWV0aG9kU3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdGVQcmluY2lwYWxlRXhlcmNlZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVyc2VFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVyc2VFdmVudE91dGNvbWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpZFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDb21tb2RpdHlBbmRTcGVjaWFsSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdE1pc3Npb25EZXNpZ25TZXJpZXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJEaW1lbnNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0T3JDaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0VGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRlcm1pbmFsSWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGVnYXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsUGF0aWVudERpYWdub3Npc1JlbGF0ZWRHcm91cHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBhdGllbnRSZWZpbmVkRGlhZ25vc2lzUmVsYXRlZEdyb3VwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJhdGlvbkxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1idWxhdG9yeVBhdGllbnRHcm91cHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudENvZGUtQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Qc3ljaGlhdHJpY0Fzc29jaWF0aW9uRGlhZ25vc3RpY1N0YXRpc3RpY2FsTWFudWFsT2ZNZW50YWxEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuU29jaWV0eUZvclRlc3RpbmdBbmRNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFQb2xhcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFTdHJ1Y3R1cmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRDbGFzc2lmaWNhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uQWNrbm93bGVkZ2VtZW50QW5kRXJyb3JDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uUXVlc3Rpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRpY2xlU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0UmVjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRTdGF0dXNPclRyYW5zYWN0aW9uUmVwb3J0aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRUcmFuc2ZlclN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5U2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNEZXByZXNjcmlwdGlvbkRpc3RyaWJ1dGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc0RlcHJlc2NyaXB0aW9uRXhjZXB0aW9uTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzUmF0ZUVkaU5ldHdvcmtFcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlRGVzY3JpcHRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlTWFzdGVyRGVzY3JpcHRpb25JbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzU3dpdGNoUmVsZWFzZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3N1cmVkRGVsaXZlcnlJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWREYXRhUHJvY2Vzc2luZ0VxdWlwbWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXdhcmRTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0FkbWluaXN0cmF0aW9uSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQnJhbmNoU29ydGluZ0lkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtTZWN1cml0aWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaXNPZkp1cmlzZGljdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkUmVqZWN0aW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRPZmZpY2VJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0NsYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5UGFydExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkluc3BlY3Rpb25BbmRTdXJ2ZXlSZXNwb25zaWJpbGl0eUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkluc3BlY3Rpb25BbmRTdXJ2ZXlTaGlwTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDcmVkaXRSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nRGV0YWlsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nUmVwb3J0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nU2VjdXJpdGllc0luZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbmFuY2lhbEluZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Z1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0xlZ2FsU3RydWN0dXJlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NTaXplQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsU2lnbkRpcmVjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5JbnRlckVkaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZURlc2lnbmF0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VPcmlnaW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoRGlzY291bnRTdGlwdWxhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VPZkxvc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWlsaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25SZXF1aXJlbWVudHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVN1YmRpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVBheW1lbnRSZW1hcmtDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mUGl0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXVzZVN0YXR1c1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUF1dG9tYXRlZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtUGFydGljaXBhbnRzSWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtVW5pdmVyc2FsSWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXN0RGVzaWduYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2duaXphbmNlU3ltYm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tTG9zc0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLVBvaW50c09mSW1wYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLVByb2ZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpdGVybXMxOTkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsQW5kR292ZXJubWVudEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERyaXZlcnNMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNDb21tb2RpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNIYXphcmRvdXNNYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc0luc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zU2FmZXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVSZWdpc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVRpdGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaWNhdGlvbnNSb3V0aW5nSWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBlbnNhdGlvblR5cGVDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnRSZXF1ZXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZVJldmlld0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNsdXNpb25FdmFsdWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc1ByZW1pc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uQW5kQ29udGFpbmVyaXphdGlvblBvaW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkRldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RvckFsZXJ0TGlzdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckFuZFJvbGwtT25PclJvbGwtT2ZmTnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRlbnRJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENsb3NlLU91dEdyb3VwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3REZWxpdmVyeURhdGVSZXZpc2lvbkFnZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RGdW5kUmVwb3J0aW5nVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yQWxlcnRMaXN0U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yUmV2aWV3TGlzdFN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQYXltZW50RGVkdWN0aW9uT3JDb2xsZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQYXltZW50TGluZUl0ZW1TdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFNoaXBtZW50QWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZEludmVudG9yeUl0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdERlc2lnbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb3ZlcnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252aWN0aW9uT2ZmZW5zZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlTG9naXN0aWNzUHJvZ3JhbVN1cHBvcnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVGaW5hbmNpYWxGaWxpbmdDcml0ZXJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlU3RhdGVtZW50RmlsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbk9yQ2hhbmdlRm9yU3RvcmFnZUl0ZW1SZWNvcmRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeUFuZEFjdGl2aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeUNvZGUtRmluYW5jZUFuZEFjcXVpc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5U3ViLUVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlEZXNpZ25hdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uQWRqdXN0bWVudFJlYXNvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0QXBwZWFyYW5jZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydENhc2VTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydERpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREb2N1bWVudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydElzc3VlZFdhcnJhbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRPZkxhd0V2ZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRPZkxhd1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0UGFydHlTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0UGxlYWRpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VDb2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VNb2RpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3BhLUNhbmFkaWFuUGF5bWVudHNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsQ2hhcmdlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsaXR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1aXNpbmVUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFzc2V0RGV0YWlscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERlbnRhbFRlcm1pbm9sb2d5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpYWJpbGl0eURldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQcm9jZWR1cmFsVGVybWlub2xvZ3lDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZUxldmVsTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcldpdGhpbkNvdW50cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21pemVkTm90aWNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNBcmVhT2ZUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RvbWVzdGljUG9ydExvY2F0aW9uQ29kZXMtVVNTY2hlZHVsZUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGb3JlaWduUG9ydExvY2F0aW9uQ29kZXMtVVNTY2hlZHVsZUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnNwZWN0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ByZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNSZWxlYXNlTm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU2ltcGxpZmllZFByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NwZWNpYWxDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1N0YXR1c09mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUcmFuc2l0R3VhcmFudGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNpdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNWYWx1YXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzUGFja2luZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVNoaXBwZWRPclJlY2VpdmVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yQnVzaW5lc3NUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuZGFudFBsZWFUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZVByaW9yaXRpZXNBbmRBbGxvY2F0aW9uc1N5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmFsTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2llbmN5Q2F1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaWVuY3lJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGlucXVlbmN5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VGVybUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWFuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWlsaXRhcml6YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VBdmFpbGFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VFdmFsdWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRXZlbnRQcm9ibGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlT3BlcmF0b3JUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlVXNhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc0VuY291bnRlcmVkRHVyaW5nRXhhbWluYXRpb25BbmRJbnZlc3RpZ2F0aW9uT2ZJbmRpdmlkdWFsc0FuZFBvcHVsYXRpb25zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzUmVsYXRlZEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zdGljQW5kU3RhdGlzdGljYWxNYW51YWxPZk1lbnRhbERpc29yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0TnVtZXJpY2FsQ29udHJvbFN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeVN0YXR1c09yRGlzcG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbEF1dGhvcml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVxdWVzdGVkQnlDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2RhYWMtRGVwYXJ0bWVudE9mRGVmZW5zZUFjdGl2aXR5QWRkcmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljTGluZU9mQnVzaW5lc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NlRm9ybUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlclBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbEJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxEdWVQcm9jZXNzU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxFeHRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0RldGFpbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdTdGF0dXNBZHZlcnNlRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVtcGluZ09yQ291bnRlcnZhaWxpbmdBc3Nlc3NtZW50TWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW1waW5nU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldENhbmFkYXM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bnMtRHVuQW5kQnJhZHN0cmVldFBsdXM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5zU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb24yUGx1czJEdW5BbmRCcmFkc3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5VGF4T3JGZWVQYXltZW50TWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeW5hbWljR2VuZXJhdG9yU2V0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHluYW1pY0xvY29tb3RpdmVUYWdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlyYS1JZC1FZGlSZWdpc3RyYXRpb25BdXRob3JpdHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdEVycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxJbnN0aXR1dGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsU3R1ZHlBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbWFnbmV0aWNUcmFuc21pdHRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmhhbmNlZFBhcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlSZWxhdGlvbnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFN0YXR1c0xvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXJyb3JDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzc2VudGlhbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFRpbWVPZkFycml2YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZVR5cGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRpbmdNZXRob2RTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdGhuaWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRlV29ya0NhbmRpZGF0ZUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhbHVhdGVXb3JrQ2FuZGlkYXRlUmVhc29uTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudEFiYXRlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50T3JFeHBvc3VyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50UmVhcHBlYXJhbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhbWluYXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjYXZhdGlvbkluZm9ybWF0aW9uQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc01hdGVyaWFsRGlzcG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDb21tb2RpdHlDbGFzc2lmaWNhdGlvbi1VU1NjaGVkdWxlQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbnNpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV5ZUNvbG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlTZWN1cml0eUNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZVRvQXdhcmRSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZUFkanVzdGFibGVSYXRlTW9ydGdhZ2VQbGFuQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLU1vcnRnYWdlSW5zdXJhbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tUG9vbEZlYXR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1SZW1pdHRhbmNlUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVNwZWNpYWxGZWF0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlUmVmaW5hbmNlUGxhbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxGaW5hbmNlQ29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGVhbHRoQ2FyZUNvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbExvZ2lzdGljc0NvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFByb2N1cmVtZW50Q29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVHJhbnNwb3J0YXRpb25Db2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEFuYWx5c2lzQ2F0ZWdvcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJdGVtQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbUF0dHJpYnV0ZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJdGVtUmVjbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsTWFuYWdlbWVudFNlcnZpY2VDYXNoLUxpbmtDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJlZ2ltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUm91dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU3RhdGVtZW50Rm9ybWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGVldFBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3dPZlRoZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2xsb3ctVXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25MaW5lT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzQ291bnRyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ1Jlc3RyaWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hYy1GZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uLU1vcnRnYWdlSW5zdXJhbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hYy1GZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uLVJlbWl0dGFuY2VQcm9ncmFtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hYy1GZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uLVNwZWNpYWxDaGFyYWN0ZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjUmVmaW5hbmNlUGxhbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVPbkJvYXJkU2l0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeUJhbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kUHVycG9zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2Fpbk9yTG9zc0luZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uQ3VzdG9tZXJTdXBwbHlDZW50ZXJOdW1iZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsVGVycml0b3J5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhdG9yU2V0TW91bnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsYXNzQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFnZW5jeVByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVPZkRpZmZpY3VsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFpckNvbG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbml6ZWRTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzQ3JlZGVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzUmVzcG9uc2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUNsYWltU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uQ29tbW9uUHJvY2VkdXJhbENvZGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uQ29tbW9uUHJvY2VkdXJhbENvZGluZ1N5c3RlbVByaW5jaXBhbFByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uRHVyYWJsZU1lZGljYWxFcXVpcG1lbnRSZWdpb25hbENhcnJpZXJDZXJ0aWZpY2F0ZU9mTWVkaWNhbE5lY2Vzc2l0eUZvcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvdmlkZXJDaGFyYWN0ZXJpc3RpY3NBbmRSZXNvdXJjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVQcm92aWRlclRheG9ub215Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbmR1c3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlPcmdhbml6YXRpb25JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9iYnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkljZDEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZ5aW5nQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGl0eURpc2Nsb3N1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW11bml6YXRpb25JbmplY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhY3RBeGlzT3JBbmFsb2dQb3J0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0UmVjb3JkZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Q29uc2VxdWVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudExvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRSZWxhdGVkQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Rlcm1zMTk4MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEluc3VyYW5jZUZpbmFuY2lhbERldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFBhcnRpY2lwYXRpb25JbkNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxTZWN1cml0eUNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZXF1ZXN0UmVzdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlcXVlc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxUcmVhdG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5U2VsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ292ZXJhZ2VEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUluZm9ybWF0aW9uSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQbGFuRGVzY3JpcHRpb25DaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNvbnRhaW5lckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNvbnRhaW5lclF1YW50aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb25QcmluY2lwYWxQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvbi1JY2QtOS1DbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZERlc2lnbmF0aW9uU3lzdGVtRm9yVGVldGhBbmRBcmVhc09mVGhlT3JhbENhdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdGlvblN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRGdW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyc1F1YWxpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Tb3VyY2luZ0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iQ2hhcmFjdGVyaXN0aWNzTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JPcmlnaW5hdG9yTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludExpZmVJbnN1cmFuY2VJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsSGVhcmluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbE9yZGVyVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsU2VudGVuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5RXZlbnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpbmRPZkNvbnRyYWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2luZE9mTW9kaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVJlc3VsdHNJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlUZXN0Q29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxDYXNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdHJ1Y3R1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZlJlY29tbWVuZGF0aW9uUmF0aW5nQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eURldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVNlcnZpY2VGZWF0dXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVN0YXR1c0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlUmVpbnN1cmFuY2VNZXNzYWdlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1Db25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkJ1c2luZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsZU9mQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU291cmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uc0ZvclRhcmlmZkNhbGN1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naWNhbE9ic2VydmF0aW9uSWRlbnRpZmllck5hbWVzQW5kQ29kZXNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naXN0aWNzQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NEZXNjcmlwdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NTZXZlcml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvckZvcmNlUHJvZ3JhbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50SW5kaWNhdG9yQ29kZS1QZXRyb2xldW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVhbENsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lQmVydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVdoYXJmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQbGFjZU9yZ2FuaXphdGlvbklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQbGFjZVRyYWRpbmdQYXJ0bmVySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29udHJvbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZkNvbW11bmljYXRpb25zSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWNoYW5pemF0aW9uT2ZDb250cmFjdEFkbWluaXN0cmF0aW9uU2VydmljZXNTeXN0ZW1FcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGlhQW5kU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEJlbmVmaXRzU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bU9mVHJhbnNtaXNzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyT3JnYW5pemF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0aG9kRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZHNPZlBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QW5kQ2l2aWxpYW5HcmFkZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QXNzaXN0YW5jZVByb2dyYW1BZGRyZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHlJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3Npb25JbXBhY3RTdGF0ZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUZ1bmN0aW9uRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluZGV4U291cmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGktTWVkaWFPYmplY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hY2hhLU5hdGlvbmFsQXV0b21hdGVkQ2xlYXJpbmdIb3VzZUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxGb3JQcmVzY3JpcHRpb25EcnVnUHJvZ3JhbXNSZWplY3RPclBheW1lbnRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2VOYXR1cmVPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlUGFydE9mQm9keUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlU291cmNlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbE1vdG9yRnJlaWdodENsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxTdGFuZGFyZFRvb3RoTnVtYmVyaW5nU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZEZWJ0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZTdWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZlN1aXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZlRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0xvbmdlckNvbnNpZGVyZWRGb3JBd2FyZFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9tZW5jbGF0dXJlQWN0aXZpdHlDbGFzc2lmaWNhdGlvbkVjb25vbXlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUG9zdGFsVG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWVBY3Rpdml0ZUZyYW5jYWlzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ibGlnYXRpb25WYXJpYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eUFuZEhlYWx0aEFkbWluaXN0cmF0aW9uTmF0dXJlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvblBhcnRPZkJvZHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvblNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ2FycmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyQW5kUmVsZWFzZU9wdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zTmF0dXJlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc09jY3VwYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc1BhcnRPZkJvZHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc1NvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2l6ZU9yT3ZlcndlaWdodENyZWRlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcFJpZ2h0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZUZhaWx1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQW5kT3JVbnBhY2tpbmdGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1JlcXVpcmVtZW50TGV2ZWxBQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1JlcXVpcmVtZW50TGV2ZWxCQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1JlcXVpcmVtZW50TGV2ZWxDQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE9mQm9keUFmZmVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRFdmVudFByb2JsZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QmVoYXZpb3VyUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGVzdHJpYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5QW5kQ29udGVudHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1CaWxsVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTGFuZENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1MZWFzZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdERpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0UG9pbnQtT2YtU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFNlbGxpbmdBcnJhbmdlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFZhbHVlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUmVndWxhdG9yeVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUm95YWx0eUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlDYWxjdWxhdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUm95YWx0eVRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Vbml0ZWRTdGF0ZXNHZW9sb2dpY2FsU3VydmV5Rm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbEFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbENsYXNzaWZpY2F0aW9uU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxTaHV0LUluUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsVGVzdEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbENoYXJhY3RlcmlzdGljc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Q2xlYXJhbmNlT2ZmaWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXNJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lPbkNsYWltSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lSZXNlcnZlVmFsdWF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydGFsSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxTZXJ2aWNlQ2FycmllclJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0Y29kZURpcmVjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdE1hcmtldFN0dWR5U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2lvdXNNZXRhbHNJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZXJ2YXRpb25EYXRhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aW9uTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2ZW50aXZlTWVhc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeURpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxQYXJ0eUNpdGl6ZW5zaGlwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlEZXNpZ25hdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VyRmluYW5jaWFsSGlzdG9yeUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFF1YWxpdHlEZWZpY2llbmN5UmVwb3J0U3VtbWFyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTdXBwbHlDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbERlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1PcmlnaW5hdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbVllYXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5T3duZXJzaGlwRXh0ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU93bmVyc2hpcFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVJlY29yZFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5U291cmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVVuZGVyd3JpdGluZ0NvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ByaWV0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udHJhY3RPZmZpY2VySW5zdHJ1Y3Rpb25zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVycG9zZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBbGVydExpc3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBc3N1cmFuY2VTaXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyVW5pdFBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeU9wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXJ5U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0ZyZXF1ZW5jeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU2VydmljZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU3lzdGVtVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEFkZGl0aW9uYWxDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsY2FyTGV0dGVyTWFya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbERvY3VtZW50TmFtZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYW5kbGluZ1Jlc3RyaWN0aW9uc0FuZEluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEhhcm1vbml6ZWRDb2RpZmljYXRpb25PZlRhcmlmZnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYXJtb25pemVkRXF1aXBtZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFJvdXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFVuaWZpZWROb21lbmNsYXR1cmVPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q29tcGFueU5ldHdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUZyb250aWVyQW5kVHJhbnNpdFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5TG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5U2VydmljZXNIYXJtb25pemVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdTdW1tYXJ5VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVBc3NldFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckNvbnRyYWN0RGVsaXZlcnlEYXRlUmV2aXNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JEZWxheWVkQ2xvc2luZ09mQ29udHJhY3RGaWxlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRGlzcG9zYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JGaW5hbmNpYWxJdGVtRGV0YWlsQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JQdWJsaWNSZWNvcmRGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvclJlcXVpc2l0aW9uaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaXBpZW50T2ZCaWxsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21tZW5kYXRpb25zUmVnYXJkaW5nRGVsYXllZERlbGl2ZXJpZXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRQcmVjZWRlbmNlQmFzZWRPbkl0c0N1cnJlbmN5SW5UaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VBbmRTdGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvblVuaXRPcGVyYXRpbmdNb2RlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ29udHJhY3RvckFjdGl2aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VNb25ldGFyeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUG9saWN5QXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0QWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERldmljZUFwcGxpY2FiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpZ2lvdXNBZmZpbGlhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWVkaWFsQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlQWNjZXNzb3JpZXNBbmRTcGVjaWFsRXF1aXBtZW50T25SYWlsY2FycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0YWJsZUV2ZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0YWJsZUV2ZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RGlzdHJpYnV0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0U291cmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpdmVCdXlJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudHNJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jeUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxBbmRDb21tZXJjaWFsUm9vbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3Rpb25zQW5kUHJvaGliaXRpb25zUGxhY2VkT25UaGVSZS1Vc2VPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWx0RXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZEluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENoYXJhY3RlcmlzdGljQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHdheURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHdheVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kRml0bmVzc0VsZWN0cm9uaWNSZWNvcmRTeXN0ZW1zRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlBbmRGaXRuZXNzRWxlY3Ryb25pY1JlY29yZFN5c3RlbXNTdWJzY3JpcHRpb25PcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUhhemFyZExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5UmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQcmljZUNvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbHZhZ2VEaXNwb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUV4dHJhY3Rpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhdmFuT3duZXJzaGlwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5RGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlTb3VyY2VPZkluanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaGFyZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VBbmRBZ2VuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3RBY3RPY2N1cGF0aW9uQ2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3RBY3RPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3RBY3RPcGVyYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50T3JQYXlvdXRPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEFjY2VwdGFuY2VEaXNjcmVwYW5jeUV4cGxhbmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRSZWxlYXNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlU3RhdGVSZWdpc3RyYXRpb25TeXN0ZW1BbmRPcGVyYXRpbmdBdXRob3JpdHlDcmVkZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVVc2VMYWJlbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemVBbmRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2luVG9uZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQXJtc0Vycm9yVHJhbnNhY3Rpb25SZWplY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEFybXNUcmFuc2FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbkNhbmNlbGxhdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlTWFpbnRlbmFuY2VBbmRSZWNvdmVyYWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mRGVwb3NpdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mRGlzY2xvc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkxlYWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkxvc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ29udHJhY3RQcm92aXNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRGF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXJrZXRpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hcmtpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWF0ZXJpYWxJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9ncmFtUmVxdWlyZW1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVpbWJ1cnNhYmxlUHJvdmlzaW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZXF1aXJlbWVudExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlcXVpcmVtZW50c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZE9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGV4dEFjY29yZGluZ1VTRW1iYXJnb1JlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRDbGF1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRGb3JFeHBvcnRBY2NvcmRpbmdOYXRpb25hbFByZXNjcmlwdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvbkNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aW9uQ2xhc3NpZmljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbEFkbWluaXN0cmF0aXZlSW5mb3JtYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbE5hdHVyZU9mVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbFByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY0J1bmRlc0FtdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0Z1bmRPck5vbi1TdG9ja0Z1bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRBY3Rpdml0eVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50QXdhcmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvbkFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uUGF5bWVudE9wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uUmVxdWVzdENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblJlc3BvbnNlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpc3RlbmNlVHlwZU9mUGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZpeE9yTGltaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tb25zVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhcnlBY2NvdW50aW5nQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNTdG9ja1R1cm5vdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbHlDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGVzY3JpcHRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW50YXhOb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtYXRpemVkTm9tZW5jbGF0dXJlT2ZIdW1hbkFuZFZldGVyaW5hcnlNZWRpY2luZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QXNzZXNzbWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T3JGZWVFeGVtcHRpb25SZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQYXJ0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxBc3Nlc3NtZW50Q2hlY2tsaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVEaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlQ2hhcmFjdGVyaXN0aWNMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlT3duZXJMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlVHlwZUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVydGlhcnlEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdEZW1vZ3JhcGhpY0NhdGVnb3J5Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTZXJ2aWNlUXVlc3Rpb25Db2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1N0YXRpc3RpY2FsQ2F0ZWdvcnlDb2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlc3VsdHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZURvY3VtZW50Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlRXhjZXB0aW9uQW5kUmVxdWlyZW1lbnRDb2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvblN0YXR1c0luZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQmlsbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uSG9sZGluZ0RlbGF5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Nb2RlT3JNZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk1vZGVSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblByaW9yaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZUFuZEJhbmtTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlTeW1ib2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlbmRSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBZGp1c3RtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUFuZENhdXNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUR1ZS1JbkluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUlkZW50aXR5Q2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUluc3BlY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlTnVtZXJpY2FsQ29udHJvbFN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkFzc2V0c0FuZExpYWJpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZBc3Npc3RhbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQmlsbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkJ1c2luZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ2FyZ29Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNvbnRyYWN0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZEZWxheUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkZpbmFuY2lhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkZpcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbmR1c3RyaWFsQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZklucXVpcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJc3N1ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkxvY2F0aW9uUmVjb25jaWxpYXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZNZWRpYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlByb2N1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTdG9yYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU3VydmV5UXVlc3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVQYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVBoeXNpY2FsSW52ZW50b3J5T3JUcmFuc2FjdGlvbkhpc3RvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVJlY2lwaWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY2xhaW1lZFByb3BlcnR5QWRkaXRpb25zRGVsZXRpb25zQW5kRGVkdWN0aW9uc0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNsYWltZWRQcm9wZXJ0eVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtRnJlaWdodENsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybVJlc2lkZW50aWFsQXBwcmFpc2FsQXR0cmlidXRlc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zQ29tbW9uQ29kaW5nU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zU3RhbmRhcmRQcm9kdWN0c0FuZFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNEZXBhcnRtZW50T2ZIZWFsdGhBbmRIdW1hblNlcnZpY2VzT2ZmaWNlT2ZWaXRhbFN0YXRpc3RpY3NFLUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc29saWNpdGVkUHJvcG9zYWxSZWplY3Rpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpemF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjY2luYXRpb25Jbm5vY3VsYXRpb25Pcklzb2xhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVPY2N1cGFudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdGF0dXNBbmRUZXJtc09mQ2FycmlhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdG93YWdlTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdXN0YWluaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlld1BhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpb2xhdGlvblR5cGVDb2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlRG9jdW1lbnROdW1iZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3lhZ2VNYW5pZmVzdFJlZmVyZW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmVzZXJ2ZU1hdGVyaWFsUmVxdWlyZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckNvbW1vZGl0eUFuZFNwZWNpYWxIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyVGVybWluYWxJZGVudGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0T3JGcmFnaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVuRGlzY292ZXJlZExvb2t1cCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3RUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdFR5cGVDb2RlZCIgdHlwZT0iQ29udHJhY3RUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJhY3RUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RUeXBlIiB0eXBlPSJDb250cmFjdFR5cGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udHJhY3RUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyRGllbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFibGVQZXJEaWVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRHcm93aW5nRXF1aXR5TW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5QWRqdXN0YWJsZVJhdGVNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBdXRob3JpdHlWZXRlcmFuc0FmZmFpcnNGaXhlZFJhdGVNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsU2Vjb25kTW9ydGdhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxGaXhlZFJhdGVNb3J0Z2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5VmV0ZXJhbnNBZmZhaXJzR3JhZHVhdGVkUGF5bWVudE1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkQ29udmVudGlvbmFsR3JhZHVhdGVkUGF5bWVudE9yU3RlcFJhdGVNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsQWRqdXN0YWJsZVJhdGVNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXNJbmNlbnRpdmVGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RTaGFyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXNBd2FyZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXNGaXhlZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlUmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1vckFjdHVhbENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlRmlybVRhcmdldFdpdGhQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZUZpcm1UYXJnZXRXaXRob3V0UGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VSZWRldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2V3aXRoRXNjYWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZVN1Y2Nlc3NpdmVUYXJnZXRXaXRoUGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVTdWNjZXNzaXZlVGFyZ2V0V2l0aG91dFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlQXdhcmRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VMZXZlbG9mRWZmb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0Nvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJvYWN0aXZlRml4ZWRQcmljZVJlZGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlybUZpeGVkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2V3aXRoRWNvbm9taWNQcmljZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbG9mRWZmb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckNvbnRyYWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvc3BlY3RSZXNlcnZhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtZVBlcmNlbnRhZ2Vhc0ZpbG1SZW50YWxFYXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVhbmRNYXRlcmlhbHMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkaXR5RGF0ZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YXJ0RGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRW5kRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJWYWxpZGl0eURhdGVzIiB0eXBlPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUmVmZXJlbmNlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIiB0eXBlPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVR5cGVDb2RlZCIgdHlwZT0iUmVmZXJlbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZmVyZW5jZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwb3J0aW5nUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cHBvcnRpbmdTdWJSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmZXJlbmNlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZUNvZGVkIiB0eXBlPSJSZWZlcmVuY2VDb2RlZCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFiYnJldmlhdGVkTmV3RHJ1Z0FwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlU291cmNlRFVOU051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZVB1cmNoYXNlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlU291cmNlU3VwcGxpZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzb3JpYWxSYWlsRGl2ZXJzaW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NvcmlhbFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nRXF1aXBtZW50TG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdGaWxlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50TWFuYWdlcnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGFydHlzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFBhcnR5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFBheWFibGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRTZXJ2aWNpbmdCYW5rc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlQ3VzdG9tZXJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZU9wZW5JdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVTdGF0ZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRPZk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPblN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkcmVzc2VlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFJlcHJpY2VkQ2xhaW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkUmVwcmljZWRMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRNZW1vQ2hhcmdlQmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVyc2FyeUNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mQ29sbGVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlVGhyb3VnaEJhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZXJvbmF1dGljYWxFcXVpcG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFGRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmZWN0ZWRTdWJzeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5QXNzaWduZWRFbXBsb3llZUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lBc3NpZ25lZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Q2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Q2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlEQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUhpZXJhcmNoaWNhbExldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeXNTdHVkZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudENsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNTaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUdFUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50VG9QYXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvVHJhbnNmZXJNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlySGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lc0ZsaWdodElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUmVjaXBpZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1idWxhdG9yeVBhdGllbnRHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRlZFVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnRGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuQmFua2Vyc0Fzc29jaWF0aW9uVHJhbnNpdE9yUm91dGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5HYXNBc3NvY2lhdGlvbkVxdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbk9zdGVvcGF0aGljQXNzb2NpYXRpb25DZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZURlZHVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlV2VsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5hbHlzaXNOdW1iZXJPclRlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaWFMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTcGVjaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTdHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGlEdW1waW5nQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhYmxlQ29lZmZpY2llbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYWJsZUluc3RydWN0aW9uc09yU3RhbmRhcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2VyTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm9wcmlhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlMaW5lRmVlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXNzbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVRyYW5zYWN0aW9uU2V0U2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25tZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25tZW50UmVjb3JkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkQ2FzZUNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRJbnZvaWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvckpvaW5lZFVuaXROb3RSZXN1YmRpdmlkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWROdW1iZXJGb3JMaW1pdGVkQ29tbW9uRWxlbWVudFBhcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWROdW1iZXJGb3JVbml0UGFya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFB1cmNoYXNlT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNSYWlsd2F5QWNjb3VudGluZ1J1bGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3N1bWluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0YUNhcm5ldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRvbWljU2FmZXR5YW5kTGljZW5zaW5nQm9hcmRQYW5lbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNoZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3Jpc2F0aW9uRm9yUmVwYWlyUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpdHlJc3N1ZWRFcXVpcG1lbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbk51bWJlckZvckV4Y2VwdGlvblRvRGFuZ2Vyb3VzR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25Ub01lZXRDb21wZXRpdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b0xvc3NJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hSZXR1cm5Pck5vdGlmaWNhdGlvbk9mQ2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRW50cnlEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU3RhbmRhcmRFbnRyeUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hUcmFjZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkVW5kZXJ3cml0aW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlUmF0aW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvdXRQcm9jZWR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWRnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZUR1ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0Fzc2lnbmVkQmFua2Vyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0Fzc2lnbmVkU2VjdXJpdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzQWNjZXB0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVByb2NlZHVyZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3NDb21tb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3NJbmRpdmlkdWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUZWxlZ3JhcGhpY051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RvQmFua0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJDb2RlZExhYmVsU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJDb2RlZFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljQ29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0Y2hOdW1iZXJPckxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0Y2hTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbUFzc2VtYmx5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5NaWxlTWFya2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nS2FuYmFuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdNZXRlclJlYWRpbmdBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ01ldGVyUmVhZGluZ0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsYXRlcmFsQ2FyU2VydmljZUFncmVlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRIb2xkSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdDZW50ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbG9mTWF0ZXJpYWxSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mUXVhbnRpdGllc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluYXJ5T2JqZWN0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluTG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rZXRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxlbmRlZFdpdGhCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxlbmRlZFdpdGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlQ3Jvc3NQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZVNoaWVsZFByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kZWRDYXJyaWVySW50ZXJuYWxSZXZlbnVlU2VydmljZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJlYXVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPclNhbGVzT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJSZWZlcmVuY2UxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJSZWZlcmVuY2UyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Q2hhcHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1b2ZMYWJvcmFuZFN0YXRpc3RpY3NTY2hlZHVsZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdVNpZ25pbmdPUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1U2lnbmluZ1NSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0FjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1RheE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQXBwcm92YWxNYXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDYXRhbG9ndWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDcmVkaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNEZWJpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RlYnRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1NoaXBtZW50TWFya051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FkRmlsZUxheWVyQ29udmVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsT2ZmT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxTaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkV4Y2lzZUVudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkZpbmFuY2lhbEluc3RpdHV0aW9uQnJhbmNoQW5kSW5zdGl0dXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuR29vZHNBbmRTZXJ2aWNlc29yUXVlYmVjU2FsZXNUYXhSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUHJvdmluY2VPcGVyYXRpbmdBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuU29jaWFsSW5zdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbldoZWF0Qm9hcmRQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGVkUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50UmVwb3J0aW5nSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRSZXBvcnRpbmdMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQmlsbGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkSXNzdWVyVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FjY2VwdGFuY2VPcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01hbmlmZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJuZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZENvbnNpZ25lZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkUGFja2FnZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFNoaXBwZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzQWdlbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzQ3VzdG9tc0JvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT2ZOZWVkUGFydHlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXN1YWx0eVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzdWFsdHlSZXBvcnRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2d1ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhc3Ryb3BoZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0ZWdvcnlPZldvcmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlZGVudHNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VkaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VpbGluZ0Zvcm11bGFSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c0F1dG9tYXRlZEZpbGVzSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c0Jsb2NrR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1N0YXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1RyYWN0U3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsU2VjcmV0YXJpYXRMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlckNoaWxkRGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsU2VjcmV0YXJpYXRMb2dOdW1iZXJQYXJlbnREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVvZkluY29ycG9yYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlb2ZUcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkTWFpbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JOQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFNUFVTSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZURvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9yZGVyQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VWZXJpZmljYXRpb25Qcm9jZWR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VDYXJkQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQ2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTm90ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxBYnN0cmFjdFNlcnZpY2VSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VsYXJQdWJsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uT2ZPcGluaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbk9mU3RhdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0aXplbnNoaXBEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l2aWxBY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdmlsTGlhYmlsaXRpZXNvZk9pbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3JDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50c0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1PZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZkNvbnRyYWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudHNTeXN0ZW1TZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1QYXJ0aWNpcGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1Vc2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhclRleHRDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudENvbXBhbnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudFJlcG9ydGluZ0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNhbExhYm9yYXRvcnlJbXByb3ZlbWVudEFtZW5kbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FsQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2RlT2ZGZWRlcmFsUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGRSb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsb2NhdGlvbkluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbE9yUHJpdmF0ZVBhc3NlbmdlclZlaGljbGVRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxBY2NvdW50U3VtbWFyeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbGFuZEdvdmVybm1lbnRFbnRpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsRHJpdmVyc0xpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVNhZmV0eUFzc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVlT25Vbmlmb3JtU2VjdXJpdHlJZGVudGlmaWNhdGlvblByb2NlZHVyZXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uQWNjZXNzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFuZFBsYWNlUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kU3luZGljYXRlUmVmZXJlbmNlMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFuZFN5bmRpY2F0ZVJlZmVyZW5jZTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlJc3N1ZWRFcXVpcG1lbnRJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVBlbmRpbmdTYWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlTYWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlWZXJpZmljYXRpb25Tb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGVudEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRVbml0c1BheW1lbnRSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25PZlB1cmNoYXNlRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbk9mU2FsZURvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kb21pbml1bUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25ncmVzc2lvbmFsRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNGdXJ0aGVyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzU2hpcG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50Q2xhc3NpZmljYXRpb25JRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc0Z1cnRoZXJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvblNoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3JzUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RyYWludE5vdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bXB0aW9uRGF0YVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9yRXF1aXBtZW50UmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3JQYWNrYWdpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNwb3NpdGlvbk9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPcGVyYXRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcm9yRXF1aXBtZW50UmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUHJlZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV29ya09yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25GaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvblVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c01vdmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBZGRlbmR1bU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBdWRpdG9ySUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnJlYWtkb3duUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvb3BOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0SG9sZGVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE9wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckRhdGFSZXF1aXJlbWVudHNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yRXN0YWJsaXNobWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBhcnR5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSaWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpb25Db250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ybmJvcmVDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFsbG9jYXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RhUmljYW5KdWRpY2lhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdENlbnRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEVsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUJ1c2luZXNzUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlMZWdpc2xhdGl2ZURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25EaXN0cmlidXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvblJlZGVtcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q291bnNlbGluZ0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRNZW1vTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JEZWJpdEFkanVzdG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmF0aW5nQWdlbmN5c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlcG9zaXRvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbEFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbGl0eURlc2lnbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3BZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0xpc3RlZENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTNTRLZXlUcmFpbkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTNTRLZXlUcmFpbkluZGljYXRvckdyb3VwTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50SW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudG9yTGF0ZXN0Q291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNhdGFsb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VQZXJpb2RTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYXRlcmlhbFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUHJvY2Vzc1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlZmVyZW5jZU51bWJlckFzc2lnbmVkVG9QcmV2aW91c0JhbGFuY2VPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc0luZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNVbml0SW52ZW50b3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclRyYWNraW5nTnVtYmVyRm9yTG9hbmVkTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQmFyQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2lzaW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHJhd2JhY2tFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0d1YXJhbnRlZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc2hvdXNlQnJva2VyTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcmVmZXJlbmNlSW5xdWlyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1JlbGVhc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVmFsdWF0aW9uRGVjaXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNUcmFuc3BvcnRMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQXV0aGVudGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFJdGVtRGVzY3JpcHRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFRdWFsaXR5UmVqZWN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhUmVsaWFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhU3RydWN0dXJlVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVycHVyY2hhc2VvcmRlcm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyVHlwZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNDdXN0b21zSWRlbnRpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVjdENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZVByaW9yaXRpZXNBbGxvY2F0aW9uU3lzdGVtUHJpb3JpdHlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVybWVudEFwcHJvdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFBheW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VHJhaWxlck1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVZlcmlmaWNhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pYWxSZWFzb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5zaXR5T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRhbEluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRhbEluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGlzdExpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mQWdyaWN1bHR1cmVBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkNvbW1lcmNlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlRm9ybTI1MFJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRERUU0NOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZFZHVjYXRpb25BY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkVuZXJneUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEhTQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVREFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZJbnRlcmlvckFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mSnVzdGljZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mTGFib3JBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlN0YXRlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2Z0aGVUcmVhc3VyeUFjcXVpc2l0aW9uT3JQcm9jdXJlbWVudFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlRyYW5zcG9ydGF0aW9uQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZUcmFuc3BvcnRhdGlvbkJvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlRyYW5zcG9ydGF0aW9uSGF6YXJkb3VzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZWZXRlcmFuc0FmZmFpcnNBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50V2hlcmVJbmp1cnlPY2N1cnJlZElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvbkNsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudHNJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdG9yeVRydXN0Q29tcGFueUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcmF0Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2NyaXB0aW9uT2ZDaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaEFkdmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlUG9zdFBhcmNlbHNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25vZlNoaXBtZW50SGFybW9uaXplZEJhc2VkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzUmVsYXRlZEdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3REZWJpdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eUluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHlJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50ZXJSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BlbnNhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxUdXJuSW5Eb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcHV0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uQ2VudGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25TdGF0ZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckFzc2lnbmVkT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yQXNzaWduZWRUcmFuc2FjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0T3JJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNBY2NvdW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc1JlcHJlc2VudGF0aXZlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc1NwbGl0QWdlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25BdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeVBheW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXRpb25BZmZlY3RlZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFZvbHVtZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNGbGlnaHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljSW52ZW50b3J5TWFuYWdlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWljaWxlQnJhbmNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pbmlvbk9mQ2FuYWRhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbVNoaXBwZXJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluaG9sZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2Vlc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ0xpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25PcmRlckJsYW5rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRm9ybXVsYXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0Q2FuYWRhczhEaWdpdFN0YW5kYXJkSW5kdXN0cmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldFVTOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TTnVtYmVyd2l0aEZvdXJDaGFyYWN0ZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRVTlNOdW1iZXJEdW5BbmRCcmFkc3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVXYXliaWxsaW5Sb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlV2F5YmlsbE5vdEluUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlGcmVlUHJvZHVjdHNSZWNlaXB0QXV0aG9yaXNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUZyZWVQcm9kdWN0c1NlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5TWVtb051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQ0NOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0aW9uRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNEYXRhSW50ZXJjaGFuZ2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNkZXZpY2VwaW5udW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGdW5kc1RyYW5zZmVySUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNQYXltZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGV2YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFyZ29OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFyZ29QZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWlzc2lvbkRlc2lnbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlT3JOb25FbXBsb3llZUNsYXNzaWZpY2F0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRheEZpbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVySWRlbnRpZmljYXRpb25OdW1iZXJPZlNlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcnNTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFZpc2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyQmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlSZXBvc2l0aW9uaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nS2FuYmFuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdNZXRlclJlYWRpbmdBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ01ldGVyUmVhZGluZ0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRNaWxlTWFya2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2Vyc1B1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlUHJvcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nRGF0YUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5xdWlyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRBc3Nlc3NtZW50TG9nTnVtYmVyQ2hpbGREbXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRBc3Nlc3NtZW50TG9nTnVtYmVyUGFyZW50RG1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvbkFnZW5jeUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lUZXN0VHlwZVB1cnBvc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvbkFnZW5jeVRyYW5zcG9ydGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudEluaXRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50T3duZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRUcmFuc3BvcnRDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWl2YWxlbnRDb3Vyc2VOdW1iZXJhdFJlcXVlc3RpbmdJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXJyb3JJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY3Jvd0ZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZU9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdGVybXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cjFDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1RyYW5zcG9ydGF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0RGlzdHJpYnV0aW9uTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGFuc2lvbm9uRWZmZWN0b2ZDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydENsZWFyYW5jZUluc3RydWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0ZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRFc3RhYmxpc2htZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRPckV4aGliaXRMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eUlETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eU1lYXN1cmVtZW50UG9pbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5TmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlQW5hbHlzaXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVtZWNoYW5pc21udW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbWlseU1lbWJlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVTZWxsZXJTZXJ2aWNlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxCdXJlYXVPZkludmVzdGlnYXRpb25JbmRpdmlkdWFsSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25Db25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvblRyYWRlT3JCcmFuZElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxFbmVyZ3lSZWd1bGF0b3J5Q29tbWlzc2lvbkNlcnRpZmljYXRlT2ZQdWJsaWNDb252ZW5pZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkhMTUNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBZG1pbmlzdHJhdGlvbkNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIVU1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0FkbWluaXN0cmF0aW9uT3JpZ2luYXRvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSW5mb3JtYXRpb25SZXNvdXJjZXNNYW5hZ2VtZW50UmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1hcml0aW1lQ29tbWlzc2lvbkZvcndhcmRlcnNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNYXJpdGltZUNvbW1pc3Npb25UYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseVNjaGVkdWxlSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVGF4cGF5ZXJzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxXaXJlVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFRFdJUkVDb25maXJtYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZVNjaGVkdWxlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVDb252ZXJzaW9uSm91cm5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUxpbmVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlckNvZGVJc3N1ZWRieUJ1cmVhdU9mQ2Vuc3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlckNvZGVJc3N1ZWRCeUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVUcmFuc2ZlckZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVUcmFuc2ZlclByb3RvY29sTG9jYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbG1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsV29ya0NhbmRpZGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxEZXRhaWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxNYW5hZ2VtZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxQaGFzZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU2V0dGxlbWVudFBhcnR5c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluZUxpbmVDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFRyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNjYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNjYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZWV0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGV4aWJsZVNwZW5kaW5nQWNjb3VudEluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZXhpYmxlU3BlbmRpbmdBY2NvdW50SW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZERhdGFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZFpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vclBsYW5BcHByb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvd1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uQWNjZXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Qcm9kdWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3NpbmdTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zdXJlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRXhjaGFuZ2VDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc05vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25UcmFkZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVzdHJ5UGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYWxTdGF0ZW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yUGlja3VwTGltaXRlZEZyZWlnaHRUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNPckFnZW50c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlVGF4QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1NlbGxlclNlcnZpY2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlWm9uZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheW9yUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsVGltZU9yUGFydFRpbWVFbXBsb3llZUNsYXNzaWZpY2F0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxXb3JrR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRNYW5hZ2Vyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNBbmFseXNpc1NvdXJjZU1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNDdXN0b2RpYW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F1Z2VUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnb0NvbnNpZ25tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsRGVjbGFyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxMZWRnZXJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxQdXJwb3NlTWVzc2FnZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFNlcnZpY2VzQWRtaW5pc3RyYXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0Rlc3RpbmF0aW9uWm9uZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0luZGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljS2V5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljU2NvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdpbm5pZU1hZVBvb2xQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzYW5kU2VydmljZVRheFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJuaW5nQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWNjb3VudGluZ0NsYXNzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWR2YW5jZVByb2dyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWdlbmN5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QmlsbG9mTGFkaW5nT2ZmaWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UHJpb3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRRdWFsaXR5QXNzdXJhbmNlQW5kQ29udHJvbExldmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50VHJhbnNwb3J0YXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkJsb2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbk9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmF2aXR5U291cmNlTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWVuQ2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBY2NvdW50aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBPclBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3d0aEZhY3RvclJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudG9yTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudG9yVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pc2VkU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pemVkQ29kZVN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFzdGVuaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNFeGVtcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1dhc3RlTWFuaWZlc3REb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uTmF0aW9uYWxQYXllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25OYXRpb25hbFByb3ZpZGVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZU1hbnBvd2VyU2hvcnRhZ2VBcmVhRmFjaWxpdHlJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJQkNDTGFiZWxlcklkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZUNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZVJhdGluZ0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZVJhdGluZ1N1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hPcldpZGVGaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoRmFicmljYXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0Q2Vuc3VzVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RCbG9ja051bWJlckFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RDb3VudHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0TWV0cm9wb2xpdGFuU3RhdGlzdGljYWxBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0U3RhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9udGFsQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yc2Vwb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG90Um9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWF0YUNhcmdvQWdlbnRDYXNzQWRkcmVzc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWF0YUNhcmdvQWdlbnRDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0Q5Q00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpY2F0aW9uQ2FyZFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbWFnZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWVkaWF0ZUV4cG9ydGF0aW9uTm9Gb3JJbkJvbmRNb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tZWRpYXRlVHJhbnNwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsZW1lbnRhdGlvblZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydENsZWFyYW5jZUluc3RydWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZXJzUmVmZXJlbmNlTnVtYmVyVG9MZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0UGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXB1dGF0aW9uQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5Cb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kVG9Pck91dGJvdW5kRnJvbVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExlZ2FsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEZWFsZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbEZhaWx1cmVDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFNhbXBsZUluc3BlY3Rpb25SZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxUcm91YmxlSW5kaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kVHJhbnNwb3J0T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uYW5kU3VydmV5U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGVPZlNlY3VyaXR5QW5kRnV0dXJlTWFya2V0RGV2ZWxvcG1lbnRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25Ob3RlSG9sZGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2VydGlmaWNhdGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvbnRyYWN0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRQYXJjZWxQb3N0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkc0xvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJBc3NpZ25lZFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJvclBvb2xJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZExvZ2lzdGljU3VwcG9ydENyb3NzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTWFzdGVyUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hc3RlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VOdW1iZXJOZXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlTnVtYmVyT2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZVRyYWluSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZ292ZXJubWVudGFsTWFyaXRpbWVPcmdhbml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1GdW5kaW5nT3JnYW5pemF0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsQ3VzdG9tZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsRGF0YVByb2Nlc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsUHVyY2hhc2VPcmRlckl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsUHVyY2hhc2VPcmRlclJlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsVmVuZG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRMb2dOdW1iZXJDaGlsZERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRMb2dOdW1iZXJQYXJlbnREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGbGlnaHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGdWVsVGF4QWdyZWVtZW50QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJlZ2lzdHJhdGlvblBsYW5BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsUmVnaXN0cmF0aW9uUGxhblN0aWNrZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbkRvbWluaW9uT2ZDYW5hZGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRJbmR1c3RyeUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJzdGF0ZUNvbW1lcmNlQ29tbWlzc2lvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhUGxhbnRSb3V0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRvcmlhbE5ld0RydWdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvckFzc2lnbmVkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JOb3RlSG9sZGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZU51bWJlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nRGF0YVNoZWV0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU0ZNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JPclByb2plY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRDcmVkaXRTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludGx5QWRtaW5pc3RlcmVkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRWZW50dXJlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ21lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25hbENvbW11bml0eU5hbWVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25hbENvbW11bml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JPcGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yb3JBZmZpbGlhdGlvbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0VHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGl0dWRlRXhwcmVzc2VkaW5EZWdyZWVzTWludXRlc2FuZFNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGl0dWRlRXhwcmVzc2VkaW5TZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VBZ3JlZW1lbnRBbWVuZG1lbnROdW1iZXJNYXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQ29udHJhY3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVJpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyQmxhbmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlclByaW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckVudGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWVCaWxsQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2VlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcm9mQ3JlZGl0RHJhZnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJvZkNyZWRpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyc29yTm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldnlpbmdPZmZpY2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VQbGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZUJpbGxpbmdBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlQmlsbGluZ1N1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRQYXJ0bmVyc2hpcElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVvZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZDcmVkaXRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlua1NlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0QmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdE9mTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMbG95ZHNDbGFpbXNPZmZpY2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkTGluZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkUGxhbm5pbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5BY3F1aXNpdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkZlYXR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUHJvc3BlY3RvcktleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxseUFzc2lnbmVkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxNZWRpYUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2Nob29sQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNjaG9vbERpc3RyaWN0Q291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFN0dWRlbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25FeGNlcHRpb25PcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9ub25Qcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25TcGVjaWZpY1NlcnZpY2VzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbldpdGhpbkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9ja2JveCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpY2FsT2JzZXJ2YXRpb25JZGVudGlmaWVyTmFtZXNhbmRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naXN0aWNzU3VwcG9ydERvY3VtZW50YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ2l0dWRlRXhwcmVzc2VkSW5EZWdyZWVzTWludXRlc2FuZFNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdpdHVkZUV4cHJlc3NlZGluU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ1Rlcm1EaXNhYmlsaXR5UG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzT3JFdmVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlckFydGljbGVOdW1iZXJPZlJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWdhemluZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxib3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxTbG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUF2YWlsYWJpbGl0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JGb3JjZVByb2dyYW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yU3lzdGVtQWZmZWN0ZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWtlZ29vZENvbW1lcmNpYWxMaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW1tb2dyYXBoeUNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlT3JnYW5pemF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb25JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RLZXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVhbFByb2Nlc3NpbmdBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlckRlZmluZWRSZXBhaXJSYXRlc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nRGlyZWN0aXZlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nT3BlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpdGltZURlY2xhcmF0aW9ub2ZIZWFsdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmdPckxhYmVsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBaXJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMYWJlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGVhc2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyU29saWNpdGF0aW9uUHJvY2VkdXJlc1Rlcm1zQW5kQ29uZGl0aW9uc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU3RvcmFnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXR1cmVkQ2VydGlmaWNhdGVPZkRlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRQcm9jZXNzaW5nRXN0YWJsaXNobWVudFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRSZWNpcGllbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEFzc2lzdGFuY2VDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFJlY29yZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVZlcnNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFuZGlzZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFudENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUFkZHJlc3NvcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VEZXNpZ25Hcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUHJvdmluZ1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nQXRUaGVCZWdpbm5pbmdPZlRoZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmdBdFRoZUVuZE9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JQ1JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pY3JvZmlsbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlncmFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUNhbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SW50ZXJkZXBhcnRtZW50YWxQdXJjaGFzZVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5T3JkbmFuY2VTZWN1cml0eVJpc2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5UmFua09yQ2l2aWxpYW5QYXlHcmFkZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsaW5naW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Sb3lhbHR5UGF5b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaXN0ZXJpYWxDZXJ0aWZpY2F0ZU9mSG9tb2xvZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVseWVhcm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9STkVUUGx1c0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNJbnN0aXR1dGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9STkVUUGx1c1VzZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VCYWNrZWRTZWN1cml0eUxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQmFja2VkU2VjdXJpdHlQb29sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUVsZWN0cm9uaWNSZWdpc3RyYXRpb25TeXN0ZW1Pcmdhbml6YXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZWVMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyYW5jZUNvbXBhbnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJhbmNlSW5kaWNhdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JDYXJyaWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yRnVlbENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGVJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlmYW1pbHlQcm9qZWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlQm9va1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VNYXBYQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZU1hcFlDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlU3ViQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVQT09mQW5JbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVpvbmVPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsaXR5QXNzaWduZWRCdXNpbmVzc1JlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVkQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWVyb25hdXRpY3NhbmRTcGFjZUFkbWluaXN0cmF0aW9uRkFSU3VwcGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBc3NvY2lhdGlvbk9mQm9hcmRzT2ZQaGFybWFjeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBc3NvY2lhdGlvbk9mSW5zdXJhbmNlQ29tbWlzc2lvbmVyc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDcmltaW5hbEluZm9ybWF0aW9uQ2VudGVyT3JpZ2luYXRpbmdBZ2VuY3lJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1Db21tdW5pdHlOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvbW11bml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1Db3VudHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtTWFwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbVN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEdvdmVybm1lbnRCdXNpbmVzc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmFsR2FzUG9saWN5QWN0Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEcnVnQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0hlYWx0aEluc3VyYW5jZUNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmVudGFsQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmVudGFsQWdyZWVtZW50UmVhc29uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0U2hpcG1lbnRJZGVudGlmaWNhdGlvbk51bWJlckNvbnRpbnVvdXNNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWluYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbkFtZXJpY2FuSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbkNvbmZvcm1hbmNlUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25OZWdvdGlhYmxlTWFyaXRpbWVUcmFuc3BvcnREb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uT3JpZ2luYXRpbmdUaGlyZFBhcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25QaWNrdXBMaW1pdGVkVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Qcm92aXNpb25hbFBhdGVudEFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25TcG91c2VUaWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vT1Q1QXV0aG9yaXR5WmVyb01pbGVhZ2VSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuRGF0dW1TdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkZyZWVUcmFkZUFncmVlbWVudENvbXBsaWFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5IYXphcmRvdXNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkhhemFyZG91c0dvb2RzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5JbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25TeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT1RJQ09MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRlbXBvcmFyeUltcG9ydGF0aW9uRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWVyb2RlQ2VkdWxhZGVJZGVudGlkYWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWVyb2RlSWRlbnRpZmljYWNpb25UcmlidXRhcmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmplY3RJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlhbmRIZWFsdGhBZG1pbmlzdHJhdGlvbkNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5CaWxsb2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ29udGFpbmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2Vhbk1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlbmRlclRyYWNraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlbnNlVHJhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZXJMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTeW1ib2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZE1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVDYWxsQWdlbmN5VGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmxpbmVQcm9jdXJlbWVudGFuZEFjY291bnRpbmdDb250cm9sVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5hbmRQcmVwYWlkU3RhdGlvbkxpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JBc3NpZ25lZFVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9ySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yTGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvblBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPclBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lckNvbnNpZ25tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0N1c3RvbWVyc1NlY29uZFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25CcmVha2Rvd25TdHJ1Y3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRmRvVHJhbnNhY3Rpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFB1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFJldHVyblJlcXVlc3RSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU2hpcHBlcnNCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyQ2hpbGREYXRhTWFpbnRlbmFuY2VSZXF1ZXN0TG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlckxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJQYXJlbnREYXRhTWFpbnRlbmFuY2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxWb3VjaGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0Nhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQ29tcGFueUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nRGVwb3NpdG9yeUZpbmFuY2lhbEluc3RpdHV0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRvcnNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5PZlNoaXBtZW50SGFybW9uaXplZEJhc2VkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1Q1QXV0aG9yaXR5Q29uZGl0aW9uT3JSZXN0cmljdGlvbm9uQ2FySGlyZVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRUeXBlT2ZSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGJvdW5kRnJvbVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQmxvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVycGFja2FnaW5nVW5pdElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRsZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dG9mU2VydmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duaW5nQnVyZWF1SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tBbmRIb2xkSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdHcm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFncmFwaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWNhbElETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRGaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0Q2F1c2luZ1JlcGFpck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydENvbnNpZ25tZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsUGF5bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRJbnRlcmNoYW5nZWFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZWZlcmVuY2VJbmRpY2F0b3JJbkFEcmF3aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUluZm9ybWF0aW9uTWVzc2FnZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRlbnRDb29wZXJhdGlvblRyZWF0eUFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRyb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzRmluYW5jaWFsSW5zdGl0dXRpb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNGaW5hbmNpYWxJbnN0aXR1dGlvblRyYW5zaXRSb3V0aW5nTm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJBc3NpZ25lZFJlc3VibWlzc2lvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvblRyYW5zaXRSb3V0aW5nTm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5R3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEhpc3RvcnlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbkFkdmFuY2VSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5zdGFsbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQbGFuUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlvcnNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBjc0NhdGFzdHJvcGhlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uQXBwcm92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmdDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5zaW9uQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbElkZW50aXR5Q2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUG9vbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5UHJlc2NyaXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaG9uZUNhbGxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEludmVudG9yeVJlY291bnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZU9mQWN0dWFsUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZU9mQUdlbmVyaWNQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWdneWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbG90TGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5OZXR3b3JrSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbG90RmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1Z051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5Rm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TGlua051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xsdXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdEVudHJ5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVBd2FyZFN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2luY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRlY2Vzc29yQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGV0ZXJtaW5hdGlvbm9mQmVuZWZpdHNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkQ2FsbFNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uU2l0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlXb3JrQ2FuZGlkYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtYXJrZXRBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWFya2V0Tm90aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQXVkaXRQcmlvcml0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFB1cnBvc2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQXVkaXRUeXBlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVJhdGVUYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXJzVmVyaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzRm9ybUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCaWxsb2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ2FyZ29Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NsYWltSGlzdG9yeUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NyZWRpdE9yRGViaXRBZGp1c3RtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NyZWRpdEFkdmljZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEZWxpdmVyeUluc3RydWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlbGl2ZXJ5U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGlzdHJpYnV0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRHJpdmVyc0xpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSGlnaGVzdFNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlSZXBvcnRlZFNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01lbWJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVudGFsQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXF1ZXN0Rm9yTWV0ZXJlZFJlYWRpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2NoZW1lT3JQbGFuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NlcXVlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NoaXBtZW50SWRlbnRpZmljYXRpb25OdW1iZXJDb250aW51b3VzTW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUYXhDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VPclNhbGVzQ2F0YWxvZ3VlUmVzcG9uc2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQXJlYU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMaXN0Q2hhbmdlb3JJc3N1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3RWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVZhcmlhdGlvbkZvcm11bGFSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbHNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JEYXRhVW5pdmVyc2FsTnVtYmVyU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckhlYWx0aEluZHVzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcklkZW50aWZpZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0QmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0U29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUGhvbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBvc3RhbFppcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JwdXJjaGFzZW9yZGVybnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclRheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclRyYWRpbmdQYXJ0bmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVW5pdmVyc2FsUHJvdmlkZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2VlZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0hhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29ySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvcnNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudEJ1ZGdldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VJbmZvcm1hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZU5vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpY2Vuc2luZ0FncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQZXJpb2RGb3JXaGljaExhYm9yQ29zdHNBcmVGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UmVzZXJ2YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTb3VyY2luZ0FncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNwZWNpZmljYXRpb25Eb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2ZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25PckRlYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mT2ZEZWxpdmVyeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlDb21wb25lbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUxvc3NJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zYWxQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkR3JvdXBXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b2NvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdHJhY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyQ29tbWVyY2lhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlck9yZGVyVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclBsYW5OZXR3b3JrSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyU2l0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJVUElOTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aW5jaWFsQ2FuYWRpYW5TYWxlc1RheEV4ZW1wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmluY2lhbFRheElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbFBhdGVudEFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvbklzc3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNEZWVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNGaWxpbmdSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1V0aWxpdGllc0NvbW1pc3Npb25DZXJ0aWZpY2F0ZU9mUHVibGljQ29udmVuaWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3B0aW9uQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTGluZUl0ZW1JZGVudGlmaWVyQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJJbmNsdWRlZGluT25PcmRlclBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyT2ZPcmRlclJlY2VpdmVkU2luY2VMYXN0UmVwb3J0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlck9mU2hpcG1lbnRSZWNlaXZlZFNpbmNlTGFzdFJlcG9ydGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZXNwb25zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVJlcXVpc2l0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzUmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0FjdGl2aXR5Q2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZpZWRNYXRlcmlhbHNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZpZWRQcm9kdWN0c0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlEaXNwb3NpdGlvbkFyZWFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5SW5zcGVjdGlvbkFyZWFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5UmV2aWV3TWF0ZXJpYWxDcmliSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcmFudGluZU9yVHJlYXRtZW50U3RhdHVzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyU3BvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlc3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZU9yU2hvcHBpbmdDYXJ0SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhY2tUeXBlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsT3JSb2FkUm91dGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkQ29tbWlzc2lvbk9pbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRDb21taXNzaW9uUmVjb3JkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsUm91dGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxXYXlCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q29uc2lnbm1lbnROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5V2Fnb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb25mZXJlbmNlSURDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlTm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXdtYXRlcmlhbFN1cHBsaWVyRHVuQW5kQnJhZHN0cmVldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZU93bmVkUHJvcGVydHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbk5vdExvd2VzdENvc3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2FsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQXNzaWduZWREcm9wWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJJRFF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzRmlsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJTdWJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQWR2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdCYW5rc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbXBhbnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdEZXBvc2l0b3J5RmluYW5jaWFsSW5zdGl0dXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BhcnR5c01lbWJlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbmNpbGlhdGlvblJlcG9ydFNlY3Rpb25JZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWNlZEVhcm5pbmdXZWVrSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkUGF0dGVybklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VEcmF3aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJBc3NpZ25lZEJ5VGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyT2ZBUmVxdWVzdEZvck1ldGVyZWRSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJRdW90ZWRPblN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyVG9QcmV2aW91c01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZVZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZFByb2R1Y3RGb3JDaGVtaWNhbEFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZFByb2R1Y3RGb3JNZWNoYW5pY2FsQW5hbHlzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lyaXN0b0ZlZGVyYWxEZUNvbnRyaWJ1eWVudGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpcmlzdG9GZWRlcmFsZGVDb250cmlidXllbnRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENhcGl0YWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDb250cmFjdG9yQWN0aXZpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkTWFpbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25OdW1iZXJPZlByZXZpb3VzQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3Ryb0luZm9ybWFjaW9uRmlzY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3Ryb05hY2lvbmFsZGVDb250cmlidXllbnRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3Ryb1VuaWNvZGVDb250cmlidXllbnRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0aW9uUHJpbWFyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdGlvblNlY29uZGFyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeUd1aWRlbGluZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyZXJzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaXNzdWVDZXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkQ29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkTm9uY29uZm9ybWFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRPYmplY3RJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkVmVuZG9yT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VJbnZvaWNlTnVtYmVyRm9yUHJpb3JCaWxsQW5kSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0YW5jZUFkdmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFBheW9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckFjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQ2F0ZWdvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckRhdGFSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJFc3RpbWF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGVhdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlQm9va2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZUNhcmdvU2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVQYXR0ZXJuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZVdheWJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEFzc2VtYmx5TW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50QXNzZW1ibHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50Q2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50Q3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50RHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2luZ1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UHVyY2hhc2VPcmRlclJhbmdlRW5kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UHVyY2hhc2VPcmRlclJhbmdlU3RhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0Zvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJpY2VkQ2xhaW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJpY2VkTGluZUl0ZW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JDYW5jZWxsYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3Rmb3JRdW90YXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVBc3NlbWJseUxpbmVGZWVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlU2NyZWVuaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZVV0aWxpemF0aW9uR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNldG9hUmVxdWVzdGZvclF1b3RhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEF2YWlsYWJpbGl0eUF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBdmFpbGFiaWxpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXRudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbE1lcmNoYW50c0NlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRQbGFuQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudFBsYW5Qb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXJTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkR29vZHNBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Hb29kc0JpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuTWF0ZXJpYWxBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5zTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZlbnVlU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld2VyRmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3UGVyaW9kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDb25zaWdubWVudE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT3JkZXJOdW1iZXJFbWVyZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT3JkZXJOdW1iZXJFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdJbnN0cnVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdWxlU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZla2VlcGluZ0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUVxdWlwbWVudENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlvZlJhZGlvQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eW9mU2hpcENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09yVGVycml0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBbGxvd2FuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzRGVwYXJ0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNGb3JlY2FzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUGVyc29uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1Byb2dyYW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVnaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXByZXNlbnRhdGl2ZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1Jlc3BvbnNpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdmluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYW5MaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZW1lT3JQbGFuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxPZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxPbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhcmNoS2V5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDb3ZlcmFnZUNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDb3ZlcmFnZUNvbXBhbnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUN1c3RvbXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUVtcGxveWVlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUhlYWx0aEluc3VyYW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlTdWZmaXhDb2RlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRCZW5lZmljaWFyeXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyaWFkZUNvbWVyY2lheUZhbWVudGFJbmR1c3RyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcnlvZlN0YXRlQXNzaWduZWRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbk9mVGhlTmF0aW9uYWxIb3VzaW5nQWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlJbnN0cnVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmFuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyZXJBdXRob3JpemF0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmVyT3JnYW5pemF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0NhdGFsb2d1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0NyZWRpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNEZWJpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzU2FsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ0FycmFuZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJEZWZpbmVkQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzQ2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzRmlsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc1JlZmVyZW5jZVRvVGhlT3JpZ2luYWxNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nQmFua1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGluZ0NvbXBhbnlBdWRpdE51bWJlckF1dG9tYXRlZENsZWFyaW5naG91c2VUcmFuc2ZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVsbGV0aW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUVzdGltYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlR3JvdXBJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUludGVycnVwdFRyYWNraW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJmb3JtZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VyTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREZXN0aW5hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50T3JpZ2luQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RpY2VPck1hbmlmZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwb3duZXJzQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckNhck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0JvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzSGF6YXJkb3VzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0xhYmVsU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ05vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nVW5pdElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1pvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0VGVybURpc2FiaWxpdHlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3dJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVRyYW5zYWN0aW9uU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJUkVOTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVJFVE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZVNwZWNpZmljUHJvY2VkdXJlc1Rlcm1zQW5kQ29uZGl0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0dWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsSW5zdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWV0eW9mUHJvcGVydHlJbmZvcm1hdGlvbkNvbXBpbGVyc2FuZEFuYWx5c3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZUFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRBbmRTZWdyZWdhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZURvY3VtZW50SW50ZXJuYWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNpbmdVbml0T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEJ1ZGdldEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDaGFyZ2VPckFsbG93YW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxHb3Zlcm5tZW50QWNjb3VudGluZ0NsYXNzaWZpY2F0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSW5zdHJ1Y3Rpb25zTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTW92ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBhY2thZ2luZ0luc3RydWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGF5bWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2Nlc3NpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWx0eUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25DbGFzc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvblJldmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaW1lbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0Qm9va2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQcmVtaXVtQXVkaXRDaGFuZ2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFNoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlVGllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja1RyYWluSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJ5Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZE51bWJlck9mSW5zcGVjdGlvbkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFBvaW50TG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZHNDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZHNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc1ZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlQnJpZGdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZVJlcGxhY2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRpbmdQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFzc2VtYmx5RGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ2hhcnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDb250cm9sbGVkU3Vic3RhbmNlTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDcmltaW5hbEhpc3RvcnlSZXBvc2l0b3J5SW5kaXZpZHVhbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZURlcGFydG1lbnRJMjBGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZURlcGFydG1lbnRJQVA2NkZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlSGF6YXJkb3VzV2FzdGVFbnRpdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUluZHVzdHJpYWxBY2NpZGVudFByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxlZ2lzbGF0aXZlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGljZW5zZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50T2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU5vblJlc2lkZW50VmlvbGF0b3JDb21wYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2VBc3NpZ25lZEJ1c2luZXNzUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jZUFzc2lnbmVkRW50aXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2FsZXNUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTZW5hdGVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTdHVkZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRld2lkZUNvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29tcGFueUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrS2VlcGluZ1VuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViYXNzZW1ibHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yRGF0YVJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZGF5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJkaXZpc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmV4aGliaXRMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViRmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViaG91c2VCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eU5vblNhbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5VmVyaWZpY2F0aW9uU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJsaW5lb2ZJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YlNlcnZpY2VyTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lzdGVuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RhbnRpdmVseUNvbnNvbGlkYXRlZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVBaXJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlTWFudWZhY3R1cmVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVOYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViU3ViaG91c2VCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Y2Nlc3NvckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJpbnRlbmRlbmNpYWRlSW52ZXJzaW9uZXNFeHRyYW5qZXJhc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnlBcHByYWlzZXJDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxBZ3JlZW1lbnRBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbENsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJSZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJEb2N1bWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDcmVkaXRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydGluZ0RvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlCb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5zaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dhcE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlRNVDEwMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlRNVDIwMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlRDb25maXJtYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bWJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltYm9sTnVtYmVyRm9yTWlsZXN0b25lT3JMT0JSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1hdGl6ZWROb21lbmNsYXR1cmVvZkh1bWFuYW5kVmV0ZXJpbmFyeU1lZGljaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1lSW5mb3JtYXRpcXVlUG91ckxlUmVwZXJ0b2lyZURlc0VudHJlcHJpc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1lSW5mb3JtYXRpcXVlUG91ckxlUmVwZXJ0b2lyZURlc0V0YWJsaXNzZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZSdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTdWZmaXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlN1cHBsZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhc2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4ZW1wdGlvbkxpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4ZW1wdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhGb3JtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aW5nQXV0aG9yaXR5SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpY2Vuc2VFeGVtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpZW5KdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4U2NoZWR1bGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhTaGVsdGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhXb3Jrc2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhbUFzc2lnbm1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsSW5mb3JtYXRpb25QYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUGhhc2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uQ2lyY3VpdFN1cHBsZW1lbnRhbElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleE1lc3NhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsT3BlcmF0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsUmVsZWFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbkZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXh0RWxlbWVudElkZW50aWZpZXJEZWxldGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRlclNjcmVlbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRCYW5rc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFkbWluaXN0cmF0b3JDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU9yZ2FuaXphdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlPcmlnaW5hdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UHVyY2hhc2VPcmRlckl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UHVyY2hhc2VPcmRlclJlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUZhaWx1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpckNhcm5ldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElSTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUNvbXBhbnlDb2RlQm9va1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVEb2N1bWVudFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlWElYSWRlbnRpZmllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9reW9TaG9rb1Jlc2VhcmNoQnVzaW5lc3NJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xsQmlsbGluZ1RlbGVwaG9uZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDeWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPcmRlckN5Y2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3duc2hpcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG94aWNvbG9neUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjZXJBY3Rpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlckFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRpbmdQYXJ0bmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJUeXBlUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyVXNlQWdyZWVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdGbGlnaHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uQ2F0ZWdvcnlPclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdEd1YXJhbnRlZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb25kZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQWNjb3VudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkV4cG9ydGF0aW9uTm9Gb3JJbkJvbmRNb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Qcmlvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udHJhY3RSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvc3RzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UmV0dXJuUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHJpcHBpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3R1ZmZpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Um91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFNlY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbE1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwbGViYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2Vyc0JpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFNSQnVzaW5lc3NJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb21tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZFc2Nyb3dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkhvdXNlaG9sZEdvb2RzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTGF3U3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mT3V0c3RhbmRpbmdKdWRnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU2NpZW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5EZWZlbnNlRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvblN1cHBsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5EZXBhcnRtZW50T2ZWZXRlcmFuc0FmZmFpcnNBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5Hb3Zlcm5tZW50VHJhbnNwb3J0YXRpb25Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lcnNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNjZXB0YWJsZVNvdXJjZURVTlNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNjZXB0YWJsZVNvdXJjZVB1cmNoYXNlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VTdXBwbGllcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRpbmdBbGVydFJlZmVyZW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOREciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZW1wbG95bWVudEluc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nQ29sbGF0ZXJhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybVJlc291cmNlTG9jYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUNsYWltc1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDb25zaWdubWVudElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUNvbnNpZ25tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDdXJyYWNSZWZlcmVuY2VOdW1iZXJPZlRoZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlTWFya2V0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVSZWluYWNSZWZlcmVuY2VOdW1iZXJPZlRoZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlU3VwcGxpZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0hhemFyZG91c0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNHb3Zlcm5tZW50VmlzYU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzU3RhbmRhcmRNZXRyb3BvbGl0YW5TdGF0aXN0aWNhbEFyZWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TG9hZERldmljZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRSZWxpZWZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRSZXBvcnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRSZXBvcnRQZXJpb2RJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxSYWlscm9hZFJldmVudWVXYXliaWxsSWRlbnRpZmllZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yRWFzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yTm9ydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvclpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFpZEluc3RhbGxtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHBlclNlcmlhbE51bWJlck9mUmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtU2hpcHBlckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NGUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUFudGlEdW1waW5nRHV0eUNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VCaW5kaW5nUnVsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQ29tbWVyY2lhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQ291bnRlcnZhaWxpbmdEdXR5Q2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUVudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRW50cnlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVByZUFwcHJvdmFsUnVsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlUHJlQ2xhc3NpZmljYXRpb25SdWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VTdGF0ZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRE9FQW5kTkNFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNET1RCb25kU3VyZXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRkNDSW1wb3J0Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRmVkZXJhbEluZm9ybWF0aW9uUmVzb3VyY2VzTWFuYWdlbWVudFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvbkVzdGFibGlzaG1lbnRJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR2VuZXJhbFNlcnZpY2VzQWRtaW5pc3RyYXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dvdmVybm1lbnRBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhdFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUJ1c2luZXNzVXNlUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlTGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVJhZGl1c29mT3BlcmF0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUmVsYXRlZFNlcnZpY2VzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlU2l6ZUNsYXNzUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JBYmJyZXZpYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGFuZ2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNoYW5nZVByb2NlZHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yT3JkZXJOdW1iZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNQcmV2aW91c0pvYk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yVGVybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb25Db2RlTG9jYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb25Db2RlTmF0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnRpY2FsQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxBZ2VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25PcmlnaW5hdG9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWZmYWlyc0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzYVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lUHVyY2hhc2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdWNoZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZURldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVBpY2tUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVN0b3JhZ2VMb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlDb3ZlcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWFwb25TeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbENsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3YWxSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbFRheFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0JyZWFrZG93blN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nU2hpZnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtJdGVtUXVhbnRpdHlEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrU2hpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzaXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGFza0NoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllhcmRQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHVycG9zZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZUNvZGVkIiB0eXBlPSJQdXJwb3NlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVycG9zZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9IlB1cnBvc2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHVycG9zZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk9ubHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlcXVlc3RlZFJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZUNvZGVkIiB0eXBlPSJSZXF1ZXN0ZWRSZXNwb25zZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcXVlc3RlZFJlc3BvbnNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVxdWVzdGVkUmVzcG9uc2UiIHR5cGU9IlJlcXVlc3RlZFJlc3BvbnNlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlcXVlc3RlZFJlc3BvbnNlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZUhvbGRTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudFdoZW5FcnJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VOb0RldGFpbE9yQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZU9ubHlDaGFuZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZVByb2R1Y3RSZXBsZW5pc2htZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZVdpdGhEZXRhaWxBbmRDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlV2l0aERldGFpbE5vQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VXaXRoRGV0YWlscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlV2l0aG91dERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2VBbmRBY2tub3dsZWRnZW1lbnRGb3JEaXJlY3REZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlTWVzc2FnZUFja25vd2xlZGdlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlUmVxdWVzdGVkRm9yRGlyZWN0RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlRm9yRWFjaFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlTWVzc2FnZUFja25vd2xlZGdlbWVudEZvckVhY2hUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VBY2tub3dsZWRnZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWNrbm93bGVkZ2VtZW50TmVlZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZUV4cGVjdGVkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlclR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyVHlwZUNvZGVkIiB0eXBlPSJPcmRlclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlclR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlclR5cGUiIHR5cGU9Ik9yZGVyVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcmRlclR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50TWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50T2ZPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNsYWltRm9yUGFydHNBbmRPckxhYm91ckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkRpc3RyaWJ1dGlvbk9mRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0l0ZW1zVG9CZUJvb2tlZFRvQUZpbmFuY2lhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50VG9QYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPR0NyaXRpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBT0dTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkFja25vd2xlZGdlbWVudEFuZEVycm9yUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVycm9yQW5kQWNrbm93bGVkZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVycm9yTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JCYW5rZXJzRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yQmFua2Vyc0d1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JEZXNpZ25hdGlvbk9mQmVydGhpbmdQbGFjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRXhjaGFuZ2VBbGxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckdvb2RzQ29udHJvbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckluc3BlY3Rpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JQaHl0b3Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yU2hpZnRpbmdGcm9tVGhlRGVzaWduYXRlZFBsYWNlSW5Qb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclVzYWdlT2ZCZXJ0aE9yTW9vcmluZ0ZhY2lsaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yVmVzc2Vsc0VudGVyaW5nSW50b1BvcnRBcmVhSW5OaWdodC1UaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZFVucHJpY2VkQmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbE5vdGljZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvcnRtZW50QWdhaW5zdEJsYW5rZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0YUNhcm5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvblRvUGxhbkFuZFNoaXBPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25Ub1BsYW5BbmRTdWdnZXN0T3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpdHlUb1Byb2NlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlQ29uZmlybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUb0JhbmtGdW5kc1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY0FncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNPcmRlcmluZ0FncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGFuZEhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0NvcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ09yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rZXRPcmRlckVzdGltYXRlZFF1YW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rZXRQdXJjaGFzZUFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0NvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlcmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0YXJ5UXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eUFtZXJpY2FDZXJ0aWZpY2F0ZU9mQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsaW5nRm9yd2FyZE5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbE9mZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsT2ZmT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbXBhaWduUHJpY2VTYWxlc0NhdGFsb2d1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BY2NlcHRhbmNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQW5hbHlzaXNWb3lhZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvRGVjbGFyYXRpb25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0RlY2xhcmF0aW9uRGVwYXJ0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01vdmVtZW50RXZlbnRMb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTW92ZW1lbnRWb3lhZ2VTdW1tYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1JlbGVhc2VOb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1Zlc3NlbERpc2NoYXJnZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1Zlc3NlbExvYWRpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZU9yZGVyTG9jYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sRmluYW5jaWFsU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQW5hbHlzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW5Gb3JtR3NwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUXVhbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUmVnaXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZTZWFsaW5nT2ZFeHBvcnRNZWF0TG9ja2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQ29zdEFuZFByaWNlRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkSW5zcGVjdGlvbkFuZFRlc3RSZXN1bHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VUb0NvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VUb1B1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZVRvUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlc05vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdmlsTGlhYmlsaXR5Rm9yT2lsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlT3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmFuY2VDZWRpbmdCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25QYXltZW50QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZENlcnRpZmljYXRlT2ZWYWx1ZUFuZE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRUcmFuc3BvcnRCaWxsT2ZMYWRpbmdNdWx0aW1vZGFsQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFjY291bnRTdW1tYXJ5UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEaXNwdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2VXaGljaEluY2x1ZGVzQVBhY2tpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zaXRlRGF0YUVsZW1lbnRDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb3NpdGVEYXRhRWxlbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudFN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRVbnBhY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZENyZWRpdE5vdGVHb29kc0FuZFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWxhckludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc2NoYXJnZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck1hbmlmZXN0VW5pdFBhY2tpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPZmZIaXJlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHJpcHBpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3R1ZmZpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXdhcmROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QmlsbE9mUXVhbnRpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RGdW5kc1N0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTZWN1cml0eUNsYXNzaWZpY2F0aW9uU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbERvY3VtZW50VDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VEZWNsYXJhdGlvbkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VEZWNsYXJhdGlvbkNvbWJpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25EZXBhcnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN1cGVyYW5udWF0aW9uQ29udHJpYnV0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlU3VwZXJhbm51YXRpb25NZW1iZXJNYWludGVuYW5jZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3REYXRhU3VtbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRGb3JtYXQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRGb3JtYXQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRGb3JtYXQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRGb3JtYXQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRGb3JtYXQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0U2NoZWR1bGVTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZUZvclByaWNlVmFyaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlUmVsYXRlZFRvRmluYW5jaWFsQWRqdXN0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVSZWxhdGVkVG9Hb29kc09yU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdMaXN0RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdzRWZmZWN0c0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0RvY2tpbmdEZXNwYXRjaEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ1NlcnZpY2VzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NyZXdBbmRDb252ZXlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Qb3N0UGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uRm9yQ2FyZ29FeGFtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uRm9yQ2FyZ29FeGFtaW5hdGlvbkFsdGVybmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aENvbW1lcmNpYWxBbmRJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRob3V0Q29tbWVyY2lhbERldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aG91dEl0ZW1EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWxpdmVyeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEb2N1bWVudHNFeHBpcmF0aW9uTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW1tZWRpYXRlUmVsZWFzZURlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3VtbWFyeURlY2xhcmF0aW9uV2l0aENvbW1lcmNpYWxEZXRhaWxBbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdW1tYXJ5RGVjbGFyYXRpb25XaXRob3V0Q29tbWVyY2lhbERldGFpbEFsdGVybmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVSZWxhdGVkVG9GaW5hbmNpYWxBZGp1c3RtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlUmVsYXRlZFRvR29vZHNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvbk9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvblJlZ2FyZGluZ1RoZUlud2FyZEFuZE91dHdhcmRNb3ZlbWVudE9mVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxjcmVkZXJlQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsY3JlZGVyZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Rm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5SW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUp1c3RJblRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RpY2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RpY2VSYWlsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVSZXNwb25zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYXREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVBvc3RQYXJjZWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVDJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QWNjZXB0YW5jZUFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdENvbGxlY3Rpb25JbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRJc3N1YW5jZUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdExldHRlck9mSW5kZW1uaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE5lZ290aWF0aW9uQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRQYXltZW50QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFRyYW5zZmVyQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzUHJlc2VudGF0aW9uRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmluZ0xpY2VuY2VJbnRlcm5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2aW5nTGljZW5jZU5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWNDYXJuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaUFzc29jaWF0ZWRPYmplY3RBZG1pbmlzdHJhdGlvbk1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFyZ29QZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyRGlzcG9zaXRpb25PcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5xdWlyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXJyb3JSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydE9mZmljaWFsUmVjb2duaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFByaWNlZEJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXB0aW9uYWxPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VDb250cm9sRGVjbGFyYXRpb25JbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQ29udHJvbERlY2xhcmF0aW9uRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JFeHBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZENyZWRpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhLUNvbW11bml0eVRyYWRlU3RhdGlzdGljYWxEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljYXRlQW5kSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yZWRDcmVkaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3JlZEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxMYWJlbEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFBheW1lbnRSZXF1ZXN0QmFzZWRPbkNvbXBsZXRpb25PZldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudE9mQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTYW1wbGVUZXN0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRXhjaGFuZ2VQZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm11bGFGdW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0FkdmljZVRvRXhwb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNBZHZpY2VUb0ltcG9ydEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQ2VydGlmaWNhdGVPZlJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNDZXJ0aWZpY2F0ZU9mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc1dhcmVob3VzZVJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVQYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodE1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGVQYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29TdW1tYXJ5TWFuaWZlc3RSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ29udHJvbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9yQ3VzdG9tc1RyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JFeHBvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckhvbWVVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JJbXBvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpcHRDYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yc2VtZWF0U2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBlbmRpbmdBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsZW1lbnRhdGlvbkd1aWRlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JJbXBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlZmluaXRlRGVsaXZlcnlEZWZpbml0ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlZmluaXRlRGVsaXZlcnlEZWZpbml0ZVF1YW50aXR5Q29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeUluZGVmaW5pdGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5SW5kZWZpbml0ZVF1YW50aXR5Q29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5U3VwZXJhbm51YXRpb25Db250cmlidXRpb25zQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVN1cGVyYW5udWF0aW9uTWVtYmVyTWFpbnRlbmFuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmVkaWJsZVNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uQ29weSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJ3YXlCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uc0ZvckJhbmtUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25Ub0NvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VEZWNsYXJhdGlvblNoZWV0Qm9yZGVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQb2xpY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbUFwcGxpY2F0aW9uRm9yUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxUcmFuc3BvcnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmFzdGF0RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUFkanVzdG1lbnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeU1vdmVtZW50QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVN0YXR1c0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nRGF0YVNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtc0Jvb2tlZFRvQUZpbmFuY2lhbEFjY291bnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYkxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2FuYmFuU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUJsYW5rZXRBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdGF0ZW1lbnRPZkFuQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mSW5kZW1uaXR5Rm9yTm9uLVN1cnJlbmRlck9mQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkludGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZVBheXJvbGxEZWR1Y3Rpb25zQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRsaW5lRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1ZhbHVlUGF5bWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWtlT3JCdXlQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVEZWNsYXJhdGlvbk9mSGVhbHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBaXJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSW5zcGVjdGlvbkFuZFJlY2VpdmluZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZVNSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0YXRpb25BdmFpbGFiaWxpdHlJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydGF0aW9uU2NoZWR1bGVJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdEFuZE1lYXRCeS1Qcm9kdWN0c1Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRGb29kUHJvZHVjdHNTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlSW5EZXZlbG9wbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyZWRTZXJ2aWNlc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpY2F0aW9uT2ZFeGlzdGluZ01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmVtZW50Q2VydGlmaWNhdGVBVHIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aWRyb3BPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGltb2RhbENvbWJpbmVkVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aW1vZGFsVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVByb2R1Y3RQbGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3Q29kZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld01lc3NhZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3UHJvZHVjdEludHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3RvcmVPcGVuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tTmVnb3RpYWJsZU1hcml0aW1lVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByZS1BdXRob3Jpc2VkRGlyZWN0RGViaXRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RGb3JTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VPZkNpcmN1bXN0YW5jZXNQcmV2ZW50aW5nRGVsaXZlcnlHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlT2ZDaXJjdW1zdGFuY2VzUHJldmVudGluZ1RyYW5zcG9ydEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25PZkVtZXJnZW5jeVNoaWZ0aW5nRnJvbVRoZURlc2lnbmF0ZWRQbGFjZUluUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZVc2FnZU9mQmVydGhPck1vb3JpbmdGYWNpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlclF1b3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsQ2hhcmFjdGVyUmVhZGluZ1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXR1c0VucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyU3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nlbmdlckxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JQZXJmb3JtYW5jZUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRSZXF1ZXN0Rm9yQ29tcGxldGVkVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25Gb3JVbnNjaGVkdWxlZEl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWNldXRpY2FsU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5dG9zYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRDaGFyZ2VzRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0UmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG91bHRyeVNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFkdmljZU9mQUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlQXV0aG9yaXplZERpcmVjdERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVBdXRob3JpemVkRGlyZWN0RGViaXRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJlbmNlQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlDcmVkaXRBc3Nlc3NtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeVNhbGVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXltZW50SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdXN0b21zRG9jdW1lbnRNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVNhbGVzQ2F0YWxvZ3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVNhbGVzQ2F0YWxvZ3VlUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlZEFsdGVybmF0ZVRlbmRlckJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWRUZW5kZXJCb3EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTmVnb3RpYXRpb25SZXN1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlVmFyaWF0aW9uSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0RhdGFSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3REYXRhTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFBlcmZvcm1hbmNlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3BlY2lmaWNhdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc2l2ZURpc2NoYXJnZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hc3RlclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYXN0ZXJTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFubmluZ0F2YWlsYWJsZVJlc291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBsYW5uaW5nQ2FsZW5kYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9kdWN0aW9uUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFJlY292ZXJ5UGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbFBheW1lbnRWYWx1YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YVByaW9yQWxsb2NhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ29uc2lnbm1lbnROb3RlR2VuZXJpY1Rlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWR5Rm9yRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2hhcmdpbmdEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkVXBkYXRlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxBcHBlbGxhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25DaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25SZW5ld2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZERpcmVjdERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VBZ2FpbnN0QXNzb3J0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU9yRGVsaXZlcnlPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0YW5jZUFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVuZXdhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlb3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckFuZFJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydE9mVHJhbnNhY3Rpb25zRm9ySW5mb3JtYXRpb25Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRPZlRyYW5zYWN0aW9uc1doaWNoTmVlZEZ1cnRoZXJJbmZvcm1hdGlvbkZyb21UaGVSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckFuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JEZWxpdmVyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckZpbmFuY2lhbENhbmNlbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JRdW90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclN0YXRpc3RpY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50c0NvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1TZW5kaW5nQ29uc2lnbm1lbnROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb0FUcmFkZVN0YXRpc3RpY3NNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUHJldmlvdXNCYW5raW5nU3RhdHVzTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1F1ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0b3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VtZVdvcmtPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsZXJQcmVjb21taXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZlcnNhbE9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZlcnNhbE9mRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDb25zaWdubWVudE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRMaXN0LVNtZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1c2hPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kSGF6YXJkRGF0YVNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZkVxdWlwbWVudENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZlJhZGlvQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eU9mU2hpcENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vhc29uVGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZCaWxsZWRDcmVkaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmLUJpbGxlZEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcXVlbmNlZERlbGl2ZXJ5U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VEaXJlY3RvcnlEZWZpbml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50T2ZBTGV0dGVyT2ZDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNMZXR0ZXJPZkluc3RydWN0aW9uc0FpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHNTdG9yZXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltcGxlRGF0YUVsZW1lbnRDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVEYXRhRWxlbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUFkbWluaXN0cmF0aXZlRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYXJlUGFydHNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kQWxvbmVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50T2ZBY2NvdW50TWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxBbmRPdGhlckFkbWluaXN0cmF0aXZlSW50ZXJuYWxEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEZWZpbml0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEb2N1bWVudEV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEb2N1bWVudEltcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcFdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Jlc1JlcXVpc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUFpcldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1hcnlTYWxlc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFyeURvY3VtZW50Rm9yQXBwbGljYXRpb25Gb3JDYXJnb09wZXJhdGlvbk9mRGFuZ2Vyb3VzR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhcnlEb2N1bWVudEZvckFwcGxpY2F0aW9uRm9yVHJhbnNwb3J0T2ZEYW5nZXJvdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5T3JTZXJ2aWNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YXBPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua2VyQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXNrT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENhbGN1bGF0aW9uQ29uZmlybWF0aW9uUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZWNsYXJhdGlvbkdlbmVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlY2xhcmF0aW9uVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhOb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdoQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWZGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJDYXJuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbGxDb252ZXJzaW9uT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nTnVtYmVyQXNzaWdubWVudFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDYXJnb1JlbGVhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGVwYXJ0dXJlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREaXNjaGFyZ2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGlzY2hhcmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFbWVyZ2VuY3lDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFbXB0eUVxdWlwbWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50QWNjZXB0YW5jZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREYW1hZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudERlbGl2ZXJ5Tm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREaXJlY3RJbnRlcmNoYW5nZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RW1wdHlSZWxlYXNlSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEltcGVuZGluZ0Fycml2YWxBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmtBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmtFc3RpbWF0ZUFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrRXN0aW1hdGVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TW92ZW1lbnRJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TW92ZW1lbnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9mZkhpcmVSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9mZkhpcmVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPbkhpcmVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T25IaXJlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPbkhpcmVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQYWNraW5nSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2tVcEF2YWlsYWJpbGl0eUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGlja1VwQXZhaWxhYmlsaXR5UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGlja1VwUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTaGlmdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3BlY2lhbFNlcnZpY2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RhdHVzQ2hhbmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdG9ja1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleU9yZGVyUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50VW5wYWNraW5nSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFVucGFja2luZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TG9hZGluZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRMb2FkaW5nUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRNb3ZlbWVudEdhdGVJblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TW92ZW1lbnRHYXRlT3V0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFN0YXR1c1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnREZXNwYXRjaEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnROaWxPdXR0dXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRQZXJzb25hbEVmZmVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50VGltYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRUaW1lVXBVbmRlcmJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFVuZGVyYm9uZEJ5U2VhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcmJvbmRBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJib25kUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdERvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNTdGFuZGFyZE1lc3NhZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0RXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbE11bHRpcHVycG9zZVRyYW5zcG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnByaWNlZEJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoaXBQZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyZ2VudFNlcnZpY2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VyRGlyZWN0b3J5RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjY2luYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGVkUHJpY2VkVGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxVbnBhY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZURldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVdhcnJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5lQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xIZWFsdGhDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdHRlbkluc3RydWN0aW9uc0luQ29uZm9ybWFuY2VXaXRoQWRyQXJ0aWNsZU51bWJlcjEwMzg1Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXJyZW5jeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ3VycmVuY3lDb2RlZCIgdHlwZT0iQ3VycmVuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDdXJyZW5jeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5IiB0eXBlPSJDdXJyZW5jeSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDdXJyZW5jeUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVpNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJZQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkVGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCT0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQldQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktIUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktZRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWE9GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhQRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNZUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1pLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJES0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWENEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVHUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1ZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVFSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVRCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhFVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRktQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpBTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0VMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR05GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHV1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdZRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFVGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1dEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMU0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNS0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1HRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVdLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1VUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVhOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNREwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1OVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU5HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUV0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpSTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5HTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBLUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQR0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBZRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUExaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSV0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1REIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNHRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktSVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNIUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0RBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTREQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1JHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRKUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFpTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE9QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVR1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVBSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVpTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWVVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVk5EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllVTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWk1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaV0QiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+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+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6dyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGF4UmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRheCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheFRyZWF0bWVudENvZGVkIiB0eXBlPSJUYXhUcmVhdG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFRyZWF0bWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRheFJlZmVyZW5jZSIgdHlwZT0iVGF4UmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXhMb2NhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4TG9jYXRpb24iIHR5cGU9IlRheExvY2F0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXgiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZWQiIHR5cGU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlZCIgdHlwZT0iVGF4Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhDYXRlZ29yeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGVkIiB0eXBlPSJSZWFzb25UYXhFeGVtcHRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4VHlwZUNvZGVkIiB0eXBlPSJUYXhUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4VHlwZUNvZGVkT3RoZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFBlcmNlbnQiIHR5cGU9IkRlY2ltYWwxMF80Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZWQiIHR5cGU9IlRheFBheW1lbnRNZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4YWJsZUFtb3VudCIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheGFibGVBbW91bnRJblRheEFjY291bnRpbmdDdXJyZW5jeSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhBbW91bnRJblRheEFjY291bnRpbmdDdXJyZW5jeSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVGF4TG9jYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRheCIgdHlwZT0iVGF4Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxEdXR5VGF4T3JGZWVDdXN0b21zSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkFsbER1dGllc1RheGVzQW5kRmVlc0N1c3RvbXNJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mRWFjaER1dHlUYXhPckZlZVR5cGVDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZBbGxEdXRpZXNUYXhlc0FuZEZlZVR5cGVzQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFJlbGF0ZWRJbmZvcm1hdGlvbiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhDYXRlZ29yeUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZFZldGVyYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlQYWlkQnlTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Rm9yRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21Db3VudHlQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbUxvY2FsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21TY2hvb2xQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbVN0YXRlUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEdvb2RzYW5kU2VydmljZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdExldHRlck9uRmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TG9jYWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHROb3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1QZXJTdGF0ZUxhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0UHJvdmluY2lhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRTYWxlVG9VU0dvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFRvbGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRXhwb3J0SXRlbVRheE5vdENoYXJnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hlclJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUYXhhYmxlTWF0ZXJpYWxFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VyUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxUYXhhYmxlTGFib3JFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkVGF4UmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm8tTm90VGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHRGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VGF4YWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblNwYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclByb3BlcnR5VGF4RXhlbXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0V4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXNPdXRzaWRlU2NvcGVPZlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbGx5RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhEdWVGcm9tQVByZXZpb3VzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheE5vdE5vd0R1ZUZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZXMtVGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaZXJvUmF0ZWRHb29kcyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUZvckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzLVRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm8tTm90VGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtRm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHRPckZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LU5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Tm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXlJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVNhbGVUb1VTR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVBlclN0YXRlTGF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRheGFibGVNYXRlcmlhbEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxUYXhhYmxlTGFib3JFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRheGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRUb2xsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUdvb2RzQW5kU2VydmljZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Qcm92aW5jaWFsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuU3BhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdExvY2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRWZXRlcmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21TY2hvb2xQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbUxvY2FsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0V4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbUNvdW50eVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbGx5RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVN0YXRlUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUHJvcGVydHlUYXhFeGVtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1MZXR0ZXJPbkZpbGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFDaXR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFDb3VudHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExU3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb21tb2RhdGlvbnNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkVmFsb3JlbVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmFsRXhwb3J0UmViYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyYWxsZXZ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9saWNCZXZlcmFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbE1hcmtUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpLUR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Nlc3NtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0xpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzUHJpdmlsZWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlSZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29mZmVlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2luT3BlcmF0ZWREZXZpY2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eVNwZWNpZmljVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVJbmNvbWVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2hTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5UmVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0TGFib3JUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5oYW5jZWQ5MTFTdGF0ZUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZUR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmNvbWVUYXhXaXRoaG9sZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFZhbHVlQWRkZWRUYXhPbkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVmFsdWVBZGRlZFRheE9uU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZUluTGlldSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQU1lZGljYXJlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBU29jaWFsU2VjdXJpdHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbExVU1RUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTcGlsbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFN1cGVyRnVuZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FtaW5nVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ29uc3RydWN0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaWZ0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1JlY2VpcHRzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kaWNhcFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzV2FzdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2h3YXlVc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbHVtaW5hbnRzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxJbmNvbWVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaGVyaXRhbmNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRnVlbFRheEFncmVlbWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JCeVRyYWRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFreVVuZGVyZ3JvdW5kU3RvcmFnZVRhbmtUYXhGZWRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFreVVuZGVyZ3JvdW5kU3RvcmFnZVRhbmtUYXhTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlnaHREdWVzUGF5YWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxDb25zdHJ1Y3Rpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdXN0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm9wb2xpdGFuVHJhbnNpdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c0Nhc2hEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzU3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV0YXJ5Q29tcGVuc2F0b3J5QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckZ1ZWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlckNvbnNvcnRpdW1UYXgtSXRhbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdFRocmVzaG9sZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVyZW5jZUR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZVRocmVzaG9sZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxjb3VudGVydmFpbGluZ0R1dHlCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbENvdW50ZXJ2YWlsaW5nRHV0eUNhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsRHV0eUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsRHV0eUNhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aEFuZEVkdWNhdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FuZFVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQZXJjZW50YWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXZlcmFuY2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0ZWRTb2NpYWxTZWN1cml0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVkV2FnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWRXYXN0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnN0cnVjdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhZGl1bVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBEdXR5LUltcG9zdGFkaUJvbGxvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZWFuZExvY2FsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQW5kTG9jYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQW5kUHJvdmluY2lhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsRnVlbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNpYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxUYXhPbkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbFRheE9uU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlUmVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRheG9uU3BlY2lmaWNMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJmdW5kVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbmRlZER1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0RldmljZUZvclRoZURlYWZTZXJ2aWNlRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVzaG9sZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9iYWNjb1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9ubmFnZVRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG91cmlzbVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVybk92ZXJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZW1wbG95bWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXR5VXNlcnNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkRlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoaG9sZGluZ1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2Vyc0NvbXBlbnNhdGlvblRheCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMTBfNCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkFzc2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5VmVuZG9yIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwyMV82Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIyMSIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iNiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTG9jYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlZCIgdHlwZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbEFkZHJlc3NJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik5hbWVBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkdQU0Nvb3JpZGluYXRlcyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb24iIHR5cGU9IkxvY2F0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblRvUmVjZWl2ZUNyZWRpdEZvclVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0aW5nVXRpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNTY2hlZHVsZUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c0Jsb2NrR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lQmFzZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1RyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNTY2hlZHVsZUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1hbmVudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRocGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvcmxkd2lkZUdlb2dyYXBoaWNMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lYXJlc3RDcm9zc1N0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q3Jvc3NTdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VySWRlbnRpZmllckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVTdWJkaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZS1Mb25naXR1ZGVTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmlkU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGlxdW90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluaG9sZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eUJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb290YWdlQ2FsbERpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25EaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxMZWFzZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFF1YWRyYW5nbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbE1lcmlkaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNpYWxQcm90cmFjdGlvbkRpYWdyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFic3RyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZ3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JRdWFkcmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnNlRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsU3RhdGVtZW50c01haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5YW5kU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRTZXJ2aWNlc0xvY2F0aW9uRGVzaWduYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFY29ub21pY0FyZWFSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QmlsbG9mTGFkaW5nT2ZmaWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9wb2xpdGljYWxOYW1lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb25NYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXN0b21zT2ZmaWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVzcG9uZGVuY2VNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSYXRlQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eU9yUGFyaXNoQW5kU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVGFua0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5TUExDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uQ2VudGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbi1TaGlwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWljaWxlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRFcXVhbGl6YXRpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkZyZWlnaHRGb3J3YXJkZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluZm9ybWF0aW9uUHJvY2Vzc2luZ1N0YW5kYXJkczU1LU5hbWVkUG9wdWxhdGVkUGxhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuQ3VzdG9tc0ZhY2lsaXRpZXNJbmZvcm1hdGlvbmFuZFJlc291cmNlTWFuYWdlbWVudFN5c3RlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdGF0aW9uQWNjb3VudGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25UcmFkZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVBbG9uZ3NpZGVWZXNzZWwtRnJlZU9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFN0YXRpb25HZW9ncmFwaGljTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbkxvY2F0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkTW92ZW1lbnRQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUZPQlBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEZ1cm5pc2hlZFByb3BlcnR5Rk9CUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRyb3BvbGl0YW5TYW1wbGluZ0FyZWFSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXhpY2FuUG9zdGFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eU9yU3RhdGVGcm9tUG9pbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW4tQWZ0ZXJMb2FkaW5nT25FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRGcmVlT25Cb2FyZFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuYW5kUHJlcGF5U3RhdGlvbkxpc3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkQWNjZXB0YW5jZVBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW4tU2hpcHBpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25WZXNzZWwtRnJlZU9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydG9mQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydG9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50c0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxTZXJ2aWNpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0RpZ2l0VVNaSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjREaWdpdFVTWklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RGlnaXRVU1pJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0RpZ2l0Q2FuYWRpYW5Qb3N0YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2RGlnaXRDYW5hZGlhblBvc3RhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVBcmVhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5SYWlsQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbEVkdWNhdGlvblNlcnZpY2VBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2FycmllckFscGhhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVBZG1pbmlzdHJhdGl2ZU1lc3NhZ2VUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJ1cmJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eU9yU3RhdGVBbmRQb2ludHNXaXRoaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbENhbXB1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVNQTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5TdG9yYWdlVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dpdGNoaW5nRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zY29udGluZW50YWxGcmVpZ2h0QnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbENhcmdvTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3duc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVGVycml0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpbmdEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXJiYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpbGxhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN0b3dhZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJab25lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNlYXNBbmRQb2ludExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdENoYXJnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlT2ZNYW5pZmVzdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mTWFuaWZlc3REZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luUmFpbEludGVybW9kYWxUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25SYWlsSW50ZXJtb2RhbFRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkFjY2VwdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc29saWRhdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZS1Db25zb2xpZGF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5YWJsZUF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRXhpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdQb3J0T2ZMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BhdGNoaW5nUG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nT3JpZ2luT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZlJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblBvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRQb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQ2hhcmdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlbGVhc2VPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkT3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF5UG9ydCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTG9jYXRpb25JZGVudGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NJRCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb25JZGVudGlmaWVyIiB0eXBlPSJMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVBZGRyZXNzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkV4dGVybmFsQWRkcmVzc0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+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+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHUFNDb29yaWRpbmF0ZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkdQU1N5c3RlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxhdGl0dWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9uZ2l0dWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJHUFNDb29yaWRpbmF0ZXMiIHR5cGU9IkdQU0Nvb3JpZGluYXRlcyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhUcmVhdG1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UYXhBcHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRJbnZvaWNlTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzSW52b2ljZUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRMaW5lTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTGluZUxldmVsIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZGVySW52b2ljZU1lZGl1bVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdHN3aXRjaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJJTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmxlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVHJhbnNtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVHJhbnNmZXJBY2Nlc3NNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVGYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFSVNNYWlsYm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQk1JbmZvcm1hdGlvbkV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbE1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RCb3hObyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2V0U3dpdGNoaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlZ3JhcGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZVRleHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWC40MDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlcXVpcmVkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckRhdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcXVlc3RlZFNoaXBCeURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVxdWVzdGVkRGVsaXZlckJ5RGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9taXNlRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhbmNlbEJ5RGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRhdGVDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJEYXRlcyIgdHlwZT0iT3JkZXJEYXRlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGF0ZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEYXRlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRhdGVDb2RlZCIgdHlwZT0iTGlzdE9mRGF0ZUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEYXRlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRGF0ZVF1YWxpZmllciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZUNvZGVkIiB0eXBlPSJEYXRlQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGVRdWFsaWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVRdWFsaWZpZXJDb2RlZCIgdHlwZT0iRGF0ZVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRhdGVRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlUXVhbGlmaWVyIiB0eXBlPSJEYXRlUXVhbGlmaWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRhdGVRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzYwMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjU2MzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2MDI4MzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTI4MzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTYyODMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxc3RTY2hlZHVsZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxc3RTY2hlZHVsZVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VsZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZU9mR29vZHNEZWNsYXJhdGlvbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlVGltZU9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50QmVuZWZpdEFnZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50RGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRJbnN1cmFuY2VFbGltaW5hdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRMaWZldGltZUJlbmVmaXRRdWFsaWZpY2F0aW9uQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50YW50c09waW5pb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2xvc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ01ldGhvZG9sb2d5Q2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdUcmFuc2FjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3BlbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGUtU3RhdGVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlSZXBvcnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eVBlcmlvZERhdGVSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxBcmNoaXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFBvcnRPZkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZXR1cm5Ub1dvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN1dGVNYW5pZmVzdGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN1dGVNYW5pZmVzdGF0aW9uT2ZBQ2hyb25pY0NvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkam91cm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZEFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRDb250ZXN0YWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWREZWF0aEJlbmVmaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZEhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQcm9jZXNzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQcm9taXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFRvQmlsbERhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yT3JkZXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWlzc2lvbkRhdGVBbmRPclRpbWVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRvcHRpb25EYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VBZnRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VCZWZvcmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQ29tcGxldGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZU9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnRUb1BheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3RtZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YWJsZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dlZFJlbmV3YWxEdXJhdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlQmFzZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUHJvYmxlbVJlc29sdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5hbHlzaXNNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5lc3RoZXNpYUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0RGVsaW5xdWVudE9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0RmlsaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0TWFpbGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdHlDb21tZW5jZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZENsb3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpYW5jZVBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50U2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Mb2dnZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50RXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsT3JkZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxPZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lQXRJbml0aWFsUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZU9mVHJhbnNwb3J0TGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxJbkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGVyaWFsQmxvb2RHYXNUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRBbmRMaWFiaWxpdHlTY2hlZHVsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0RG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudFJlY29yZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRhbmNlRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpZW5jZURlZmljaWVuY3lQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0UGVyaW9kQWZ0ZXJTcGxpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0UGVyaW9kUHJpb3JUb1NwbGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW9uVmFsaWRhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGljUHJlbWl1bUxvYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJpbGl0eUR1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZURlbGl2ZXJ5RGVsYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VQYXltZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBd2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09uTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJEZWxpdmVyeURhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VTaGVldERhdGVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlbGluZUNvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlbGluZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWZvcmVJbnZlbnRvcnlJc1JlcGxlbmlzaGVkQmFzZWRPblN0b2NrQ2hlY2tMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTGF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5UaGVyYXB5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNCYW5rc0R1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFwcGxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDcmVkaXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDcmVkaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDcmVkaXRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdERlYml0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RGViaXRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBheW1lbnRzVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UmVsZWFzZUF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0c1BhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlckVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFR5cGVHcm9zc1dlZWtseUFtb3VudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFR5cGVOZXRXZWVrbHlBbW91bnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0QmVmb3JlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdFRpbWVUb0NhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpYW5udWFsVGVybWluYWxJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuRGF0ZUJpZHNXaWxsQmVPcGVuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZFByaWNlRXhjZXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRUaHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua3NWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVwcmludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc0luY29tcGxldGVBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzTm90QXV0aG9yaXplZEFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNOb3RDb21wbGV0ZUFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rRW50cnlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcml0aXNoVGhlcm1hbFVuaXRUZXN0UGVyZm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRMaW5lQXBwbGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NvbnRyb2xDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc09wZW5lZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNEb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNMb2NhbFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXJFeENvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyRXhGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdERlbGl2ZXJlZEJ5VGhpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90UHVibGlzaGVkQnlUaGlzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3RTaGlwcGVkQnlUaGlzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uRGF0ZVRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YWxpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGlvblBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGlvblBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0Jvb2tpbmdDb25maXJtZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29SZWxlYXNlRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZUNvbnZlcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZVJlb3BlbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQ2FsbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGVnb3J5Q2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlYXNlZE9wZXJhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uT2ZXZWlnaHREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUmV2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRBY2NvdW50aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUJhY2tEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0T2ZBY2NvdW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkYmlydGhEYXRlQW5kT3JUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZGJpcnRoRGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyaXN0ZW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuc2hpcENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvcktub3dsZWRnZU9mVGhlSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3JOb3RpZmllZE9mRW1wbG95ZWVMZWdhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUluY3VycmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1NYWRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1Ob3RpZmljYXRpb25SZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1zTWFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1TdGF0ZW1lbnRQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltU3RhdGVtZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJhbmNlRGF0ZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY2FsRXhhbWluYXRpb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFVudGlsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0RhdGVPZkZpcnN0QmFsYW5jZVNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3N1cmVEYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbERlcGVuZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbERlcGVuZGVudEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbkRhdGVUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZW5jZWRQdW1waW5nQmFsbGFzdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZW5jZWRUYW5rQ2xlYW5pbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJpc29uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21waWxhdGlvbkRhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFB1bXBpbmdCYWxsYXN0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFRhbmtDbGVhbmluZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVOb3RBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVOb3RCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25Jbml0aWFsVHJlYXRtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb25EYXRlTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFRdWFsaWZ5aW5nRXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25EYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2FmZXR5Q29udmVudGlvbkNzY0luc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTYWZldHlDb252ZW50aW9uQ3NjUGxhdGVFeHBpcmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3RyaXBwaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3R1ZmZpbmdEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZXN0YWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbmN5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uT2ZQYXlTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVpbmdFZHVjYXRpb25SZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c0NvdmVyYWdlRGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNQYXNzaXZlTW90aW9uQ1BNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF1ZGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBd2FyZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJpbmRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvbXBsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvc3RzVGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdERlZmluaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE1haWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJmb3JtYW5jZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmZvcm1hbmNlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJlLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsRGVsaXZlcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbFN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblBlcmlvZEVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25QZXJpb2RTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25zQ2Vhc2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvdmVydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnNpb25Qcml2aWxlZ2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnNpb25Ub1JlcGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvbkludG9Ib2xkaW5nQ29tcGFueURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRlZFRvRWxlY3Ryb25pY0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252aWN0ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25PZkJlbmVmaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25PZkJlbmVmaXRzQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHNFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZERhdGVPZkJpcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3NpZ25lclNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREaXNtaXNzYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEV2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydE5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUlzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEluY29tZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXREb2N1bWVudGF0aW9uRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0ZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2VCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0ZWRTZXJ2aWNlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNSZXF1ZXN0ZWRWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzYm9yZGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VyZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBdXRob3JpdHlDb250cm9sU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGlzYWJpbGl0eVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RMYXN0RGF5V29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGlzYWJpbGl0eVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50SW5jb21lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGVnYWxTdHJ1Y3R1cmVFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudE1vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TmFtZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2NoZWR1bGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNjaGVkdWxlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VydGFpbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJ0YWlsbWVudERhdGVmcm9tQWR2aWNlT2ZQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDYXJnb1JlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNFbnRyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBY2NvdW50TWF0dXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFjcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQW5kT3JUaW1lT2ZIYW5kbGluZ0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFzQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBc3NpZ25tZW50RmlsZWRGb3JSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lGaWxlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVCZWNhbWVBd2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUNsYWltUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUNvdXJzZU9mT3J0aG9kb250aWNzVHJlYXRtZW50QmVnYW5PcklzRXhwZWN0ZWRUb0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRGVlZEZpbGVkRm9yUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRGVmYXVsdFdhc0N1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRG9jdW1lbnRhdGlvbk9yUGFwZXJ3b3JrT3JCb3RoV2FzU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yZWNsb3N1cmVIZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yZWNsb3N1cmVQcm9jZWVkaW5nc0luc3RpdHV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZVNhbGVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JUaGVMYXN0VXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlSGF6YXJkSW5zdXJhbmNlUG9saWN5Q2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlSGF6YXJkSW5zdXJhbmNlUG9saWN5UmVmdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU1hdGVyaWFsVXNhZ2VTdXNwZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFiYW5kb25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY3F1aXNpdGlvbk9mVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXBwcmFpc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBc3NpZ25tZW50QXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFzc2lnbm1lbnRSZWplY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDbG9zaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEYW1hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2Vhc2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWVkSW5MaWV1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEaXZvcmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZFeHRlbnNpb25Ub0NvbnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlybUNvbW1pdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0TW9ydGdhZ2VQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdFJlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RVbmN1cmVkRGVmYXVsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRm9yZWNsb3N1cmVOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0RHJhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdEluc3RhbGxtZW50UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RQYXltZW50UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RVcGRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvY2FsT2ZmaWNlQXBwcm92YWxPZkNvbnZleWFuY2VPZkRhbWFnZWRSZWFsRXN0YXRlUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvY2FsT2ZmaWNlQXBwcm92YWxPZkNvbnZleWFuY2VPZk9jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUNlcnRpZmljYXRpb25PZkNvbnZleWFuY2VPZkRhbWFnZWRSZWFsRXN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZNYXhpbXVtTWVkaWNhbEltcHJvdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOb3RpY2VPZlByb2JhYmxlSW5lbGlnaWJpbGl0eUZvckFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZU9mUmVmZXJyYWxGb3JBc3NpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOb3RpY2VUb0NvbnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZPcmRlckxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQb3NzZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcm9kdWN0RmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJvcGVydHlJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRnJvbUJhbmtydXB0Y3lEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZSZXBhaXJPclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNlaXp1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNvdXJjZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9uV2hpY2hBc3NldHNKdWRnZWRJbnN1ZmZpY2llbnRUb1BheUNyZWRpdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU91dHN0YW5kaW5nTG9hbkJhbGFuY2VSZXBvcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQbGFjZWRJbkRpc2Zhdm91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVBvc3Nlc3NvcnlBY3Rpb25Jbml0aWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcmFjdGljZUNlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByYWN0aWNlRXN0YWJsaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcm9wZXJ0eVNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVSZWFkeUZvckNvbGxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVSZWRlbXB0aW9uUGVyaW9kRW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlZmVycmVkVG9BdHRvcm5leUZvckZvcmVjbG9zdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRocm91Z2hXaGljaFByb3BlcnR5VGF4ZXNIYXZlQmVlblBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaW1lT2ZEaXNjb3VudFRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mSW50ZXJlc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaW1lT2ZMYXRlc3RBY2NvdW50c0ZpbGluZ0F0UHVibGljUmVnaXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUb3RhbEFtb3VudE9mRGVsaW5xdWVuY3lSZXBvcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVZvbHVudGFyeUNvbnZleWFuY2VBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVdoZW5Db250YWluZXJFcXVpcG1lbnRCZWNvbWVzRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheWxpZ2h0T3ZlcmRyYWZ0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c09mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWF0aERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdFZhbHVlRGF0ZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidEluY3VycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNpc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvblByZXNlbnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uUmVmZXJlbmNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RpYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWVkTm90QXZhaWxhYmxlQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkRGlzdHJpYnV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpbml0aW9uT2ZEaXNhYmlsaXR5RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGF5ZWRCaWxsaW5nTm90RGVsYXllZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyTm90QmVmb3JlQW5kTm90QWZ0ZXJEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBcHBvaW50bWVudERhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lMVN0U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVDdXJyZW50U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVEZWZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVGaXJzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUxhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVQcm9taXNlZEZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVQcm9taXNlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVTY2hlZHVsZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9yZGVySXNzdWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pYWxFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbFJlc2Npc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRBZG1pc3Npb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50RGlzY2hhcmdlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mTGFib3JXYWdlRGV0ZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUZyb21MYXN0UG9ydE9mQ2FsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZUZyb21TcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0cmltZW50YWxJbmZvcm1hdGlvblJlY2VpcHREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RJbnRlcmNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHlXYWl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlQW5kTG9hZGluZ0NvbXBsZXRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2UtUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzZW1iYXJrYXRpb25EYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzbWlzc2FsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aWRlbmRBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0RXhwaXJ5RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0SXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFByZXNlbnRhdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRNZXNzYWdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVjZWl2ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXF1ZXN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3REZWxpdmVyQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90RGVsaXZlckJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RTaGlwQmVmb3JlRXhDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFNoaXBCZWZvcmVFeEZhY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nUmV2aXNpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcHBlZFRvTGVzc1RoYW5IYWxmVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlRGF0ZUxhc3RDb21wbGV0ZUluc3RhbGxtZW50UGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlRGF0ZU9mRmlyc3RQYXltZW50VG9QcmluY2lwYWxBbmRJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlQmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmxpZXN0RmlsaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJsaWVzdFNhbGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlXaXRoZHJhd2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuaW5nc0VmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZURhdGVPZkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJpbGl0eUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJpbGl0eUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJrYXRpb25EYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUVmZmVjdGl2ZURhdGVPZkNvdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUxhaWRPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGVtcG9yYXJ5TGFpZE9mZlBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUZW1wb3JhcnlMYWlkT2ZmUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVXYWdlc0NlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJLbm93bGVkZ2VPZlRoZUluanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJSZXBvcnRlZEluanVyeVRvQ2xhaW1BZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UG9zaXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRPckhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQb3NpdGlvblN0YXJ0RGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFByb2Zlc3Npb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRBdmFpbGFiaWxpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmREYXRlT2ZTdXBwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmREYXRlU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdMYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZkdyYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZkxhc3RGaXNjYWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlZENlcnRpZmljYXRlSXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlTGV2ZWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0RhdGFMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnJvbGxtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnJvbGxtZW50U2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeURhdGVFc3RpbWF0ZWRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRMb2dFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQcmVUcmlwRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmVjb25kaXRpb25pbmdEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmVwYWlyUmVhZHlEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXR1cm5QZXJpb2RFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RvY2tDaGVja0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NhbGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZUNvbW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQWNjZXB0YW5jZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZENvbXBsZXRpb24tRmlyc3RQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLVNlY29uZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZENvbXBsZXRpb24tVGhpcmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25EYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZCaXJ0aEVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEVzY3Jvd0Nsb3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEltbWlncmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9pbnRPZkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFBvaW50T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFBvcnRPZkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LUZpcnN0UHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkU3RhcnQtU2Vjb25kUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkU3RhcnQtVGhpcmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZVByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aW9uRGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXRQbGFudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkQ29udGFpbmVySGlyZUZyb21EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRGdW5kaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRQcm9ibGVtUmVzb2x1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkUmVwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRPbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVPZkV4dGVuc2lvblRvQXNzaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZU9mRXh0ZW5zaW9udG9Gb3JlY2xvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlVGltZU9mQ3VzdG9tc0RvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZVRvU3VibWl0VGl0bGVFdmlkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbk9mRXh0ZW5zaW9uVG9Db252ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkV4dGVuc2lvblRvU3VibWl0RmlzY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbk9mRm9yZWNsb3N1cmVUaW1lZnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyeURhdGVPZkV4cG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyeURhdGVPZkltcG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGxhbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRhdGlvbkRhdGVGb3JUZXh0aWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9zdXJlU291cmNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlRHVlQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZU1vZGVFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlYXNpYmlsaXR5U2lnbk9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhpZ2h3YXlBZG1pbmlzdHJhdGlvbkZod2FJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlQ2FwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkRmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlR2VuZXJhdGlvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNvbmNpbGlhdGlvblZhbHVlRXN0aW1hdGVBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNjaGVkdWxlZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENvdmVyYWdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbmZvcm1hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uU3VibWlzc2lvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hEYXRlT3JUaW1lTWFuZGF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hEYXRlT3JUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3REYXRlT2ZPcmRlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJbnRlcmVzdEJlYXJpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludGVyZXN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJbnZvbHZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RNYXJrZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQYXltZW50Q2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UHJvZHVjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UHVibGlzaGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTYWxlRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFN1Ym1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0VmlzaXRvckNvbnN1bHRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRFeHRyYUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRCaWxsRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9FYXJsaWVzdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0xhdGVzdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mTm90aWNlVG9Qcm9jZWVkVG9Db21tZW5jZW1lbnRPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk5vdGljZVRvUHJvY2VlZFRvQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb1NhbXBsZVJlYWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9TaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlJlY2VpcHRPZkl0ZW1Ub0FwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mUmVjZWlwdE9mVG9vbGluZ0FpZHNUb1NhbXBsZVJlYWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mU2FtcGxlQXBwcm92YWxUb0ZpcnN0UHJvZHVjdFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mVG9vbGluZ0F1dGhvcml6YXRpb25Ub1NhbXBsZVJlYWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tTGFzdEJvb2tlZE9yZGVyVG9EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kc0FwcHJvcHJpYXRpb24tRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kc0FwcHJvcHJpYXRpb24tU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1dHVyZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FsbG9uc1Blck1pbnV0ZVRlc3RQZXJmb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1Bvc2l0aW9uaW5nRGF0ZVRpbWVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNQb3NpdGlvbmluZ0RhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cENvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cENvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZE92ZXJEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZE92ZXJEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDYXBpdGFsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uUmVsZWFzZUF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hSYXdNYXRlcmlhbEF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVkRnJvbURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVkVW50aWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEFzU3RvY2tBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xpZGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xpZGF5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xpZGF5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VzQ29ubmVjdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VzRGlzY29ubmVjdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsQWRtaXNzaW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxEaXNjaGFyZ2VEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyb3Rlc3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxuZXNzQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3NSZWNvdmVyeURhdGVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1taWdyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsYW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxlbWVudGF0aW9uRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5hY3Rpdml0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRNb3ZlbWVudEF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVEb2N1bWVudGF0aW9uRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lSW5jcmVhc2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25EaXNzb2x1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jdW1iZW5jeVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEVkdWNhdGlvblBsYW5JRVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLWZvcmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlbGVhc2VBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbENsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbENvbnRhY3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RMYXN0RGF5V29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZFJldHVyblRvV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbEZlZUR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbEZpbmFuY2lhbEFjY291bnRzRmlsZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlSW5pdGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxQcmVtaXVtRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUmVxdWVzdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluanVyeUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluanVyeU9ySWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU2VydmljZVN1cnZleURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc29sdmVuY3lEaXNjaGFyZ2VHcmFudGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbkRhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbG1lbnRQYXltZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25zT3JpZ2luYWxFeGVjdXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1ZmZpY2llbnRBc3NldHNKdWRnZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdENhcGl0YWxpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFBhaWRUaHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFBhaWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UmF0ZVZhbGlkaXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudEFwcHJvdmFsRm9yUHVibGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsUmV2aWV3Q3ljbGVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycnVwdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJydXB0aW9uU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXJTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnROdW1iZXJBbGxvY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52aXRhdGlvblRvVGVuZGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURhdGVSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklycmVndWxhckludGVyZXN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Db250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW5lZEVtcGxveWVyRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbmVkRnVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5RXZlbnRDYWxlbmRhclllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50RmlzY2FsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyV2FnZURldGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QWN0aXZpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QW5udWFsUmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENhcGl0YWxDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENoZWNrRm9yQmFsYW5jZVNoZWV0VXBkYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENpdmlsaWFuRmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZUZvckFHb3Zlcm5tZW50QWdlbmN5VG9GaWxlQUNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZU9mQWNjb3VudHNGaWxlZEF0UHVibGljUmVnaXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlT2ZPcmRlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVUb0ZpbGVBQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlVG9PYmplY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RFcGlzb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Rm9sbG93LXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SW5zdXJhbmNlTWVkaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEludGVyZXN0QmVhcmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJdGVtRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RMb2dnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNYXJrZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1lYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZW5zdHJ1YWxDeWNsZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1lbnN0cnVhbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1pbGl0YXJ5RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0T2ZmSGlyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RPbkhpcmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UGFpZEluc3RhbGxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBheW1lbnRNYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UGh5c2ljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcmVtaXVtRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHJlbWl1bVBhaWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFB1YmxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHVibGlzaGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNhbGFyeUluY3JlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2FsZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNjcmVlbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNlZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0VmlzaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0WFJheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEFic2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0QmFsYW5jZVNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RDaGVja0luVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RGVsaXZlcnlEYXRlYXRQaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3REZWxpdmVyeURhdGVBdFJhaWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RGaWxpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0TWV0ZXJSZWFkaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0T25Cb2FyZENhcnJpZXJEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RQcmljZUFkanVzdG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RSZWNlaXZpbmdEYXRlQ3V0b2ZmRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0VmlzaXRvckNvbnN1bHRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5VGltZUZpcnN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlUaW1lTGFzdERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQ29tbWVuY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VUZXJtRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VUZXJtU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0RW1wbG95ZXJEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEFjdGlvbkNsb3NlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQWN0aW9uU3RhcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTZXR0bGVtZW50VGVybXNNZXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFN0cnVjdHVyZUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckNyZWRpdENoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkFncmVlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mTGlhYmlsaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VSZW5ld2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFByaWNlQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRvblZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0RhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUHVyY2hhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5TZXJ2aWNpbmdUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25FeGNlcHRpb25PcmRlck51bWJlckFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ROdW1iZXJFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlc3RBY3Rpdml0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsUmVjZWlwdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUNvbW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWtlZ29vZENvbW1lcmNpYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50QXZhaWxhYmxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlck5vdFJlZ2lzdGVyZWRBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlPclRhcmdldEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5T3JUYXJnZXRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RTaGlwTm90aWNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTWFycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxlYXNlQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXR1cml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQ3JlZGl0R3JhbnRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRBZ2VpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5mb3JtYXRpb25TaWduYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbmZvcm1hdGlvblN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBQ292ZXJhZ2VFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBRWxpZ2liaWxpdHlCZWdpbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFFbGlnaWJpbGl0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJDb3ZlcmFnZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJFbGlnaWJpbGl0eUJlZ2luRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkVsaWdpYmlsaXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QlRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRwb2ludE9mUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZXF1aXJlZERpc3RyaWJ1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNoZWxmTGlmZVJlbWFpbmluZ0F0VGltZU9mRGVzcGF0Y2hQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TaGVsZkxpZmVSZW1haW5pbmdBdFRpbWVPZlJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aFRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9vcmluZ0RhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZWVPZmZpY2lhbFNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZVJlcG9ydGVkQ3VydGFpbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZU5vdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5RWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5TGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUxhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudEhlbW9nbG9iaW5PckhlbWF0b2NyaXRPckJvdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRSZW5ld2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50UmV2aXNpb25vckluaXRpYWxWZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50U2VydW1DcmVhdGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92ZWRGcm9tTG9jYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkRXh0ZW5zaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGlvbnNTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldENyZWRpdFNlcnZpY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRXb3J0aERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QW5udWFsTWVldGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEluc3RhbGxtZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEludGVyZXN0Q2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFBheUluY3JlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJldmlld0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbldvcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUHJvZHVjdGlvblNjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1Byb21pc2VBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1NoaXBwaW5nU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mRGVhdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvblRpbWVMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlZ2lzdGVyZWRBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGFuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhbkZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSGlyZVN1cnZleURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljaWFsUmFpbENhckludGVyY2hhbmdlRWl0aGVyQWN0dWFsb3JBZ3JlZWRVcG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmYtTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldEZyb21Db29yZGluYXRlZFVuaXZlcnNhbFRpbWVVdGMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZGVzdFVucGFpZEluc3RhbGxtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Cb2FyZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGlyZVN1cnZleURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25zZXRPZkN1cnJlbnRTeW1wdG9tc09ySWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25zZXRPZlNpbWlsYXJTeW1wdG9tc09ySWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbkhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uc0NlYXNlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9waW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0Vhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckFtZW5kbWVudEJpbmRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvbXBsZXRpb25EYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJSZWNlaXZlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclRvUHJvY2VlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFc3RpbWF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSXNzdWVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxseVNjaGVkdWxlZFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTWF0dXJpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbE5hbWVDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFBvc3RpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvZG9udGljVHJlYXRtZW50UGVyaW9kUmVtYWluaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob2RvbnRpY1RyZWF0bWVudFBlcmlvZFRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtUG9ja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlQXVkaXRvcnNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJoYXVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJyaWRlRGF0ZUZvclNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJUYXJnZXRCYXNlbGluZU1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblNhdHVyYXRpb25UZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5RXZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweUZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0VuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRJbkZ1bGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1UaHJvdWdoRGF0ZUZvckFjY3J1ZWRTaWNrUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGVGb3JNaW5pbXVtUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1UaHJvdWdoRGF0ZUZvclNhbGFyeUNvbnRpbnVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlRm9yVG90YWxQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yVmFjYXRpb25QYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcGVyd29ya01haWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEFubnVpdGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0VGltZVdvcmtpbmdDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEZpcnN0VmlzaXRGb3JDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRDb21tZW5jZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RGF0ZVRpbWVEZWZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbml0aWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbnN0cnVjdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvblByZXNlbnRhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsRGVkdWN0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxQZXJpb2RCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVha0FjdGl2aXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uUFJPQXBwcm92ZWRTdGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uUFJPQXBwcm92ZWRTdGF5RnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmdBcmNoaXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjb2xhdGlvblRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEFuRXZlbnRJc0xhdGVEdWVUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQmV0d2VlbkNoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZENvdmVyZWRCeVNvdXJjZURvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RFeHRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kaWNJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZDYXJlRW5kRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZDYXJlU3RhcnREYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZklsbG5lc3NFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZklsbG5lc3NTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE92ZXJkdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RXb3JrZWRGb3JUaGVDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRUb0FkbWl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0xhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBDb2xsZWN0aW9uRGF0ZVRpbWVPZkNhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBEYXRlVGltZU9mRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudERhdGVQcmV2aW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50UGVyaW9kRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5FbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZER1cmF0aW9uT2ZXb3JrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZFJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5PZlRyZWF0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBhcnRpY2lwYXRpb25TdXNwZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGVyaW9kRWxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbkJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGVyaW9kRWxlY3Rpb25FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5UZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1Z2dlZEFuZEFiYW5kb25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmVPbk9yQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZU9uT3JCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVN1cnJlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nRGF0ZVRpbWVPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdEYXRlVGltZU9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0bWFya0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkVuZE9mU2Vjb25kWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRmlyc3RSZXBvcnRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25GaXJzdFNlbWktYW5udWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25TZWNvbmRTZW1pLWFubnVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXJyYW5nZWREZWFsTWF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1Bd2FyZFN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2VkaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2VydGlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZvcmVjbG9zdXJlQWNjZXB0YW5jZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZvcmVjbG9zdXJlU2FsZUNsb3NpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5RHVyYXRpb25BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUNoYW5nZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1QYWlkVG9EYXRlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1QYWlkVG9EYXRlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbkRhdGVUaW1lT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25EaXNwZW5zaW5nRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uSXNzdWVEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25UbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uRGF0ZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uRGF0ZU9mR29vZHNEZWNsYXJhdGlvbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvblRvQmFua3J1cHRjeVJlY2VpdmVyc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50ZWRUb1JlY2VpdmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudExlZ2FsU3RydWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50bHlSZXNpZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudFJlc2lkZW5jZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCb29raW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ291cnRFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdXJyZW50QWNjb3VudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNJbnZvaWNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlcG9ydGVkRGF0ZU9mQmlydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlSZXNpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01ldGVyUmVhZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2VTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudExpbWl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJhc2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXJFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3RBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDb250cmFjdElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckhvc3BpdGFsaXphdGlvbkRhdGVzUmVsYXRlZFRvQ3VycmVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdERhdGVPZkJpcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvck5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZpbGVnZURldGFpbHNWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdEYXRlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0QXZhaWxhYmlsaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEhlbGRVbnRpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkRhdGVOb1NjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25NYW51ZmFjdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaWZlc3BhbkF0VGltZU9mUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtbWVkQ2FsZW5kYXJZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtbWVkRmlzY2FsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRBY3Rpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRGb3JlY2xvc3VyZVNhbGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0T3ZlclRhcmdldEJhc2VsaW5lRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeUFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5UHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeVdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudEFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50UHJpb3J0b0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudFdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRGF0ZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkZsb29yU3RvY2tQcm90ZWN0LUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRmxvb3JTdG9ja1Byb3RlY3QtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkludm9pY2VQZXJmb3JtYW5jZS1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkludm9pY2VQZXJmb3JtYW5jZS1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JkZXItRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25PcmRlci1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUGVyZm9ybWFuY2UtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25QZXJmb3JtYW5jZS1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUmVxdWVzdGVkRGVsaXZlcnktRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25SZXF1ZXN0ZWREZWxpdmVyeS1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU2hpcC1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblNoaXAtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUFjcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUJ1aWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckxhdGVzdFBvc3NpYmxlQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXRJbnRvU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlckVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVUb0JlUmVjZWl2ZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlT2ZFeGNoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlUHJpY2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhY2hlZFRvdGFsRGVwdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWR5Rm9ySW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlVGF4WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVidWlsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjYXB0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZhYmxlc0NvbGxlY3Rpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlQXRMb2NrYm94RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRJblRoZU1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQXBwb2ludGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNoaXBQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc2hpcFJlc3VsdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhc3NpZmljYXRpb25FeGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLWV2YWx1YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZUV4cG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRJdGVtQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1c2FsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ29udHJhY3Rvck51bWJlckFzc2lnbm1lbnREYXRlT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkRhdGVPZlByZXZpb3VzQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25PZkJvYXJkT2ZEaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbWJ1cnNlbWVudENsYWltSXNzdWVEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZUltcG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN0YXRlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQWNjb3VudGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VDb3ZlcmFnZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUN1cnJlbnRBY2NvdW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VJc3N1ZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VQYWlkVXBEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBheW1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVPZkN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZU9mU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VkUmV0dXJuVG9Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlZFRvVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlT2ZJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb2RlbGluZ0NvbXBsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVuZXdhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50U3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJUdXJuYXJvdW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYXltZW50QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGF5bWVudFNjaGVkdWxlU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nQ3ljbGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWFsaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRGVwYXJ0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkRm9yQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGb3JEZWxpdmVyeVdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVJlcXVlc3RlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRm9yU2hpcG1lbnRXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZE9mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRTZXR0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclF1b3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2YXRpb25PZkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudExpY2Vuc2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50TGljZW5zZUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lnbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc29sdmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblJlbGVhc2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZW50aW9uUmVsZWFzZURhdGVUaW1lUGFydGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0cmFuc21pc3Npb25UaW1lU3RhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Ub1dvcmtEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Ub1dvcmtQYXJ0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkQWRqdXN0ZWRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRBZGp1c3RlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkRXN0aW1hdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2b2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2b2tlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZEZ1bmRUYXhFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxhcnlDaGFuZ2VFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxhcnlEZWZlcnJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZWFibGVTdG9ja0RlbWFuZENvdmVyUGVyaW9kRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQXZhaWxhYmxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQ29sbGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVSZXF1aXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FuY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdGlzZmFjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdGlzZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yRGVsaXZlcnlPbk9yQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5T25PckJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yRGVsaXZlcnlXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvclNoaXBtZW50QWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvclNoaXBtZW50UHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEludGVyY2hhbmdlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZVJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQWRtaXNzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGlzY2hhcmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaGFyZVByaWNlQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdGlvblBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdGlvblBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbEJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0xvY2FsVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VtaWFubnVhbEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGluZ1JvYWRUaW1lU3RhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcHRpY0FwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29tcGxldGlvbkRhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlSW50ZXJydXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VyU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0b2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGVBc1NwZWNpZmllZEJ5VGhlT3JpZ2luYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGVGcm9tSW50ZXJsaW5lU2V0dGxlbWVudFN5c3RlbU9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmTGlmZUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBEYXRlT3JpZ2luYWxseVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcER1cmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVQcm9taXNlZEZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVByb21pc2VkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdExhdGVyVGhhbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90QmVmb3JlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RCZWZvcmVBbmROb3RBZnRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwT25PckFib3V0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdEYXRlQW5kT3JUaW1lQ3VycmVudFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0RhdGVOb1NjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwV2Vla09mRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2h1dEluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0JlbmVmaXRBZ2VMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0luc3VyYW5jZUVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0xpZmV0aW1lQmVuZWZpdFF1YWxpZmljYXRpb25BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGV0cmFja2VkV2VsbGJvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hdHVyZVJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1pbGFySWxsbmVzc09uc2V0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltcGxlSW50ZXJlc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlcmluZ0VuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlcmluZ1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdHlDbGFpbXNWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkQm9va1B1YmxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xlRGlyZWN0b3JzaGlwUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VEb2N1bWVudENhcHR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjaW5nT3JkZXJVbml0QXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JlZERlcGVuZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JlZERlcGVuZGVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlUmV0aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3B1ZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZU1hbmRhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTm90QWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZU5vdEJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRlZERvaW5nQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0Tm9FYXJsaWVyVGhhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnROb0xhdGVyVGhhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVJlc2lkZW5jeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsVGltZVNlcmllc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0Fzc2lnbm1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQ29tbWVyY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzT3V0c2lkZVByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUHJpb3JBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BEaXN0cmlidXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wV29ya0FzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudFNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclBlcmlvZE9mSGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWlzc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudEludGVyZXN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudFN1Ym1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyc2VkZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsSXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0F2ZXJhZ2VDcmVkaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VDYXNpbmdBdXRob3JpdHlBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZ2VyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycmVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5kZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5zaW9uRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5zaW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd29ybkFuZFN1YnNjcmliZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bXB0b21zT25zZXRQYXRpZW50QWxsZWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1UZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWJsZVJhdGluZ0VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFpbENvdmVyYWdlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhaWxDb3ZlcmFnZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua3NBY2NlcHRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rc0luc3BlY3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQb2ludERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXhEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlQcm9zdGhlc2lzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyU3VibWlzc2lvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uT2ZGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNEaXNjb3VudER1ZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc01ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNOZXREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0Q29tcGxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RQZXJmb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RQZXJpb2RFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzTGluZVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXB5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRW1wbG95ZWVCZWdhbldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJblVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVOb3dEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nUmVxdWlyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNoZWxmTGlmZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZVN0eWxlUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2Zlck5vdGVBY2NlcHRhbmNlRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2hpcG1lbnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFRpbWVMaW1pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvbkRhdGVUaW1lT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0cmlwcGluZ0RhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0dWZmaW5nRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsQmFsYW5jZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU3RhcnREYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFN0YXJ0RGF0ZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGluZ1llYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGVkRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGl0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRpdHlTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkVW50aWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EYXRlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheENsYWltc1ZlcmlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEYXRlT2ZJbmRleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyYmFsUmVwb3J0TmVlZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25SZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFJlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzdGluZ1NlcnZpY2VCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzdGluZ1NlcnZpY2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVudGFyeVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3VjaGVyRGF0ZU9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlc0Vhcm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZVBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXRpbmdUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlZWtFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxMb2dSdW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZUNvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVDb250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbGxBZHZpc2VBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoaGVsZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtFZmZlY3RpdmVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc0NvbXBsZXRpb25EYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NDb21wbGV0aW9uRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JzdFRpbWVUb0NhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJCZWdpbm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJPZk9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJUb0RhdGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyUGFydHkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJ1eWVyUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdXllclRheEluZm9ybWF0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHlUYXhJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VsbGVyUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJUYXhJbmZvcm1hdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5VGF4SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcFRvUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCaWxsVG9QYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlbWl0VG9QYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBGcm9tUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJXYXJlaG91c2VQYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNvbGRUb1BhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWFudWZhY3R1cmluZ1RvUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYXRlcmlhbElzc3VlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFydHlDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJQYXJ0eSIgdHlwZT0iT3JkZXJQYXJ0eSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydHkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5SUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTURGQnVzaW5lc3MiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik5hbWVBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckNvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlY2VpdmluZ0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBwaW5nQ29udGFjdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3RoZXJDb250YWN0cyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29ycmVzcG9uZGVuY2VMYW5ndWFnZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5IiB0eXBlPSJQYXJ0eSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSWRlbnRpZmllciIgdHlwZT0iTGlzdE9mSWRlbnRpZmllciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0SUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb250YWN0RnVuY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3REZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZDb250YWN0TnVtYmVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0IiB0eXBlPSJDb250YWN0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0RnVuY3Rpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGVkIiB0eXBlPSJDb250YWN0RnVuY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0RnVuY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0RnVuY3Rpb24iIHR5cGU9IkNvbnRhY3RGdW5jdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb250YWN0RnVuY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0aW5nT2ZmaWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdjb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsSW5zdXJhbmNlSW5mb3JtYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdGl2ZUNvbnRyYWN0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZ0ZXItSG91cnNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudFNjaGVkdWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbnRpb24tVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEZpbmFuY2lhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWROZWdvdGlhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRTaWduYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZENsZWFyaW5naG91c2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbElucXVpcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZFN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVW5pdE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyTmFtZW9yRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FEQW5kQ0FNU3BlY2lhbGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWlybWFuT2ZUaGVCb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VPcmRlckFwcHJvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkV4ZWN1dGl2ZU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmRmluYW5jaWFsT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZJbmZvcm1hdGlvbk9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmT3BlcmF0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVdvcmtzQXV0aG9yaXR5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbXNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ2hvdXNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtPZkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Cb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlZ2VvZkVkdWNhdGlvbkFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcHV0ZXJTeXN0ZW1zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY3VycmVudEVtcGxveWVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVB1cmNoYXNpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFuZFNjaGVkdWxlQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udGFjdEdyYW50aW5nQXBwb2ludG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlbGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5SW5zdHJ1Y3Rpb25zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsU2Nob29sQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yRW1wbG95ZWVUb0V4ZWN1dGVFeHBvcnRQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JFbXBsb3llZVRvRXhlY3V0ZUltcG9ydFByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPclBlcnNvblJlc3BvbnNpYmxlRm9yUHJvY2Vzc2luZ1B1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZlbG9wbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yeUFkdmVydGlzaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb25EaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb25NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cmljaXR5U3VwcGx5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0RhdGFJbnRlcmNoYW5nZUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljU3VibWlzc2lvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1Db25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QtTWlsaXRhcnlUcmFmZmljTWFuYWdlbWVudENvbW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QtU2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGFuZ2Vyb3VzR29vZHNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGVyZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVuaW5nUHJvZ3JhbXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZVZpY2UtUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEFpZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3NpbmdMZW5kZXJBZG1pbmlzdHJhdGl2ZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTdXBwbHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXZpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlQnVzaW5lc3NPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlRW5naW5lZXJpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlRmluZUFydHNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1aWRhbmNlQ291bnNlbG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlVuaXRGb3JJbmZvcm1hdGlvbkRpc3NlbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlVuaXRGb3JJbmZvcm1hdGlvblByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlVuaXRPckNvbXB1dGVyRGF0YVByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHVtYW5SZXNvdXJjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFdvcmtBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRyZWdpc3RyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd0Zpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd1NjaG9vbEFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQXVkaXRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxQdXJjaGFzaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0aW5nRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0aW5nRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29udHJvbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzcG9zaXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbEhhbmRsaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVNlbmRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QnVzaW5lc3NQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEZXZlbG9wbWVudHNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnlQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWVyaWNhbENvbnRyb2xFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWR1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50b3JHdWFyZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0xhYm9yYXRvcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0NsYWltT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUV2YWx1YXRpb25Db21taXR0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkNvbGxlY3Rpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mRGVsaXZlcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50T3JFcXVpcG1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybU1haW50ZW5hbmNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydEVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhd2FyZFN1cnZleU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlUYXhwYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsU3R1ZHlDb250YWN0b3JBdXRob3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2JhdGlvbm9yTGVnYWxPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvblJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TWFuYWdlbWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1EaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3REaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG90eXBlQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNSZWxhdGlvbnNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdDb250cmFjdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBc3N1cmFuY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29vcmRpbmF0b3JDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5SW5zcGVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTdXJ2ZXlvckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVN1cGVydmlzb3JPckNsZXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHlLZXlIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eU9jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJhdGVPckNoYXJnZWJhY2tDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdEb2NrQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxDb21wYW55QWRtaW5pc3RyYXRpdmVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRBdXRob3JpemVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRQcmVwYXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb25Gb3JDb21wdXRlckRhdGFQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbmZvckluZm9ybWF0aW9uRGlzc2VtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb25Gb3JJbmZvcm1hdGlvblByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld0FuZFJlcHJpY2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwcmVzZW50YXRpdmVPckRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sQ2xlcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbG9mVGhlb2xvZ3lBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xvZlZldGVyaW5hcnlNZWRpY2luZUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JkZXJXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVGVjaG5pY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VydmljZXNXb3JrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlSG91c2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvZ3JhbUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRpbkFic2VudGlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkeVN1Ym1pdHRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbXNBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEb2N1bWVudGF0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxNYXJrZXRpbmdSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsV3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNOZXR3b3JrQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lQW5zd2VyaW5nU2VydmljZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyRGV2ZWxvcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmQtUGFydHlBZG1pbmlzdHJhdG9yQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93blBsYW5uaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZmZpY0FkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWZmaWNBdXRob3JpdHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0SW5mcmFzdHJ1Y3R1cmVBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyZ3JhZHVhdGVBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb25QcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpY2VQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXZlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJTdXBwbHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQnJva2VyTWFpbnRlbmFuY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2hvcENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzTWFuYWdlbWVudENvbnRhY3QiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRhY3ROdW1iZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiIHR5cGU9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3ROdW1iZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROdW1iZXJWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZWQiIHR5cGU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyIiB0eXBlPSJDb250YWN0TnVtYmVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWFpbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vYmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1dXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVSTE90aGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJMaXN0T2ZDb250YWN0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0eVRheEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheElkZW50aWZpZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZ2lzdGVyZWROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWdpc3RlcmVkT2ZmaWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRheExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb21wYW55UmVnaXN0cmF0aW9uTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eVRheEluZm9ybWF0aW9uIiB0eXBlPSJQYXJ0eVRheEluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYXJ0eUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYXJ0eUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYXJ0eUNvZGVkIiB0eXBlPSJMaXN0T2ZQYXJ0eUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0eUNvZGVkIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlSb2xlQ29kZWQiIHR5cGU9IlBhcnR5Um9sZUNvZGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydHlSb2xlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlDb2RlZCIgdHlwZT0iUGFydHlDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlRyYW5zcG9ydCIgdHlwZT0iTGlzdE9mVHJhbnNwb3J0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydElEIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zcG9ydE1vZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNwb3J0TWVhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcnJpZXJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJyaWVySUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkN1c3RTaGlwcGluZ0NvbnRyYWN0TnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlZCIgdHlwZT0iU2VydmljZUxldmVsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUxldmVsQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcHBpbmdJbnN0cnVjdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRMZWdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc2l0RGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnQiIHR5cGU9IlRyYW5zcG9ydCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0TW9kZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TW9kZUNvZGVkIiB0eXBlPSJUcmFuc3BvcnRNb2RlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TW9kZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1vZGUiIHR5cGU9IlRyYW5zcG9ydE1vZGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0TW9kZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNoYXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyaWVnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRheGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRGb3JjZXNDb3VyaWVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja2hhdWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0V2F5LVNoaXBwZXJzT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rUG9zdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYk9yVGF4aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uSXJyZWd1bGFyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyaXplZE9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbE9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrdXBPckN1c3RvbWVyc0V4cGVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlYXdheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVhd2F5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb3BlYW5PclBhY2lmaWNEaXN0cmlidXRpb25TeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFRyYW5zcG9ydEluc3RhbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmx5YXdheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1JlY2VpdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1JlY2VpdmluZ09yU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNTaGlwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyd2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1vZGFsLVBpZ2d5YmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5UcmFpbGVyTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9nYWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpdGltZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJbnRyYXRoZWF0ZXJBaXJsaWZ0U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlPZmZpY2lhbE1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVVbmtub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItQnVsa0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUNvbW1vbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUZsYXRiZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLVBhY2thZ2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11dGltb2RhbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ29uZmVyZW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuTm9uLUNvbmZlcmVuY2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJjZWxQb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRQaWdneWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZFJhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sVG9Qb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVBhcmNlbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1aWNrdHJhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYU9yQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBZ2VudC1UcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVhbXNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd2F3YXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyT3JQaXBlbGluZUludGVybW9kYWxNb3ZlbWVudCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0TWVhbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZWQiIHR5cGU9IlRyYW5zcG9ydE1lYW5zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TWVhbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNZWFucyIgdHlwZT0iVHJhbnNwb3J0TWVhbnMiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0TWVhbnNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElMQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElMQ29udGFpbmVyLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJTENvbnRhaW5lci1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SUxDb250YWluZXItQ2xvc2VkVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJlaWdodC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJpZGVWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZUNoZW1pY2FsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlFbmNsb3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2dpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXJDdXNoaW9uVW5kZXJGcmFtZU9GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItRGFtYWdlRnJlZUVxdWlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW5zdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW50ZXJpb3JCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGt0cnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kQnVsa1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRUYW5rVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fib29zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FuZFBhc3NlbmdlclZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyV2l0aENhcmF2YW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbWVudFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npcy1Hb29zZW5lY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyLUNvbnRyb2xsZWRUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FsVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FzdGVyQ2hlbWljYWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWwtQ2FyQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbENhck9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUFsdW1pbnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUNsb3NlZFRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGlnaFNpZGVPcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItTG93U2lkZU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9ubHlWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuLVNpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3BlblRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVBsYXRmb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJyZXN0aW5nb25hQ2hhc3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVN0ZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmtDaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rRm9vZEdyYWRlLUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmtHYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1VcGdyYWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVZlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEJhZ0hhbmdlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhGbG9vclNlY3VyaW5nUmluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhGbHVzaERvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoSGFuZ2FyQmFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFNtb290aFNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoV2F2eU9yUmlwcGxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRUZW1wZXJhdHVyZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNydWRlT2lsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckRldGVybWluZWREZWFuc09mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJhaWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dC1JbkhlbHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVlcFNlYUNoZW1pY2FsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BCYWNrVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5QnVsa0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2VwdGlvbmFsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZXJyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzaGluZ1Zlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFja0RvdWJsZURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFJhY2stRmxhdEJlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUmFjay1TaW5nbGVEcm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGJlZFNsaWRpbmdUYW5kZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlci1SZW1vdmFibGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJ3aXRoSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJ3aXRoTm9IZWFkYm9hcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyLUVuZEJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGNhcldpdGhQZWRlc3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2tBbmRJc290aGVybWljVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kUmVmcmlnZXJhdGVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRm9vZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cm5pdHVyZVRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnb1Zlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhdG9yU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLUNvdmVyZWRJbnRlcmlvckJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5jYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmF2ZWxWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZIZWlnaHRGbGF0UmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZC1FbmRIZWxwZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkb2ZUcmFpbkRldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEN1YmVWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZFBuZXVtYXRpY0Rpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhbnRDYXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGxlckNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVHJ1Y2tBbmRGcmVlemVyVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWN0cnVja2FuZHJlZnJpZ2VyYXRlZHRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVlZmllZE5hdHVyYWxHYXNDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1ZWZpZWRQZXRyb2xldW1HYXNDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkT3JVbmxvYWREZXZpY2VPbkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbFByb2R1Y3RzVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuLVRvcE9yRmxhdEJlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Ub3BWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlclZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0cm9sVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLVVwVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxCdWxrQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsRXhwcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRNYWludGVuYW5jZU9mV2F5Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsU2lsb1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhci1FbmRIZWxwZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrQW5kRnJlZXplclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrQW5kVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVTaWRlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhbFRydWNrQW5kVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdpZFRydWNrV2l0aFRhbmtBbmRCdWxrVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rQW5kVGFua1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRSYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRTaWxvVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsT24tUm9sbE9mZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJEZXRlcm1pbmVkTWVhbnNPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RBSy1SQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWVsUHJvZHVjdHNWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lcjI1VG9ubmVXaXRoOTBDdWJpY01ldGVyVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZFJlbW92YWxUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZFJlbW92YWxUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mYW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVzY29waW5nVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltYmVyT3JMb2dDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBBcnRpY3VsYXRlZFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXB0cnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQm9hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1DYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRHJ5RnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1FbGVjdHJpY0hlYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Ob3RPdGhlcndpc2VTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUG5ldW1hdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVJlZnJpZ2VyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUNoZW1pY2FscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUZvb2RHcmFkZUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluV2l0aDIwT3JNb3JlV2Fnb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGhNb3JlVGhhbk9uZUFuZExlc3NUaGFuMjBXYWdvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluV2l0aE9uZVdhZ29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXIyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLUZ1bGx5RW5jbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aERvb3JzTm9Sb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BIaWdoU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcExvd1NpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrT3JUcmFpbGVyV2l0aFRpbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vckFuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVnYW5kT3JQdXNoYm9hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdExvYWREZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuLVNwZWNpYWxJbnNpZGVMZW5ndGhXaWR0aE9ySGVpZ2h0UmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtTGFrZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tQ29udGFpbmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUxhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Sb2xsT24tUm9sbE9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vZGNoaXBjYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVmVzc2VsIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlcnZpY2VMZXZlbENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrQ29tbW9kaXR5VHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1TdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlZURheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjlBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckVjb25vbXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVCaWxsaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cmllckV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVkTmV4dERheUJ5Q2FydGFnZUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZFNlY29uZERheUJ5Q2FydGFnZUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZFRoaXJkRGF5QnlDYXJ0YWdlQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZmlybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZmlybWF0aW9uUmV0dXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb29yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RpZmljYXRpb25Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnlXaXRoU2lnbmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlUGx1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tpbmdHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNlcnZpY2VXb3JsZHdpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlV29ybGR3aWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRybyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGl3ZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREYXlBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRGbGlnaHRPdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREYXlIdW5kcmVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0TW9ybmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U2VydmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVybmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTEwMzBBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5Qnk5MzBBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlNYWlsSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeU5vb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPQm94WmlwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5NTAwUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYVNlY29uZERheUJ5Tm9vbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUludGVybW9kYWxIaWdoU3BlZWQ3ME1pbGVzUGVySG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbnRlcm1vZGFsQW5kU3RhY2tTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2ME1pbGVzUGVySG91clNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0RnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VzVHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXV0ZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUmV0dXJuU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtZURheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGF5QWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEdyb3VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGF5SHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91bmRIdW5kcmVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRNb3JuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNwZWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxTcGVlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdFNlcnZpY2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRUaGVTdGF0aXN0aWNhbFRlcnJpdG9yeUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0Qm9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdERlcGFydHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUZvdXJ0aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1GaWZ0aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1TaXh0aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1TZXZlbnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUVpZ2h0aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW4tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1GaXJzdENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haUNhcnJpYWdlLVNlY29uZENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1UaGlyZENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyd2F5VHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNhcnJpZXJBbGxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFByZS1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUFjY2VwdGFuY2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZE9uLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtTmludGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVRlbnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUVsZXZlbnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVR3ZWxmdGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxc3RDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIybmRDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzcmRDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNSb3V0aW5nT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luRGVsaXZlcnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUxZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsYWdlUmlnaHRzQ2FycmllckFuZEp1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5Td2l0Y2hDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsYWdlTW92ZW1lbnRDYXJyaWVyQW5kSnVuY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkNhcnJpZXJBaXJNb3Rvck9yT2NlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkNhcnJpZXJSdWxlMTFTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNSb3V0aW5nT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlU3dpdGNoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENhcnJpZXJJblJvdXRlT25SZXR1cm5Sb3V0ZU1vdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bmN0aW9uU2V0dGxlbWVudENhcnJpZXJGb2xsb3dpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bmN0aW9uU2V0dGxlbWVudENhcnJpZXJQcmVkZWNlc3NvciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIgdHlwZT0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnRFcXVpcG1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlZCIgdHlwZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRQcm92aWRlckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZWQiIHR5cGU9IkVxdWlwbWVudE93bmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50T3duZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRXF1aXBtZW50SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFNpemVUeXBlQ29kZWQiIHR5cGU9IkVxdWlwbWVudFNpemVUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBlbWVudFNpemVUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50U3RhdHVzQ29kZWQiIHR5cGU9IkVxdWlwbWVudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlZCIgdHlwZT0iRnVsbEluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbmRpdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU2VhbEluZm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkVxdWlwbWVudE1lYXN1cmVtZW50cyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRFcXVpcG1lbnQiIHR5cGU9IlRyYW5zcG9ydEVxdWlwbWVudCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRQcm92aWRlckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyU3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJTdXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yU3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY29uc29saWRhdG9yU3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlTdXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyU3VwcGxpZWRGcm9tQUxlYXNpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJTdXBwbGllZEZyb21UaGVSYWlsd2F5c1Bvb2wiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50T3duZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90Q3VzdG9tZXJPd25lZE9yTGVhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPd25lZE9yTGVhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwTGVhc2VkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudFNpemVUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJbENvbnRhaW5lci1DbG9zZWRUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJbENvbnRhaW5lci1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SWxDb250YWluZXItQ2xvc2VkVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SWxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5RW5jbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZFdpdGhSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2dpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXJDdXNoaW9uVW5kZXJGcmFtZU9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItRGFtYWdlRnJlZUVxdWlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW5zdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW50ZXJpb3JCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveFBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fib29zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npcy1Hb29zZW5lY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyLUNvbnRyb2xsZWRUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsLUNhckNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxDYXJPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1BbHVtaW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1DbG9zZWRUb3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhpZ2hTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWMyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljMzBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzQwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUxvd1NpZGVPcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3Blbi1TaWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW5Ub3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1QbGF0Zm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUmVzdGluZ09uQUNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1TdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUNoZW1pY2FscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmstRm9vZEdyYWRlLUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmstR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVXBncmFkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1WZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhCYWdIYW5nZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoRmxvb3JTZWN1cmluZ1JpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoRmx1c2hEb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEhhbmdhckJhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhTbW9vdGhTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFdhdnlPclJpcHBsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkVGVtcGVyYXR1cmVUcmFpbGVyLVJlZWZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWRCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0LUluSGVscGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaW1lQ29hdGVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQmFja1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1YWxUcmFpbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZUcmFpbkRldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXBveHlDb2F0ZWRUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZWFibGVQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2stRG91YmxlRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2stRmxhdC1CZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLVNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGJlZFNsaWRpbmdUYW5kZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlci1SZW1vdmFibGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJXaXRoSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJXaXRoTm9IZWFkYm9hcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyLUVuZEJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGNhcldpdGhQZWRlc3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRm9vZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1Db3ZlcmVkLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmSGVpZ2h0RmxhdFJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWQtRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDdWJlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQtUG5ldW1hdGljRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmFudC1DYXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGxlckNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9yVW5sb2FkRGV2aWNlT25FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW4xMC45ME1BbmQxMy43NU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW42LjE1TUFuZDcuODJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuNy44Mk1BbmQ5LjE1TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjkuMTVNQW5kMTAuOTBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1MZXNzVGhhbjYuMTVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb253b3JraW5nUmVlZmVyQ29udGFpbmVyMjBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ud29ya2luZ1JlZWZlckNvbnRhaW5lcjQwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbldvcmtpbmdSZWZyaWdlcmF0ZWRPclJlZWZlckNvbnRhaW5lcjMwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVmVzc2VsLUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1Ub3BPckZsYXRiZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuVG9wVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLVVwVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyUGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3N1cml6ZWRUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0ZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZE1haW50ZW5hbmNlT2ZXYXlDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXItRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRPclJlZWZlckNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuazIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuazMwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuazQwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFua0ljMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rSWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZVNpZGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWRkbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYW5kaW5hdmlhblBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VtaS1SZWZyaWdlcmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWktVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhaW5sZXNzU3RlZWxUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFrLVJhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lcjIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lcjMwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lcjQwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWMzMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzQwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXNjb3BpbmdUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDb250YWluZXIyMEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDb250YWluZXIzMEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDb250YWluZXI0MEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RlYmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLURyeUZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRWxlY3RyaWNIZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVBuZXVtYXRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1SZWZyaWdlcmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1Gb29kR3JhZGUtTGlxdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXIyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLUZ1bGx5RW5jbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aERvb3JzLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BIaWdoU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcExvd1NpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdExvYWREZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbi1TcGVjaWFsSW5zaWRlTGVuZ3RoLVdpZHRoT3JIZWlnaHRSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1MYWtlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Db250YWluZXJzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tTGFzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLVJvbGxvbi1Sb2xsb2ZmIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5lbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbk9uQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRsYW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJsYW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsb2FkZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRnVsbEluZGljYXRvckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uZGl0aW9ucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZyaWdlcmF0aW9uT24iIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNpZHVlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mQ29uZGl0aW9ucyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb25kaXRpb25zIiB0eXBlPSJDb25kaXRpb25zIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEaW1lbnNpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRpbWVuc2lvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGltZW5zaW9uIiB0eXBlPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRpbWVuc2lvbkNvZGVkIiB0eXBlPSJEaW1lbnNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaW1lbnNpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaW1lbnNpb24iIHR5cGU9IkRpbWVuc2lvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWVhc3VyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnRWYWx1ZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50UmFuZ2UiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudCIgdHlwZT0iTWVhc3VyZW1lbnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50VmFsdWUiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50VmFsdWUiIHR5cGU9Ik1lYXN1cmVtZW50VmFsdWUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWFsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0ZXJUaGFuT3JFcXVhbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdGVyVGhhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuT3JFcXVhbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFcXVhbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1ZVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZlZFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZlJhbmdlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbmRpdGlvbnNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVBaXJFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUJ1dHlsQWNldGF0ZUVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlSDJPRXF1YWxzMU9yV2F0ZXJFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRUbzYwRGVncmVlc0ZhaHJlbmhlaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlVG9sdWVuZUVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcG9ySW5BaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcG9ySW5PdGhlclRoYW5BaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGVtcGVyYXR1cmVBbmRQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uc090aGVyVGhhblN0YW5kYXJkVGVtcGVyYXR1cmVBbmRQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5FdGh5bEFsY29ob2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluRXRoeWxFdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5XYXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXQxQXRtb3NwaGVyZVByZXNzdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUV0aGVyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkaWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpci1EcmllZEJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcy1SZWNlaXZlZEJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aWxpYnJpdW1CYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmVBbmRBc2gtRnJlZUJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeGlkaXppbmdBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y2luZ0F0bW9zcGhlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0Y2hldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJhdGVkVmFwb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY29uZGl0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0LVRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUtV2VpZ2h0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jb3JyZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJHYWxsb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZG9taW5hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlT3duZWRPckNvcnBvcmF0ZU93bmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZGVkT3JCbG9ja2VkVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0V2hlblNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzSXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzUmVwYWlyZWRPckltcHJvdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YW50YW5lb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9IaWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb01lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9Nb2RlcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1Ub0dvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bVRvSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9Hb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb01lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZFRvSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNyZWFzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck9uLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck1pZC1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJPZmYtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyU3VwZXJPbi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJTdXBlck9mZi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJPbi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJNaWQtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlclN1cGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyU3VwZXJPZmYtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyRGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJOaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyRGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJOaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay0zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3VsZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25UaW1lUmVsYXRlZERlbWFuZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWVhc3VyZW1lbnRSYW5nZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNaW5pbXVtVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1heGltdW1WYWx1ZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnRSYW5nZSIgdHlwZT0iTWVhc3VyZW1lbnRSYW5nZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWluaW11bVZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNaW5pbXVtVmFsdWUiIHR5cGU9Ik1pbmltdW1WYWx1ZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWF4aW11bVZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNYXhpbXVtVmFsdWUiIHR5cGU9Ik1heGltdW1WYWx1ZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVW5pdE9mTWVhc3VyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVPTUNvZGVkIiB0eXBlPSJVT01Db2RlIi8+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+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaUCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEaW1lbnNpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0R3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0c1BlclBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF0Q29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1Rvbm5hZ2VPZlRoZVZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0VG9ubmFnZU9mVGhlVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIdW1pZGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJDb25zdW1wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdERpc3NpcGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGbG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ja0ltcGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aXZlVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk9wZXJhdGl2ZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Vm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckNvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbnNpbGVTdHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYnJvc2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F1Z2VMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGl1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWlnaHRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0T2ZDb252ZXlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlU3VtbWVyRGVhZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyaXplZENhcmdvT25WZXNzZWxzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29udGFpbmVyaXplZENhcmdvT25WZXNzZWxzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRBc2NlcnRhaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsT3ZlcmFsbExlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ01ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFBvc2l0aW9uSW5UaGVXaWR0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZVdpZHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFBvc2l0aW9uSW5UaGVUaGlja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVUaGlja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRhaW5lckFjdHVhbEZpbGxpbmdXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRhaW5lck1heGltdW1DYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWROZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdIZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNraW5nSGVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZXJyaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXB1cml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5TaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW50aGFuaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxhc3RpY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhaW5lZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FsbGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Ryb250aXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdG9yYWdlTGltaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVJbmRleE9mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmREcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZ0ZXJEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50R3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVHJhbnNwb3J0RXF1aXBtZW50R3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjaWRpdHlPZkp1aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5ldHJvbWV0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1aWNlV2VpZ2h0UGVyMTAwR3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZydWl0U2tpbkNvbG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5nbGVPZkJlbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkSW5jcmVtZW50YWxNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbEQxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbEQyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbEQ1MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN0YWNraW5nV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc01lYXN1cmVDdWJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlRmF0Q29udGVudEluRHJ5TWF0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWNjaGFyb21ldHJpY0NvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhdGVDb250ZW50T2ZBbkFsY29ob2xpY1Byb2R1Y3RBZnRlckJvdHRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmh5ZHJvdXNDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtpbmdMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0aW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZUdyYXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUdyb3NzT2JzZXJ2ZWRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUdyb3NzU3RhbmRhcmRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1OZXRTdGFuZGFyZFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxPbi1Cb2FyZFF1YW50aXR5LUFmdGVyRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Ub3RhbENhbGN1bGF0ZWRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVRvdGFsT2JzZXJ2ZWRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubmFnZUdhdWdlRGlzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bU5ldFN0YW5kYXJkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWRpbWVudEFuZFdhdGVySW5QZXRyb2xldW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic2VydmVkUmVmZXJlbmNlSGVpZ2h0LVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZUhlaWdodC1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbGxhZ2VHYXVnZURpc3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltQ29ycmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm93VG9CcmlkZ2VEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpZ2h0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJha2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtpbmdTdHJlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtpbmdTdHJlbmd0aFdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaXNXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZW50c09mUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29yZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25XZWlnaHRBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYW1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWx0YVZhbHVlTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuc2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdGFuY2VCZXR3ZWVuUG9pbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1Cb3hjYXJEb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWROZXdXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsb25nYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGFtZW50Q291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdpdHVkaW5hbEZsYXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnN2ZXJzZUZsYXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F1Z2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzV2VpZ2h0LU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhcmRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHQtTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0RGltZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhY3RFbmVyZ3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZURpYW1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZ3RoLU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZURpYW1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVTdHJldGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb25uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVIdW1pZGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaXN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvY2t3ZWxsQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWN0aW9uT2ZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW4tUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyZVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaWNrbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0UGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0LVZhbkRvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoLVZhbkRvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXRPZkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXRPZkxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZUhlaWdodC1GbGF0QmVkV2l0aFJlbW92YWJsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3F1YXJlbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Bvb2xTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZaWVsZFN0cmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWluaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnNlbmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlzbXV0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyYm9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2x1bWJpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hsb3JpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYmFsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyb21pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvblBsdXNTaWxpY29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJtYW5pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJvZ2VuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3Rhc3NpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25lc2l1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZ2FuZXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2x5YmRlbnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaXRyb2dlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29kaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaW9iaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWNrZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvc3Bob3J1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VscGh1ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aW1vbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVuaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxpY29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxpY2l1bU94eWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFudGFsaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxsdXJpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGFuaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW5hZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVuZ3N0ZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmluYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmlyY29uaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb09wZXJhdGluZ1RlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFbWVyZ2VuY3lUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udHJvbFRlbXBlcmF0dXJlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTZWFsSW5mbyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2VhbEluZm8iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNlYWxJbmZvIiB0eXBlPSJMaXN0T2ZTZWFsSW5mbyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VhbEluZm8iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU2VhbElzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJbmZvIiB0eXBlPSJTZWFsSW5mbyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VhbElzc3VlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbElzc3VlckNvZGVkIiB0eXBlPSJTZWFsSXNzdWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbElzc3VlckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJc3N1ZXIiIHR5cGU9IlNlYWxJc3N1ZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VhbElzc3VlckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVua25vd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJhbnRpbmVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsT3BlcmF0b3IiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsU3RhdHVzQ29kZWQiIHR5cGU9IlNlYWxTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsU3RhdHVzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0luZm8iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIgdHlwZT0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlYWxTdGF0dXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblJpZ2h0Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlRWxlY3Ryb25pY1NlYWxJc0ZhdWx0eSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNpdERpcmVjdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNpdERpcmVjdGlvbkNvZGVkIiB0eXBlPSJUcmFuc2l0RGlyZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdERpcmVjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZWQiIHR5cGU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZSIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zaXREaXJlY3Rpb24iIHR5cGU9IlRyYW5zaXREaXJlY3Rpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNpdERpcmVjdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllclRvU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0J1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yVG9TZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvRHJvcFNoaXBEZXNpZ25hdGVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvRnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9TdWJjb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RoZXJWZXNzZWxUb0xpZ2h0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZ2h0ZXJUb01vdGhlclZlc3NlbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhcldlZWtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0RheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVEYXlXb3JrV2VlayIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGVkIiB0eXBlPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlZCIgdHlwZT0iVHJhbnNwb3J0VGVybXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRUZXJtc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGVkIiB0eXBlPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrT2ZMb3NzQ29kZWQiIHR5cGU9IlJpc2tPZkxvc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrT2ZMb3NzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0Rlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXJtc09mRGVsaXZlcnkiIHR5cGU9IlRlcm1zT2ZEZWxpdmVyeSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlYW5kRGVzcGF0Y2hDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RlZEJ5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb25kaXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXgtV29ya3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWUtQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUFsb25nc2lkZVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVPbkJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QW5kRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdC1JbnN1cmFuY2VBbmRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWFnZVBhaWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmlhZ2UtSW5zdXJhbmNlUGFpZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWRBdEZyb250aWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWRFeC1TaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWRFeC1RdWF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWREdXR5VW5wYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWREdXR5UGFpZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlQ29sbGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZVByZXBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hPbkRlbGl2ZXJ5U2VydmljZUNoYXJnZVBhaWRCeUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaE9uRGVsaXZlcnlTZXJ2aWNlQ2hhcmdlUGFpZEJ5Q29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0RnJlaWdodENyZWRpdGVkVG9QYXltZW50Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBpY2stVXBPckJhY2toYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpbmVkQnlCdXllckFuZFNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9iUG9ydE9mQ2FsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZlByZXBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uQ29weS1Ob1BheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvc3RzUGFpZEJ5Q29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3N0c1BhaWRCeUNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJldmVudWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEJ5QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeVN1cHBsaWVyT3JTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWFibGVFbHNld2hlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRBbmRTdW1tYXJ5QmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEJ1dENoYXJnZWRUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQnlQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWQtQnlTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRMb2NhbENvbGxlY3RPdXRzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZE9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvbnRhaW5lckZyZWlnaHRGcmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0UGFpZEJ5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvbnRhaW5lckZyZWlnaHRQYWlkQnlTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVsZTExU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VGcmVpZ2h0LU5vQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDb25kaXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmlza09mTG9zc0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9EZXN0aW5hdGlvbklzQnV5ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9GcmVpZ2h0RXF1YWxpemF0aW9uUG9pbnRJc1NlbGxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb1Bvb2xQb2ludElzU2VsbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRGVzdGluYXRpb25Jc1NlbGxlcnMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlByaWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQcmljZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUHJpY2UiIHR5cGU9Ikxpc3RPZlByaWNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlByaWNpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlQmFzaXNRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhbGN1bGF0ZWRQcmljZUJhc2lzUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlUXVhbnRpdHlSYW5nZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUHJpY2VNdWx0aXBsaWVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZSIgdHlwZT0iUHJpY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNpbmdUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZVR5cGVDb2RlZCIgdHlwZT0iUHJpY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2luZ1R5cGUiIHR5cGU9IlByaWNpbmdUeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlByaWNlVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlRGVwZW5kZW50UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzSXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25OZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uR3Jvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEluY2x1ZGVkQWxsb3dhbmNlc0FuZENoYXJnZXNOb3RJbmNsdWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlU2VsbGluZ1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByaWNlVGF4SW5jbHVkZWRFeGNsdWRpbmdBbGxvd2FuY2VzT3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByaWNlRXhjbHVkaW5nQWxsb3dhbmNlc09yQ2hhcmdlc0FuZFRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGl2ZVVuaXRQcmljZUNvbXBvbmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUdlbmVyaWNQcm9kdWN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlV2hvbGVzYWxlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbERpc3RyaWJ1dGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RG9tZXN0aWNWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZFVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRDdXN0b21zVW5pdFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJBZGp1c3RlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRBbW91bnRBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RTdG9yZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RTaGlwUHJvZ3JhbVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFY3NjUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZU9yaWdpbmFsRXF1aXBtZW50TWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbnREZWxpdmVyeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kc1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVXBwZXJMaW1pdFByaWNlTWF4aW11bUFsbG93YWJsZUNvc3RQcmljaW5nRm9yRHJ1Z3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1QcmljZURvTm90QWR2aXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcmljZVRocm91Z2hRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cmlhbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VCaWxsaW5nUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5VG9BZHZpc2VVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BY3Rpdml0eVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9yZGVyUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJlbGVhc2VRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUHJpY2VSZWR1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNTdWdnZXN0ZWRSZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1SZWxlYXNlUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0SXRlbVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsVG9BZHZpc2VVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUHVyY2hhc2VPcmRlclByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcmljZUJlZ2lubmluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrUHVyY2hhc2VPcmRlckNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUNhdGFsb2d1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyRWFjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VJbkVmZmVjdEF0VGltZU9mU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcktpbG9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJMaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEZyZWlnaHRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXJzUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclRvbm5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpZWRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWREZWFsZXJOZXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkRmxlZXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEFuZERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRMaXN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUHJpY2VGYWN0b3JzRXF1YWxpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRSZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bU9mTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRXaG9sZXNhbGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9CZU5lZ290aWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVzaG9sZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZWRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdENvc3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJab25lUHJpY2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVuaXRQcmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlVmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2UiIHR5cGU9IlVuaXRQcmljZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHlWYWx1ZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5UmFuZ2UiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eSIgdHlwZT0iUXVhbnRpdHkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5VmFsdWUiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5VmFsdWUiIHR5cGU9IlF1YW50aXR5VmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWluaW11bVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNYXhpbXVtVmFsdWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5UmFuZ2UiIHR5cGU9IlF1YW50aXR5UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNlTXVsdGlwbGllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2VNdWx0aXBsaWVyQ29kZWQiIHR5cGU9IlByaWNlTXVsdGlwbGllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNdWx0aXBsaWVyIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2VNdWx0aXBsaWVyIiB0eXBlPSJQcmljZU11bHRpcGxpZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHJpY2VNdWx0aXBsaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLU9yaWdpbmFsQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItUmV0YWlsQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRNdWx0aXBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1XaG9sZXNhbGVDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50U29sdXRpb25NdWx0aXBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nTXVsdGlwbGllciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGF5bWVudEluc3RydWN0aW9ucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGF5bWVudFRlcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGF5bWVudE1ldGhvZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudEluc3RydWN0aW9ucyIgdHlwZT0iUGF5bWVudEluc3RydWN0aW9ucyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGF5bWVudFRlcm1zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYXltZW50VGVybSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGlzY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50VGVybXNOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXltZW50VGVybXMiIHR5cGU9IlBheW1lbnRUZXJtcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGF5bWVudFRlcm0iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRUZXJtQ29kZWQiIHR5cGU9IlBheW1lbnRUZXJtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFRlcm1Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50VGVybVZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50VGVybURldGFpbHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJEaXNjb3VudHMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudFRlcm0iIHR5cGU9IlBheW1lbnRUZXJtIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBheW1lbnRUZXJtQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwRGF5c0FmdGVyRW5kT2ZNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeUFjY2VwdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5RGVmZXJyZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeU5lZ290aWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeU5lZ290aWF0aW9uQnlOYW1lZEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5TmVnb3RpYXRpb25XaXRoQW55QmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlOZWdvdGlhdGlvbldpdGhBbnlCYW5raW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5U2lnaHRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY0NvbW1pc3Npb25UZXJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNEaXNjb3VudE9mZmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsVG9CaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25PcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQWdhaW5zdERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaEJ5U3RhdGVMYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hEaXNjb3VudFRlcm1zQXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hvbkFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hvbkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hPbkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUGVyVmVuZG9yUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFdpdGhPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUNhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDb250cm9sbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRpbmdHaXZlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRPckluc3RhbGxtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0UmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudE5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50V2l0aEFkdmFuY2VQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudFdpdGhQcm9tcHRQYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50c0FnYWluc3RBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHNBZ2FpbnN0UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXN0UGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkRGF0ZUxhdGVQYXltZW50UGVuYWx0eUFwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudFBheW1lbnRzQXJlRHVlQW5udWFsbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHNBcmVEdWVNb250aGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudFBheW1lbnRzQXJlRHVlUXVhcnRlcmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudFBheW1lbnRzQXJlRHVlU2VtaUFubnVhbGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlckNvbXBhbnlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnJldm9jYWJsZUxldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdEF0U2lnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdW1wU3VtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TW9udGhGb2xsb3dpbmdJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFlldERlZmluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRBZ2FpbnN0U3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJ5SW5zdGFsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJ5aW5zdGFsbWVudHNBY2NvcmRpbmdUb1Byb2dyZXNzQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCeUluc3RhbG1lbnRzQWNjb3JkaW5nVG9Qcm9ncmVzc1RCQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1ZVVwb25SZWNlaXB0T2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXJUaHJvdWdoQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFRlcm1zRGVmaW5lZEluQ29uc29saWRhdGVkSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFVwb25Db21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5VGVybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlBZ3JlZWRVcG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbXB0UGF5bWVudEFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJveGltbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxCeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvQWR2aXNlQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm94aW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckZsb29yUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVub3JQYXltZW50VGVybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zTm90QXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0Z1bmRzUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVua25vd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYW5jZUJpbGwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NvdW50cyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXNjb3VudFBlcmNlbnQiIHR5cGU9IkRlY2ltYWwxMF80Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXNjb3VudEFtb3VudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnREYXlzRHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXNjb3VudER1ZURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnREYXlPZk1vbnRoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXNjb3VudERhdGVUaW1lUmVmQ29kZWQiIHR5cGU9IkRhdGVUaW1lUmVmQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnREYXRlVGltZVJlZkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5ldERheXNEdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5ldER1ZURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmV0RGF0ZVRpbWVSZWZDb2RlZCIgdHlwZT0iRGF0ZVRpbWVSZWZDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXREYXRlVGltZVJlZkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRpc2NvdW50cyIgdHlwZT0iRGlzY291bnRzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNb25ldGFyeVZhbHVlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeUFtb3VudCIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5VmFsdWUiIHR5cGU9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXJnZXRDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlT2ZFeGNoYW5nZSIgdHlwZT0iRGVjaW1hbDE5XzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkludmVyc2VSYXRlT2ZFeGNoYW5nZSIgdHlwZT0iRGVjaW1hbDE5XzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRhdGVPZlJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZlJhdGVPZkV4Y2hhbmdlUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIiB0eXBlPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMTlfOSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWZlcmVuY2UiIHR5cGU9Ikxpc3RPZlJlZmVyZW5jZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEYXRlVGltZVJlZkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZERlbGl2ZXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxPZkdhZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9mU2FtcGxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkFuZEFjY2VwdGFuY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2xlYXJhbmNlRGF0ZUV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZURhdGVJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVDcmVkaXROb3RlUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVFeFdvcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlR29vZHNIYW5kZWRPdmVyRm9yU2hpcG1lbnRCeVNlbGxlck9yQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVHb29kc1JlY2VpdmVkQnlCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUdvb2RzUmVjZWl2ZWRCeUJ1eWVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlR29vZHNSZWNlaXZlZEJ5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUludm9pY2VSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWNjZXB0YW5jZU9mRmlyc3RTYW1wbGVzUHJvZHVjZWRVbmRlclByb2R1Y3Rpb25Db25kaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY2NlcHRhbmNlT2ZOZWdvdGlhYmxlSW5zdHJ1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWNjZXB0YW5jZU9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXJyaXZhbE9mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZCaWxsT2ZMYWRpbmdDb25zaWdubWVudE5vdGVPck90aGVyVHJhbnNwb3J0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNlcnRpZmljYXRlT2ZGaW5hbEFjY2VwdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNlcnRpZmljYXRlT2ZQcmVsaW1pbmFyeUFjY2VwdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ29uZmlybWF0aW9uT2ZPcmRlclJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWxpdmVyeU9mR29vZHNUb0VzdGFibGlzaG1lbnRzRG9taWNpbGVTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWxpdmVyeVRvQnV5ZXJPZkRvY3VtZW50c1JlcHJlc2VudGluZ0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWxpdmVyeVRvQnV5ZXJzQWdlbnRPZkRvY3VtZW50c1JlcHJlc2VudGluZ0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWxpdmVyeVRvQ2Fycmllck9mRG9jdW1lbnRzUmVwcmVzZW50aW5nR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlbGl2ZXJ5VG9JbnRlcm1lZGlhcnlCYW5rT2ZEb2N1bWVudHNSZXByZXNlbnRpbmdHb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZFbmRPZldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpbmFsQWNjZXB0YW5jZU9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mSW53YXJkRnJvbnRpZXJDcm9zc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mSXNzdWVPZlRyYW5zcG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOZWdvdGlhYmxlSW5zdHJ1bWVudERyYWZ0UHJvbWlzc29yeU5vdGVCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3V0d2FyZEZyb250aWVyQ3Jvc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByZXNlbnRhdGlvbk9mRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcmVzZW50YXRpb25PZk5lZ290aWFibGVJbnN0cnVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcmVzZW50RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByb3Zpc2lvbmFsUmVjZXB0aW9uT2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZSZWNlaXB0Rm9yTG9hZGluZ01hdGVzUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVjZWlwdE9mVG9vbERlcGVuZGVudEluaXRpYWxTYW1wbGVzUGx1c1VubGltaXRlZEFic29sdXRlQmFua0d1YXJhbnRlZVBsdXNWYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZSZWNlaXB0T2ZUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZSZXNhbGVCeUJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTYWxhcnlQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2hpcG1lbnRBc0V2aWRlbmNlZEJ5VGhlVHJhbnNwb3J0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNpZ25hdHVyZU9mQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlN0YXJ0T2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJlc2VudERvY3VtZW50UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcm9jZWVkc09mUmVzYWxlQ29sbGVjdGVkQnlCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRBdERheXNBZnRlckRhdGVPZklzc3VhbmNlT2ZUcmFuc3BvcnREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRBdERheXNBZnRlckRhdGVPZlByZXNlbnRhdGlvbk9mRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdEF0RGF5c0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QXREYXlzU2lnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGVPZk5lZ290aWFibGVJbnN0cnVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVJlY2VpcHREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlVHJhbnNtaXNzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVZlcmlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUmVmZXJlbmNlRGF0ZUFncmVlZFVwb25CZXR3ZWVuVGhlUGFydGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFwcHJvdmFsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdE9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZERhdGVPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpZWREcmFmdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0aXB1bGF0ZWREYXRlRm9yQWNjZXB0YW5jZU9mRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0aXB1bGF0ZWREYXRlRm9yTmVnb3RpYXRpb25PZkRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGlwdWxhdGVkRGF0ZUZvclBheW1lbnRPZkRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXltZW50TWV0aG9kIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXltZW50TWVhbkNvZGVkIiB0eXBlPSJQYXltZW50TWVhbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRNZWFuQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudE1lYW5SZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFN5c3RlbUNvZGVkIiB0eXBlPSJQYXltZW50U3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFN5c3RlbUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yaWdpbmF0aW5nRklBY2NvdW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRklBY2NvdW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlY2VpdmluZ0ZJQWNjb3VudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkZJQWNjb3VudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhcmRJbmZvIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXltZW50TWV0aG9kIiB0eXBlPSJQYXltZW50TWV0aG9kIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBheW1lbnRNZWFuQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwMzVFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0ZWRCaWxsT2ZFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UGx1c0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBsdXNEZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ29ycG9yYXRlVHJhZGVFeGNoYW5nZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ29ycG9yYXRlVHJhZGVFeGNoYW5nZURlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDb3Jwb3JhdGVUcmFkZVBheW1lbnRDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENvcnBvcmF0ZVRyYWRlUGF5bWVudERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENyZWRpdFJldmVyc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kRGViaXRSZXZlcnNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIUHJlQXJyYW5nZWRQYXltZW50QW5kRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIUmV2ZXJzYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBQRENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQUEREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQUERQbHVzQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBQRFBsdXNEZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQbHVzQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBsdXNEZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0NvcnBvcmF0ZVRyYWRlRXhjaGFuZ2VDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDb3Jwb3JhdGVUcmFkZUV4Y2hhbmdlRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDb3Jwb3JhdGVUcmFkZVBheW1lbnRDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDb3Jwb3JhdGVUcmFkZVBheW1lbnREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0NyZWRpdFJldmVyc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NEZWJpdFJldmVyc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ0hvdXNlQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ0hvdXNlRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rY2hlcXVlLUlzc3VlZEJ5QUJhbmtpbmdPclNpbWlsYXJFc3RhYmxpc2htZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlDcmVkaXRvck9uVGhpcmRQYXJ0eUFuZEFjY2VwdGVkQW5kRW5kb3JzZWRCeUFCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsRHJhd25CeVRoZUNyZWRpdG9yQW5kRW5kb3JzZWRCeUFub3RoZXJCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsRHJhd25CeVRoZUNyZWRpdG9yT25BQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvck9uQUJhbmtBbmRFbmRvcnNlZEJ5QVRoaXJkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5VGhlQ3JlZGl0b3JPbkFUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsRHJhd25CeVRoZUNyZWRpdG9yT25UaGVEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tFbnRyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0VudHJ5RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hpZXJzQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNjZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2NkUGx1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRDaGVxdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdCZXR3ZWVuUGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0UGF5bWVudEJ5Q2VydGlmaWVkRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RQYXltZW50QnlDb21wYW55Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBlbnNhdGlvbkJ5QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXREZWJpdEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdHAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN0eCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdFRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3Rpb25Gcm9tRmlsbVJlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheVRvT3RoZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUJJTkFYQ2xlYXJpbmdOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUGF5bWVudFN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFJlc2VydmVGdW5kc09yV2lyZVRyYW5zZmVyUmVwZXRpdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFJlc2VydmVGdW5kc09yV2lyZVRyYW5zZmVyTm9uUmVwZXRpdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb25PcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGb3JtYXRHaXJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5bWVudEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZS1CYW5raW5nRGViaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVDb250aW5nZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVTZW5zaXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluS2luZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydW1lbnROb3REZWZpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlckJhbmtEZWJpdFRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlZFNlcGFyYXRlbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbC1TdW1Db25zdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxDaGVxdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2tCb3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsT3JSZWdpb25hbENsZWFyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25QYXltZW50RGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VHJhbnNmZXJhYmxlQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUcmFuc2ZlcmFibGVMb2NhbENoZXF1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5QnlDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJ5UG9zdEdpcm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRUb0JhbmtBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsRGVkdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1DbGVhcmluZ2hvdXNlQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFBEQ3JlZGl0VG9EZW1hbmREZXBvc2l0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFBERGViaXRUb0RlbWFuZERlcG9zaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUERQbHVzQWRkZW5kdW1DcmVkaXRUb0RlbWFuZERlcG9zaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUERQbHVzQWRkZW5kdW1EZWJpdFRvRGVtYW5kRGVwb3NpdEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWF1dGhyb2l6ZWRDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseUNoYXJnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVOZXR0aW5nQWdyZWVtZW50UGF5QnlXaXJlVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVOZXR0aW5nUGF5QnlDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlBQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeUFCYW5rQW5kRW5kb3JzZWRCeUFub3RoZXJCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5QVRoaXJkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlBVGhpcmRQYXJ0eUFuZEVuZG9yc2VkQnlBQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeVRoZURlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeVRoZURlYnRvckFuZEVuZG9yc2VkQnlBVGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeVRoZURlYnRvckFuZEVuZG9yc2VkQnlCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wcmlldGFyeU5ldHdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRIb21lLUJhbmtpbmdDcmVkaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlR2lybyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERldGFpbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZE1ldGhvZEZvclBheW1lbnRXYXNOb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWFyeUFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxlcnNDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXJnZW50R2lybyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklTQVNwZWNpYWxFbGVjdHJvbmljRnVuZHNUcmFuc2Zlck5ldHdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lyZVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYMTIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGF5bWVudFN5c3RlbUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRpbmFyeVBvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpck1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lckVtcGxveWVlQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hDb25jZW50cmF0aW9uRGlzYnVyc2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQ29uY2VudHJhdGlvbkRpc2J1cnNlbWVudFBsdXNBZGRlbmRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckluaXRpYXRlZEVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckluaXRpYXRlZEVudHJ5UGx1c0FkZGVuZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVRyYWRlRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZUNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlZ3JhcGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJUcmFuc21pc3Npb25OZXR3b3JrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0d29ya3NOb3REZWZpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWR3aXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbC1GYWNlLVRvLUZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFycmFuZ2VkUGF5bWVudEFuZERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFycmFuZ2VkUGF5bWVudEFuZERlcG9zaXRQbHVzQWRkZW5kYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXV0aG9yaXplZERyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQWlyTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NlbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQUNIIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJGSUFjY291bnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJBY2NvdW50RGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRklBY2NvdW50IiB0eXBlPSJGSUFjY291bnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnREZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2Vjb25kYXJ5QWNjb3VudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJQkFOIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50Q29udHJvbEtleSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRUeXBlQ29kZWQiIHR5cGU9IkFjY291bnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudE5hbWUxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50TmFtZTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFjY291bnRSZWZlcmVuY2VzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudERldGFpbCIgdHlwZT0iQWNjb3VudERldGFpbCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBY2NvdW50VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdCdXNpbmVzc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV5TWFya2V0RnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudEFjY291bnRWZXN0ZWRJbnRlcmVzdGF0TWFya2V0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRBY2NvdW50VmVzdGVkSW50ZXJlc3ROZXRDYXNoVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxSZXRpcmVtZW50QWNjb3VudC1JUkEtVmVzdGVkSW50ZXJlc3RhdE1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsUmV0aXJlbWVudEFjY291bnQtSVJBLVZlc3RlZEludGVyZXN0TmV0Q2FzaFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVDb250cm9sbGVkUmV0aXJlbWVudEFjY291bnRWZXN0ZWRJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZURlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNraW5nQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VGYWNlVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRBY2NvdW50LVZlc3RlZEludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0RnVuZEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2Nrc2FuZEJvbmRzQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZUFjY291bnQtTmV0Q2FzaFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVJldGlyZW1lbnRBY2NvdW50LTQwMUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcmFnZUFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUJhY2tBY2NvdW50Zm9yUmV0dXJucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaE1hbmFnZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWFuZERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhpc3RpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5JdGVtc29uRGVtYW5kRGVwb3NpdEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkl0ZW1zb25TYXZpbmdzQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F2aW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5TG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkRGlzYnVyc2VtZW50TWFzdGVyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZERpc2J1cnNlbWVudFN1YkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnJpY2hlZFBsYW5Db250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZy10ZXJtRGlzYWJpbGl0eVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXV0dWFsRnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aW9uc2hpcFN1bW1hcnlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZla2VlcGluZy1DdXN0b2R5QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmVyb0JhbGFuY2VNYXN0ZXJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaZXJvQmFsYW5jZUFmZmlsaWF0ZUFjY291bnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGaW5hbmNpYWxJbnN0aXR1dGlvbklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRmluYW5jaWFsSW5zdGl0dXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoU3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaEhvdXNlTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaFN0cmVldFN1cHBsZW1lbnQxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaFN0cmVldFN1cHBsZW1lbnQyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaFBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoQ2l0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hSZWdpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWdpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hDb3VudHJ5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ291bnRyeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiIgdHlwZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcmRJbmZvIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXJkTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkQXV0aENvZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcmRSZWZOdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcmRFeHBpcmF0aW9uRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkVHlwZSIgdHlwZT0iQ2FyZFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkVHlwZU90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkSG9sZGVyTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2FyZEluZm8iIHR5cGU9IkNhcmRJbmZvIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNhcmRUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNRVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSkNCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaW5lcnMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkFsbG93T3JDaGFyZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiIHR5cGU9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFsbG93T3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkluZGljYXRvckNvZGVkIiB0eXBlPSJJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbmRpY2F0b3JDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCYXNpc0NvZGVkIiB0eXBlPSJCYXNpc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhc2lzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlZCIgdHlwZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWxsb3dhbmNlT3JDaGFyZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkFsbG93T3JDaGdEZXNjIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzaXNRdWFudGl0eVJhbmdlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkJhc2lzTW9uZXRhcnlSYW5nZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRheCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2VxTm8iIHR5cGU9InhzZDppbnQiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWxsb3dPckNoYXJnZSIgdHlwZT0iQWxsb3dPckNoYXJnZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJbmRpY2F0b3JDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJvdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51c09yQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3RoZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQmFzaXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV0YXJ5QW1vdW50Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNoZWNrVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q3VzdG9tZXJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VUb0JlUGFpZEJ5VmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VUb0JlUGFpZEJ5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZHcm9zc1F1YW50aXR5SW52b2ljZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVRvQmVJc3N1ZWRCeVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlVG9CZUlzc3VlZEJ5UmVzZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZURlbmllZEJ5VmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVBheWFibGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY3J1YWxGdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaEluQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlQW5kQWRkdG9JbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBbGxvd09yQ2hnRGVzYyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlcnZpY2VDb2RlZCIgdHlwZT0iU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd09yQ2hnRGVzYyIgdHlwZT0iQWxsb3dPckNoZ0Rlc2MiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGVzY3JpcHRpb24iIHR5cGU9Ikxpc3RPZkRlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb25UZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlcnZpY2VDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJvdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFic29sdXRlTWluaW11bUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlLUZlZGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NoYXJnZS1TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE51bWJlckNvcnJlY3Rpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjaWRCYXR0ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnbWVudG9mRGVsaXZlcnlGZWVBT0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2YXRpb25PZkNhcm5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbENvbW1lcmNpYWxJbnZvaWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbENvcGllc09mRnJlaWdodEJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFRhcmlmZkNsYXNzaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT24tRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkcmVzc0NvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZFRvTWFrZU1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Rm9yTWF4aW11bUNoYXJnZXNCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Rm9yTWluaW11bUF2ZXJhZ2VUaW1lUmVxdWlyZW1lbnRCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkVmFsb3JlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUNoYXJnZXNIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZURlc3RpbmF0aW9uQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRGVzdGluYXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VPcmlnaW5BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VPcmlnaW5GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWRhdml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudERpc2J1cnNlbWVudC1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnREaXNidXJzZW1lbnQtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdE9uR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHBvcnRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRXhwcmVzc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZU9wZW5pbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRUZXJtaW5hbEhhbmRsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnRhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGljQmV2ZXJhZ2VSZXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGVnaGVueUNvdW50eVBBRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUZvckNvbnNpZ25tZW50TWVyY2hhbmRpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU5vbi1QZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kaW5nRXhwb3J0RG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5uZWFsSGVhdFN0ZWVsb3JHbGFzc1RyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5vZGl6aW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpLWR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJiaXRyYXJ5SW5BZGRpdGlvblRvVGhyb3VnaFJhdGVzYW5kQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0V29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudHNUb0JpbGxPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFkRGVidCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2luZ0RyYWZ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VGcmVpZ2h0QWxsS2luZHNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY1Jlb3JkZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW1pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZGRpbmdGZWVkaW5nRGlzaW5mZWN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWVmRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXlvbmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJleW9uZEZyZWlnaHRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdBdHRlbmRhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYWNrTHVuZ1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2tpbmdBbmRCcmFjaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG93ZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYnRhaWxDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3BTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVhdXhBcmJpdHJhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90aC1GbGF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2J1bGtTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtCdWxrU3VyZmFjZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpZGdlVG9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VuTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZW5QYWNrYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcmFnZU9yRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudC0yMEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmRlbk92ZXJoZWFkT3JBbGxvd2FuY2VGb3JJbmRpcmVjdENvc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllckhhbmRDYXJyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ2FyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJsZVByZXNzdXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJsZXNTZW5kaW5nT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbXBBcmJpdHJhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkYUdyZWF0TGFrZXNBZGRpdGlvbmFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DUUN1c3RvbXNDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VycmVuY3lFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5JbXBvcnRUZXJtaW5hdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5SZWNvbnNpZ25tZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblJlbWFuaWZlc3RGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGVkT3JkZXJIZWF2eUR1dHlGbGF0Y2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXB0dXJlQWRkaXRpb25hbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhckxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhclJlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckNyZWRpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckRlYml0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyTm90aWZpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJ0YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJ0YWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9naW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRzT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZSZWdpc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWluQW5kQmluZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2VTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VPZkFpcmJpbGwtU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlc0ZvcndhcmRBZHZhbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydGVyU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxNaWxsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGljYWdvTG9vcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lnYXJldHRlU3RhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eU1haW50ZW5hbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5UGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVRlcm1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhbmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1NlYWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdEaXBSdXN0cHJvb2ZFRFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPREFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09EQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdE9uRGVsaXZlcnlBbHRlcmF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeURlbGV0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1tYW51ZmFjdHVyaW5nRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5hdGlvblBlcmZvcm1hbmNlQW5kTm9uLXBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lQWxsU2FtZURheVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pY2F0aW9uc0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZUNhckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcHJlc3NvckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2Vzc2lvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2Vzc2lvbk1vbmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25nZXN0aW9uU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zZXJ2YXRpb25SZXNlYXJjaEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlVW5sb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFN1cnZlaWxsYW5jZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0YW50U3VydmVpbGxhbmNlU2VydmljZS1Bcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJpemF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWxhckxlZ2FsaXphdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEZXBvc2l0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGVzdHVmZmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpdmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxlYXNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvc3NEYW1hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcnZpY2VDaGFyZ2VVS0VVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VydmljZUNoYXJnZVVTQUNhbmFkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3R1ZmZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclRyYWlsZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNNaWxlYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RFc2NhbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1vcENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVBZHZlcnRpc2luZ01lcmNoYW5kaXNpbmdBbGxvd2FuY2VQZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU9mQmlsbE9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5T2ZEZWxpdmVyeVJlY2VpcHRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RSZWNvdmVyeUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RSZWNvdmVyeUZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ290dG9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudEFuZFJlY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uUmVpbWJ1cnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhZnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5RGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQWNjb3VudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVxdWlwbWVudEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlckZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0V4YW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUNvbnRhaW5lckxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRmVlcy1MaWZ0TGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGb3JtYWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnZvaWNlLUFkZGl0aW9uYWxQYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUGVuYWx0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXRBbmRQYXJhbGxlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0dGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZE1lcmNoYW5kaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0NhcnJpZXJFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvQ2FycmllclZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9Hb3Zlcm5tZW50RXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhRHJhd2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZGhlYWRNaWxlYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFmQW5kRGlzYWJsZWRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkVmFsdWVGb3JDYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkVmFsdWVGb3JJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdFRvTWFrZU1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlY3RpdmVBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaXRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZS1JbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGF5RnVybmlzaGluZ0Rlc3RpbmF0aW9uV2VpZ2h0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlLUF2ZXJhZ2VBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZS1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdEluTGlldU9mT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcmFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVycmlja0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduYXRlZFN1cHBsaWVySW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbkxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mUG93ZXJVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZUcmFpbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uLVNwZWNpYWxUeXBlRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlcm1pbmVkRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2ZWxvcG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFByb2R1Y3RIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb25uZWN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtRHJvcEJveENvbnZlbmllbmNlQ3RyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1JbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LU11bHRpcGxlU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNlcnZpY2VPcHRpb25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtU2VydmljZU9wdGlvblBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtU3BlY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGxheUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckRpc2NvdW50QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25BbmRSZWNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvblRvQWlyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrYWdlLUJvYXREZXRlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvb3ItVG8tRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93ZWxQaW5DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ0F0UG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VhdFBvcnRPZkRlYmFya2F0aW9uUmF0ZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VBdFBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlYXRQb3J0T2ZFbWJhcmthdGlvblJhdGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlTGluZUhhdWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlckFzc2lzdGVkVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzV2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BEb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wWWFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bUNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1EZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtVXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeWVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlJY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bm5hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlEcmF3YmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlCdXlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5UGF5bWVudEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlTaGlwQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lQb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5V2VpZ2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuY2xvc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneWNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5U3VyY2hhcmdlRnVlbEFkanVzdG1lbnRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ1N1cHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdyYXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGVyZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRNYW51ZmFjdHVyZXJSZXN0b3JhdGlvbkF1ZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NhbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2Nyb3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cjFQcmVzZW50YXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuUG9ydENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NpdmVWYWx1ZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzTWlsZWFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzUGVyaW9kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzVmFsdWVGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VBY2Nlc3NDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlT2ZFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRpb25EZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdGlvblBpY2t1cENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwYW5kZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRPbmVEYXlDb25zdWxhclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNoaXBtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGluZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGluZ1ByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEN1c3RvbXNDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydERlY2xhcmF0aW9ucy1BdXRvbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydERlY2xhcmF0aW9ucy1VU1NoaXBwZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRJbXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2Vuc2VBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0U2hpcHBpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhQ29waWVzYW5kTWFpbGluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGFib3JIZWxwZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMZW5ndGhTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhU2VydmljZS1Db3VudGVyLVRvLUNvdW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNzaW1pbGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNzaW1pbGVDaGFyZ2VzLUFkZGl0aW9uYWxQYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkTGFtcFBhbmVsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXhQcmUtYWxlcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUcmFuc2ZlclN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEFydGljbGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0RmxpZ2h0T3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0cmFja1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yU3RvY2tQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kTG9kZ2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc1JlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNTcGVjaWFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZENvdXBvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdBZ2VudENvbW1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZURvbWljaWxlU2hpcG1lbnRQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRCYXNlZE9uRG9sbGFyTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodENoYXJnZXNUb0JvcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodENoYXJnZXNUb0Rlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0RXF1YWxpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW50ZXJuYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWxOb24tVVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW50ZXJuYXRpb25hbFVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBhc3N0aHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVzaG5lc3NMZWFrZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsVHJ1Y2tsb2FkQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJtZW50RGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm1lbnRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ByZXNzdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRld2F5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGF6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29sZEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc0NyZWRpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRXYXJlaG91c2VGZWUtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRXYXJlaG91c2VGZWUtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkRvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkZsb3dDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXR1aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmluZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NSZWNlaXB0c1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBhZ2VEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBlZEl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVkSW5zcGVjdGlvblRlY2huaWNhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1bGZQb3J0RGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ0NoYXJnZXNPbkRpc3RyaWJ1dGlvbkZyZWlnaHRGb3J3YXJkZWRCZXlvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nRnJlaWdodEF0UG9zaXRpb25zTm90SW1tZWRpYXRlbHlBZGphY2VudFRvVmVoaWNsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFyYm9yTWFpbnRlbmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhcmJvck1haW50ZW5hbmNlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsaW5nQW5kSG9pc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxpbmdBbmRIb2lzdGluZ1RvQmVEaXJlY3RCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnb09uRGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzSGFuZGxpbmdGZWUtRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0hhbmRsaW5nRmVlLUludGVybmF0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1N0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRJblRyYW5zaXRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0VHJlYXRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXZ5RHV0eUZsYXRDYXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXZ5TGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNlY3VyaXR5UmVkSW4tYm9uZFNlYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2h3YXlJbnRlcmNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9pbnRpbnNBbmRIYXVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTGluZUZyZWlnaHRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbmV5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb29rLXVwY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NlQ2hhcmdlU3BlY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2Vob2xkR29vZHNQaWNrLXVwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFUQUFpcmJpbGxQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFUQUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHJvcGVyRG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZEZyZWlnaHRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVGcmVpZ2h0TWFudWZhY3R1cmluZ1RvU2hpcHBpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3JyZWN0QmlsbGluZ0FjY291bnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5UHJpY2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlQ2FibGVDb25uZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdEF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25BbmRUcmFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uV2FycmFudHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VsYXRlZFRhbmtDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQbGFjZW1lbnRDb3N0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQcm92aWRlZEJ5TGVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQcm92aWRlZEJ5TGVzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZGl2aXNpb25Qcm9maXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdE9uUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdE9uU2VjdXJpdHlEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVXNlUGVybWl0dGVkQXRTcGVjaWFsUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFpclRyYW5zcG9ydEFzc29jaWF0aW9uQ29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFpclRyYW5zcG9ydEFzc29jaWF0aW9uTWFya3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ291cmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbERvb3ItdG8tRG9vckhhbmRsaW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnBsYW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnN0YXRlSGlnaHdheVRvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdFByaWNlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmEtcGxhbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBZGRpdGlvbmFsQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUF0LUNvc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEZWxpdmVyeVRlcm1zQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTm8tQ2hhcmdlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VXaXRoR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklyaXNoQXJiaXRyYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklzbGFuZERlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc2xhbmRQaWNrLVVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGFsaWFuUmVsZWFzZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW0tVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcEZyb21GcmVlemluZ1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iktvc2hlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQ29zdE9mUmVtb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JNb2RpZnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yTm9Ucm91YmxlRm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yT3ZlcnRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yUHJlbWl1bU92ZXJ0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclJlcGFpckFuZFJldHVybk9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclN0cmFpZ2h0LXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGVzdEFuZENhbGlicmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFkaW5nQWRqdXN0bWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudEZhY3Rvci0yMEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3ItNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXNoaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlT3JkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVQYXltZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdXREZXNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheW92ZXJDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkRmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFraW5nVW5kZXJncm91bmRTdG9yYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNob3J0ZmFsbENvbnNpZGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhblRydWNrbG9hZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXRQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlQW5kVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVsaW5lU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZ0R2F0ZVRydWNrT3JGb3JrbGlmdFNlcnZpY2VBdFBpY2stdXBEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bEZyb21Qb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxQZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFRvUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRlZERhbWFnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uQW50aS1EdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25Db3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVGF4QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRvdGFsRHVlVVNDdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25Ub3RhbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdMYWJvckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRXZWlnaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxEZWxpdmVyeURyYXlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmVEZWxheWVkSW5Td2l0Y2hpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlVW5kZXJPd25Qb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3R0ZXJ5Q2hhcmdlQmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90dGVyeUNyb3NzUmVkZWVtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvdy1UaWVyTG90dGVyeUNhc2hpbmdCb251cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93LVRpZXJMb3R0ZXJ5V2lubmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVtcFN1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nLVBvc3RhZ2VDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nLVNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsSW52b2ljZVRvRWFjaExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0RGV2ZWxvcG1lbnRGdW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZ09yVGFnZ2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFycmlhZ2VSdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1vUmV0dXJuYWJsZUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbmRpc2VQcm9jZXNzaW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NlbmdlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsc1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZC1UaWVyTG90dGVyeUNhc2hpbmdCb251cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkLVRpZXJMb3R0ZXJ5V2lubmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZWFnZUZlZUZvclJlcGFpckFuZFJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZWFnZU9yVHJhdmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGlmaWVkQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhseVJlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW91bnREZW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3VudGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXNocm9vbUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0Rpc3RyaWJ1dGlvbkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SXRlbUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3RvcmVBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N0b3JlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1dhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3V2FyZWhvdXNlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1lvcmtEZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9ya1BpY2stdXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5IRFdoYXJmYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1EdXRpYWJsZUNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbkdlbmVyYXRlZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1yZXR1cm5hYmxlQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9SZXR1cm5DcmVkaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbFB1bXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyaXplZEFmZmlkYXZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5Q29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlDb25zaWduZWVCZWZvcmVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm96emxlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNoYXJnZXMtSGF6YXJkb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN1cHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzaG9yZS1BbGFza2FIYXdhaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQ2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uRGVja0JyZWFrQnVsa0RpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lLURheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZVRpbWVFbmdpbmVlcmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lLVRpbWVMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtVGltZS1Pbmx5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmV0aW1lVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IYW5kU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFNvZnR3YXJlU3VwcG9ydEZvck9wZXJhdGlvbmFsU3VwcG9ydFN5c3RlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsU29mdHdhcmVTdXBwb3J0Rm9yU3dpdGNoaW5nU3lzdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uQ2hhcmdlQ29sb3JGYWJyaWNPZmZpY2VGdXJuaXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyLUZsYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyTm90aWZ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFjY2Vzc29yaWFsU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBZHZhbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJFeHBvcnRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckdvdmVybm1lbnRBZ2VuY3lEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHb3Zlcm5tZW50QWdlbmN5RXhhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTWlzY2VsbGFuZW91c0Vhcm5pbmdPckFkZGl0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclNlZVJlbGF0ZWREZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZSb3V0ZU1pbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZlpvbmVQaWNrLXVwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUNhYmxlQ29ubmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlckRpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlckhlaWdodENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnJ1bkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNpemVkUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyV2lkdGhDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0NyYXRpbmdBbmRIYW5kbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0NyYXRpbmdIYW5kbGluZ0FuZFRyYW5zcG9ydGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrSW52b2ljZVdpdGhTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpbnRpbmdQcmltZXJPckZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRFeGNoYW5nZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0aXppbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFsbGVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJpc2hDb3VudHlTYWxlc1RheE9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NpbmdTaGlwcGVyc0V4cG9ydEVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWRkaXRpdmVzT3ZlcnRpbWVMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbEFkZGl0aXZlc1N0cmFpZ2h0VGltZUxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlY2FuRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50RGlmZmVyZW50aWFsLUxlc3NUaGFuQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZTaGlwbWVudFZhbHVlVGhhdElzUmV0dXJuYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mU2hpcHBlZFF1YW50aXR5VGhhdElzUmV0dXJuYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckl0ZW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0c0JvbmRzRXNjb3J0QXR0ZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJPcmRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyUG91bmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob3NwaGF0aXppbmdTdGVlbFRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja2xlQW5kT2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2stdXBBbmREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwLU91dE9mQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyQ2hhcmdlc090aGVyVGhhbldoYXJmYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyQ2hhcmdlcy1XaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllclBpY2stdXBBbmRPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdEluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudEFuZE9yUmVtb3ZhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xlTGFzaGluZ0VxdWlwbWVudFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sZVdvb2QtU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ya0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRIYW5kbGluZ0FuZFVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdERhbWFnZWRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90YXRvRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlckZhY3RvckFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNhcnJpYWdlRXhjZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjaW91c01ldGFsQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbG9hZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbG9kZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pc2VVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZFVzYWdlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25BbmREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkFpcldheWJpbGwtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQ2FuYWRpYW5DdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkNvbW1lcmNpYWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mRXhwb3J0RW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZJbnN1cmFuY2VDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZlVTRXhwb3J0RG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLVBvc2l0aW9uZWRJbnZlbnRvcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0JpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudFBlcmNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQW5kTWFya2V0aW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZURldmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJpbGxpbmdBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yRGVsaXZlcnlPZkJpbGxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JNb250aENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZU93bmVkVmVoaWNsZVByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NJblRyYW5zaXRQcml2aWxlZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mb3JtYUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudFJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZDb21wb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2UtQ29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2UtSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZUhvdXNlaG9sZElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVOYW1lQW5kQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVsbGluZ0V5ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBBaXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbGhlYWRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVSZWR1Y3Rpb25Cb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLUJpbGxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmlsbGVkRHJheWFnZS1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViaWxsZWREcmF5YWdlLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNpcGllbnRBZGRyZXNzQ29ycmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXJIYW5kbGluZ0NodXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkZlZGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uU2hhcmVkUmVzcG9uc2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uY2lsaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbm5lY3RjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbkNvbnNpZ25lZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWduRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbm1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29vcGVyaW5nQXRPd25lcnNPclNoaXBwZXJzRXhwZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3JhdGluZ1JlY29vcGVyaW5nLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyYXRpbmdSZWNvb3BlcmluZy1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0hhcmR3YXJlTWFpbnRlbmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0xpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ1NvZnR3YXJlTWFpbnRlbmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGlzdHJpYnV0aW9uQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y3Rpb25QcmVwYWxsZXRpemVkQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlckNhcmdvUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxDYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb25NZWNoYW5pY2FsRGV0ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVyYmlzaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25PZkV4cG9ydEZvclJlZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mRXhwb3J0U2hpcG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5UmVxdWlyZWRSZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlhYmlsaXR5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpbnF1aXNobWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvbkFudGktRHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25Db3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25UYXhBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25Ub3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25Ub3RhbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsRGVkdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50c0FuZExlYXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWNrQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckF0QnV5ZXJzRXhwZW5zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRDdXN0b21lckV4cGVuc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckF0R292ZXJubWVudEV4cGVuc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0VmlhQ2FuYWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlYXJjaERldmVsb3BtZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlbGxlcnNEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb3R0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0b2NraW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXJ0aWNsZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNhcmdvQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZExvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJld29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlkaW5nQXR0ZW5kYW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2NreU1vdW50YWluQnVyZWF1NTgzSXRlbTExMDBBcmJpdHJhcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxPdXRBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsUmViYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3lhbHRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbHZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWUtRGF5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrLVVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2stdXBPckRlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVDaGFyZ2VVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmFwQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNpZ25hdHVyZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ3JlZ2F0aW5nU29ydGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmVW5sb2FkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckhhbmRDYXJyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUFzc2lzdGFuY2VQcm9ncmFtU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlV2l0aENhc2hEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVVwZ3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldC11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlYXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWVwRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRBbmRDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRDYXJyaWVyQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQ29uc2lnbmVlVW5sb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdBbmRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHNpZGVQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUb1N0b2NrUXVhbGl0eUF1ZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG90Ymxhc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmlua2FnZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmstV3JhcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yT3JpZ2luYXRpb25EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yT3JpZ2luYXRpb25Qb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yUG9ydE9mRW1iYXJrYXRpb25EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlSW52b2ljZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlU2hpcG1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWV2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0VW5sb2FkaW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbG90dGluZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxPcmRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVTdXBwb3J0U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENpcmN1c1RyYWlucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRGV0ZW50aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRXF1aXBtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRmluaXNoQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRnJlaWdodFN1cHBsZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNaWxlYWdlTW92ZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGVybWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFB1bXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxTZWFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUZXN0RXF1aXBtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVG9vbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRvb2xpbmdyZXdvcmtjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUcmFpbk1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVmVoaWNsZVJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25SZXZpZXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFBpY2stVXBBdFBpZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90dGluZ09mVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ByZWFkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1wRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRieUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVNZXRyb3BvbGl0YW5UcmFuc2l0QXV0aG9yaXR5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU1vdG9yRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTYWxlc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWFtaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVuY2lsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXRPcmlnaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdFBpZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wcGluZ0luVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWlnaHRlbmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJlZXRMYW1wc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyaXBwaW5nU29ydGluZ0FuZENvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWZmaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVmZmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFRvQ29vcGVyYXRpdmVBZHZlcnRpc2luZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFRvVGF4T25SZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZlcmFuY2VXYXJlaG91c2VDaGFyZ2VFeHBvcnRPckltcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnYXJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bU9mQWRkc0FuZERlZHVjdHNUb01ha2VNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VuZGF5T3JIb2xpZGF5UGljay11cE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyQmFnQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2VsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dpdGNoQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2l0Y2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcnBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUFpcnBvcnRUYXhEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUFpcnBvcnRUYXhPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1CZXZlcmFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUNpdHlTYWxlc1RheE9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUV4Y2lzZVRheC1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUV4Y2lzZVRheC1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1GZWRlcmFsRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRmVkZXJhbEV4Y2lzZVRheE9uVGlyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Hb3Zlcm5tZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1IYW5kbGluZ0NoYXJnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGlhYmlsaXR5LUFtb3J0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGlhYmlsaXR5LU9uZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Mb2NhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTG9jYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1NZXRyb3BvbGl0YW5UcmFuc2l0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhPbk1pc2NlbGxhbmVvdXNDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhPblRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtUmVndWxhdG9yeVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVNhbGVzYW5kVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU2FsZXNUYXhTdGF0ZUFuZExvY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3RhdGVIYXphcmRvdXNTdWJzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN1cGVyRnVuZEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5vbG9neUV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlZ3JhbUNoYXJnZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmUtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5Vm9sdW50YXJ5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJlZEFzVHJ1Y2tsb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxEaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsSGFuZGxpbmdDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbFNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RRdWFsaWZpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UGFsbGV0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaHB1dEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaHB1dENvbnRhaW5lckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhydXdheUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlja2V0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9iYWNjb1Byb2R1Y3RzUmVwb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUT0ZDU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ1Jld29ya0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbHNGb3JQcmludGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBc3Nlc3NvcmlhbENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRHVlVVNDdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudE5vbi1VU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudFVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxNYXRlcmlhbEludm9pY2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNpbmdJbmJvdW5kVmlhT3RoZXJDYXJyaWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2luZ1NlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNrU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVJbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFuZFNldHVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkNoYXJnZU1pbmltdW1SYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkRpcmVjdEJpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uVGhpcmRQYXJ0eUJpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uVmVuZG9yUHJvdmlkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW1taW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0RldGVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tsb2FkRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1cm5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3by1EYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd29Eb29yUGlja1VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFic29yYmVkU3dpdGNoaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdMYWJvckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ1JlbG9hZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zYWxlYWJsZU1lcmNoYW5kaXNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNjaGVkdWxlZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlUGxhbkRldGFpbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUZsYXRBc3Npc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VNYXhpbXVtQXNzaXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RBSW5zcGVjdGVkU3RhbXBpbmdDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VDaGFyZ2VUb29saW5nUGVyc29ubmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2UtU3BlY2lhbFR5cGVGbGF0Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZlaGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbkNsZWFuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlT3JkZXJlZEJ1dE5vdFVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVQcmVwQ2hhcmdlQ291cnRlc3lEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVJvYWRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbnRpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpcmdpbklzbGFuZFRyYW5zZmVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50YXJ5Q29udHJpYnV0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl0aW5nVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0NyZXdJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlZEZ1dGlsZVRyaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVybWVsb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGxBbmRJbnZvaWNlRGlzdHJpYnV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWF0aGVyUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0VmVyaWZpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZS1CcmVha2J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZS1Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZGVBcmVhVGVsZXBob25lU2VydmljZVVzYWdlQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWxsQ2FsbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdHRlblByb29mT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWC1yYXlDaGFyZ2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJhc2lzTW9uZXRhcnlSYW5nZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlMaW1pdCIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2lzTW9uZXRhcnlSYW5nZSIgdHlwZT0iQmFzaXNNb25ldGFyeVJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNb25ldGFyeVJhbmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNaW5pbXVtTW9uZXRhcnlWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNYXhpbXVtTW9uZXRhcnlWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeVJhbmdlIiB0eXBlPSJNb25ldGFyeVJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNb25ldGFyeUxpbWl0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeUxpbWl0VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeUxpbWl0IiB0eXBlPSJNb25ldGFyeUxpbWl0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiIHR5cGU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJRdWFudGl0eU1vbmV0YXJ5VmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiIHR5cGU9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJhdGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGVQZXJVbml0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2VCYXNpcyIgdHlwZT0iRGVjaW1hbDE4XzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGUiIHR5cGU9IlJhdGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDE4XzMiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSIzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGVyY2VudFF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnQiIHR5cGU9IkRlY2ltYWwxMF80Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJjZW50YWdlTW9uZXRhcnlWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlZCIgdHlwZT0iUGVyY2VudFF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50UXVhbGlmaWVyIiB0eXBlPSJQZXJjZW50UXVhbGlmaWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUxpc3RDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTmV0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtR3Jvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LU5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlcGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUHJpY2VBbW91bnRMZXNzUHJldmlvdXNEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TW9udGhseU9uQWxsSW52b2ljZXNQYXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudENoYXJnZUJhc2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxSYXRlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbW11dGFibGUiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZUxpbmsiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cHBsaWVyU2hvcHBpbmdDYXJ0SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlJvdW5kVHJpcE9yZGVyIiB0eXBlPSJ4Y2JsQm9vbGVhbiIgZml4ZWQ9InRydWUiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iIHR5cGU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU3RydWN0dXJlZE5vdGUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIiB0eXBlPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0dXJlZE5vdGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iR2VuZXJhbE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5vdGVJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5vdGVVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRleHRUeXBlQ29kZWQiIHR5cGU9IlRleHRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGV4dFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVkTm90ZSIgdHlwZT0iU3RydWN0dXJlZE5vdGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGV4dFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZGxpbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5Rm9yQnJlYWNoT2ZDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSaWRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckNvbnRyYWN0dWFsU3RpcHVsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvUmVjb3JkUE9UZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFBPVGV4dCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTmFtZVZhbHVlU2V0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVNldCIgdHlwZT0iTGlzdE9mTmFtZVZhbHVlU2V0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lVmFsdWVTZXQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNldE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNldElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lVmFsdWVTZXQiIHR5cGU9Ik5hbWVWYWx1ZVNldCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTmFtZVZhbHVlUGFpciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iTmFtZVZhbHVlUGFpciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mTmFtZVZhbHVlUGFpciIgdHlwZT0iTGlzdE9mTmFtZVZhbHVlUGFpciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZVZhbHVlUGFpciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRhdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZVZhbHVlUGFpciIgdHlwZT0iTmFtZVZhbHVlUGFpciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQXR0YWNobWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQXR0YWNobWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQXR0YWNobWVudCIgdHlwZT0iTGlzdE9mQXR0YWNobWVudCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXR0YWNobWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50QWN0aW9uQ29kZWQiIHR5cGU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50QWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaWxlTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudFRpdGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1JTUVUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXBsYWNlbWVudEZpbGUiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudExvY2F0aW9uIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJBdHRhY2htZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcGRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFuZ2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkl0ZW1EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJEZXRhaWwiIHR5cGU9Ik9yZGVyRGV0YWlsIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJdGVtRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJdGVtRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZJdGVtRGV0YWlsIiB0eXBlPSJMaXN0T2ZJdGVtRGV0YWlsIi8+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+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVRhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2F0ZWdvcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0ZWdvcnlJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJTdGFuZGFyZENhdGVnb3J5SUQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3J5IiB0eXBlPSJDYXRlZ29yeSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeUlEIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFuZGFyZENhdGVnb3J5VHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNsYXNzaWZpY2F0aW9uSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlY2huaWNhbElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFuZGFyZENhdGVnb3J5SUQiIHR5cGU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUXVhbnRpdHlDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUXVhbnRpdHlDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUXVhbnRpdHlDb2RlZCIgdHlwZT0iTGlzdE9mUXVhbnRpdHlDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlDb2RlZCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZWQiIHR5cGU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5Q29kZWQiIHR5cGU9IlF1YW50aXR5Q29kZWQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVVuc2VydmljZWFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlQXZlcmFnZU92ZXJkdWVEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BsYWNlZEZvckNvbGxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVBY2NvdW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnREb3NlUGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudERvc2VQZXJVbml0RGlzcGVuc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGlzdGluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZU1haW50ZW5hbmNlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsVW5pdHNDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRlZEVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlbWFuZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUHJvbW90aW9uU2FsZXNGb3JlY2FzdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUmVwbGVuaXNobWVudERlbWFuZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsVXNhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRDb3JyZWN0b3JSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50VG9JbnZlbnRvcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlQXREZWF0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZEFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZExpbmVJdGVtc0NvbXBsZXRlZC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VkTGluZUl0ZW1zRGVsaW5xdWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlSGlnaFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VMb3dWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTW9kaWZ5aW5nVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU5lYXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU5leHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlT2ZGaW5hbmNpYWxJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRlQmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmFsV29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRSYWRpb3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVBdHRlbmRhbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvY2F0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3R0ZWRVc2FnZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFRpbWVCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25DdW11bGF0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uVGVybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uVG90YWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWRMZW5ndGhPZlNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT3JPZmZlckR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVOdW1iZXJPZkhvbGRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZVbml0c0ZvclNhbGVQcm9qZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZVbml0c1Byb2plY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYURhbWFnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFPZkxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhUGVyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzSXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRTZWl6ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdENvbXBsZXRlVmFyaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0Q29tcGxldGlvblF1YW50aXR5RXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRhbnQtSGFuZGxlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNlZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJldGVudGlvbkxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlUmVzb3VyY2VUYXNrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlTnVtYmVyT2ZFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrb3JkZXJMaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja29yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtSZWplY3RJdGVtQ291bnQuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UGV0aXRpb25zRmlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGhyb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGhyb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHJvb21Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1VuaXRQZXJQcmljaW5nVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb29kUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zTGVhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnNPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoT2ZmaWNlTG9jYXRpb25zRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm90aGVyc0RlY2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm90aGVyc0xpdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRlZEhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NsYXNzRmFpbHVyZUluY2lkZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZUNsYXNzSW5jaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVJbmR1c3RyeUluY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlTmF0aW9uYWxBdmVyYWdlSW5jaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5dXBPckJ1eWRvd25SYXRlUGVyQmFzaXNQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnl0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGFsQ2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkUmVnaXN0ZXJlZE51cnNlQW5lc3RoZXRpc3ROdW1iZXJPZkNvbmN1cnJlbnRQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VzSW5DYXBpdGFsU3RydWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVDdWJpY01lYXN1cmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZURpc3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZkF4bGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZDb250YWluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZQYWNrYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mUmFpbFdhZ29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlVGFyZVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGF0aW5nT2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVya3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTdGF0ZW1lbnRCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RvY2tCYWxhbmNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvMkluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJlZC1BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyZWQtRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsUmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXRtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXR0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5U2VydmljZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW5pZXNJbmNsdWRlZEluQ29uc29saWRhdGVkRmluYW5jaWFsU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW5pZXNJbmNsdWRlZEluQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5TYW1lQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmlzb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkQ29udHJhY3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFByb2plY3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRNZXRlclJlYWRpbmdDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY3VycmVudEl0ZW1PdXRwdXRPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkRGlzY291bnRJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyUmVzZXJ2ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWFuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCdXlkb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJ1eXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvbXBsZXRlZERlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RMaW5lSXRlbVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yQXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckN1bXVsYXRpdmVUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0c0NvbXBsZXRlZERlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0c0NvbXBsZXRlZERlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsTW9iaWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGlvbnNTZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZVNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2RDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1WZXJiYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1Xcml0dGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVyQ2xlcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vyc2VTZWdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWQtQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVCdWRnZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVFYXJuZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUVmZmVjdE9mUHJpb3JQZXJpb2RBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlR2FzSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlR2FzVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlTGlxdWlkSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlT2lsT3JDb25kZW5zYXRlVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbEVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5QWN0dWFsTWVhc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbFBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eU9yZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZEVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kTWVhc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZFBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZFJlYWNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZWNlaXZlZEVuZE9mUHJpb3JZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25DcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUGVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25SZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVxdWlyZWRQcmlvclRvVGhlRmlyc3RTY2hlZHVsZWRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2NoZWR1bGVkVXBUb0FjY3VtdWxhdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZExvbmctRGlzcG9zaXRpb25DaGFsbGVuZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkTG9uZy1EaXNwb3NpdGlvblBlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRTaG9ydC1EaXNwb3NpdGlvbkNoYWxsZW5nZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRTaG9ydC1EaXNwb3NpdGlvblBlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVTY2hlZHVsZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlU2NyYXBRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlV2F0ZXJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREYXlzT25NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdGlibGVCbG9vZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0Tm90aWZpY2F0aW9uUmVzcG9uc2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZ3JlZVNlZ21lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUJhdGNoTXVsdGlwbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UXVhbnRpdHlCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50Q291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudHNBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudFRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0cm95ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0cmltZW50YWxMZWdhbEZpbGluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsTGVnYWxGaWxpbmdzQWdhaW5zdERpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZW5zaW9uYWxTYW1wbGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RTaGlwbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RXb3JrZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZWV0UXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25SZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2l0aW9uVW5kZXRlcm1pbmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNBZmZpbGlhdGVkQ29tcGFuaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY1VzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWUtSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmF0aW9uSW5DdXJyZW50Sm9iIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEd2VsbGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5lZFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZUN1bXVsYXRpdmVUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5lZFZhbHVlSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxhcHNlZER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljU2lnbmF0dXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kLUFjY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZC1TaWNrbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5TW9kaWZ5aW5nVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQXRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRBdFRoaXNMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRCeVRoaXNDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Byb2Zlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkT25UaGlzSm9iIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUF2ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtTm9ub3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc05vdEluY2x1ZGluZ093bmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzTnVtYmVyT2ZEYXlzQXdheUZyb21Xb3JrRHVlVG9Jbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc051bWJlck9mRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1QYXJ0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLVNhbWVEdXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1TYW1lT2NjdXBhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzU2hhcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNUb3RhbE51bWJlck9mRGF5c0F3YXlGcm9tV29ya0R1ZVRvSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbEZpcnN0TW9udGhPZlF1YXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxTZWNvbmRNb250aE9mUXVhcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbFRoaXJkTW9udGhPZlF1YXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1N0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZk1vbnRoSW52ZW50b3J5UHJpb3JUb1NoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmVkU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWl0eVNlY3VyaXR5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZUF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFubnVhbFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZW1haW5pbmdFY29ub21pY0xpZmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlbWFpbmluZ1BoeXNpY2FsTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkVG90YWxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YXBvcmF0ZWRXYXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhpc3RlbmNlTGltaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuZGl0dXJlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkVGVybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFVbnBsYW5uZWREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRXb3JrZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlU2l6ZUFmdGVyQ29tcHJlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVTaXplQmVmb3JlQ29tcHJlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsRGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQ292ZXJhZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoT2Zmc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhcmVPckZsYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yc09jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdGVkU2Nhbm5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFRvQ29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25SZWxhdGVkRW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVtZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUZsb2F0LUluQ2FsZW5kYXJVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUZsb2F0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVsYW5jZURlYnRDb2xsZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlbGFuY2VTYWxlc3BlcnNvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVRdWFudGl0eUluY2x1ZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUXVhbnRpdHlOb3RJbmNsdWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsQ29uc3VtZWRPckJ1cm5lZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFB1bXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsQmF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxHcm91cHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxTYW1wbGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVybmlzaGVkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FyYWdlT3JDYXJwb3J0QXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNMaWZ0Vm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZWNlaXB0Vm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZXR1cm5lZFRvRWFydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1JldHVybmVkVG9Qcm9wZXJ0eUZvckZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1Nocmlua2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzU29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvckRyaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yRnVlbFN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvclBsYW50RnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvclJlcHJlc3N1cmluZ09yUHJlc3N1cmVNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZE9uUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ZlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsRWxpbWluYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZXBvcnRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVUcmFuc2ZlckFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NBbm51YWxJbmNvbWVNdWx0aXBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0J1aWxkaW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NFc3RpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NMaXZpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0xpdmluZ0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NSZW50TXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZUJ1eXVwTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRmVlUmF0ZUFmdGVyQWx0ZXJuYXRlUGF5bWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRmVlUmF0ZUFmdGVyQnV5dXBPckJ1eWRvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoRmFicmljYXRpb25BdXRob3JpemF0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hSYXdNYXRlcmlhbEF1dGhvcml6YXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tQWlyY3JhZnRPclR5cGVGbHlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tQWlyY3JhZnRUeXBlT3JMaWZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0VHlwZU9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUxpZmV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLVR5cGVGbHlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFpcm1lbnREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWlybWVudEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jcmVtZW50YWxPcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpcmVjdEVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlCdXNpbmVzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByb3ZpZGVyU3RhbmRhcmRpemVkTW90b3JWZWhpY2xlUGVuYWx0eVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZWFkaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlZENhcGFjaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1ZmZpY2llbnRGdW5kc1JldHVybmVkQ2hlcXVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZW5kZWRDaGFuZ2VUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdEZvck92ZXJkcmF3bkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1UZXJtUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnRhbmtUcmFuc2ZlckFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UcmFuc2l0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q2F0ZWdvcnlUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5RGlzY3JlcGFuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeU1vdmVtZW50UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeU9uU2hlbGZXb3JrSW5Qcm9ncmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UXVhbnRpdHlBdFN1cHBsaWVyc05vdFN1YmplY3RUb0luc3BlY3Rpb25CeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlRdWFudGl0eUF0U3VwcGxpZXJzU3ViamVjdFRvSW5zcGVjdGlvbkJ5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVdpdGhkcmF3YWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9sdmVtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZWRTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkphaWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZW1lbnRzUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ21lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbFN0YXlEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ckhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWdUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kSG9sZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZFNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0Q3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdTdWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUGVyaW9kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZ3RoT2ZSZXNpZGVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsUmVzb3VyY2UtUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsUmVzb3VyY2VUYXNrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsc09jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlV2l0aGRyYXdhbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlV2l0aGRyYXdhbHNTZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbnNSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZldGltZUNhcGFjaXR5T2ZUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlLVRpbWVSZXNlcnZlLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZXRpbWVSZXNlcnZlRGF5cy1BcHBsaWVkVG9UaGlzQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmUtVGltZVJlc2VydmUtRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1zQ29tcGxldGVkRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lVGhyZWFkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZEluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGl2ZXN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJlcGF5bWVudFRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzT3JHYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0R2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0R29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RPaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RXb3JrVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdFdvcmtUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZWRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lUmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQcmljZUNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0Y2hpbmdFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsT24tQm9hcmRRdWFudGl0eVByaW9yVG9Mb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QtQWNjaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kQWNjaWRlbnRUb0FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QtU2lja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kU2lja25lc3NUb0FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bURlbGl2ZXJ5QmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1Gb3JlY2FzdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTWF0dXJpdHlFeHRlbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mRW1wbG95ZWVzQXRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mUHVyY2hhc2VPcmRlcnNBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZTaGlwbWVudHNBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVByb2R1Y3Rpb25CYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVF1YW50aXR5VG9XaGljaFRheFJhdGVBcHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUmVxdWVzdGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVNoaXBRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN0YWNrYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN0b2NrTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdXBwbHlRdWFudGl0eVN1cHBsaWVyRW5kb3JzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1UcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2F0aW9uRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlcnNJbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzZW5nZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVNhbGVzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxpb25Eb2xsYXJSb3VuZHRhYmxlQ3JlZGl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUF2ZXJhZ2VUaW1lUmVxdWlyZW1lbnRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUNvbnRyYWN0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1DcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1EZWxpdmVyeUJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRW1wbG95ZWVzQXRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUZhYnJpY2F0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Gb3JlY2FzdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtTnVtYmVyT2ZFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclBhY2thZ2VMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Qcm9kdWN0aW9uQmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1RdWFudGl0eVRvV2hpY2hUYXhSYXRlQXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJlcXVlc3RhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TaGlwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TdG9ja0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vYmlsZUxvYWRpbmdBbGxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbE9yVGFyZ2V0U3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZVBvb2xDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEJ1c2luZXNzRmFpbHVyZUluY2lkZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0UXVhbnRpdHlEZWNyZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0UXVhbnRpdHlJbmNyZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0VG9QYXlJdGVtQ291bnQuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0RlbGl2ZXJ5UmVxdWlyZW1lbnRJblRoaXNJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUJpbGxhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbW1pdHRlZEludmVudG9yeU9uU2hlbGYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbmZvcm1hbmNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db25zb2xpZGF0ZWRUb3RhbC1Eb21lc3RpY1N1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnNvbGlkYXRlZFRvdGFsLUZvcmVpZ25TdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvdmVyZWQtQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ292ZXJlZC1Fc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Eb21lc3RpY1N0b2NraG9sZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZXhjbHVzaXZlVXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVVuaW9uRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVXJnZW50RGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbFJlYWRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVwbGFjZWRCbG9vZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1ZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFjY291bnRzUGFzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBY3RpdmVBY2NvdW50c1RoaXNDeWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBZGRlZExvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBZGp1c3RtZW50UGVyaW9kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBdHRhY2tzT3JPY2N1cnJlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZCYXRjaGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkJvcnJvd2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDYXJkc05vdFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNhcmRzT3V0c3RhbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2hlY2tzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNsYWltYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDbG9zZWRMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ28tSW5zdXJhbmNlRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDb3BpZXNPZkJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDcmV3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRheXNDb3ZlcmVkQnlJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWxpbnF1ZW50SW5zdGFsbG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlbGl2ZXJpZXNQZXJEZXNwYXRjaFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZXBlbmRlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkVuZFVzZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkVudGl0bGVkRXhlbXB0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZGYWlsZWRCdXNpbmVzc2VzT2ZEaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRnJhbmNoaXNlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRnVsbC1UaW1lRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkhvc3BpdGFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJZGVudGljYWxIYW5kbGluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkluc3VyZWRMaXZlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJbnRlcmVzdFBheW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZklycmVndWxhckludGVyZXN0UGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNBdXRob3JpemVkQXRTdG9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJdGVtc0F1dGhvcml6ZWRBdFdhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJdGVtc0luU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGF0ZUNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGV2ZWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxpbWl0ZWRQYXJ0bmVyc2hpcFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTG9hbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTG9zdENhcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1lbWJlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTWVzc2FnZVJlY2lwaWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vcnRnYWdvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTW91bGRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk5vbi1Db3ZlcmVkRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZOb25zdWZmaWNpZW50RnVuZEl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9wZW5BY2NvdW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVyYXRpbmdQZXJpb2RzQXRGYWlsdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9wZXJhdG9yQ3JlZGl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcmlnaW5hbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGFja2FnZXNJbkhhbmRsaW5nVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYXNzZW5nZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhdGllbnRBZG1pc3Npb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBlb3BsZUxpdmluZ0F0UmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBoeXNpY2lhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUHJvZHVjaW5nV2VsbHNSZW1haW5pbmdPblByb3BlcnR5T3JGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQcm9kdWNpbmdXZWxsc1JlbWFpbmluZ09uUm95YWx0eUFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUXVhbnRpdGF0aXZlSW5jZW50aXZlU2NoZW1lVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2VydmljZXNPclByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2hlbGZGYWNpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNoZWxmVGFncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaWduZWRCaWxsc09mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlN0YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlN0b2xlbkNhcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlN0b3BzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRoZWF0cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRpbWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRpbWVzRGVwb3J0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVHJhbnNwb3J0RG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzLUhvdXNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNJblRoZURlcHRoT2ZBTGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNJblRoZVdpZHRoT2ZBTGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5zaWduZWRCaWxsc09mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZldpdGhob2xkaW5nRXhlbXB0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyc09mQ29uc3VtZXJVbml0c0luVGhlVHJhZGVkVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyV2Vla3NQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9lbUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlV29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmTGVhc2VGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQcmVtaXNlU2FsZXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUHJlbWlzZXNTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQ29uZGVuc2F0ZVNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbENvbmRlbnNhdGVVc2VkT25Qcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsT3JDb25kZW5zYXRlVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxTZWRpbWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxUaGVmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IYW5kQW5kRHVlLUluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhvbGRGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25PcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblByZW1pc2VTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblByZW1pc2VzU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5pbmdTdGF0ZW1lbnRCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nU3RvY2tCYWxhbmNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nQmVkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nRGl2aXNpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvcnNXb3JraW5nSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyUXVhbnRpdHlNdWx0aXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTG9hblRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUGF5bWVudEl0ZW1Db3VudC4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVGVybUluWWVhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckdhc0Rpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJNaXNjZWxsYW5lb3VzRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyT2lsQ29uZGVuc2F0ZURpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkUGFydGljaXBhbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkU3RvY2tob2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlcldhclJlc2VydmVNYXRlcmlhbFJlcXVpcmVtZW50c1Byb3RlY3RhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyV2F0ZXJEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0bGllckRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mSW52ZW50b3J5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHN0YW5kaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHN0YW5kaW5nU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtVHVybmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJmbG93UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzRXF1aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDaGFuZ2VBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBQZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25PY2N1cGF0aW9uUXVhbGlmaWNhdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLUluQ29tbW9uU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLUluUHJlZmVycmVkU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLUluU2VjdXJpdHlTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmtpbmdTcGFjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxCYXRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGlvblNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRUaW1lRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXN0RHVlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q2FuY2VsbGF0aW9uSXRlbUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVyYXRpb25XZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEV4cGVyaWVuY2VzSW5UaGVMYXN0MTJNb250aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFeHBlcmllbmNlc0luVGhlTGFzdDNNb250aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlcnNGaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudHNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRhZ2VPZk9yZGVyZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kaWNDYXBhY2l0eU9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZFbXBsb3ltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eU1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFF1YW50aXR5UmVhY2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc2lzdGVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldGl0aW9uc0ZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFN0YXR1c0lpaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNJdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZWNlc0RlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsZmVyYWdlR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbG90cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVBZGp1c3RtZW50T3JBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXR0ZWRXYXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50UGVyaW9kRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZFVuaXREZXZlbG9wbWVudFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudFNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50V29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydGFibGVSYWRpb3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRlZFRlbGVwaG9uZUxpbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LU9wRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG91bHRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZG9taW5hdGVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1PcERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRRdWFudGl0eU5vdFNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRRdWFudGl0eVNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1Qcm9kdWN0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRG9zYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25FZmZlY3RpdmVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50aWFsVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzdXJlQmFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCZW5lZml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdW11bGF0aXZlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSGlnaGVzdEN1bXVsYXRpdmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseUFtb3J0aXNlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01vbnRoc1VzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTnVtYmVyT2ZCcmFuY2hMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTnVtYmVyT2ZFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzT3JkZXJRdWFudGl0eVRvQmVDYW5jZWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzV2Vla1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1RvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljaW5nVW5pdFBlckJpbGxpbmdVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TWFuYWdlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlNZXRlclJlYWRpbmdWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU5ldFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxzSW5jbHVkZWRBc0VtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDdW11bGF0aXZlSW1iYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclVuaXRzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2JhdGlvbkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNpbmdXZWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEV4Y2hhbmdlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uUmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uV29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNhbGVzQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEF2YWlsYWJsZUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBoYXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdHNJblByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RVbml0c1NvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Rlc3RlZEJpbGxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvblR1cm5TaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9mUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWNhdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmeWluZ1dlZWtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbEZhaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xIZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0YXRpdmVJbmNlbnRpdmVTY2hlbWVCYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUFkdmlzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXBwcm92ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXQxMDBQY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlRm9yUmV0dXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZUZvclNhbGUtU3RvY2tRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVPblNoZWxmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF3YWl0aW5nRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QnlQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlDYW5jZWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Q2FycmllZEZvcndhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGVmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc2FwcHJvdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc3BlbnNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNwbGF5ZWROb3RBdmFpbGFibGVGb3JTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUVhcm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlIZWxkQnlEZWxpdmVyeVZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5TG9naXN0aWNTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5UmV0YWlsT3V0bGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluRmxvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5Ib2xkT3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluTWFudWZhY3R1cmluZ1Byb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5QaHlzaWNhbEludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJblF1YXJhbnRpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUxhbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlMb2FkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TWFuaWZlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlOb3RBdmFpbGFibGVGb3JEZXNwYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPZkRlYWxlckxpY2Vuc2VQbGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T2ZNYXRlcmlhbEluT3JkZXJlZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T25IYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9uSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJOZXh0SGlnaGVyQXNzZW1ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyUGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJTa2lkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclVuaXRPZklzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlbWFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJlbWVudEZvck1haW50ZW5hbmNlQW5kUmVwYWlyT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyZW1lbnRGb3JTYW1wbGVJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmluZ01hbmlwdWxhdGlvbkJlZm9yZURlc3BhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJldHVybmVkRGVmZWN0aXZlT3JEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTZXJ2aWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNvbGROZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VzcGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVRvQmVEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlXaXRoZHJhd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5V2l0aGhlbGRCeU93bmVyT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVRdWFudGl0eU9uSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZUF2ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VNaW5pbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlUGVyRGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRBbmRBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWROb3RBY2NlcHRlZFRvQmVEZXN0cm95ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTm90QWNjZXB0ZWRUb0JlUmV0dXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGVkTWFpbnRlbmFuY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21tZW5kZWRPdmVyaGF1bEFuZFJlcGFpclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZGVyYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGVsaXZlcnlBZnRlclBvc3RQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbGxzQXV0aG9yaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJyYW5kc0Rpc3RyaWJ1dGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnJhbmRzTWFudWZhY3R1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZFJldHVyblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkQnVzaW5lc3NFbnRpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZEVudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGlvbnNoaXBEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVzRW1wbG95ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ0F1dGhvcml6ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluaW5nRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyaW5nTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlb3JkZXJQb2ludFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRCbG9vZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50T3ZlcnJpZGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnREaWZmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlZERlZmljaWVuY2llcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudFF1YW50aXR5VGhhdFdhc1ByZXZpb3VzbHlSZWxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlzaXRpb25pbmdPYmplY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVkUXVhbnRpdHlDdXN0b21lckRpcmVjdERlbGl2ZXJ5U2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVkUXVhbnRpdHlSZXRhaWxTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlLVF1YW50aXR5LUF2YWlsYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGlvbkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZW50aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkQnlDb25zdW1lclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuc1JlcGxhY2VtZW50UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9vbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5TGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzcGVyc29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNRdWFudGl0eU5vdEluY2x1ZGVkSW5UaGVSZXBsZW5pc2htZW50Q2FsY3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUXVhbnRpdHlQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYXR0ZXJlZFZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcEFsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmFwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlOZXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZENoYXJnZXNSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0aWVzU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVyc0hvbGRpbmdSZW1haW5kZXJPZlNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNBZGRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzRGVsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzSGVsZEFzVHJlYXN1cnlTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT2ZDb21tb25TdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT2ZQcmVmZXJyZWRTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT3duZWRCeUluLVN0YXRlUmVzaWRlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPd25lZEJ5T3V0LU9mLVN0YXRlUmVzaWRlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNTdWJzY3JpYmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNTdWJzY3JpYmVkQnV0Tm90SXNzdWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdGljZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydC1MYW5kZWRHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxlbnRQYXJ0bmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luY2VMYXN0VHJhdmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXN0ZXJzRGVjZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpc3RlcnNMaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemVPZkhvdXNlaG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZFdvcmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzc1VzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29ydGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRlZFF1YW50aXR5UmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNlT2NjdXBpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYXJ0bmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRDYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0T2Zmc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2VNb3RvclZlaGljbGVQZW5hbHR5UG9pbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbFNhbGVzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrVHJhbnNmZXJzSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrVHJhbnNmZXJzT3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9sZW5DaGVxdWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yQXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckN1bXVsYXRpdmVUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZWRRdWFudGl0eVJldHVybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZWRRdWFudGl0eVNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnREZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGlvbmFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1aXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJFc3RpbWF0ZWRMYXRlc3RNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRXN0aW1hdGVkUHJldmlvdXNNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycGx1c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlzSW5BdmVyYWdlUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5kZWREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dhbi1HYW56Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWJsZXNBdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbGtQYXRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmTG9zc0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFjaGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2lhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZW9yZXRpY2FsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRXhwZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVGcmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUluQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUluUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUhvc3BpdGFsaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdEFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0Q2l2aWxpYW5GbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RJbnN1cmFuY2VNZWRpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0TWlsaXRhcnlGbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU1lZGljYWxDb25zdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2F0aW9uRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2F0aW9uU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU9uc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VTdXJnZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VUcmlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c0tub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNQZXJTaGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzU3BlbnRPbkR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb0NvbXBsZXRlUXVhbnRpdHlFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbGVyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQWRqdXN0bWVudHNWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQW1vcnRpc2F0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBdXRob3JpemVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQmVnaW5uaW5nSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc0Fzc29jaWF0ZWRXaXRoUmVwZWF0ZWRUcmF1bWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aERpc29yZGVyc0R1ZVRvUGh5c2ljYWxBZ2VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aER1c3REaXNlYXNlc09mVGhlTHVuZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aG91dERheXNBd2F5RnJvbVdvcmtBbmRXaXRob3V0UmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoUG9pc29uaW5nSWxsbmVzc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhSZXNwaXJhdG9yeUNvbmRpdGlvbnNEdWVUb1RveGljQWdlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhTa2luRGlzZWFzZXNPckRpc29yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWREb21lc3RpY1N1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWRGb3JlaWduU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENvbnNvbGlkYXRlZFN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29ya0R1ZVRvSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrRHVlVG9Jbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT2ZSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9JbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPbk1hcmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzV2l0aFJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0luanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWF0aENsYWltcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWF0aHNBc0FSZXN1bHRPZklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhzQXNBUmVzdWx0T2ZJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0c0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0c1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0c1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVtYW5kT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbWFuZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxFbmRpbmdJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRmxvYXRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEdhc0Rpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhPY2N1cGF0aW9uYWxJbGxuZXNzZXNOb3RPdGhlcndpc2VDbGFzc2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRob3V0TG9zdFdvcmtEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NXaXRoTG9zdFdvcmtEYXlzT3JSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEluanVyeUNsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEluanVyeUNsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrT3JSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEluanVyeUNsYWltc1dpdGhvdXRMb3N0V29ya0RheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE5vbi1Db25zb2xpZGF0ZWRTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZDb252aWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkRvbWVzdGljU3Vic2lkaWFyaWVzSW5jbHVkZWRJbkZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkRvbWVzdGljU3Vic2lkaWFyaWVzTm90SW5jbHVkZWRJbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkZvcmVpZ25TdWJzaWRpYXJpZXNJbmNsdWRlZEluRmluYW5jaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRm9yZWlnblN1YnNpZGlhcmllc05vdEluY2x1ZGVkSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZMb2FuRGV0YWlsUmVjb3JkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZk1vcnRnYWdlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZQYXJraW5nU3BhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mU3Vic2lkaWFyaWVzTm90SW5jbHVkZWRJblRoZUZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mVW5pdHNGb3JTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvbkNvbWJpbmVkUmVwb3J0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25GaXJzdFJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uU3Vic2VxdWVudFJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZJc3N1YWJsZUFzc2V0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPaWxBbmRPckNvbmRlbnNhdGVEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPaWxBbmRPckNvbmRlbnNhdGVJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3RoZXJQcm9wZXJ0aWVzT3duZWRBbmRGaW5hbmNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQYXltZW50c1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBvc3QtQWR2aWNlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBvc3QtQWR2aWNlc1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBvc3QtQWR2aWNlc1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByb2R1Y3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJvcGVydGllc093bmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFF1YW50aXR5UGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxSZXNvdXJjZS1RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxSb29tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTZXJ2aWNlQmFja29yZGVyUXVhbnRpdHlIaWdoUHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2VydmljZUJhY2tvcmRlclF1YW50aXR5TG93UHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2hhcmVzT2ZTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTeXN0ZW1CYWNrb3JkZXJRdWFudGl0eUhpZ2hQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTeXN0ZW1CYWNrb3JkZXJRdWFudGl0eUxvd1ByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUcmFuc2FjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVW5pZGVudGlmaWVkVHJhbnNhY3Rpb25zUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV2F0ZXJEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXYXRlckluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXb3JrZWRCeUFsbEVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXb3JraW5nSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlbWFya1JlcHJlc2VudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW1hcmtzVXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5lZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvblNldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkSW5RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWRPdXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxsaW5nRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydW5rZWRDaGFubmVscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2tub3dsZWRnZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hZGp1c3RlZENvcnJlY3RvclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY292ZXJlZENoZXF1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNQZXJVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUHJvZHVjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZExhc3REYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkUGVyRGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlclF1YXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkUGVyV2VlayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNhbGVhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc29sZFF1YW50aXR5SGVsZEJ5V2hvbGVzYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW50aWxOZXh0VHJhdmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnVzYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnVzZWRBY2N1bXVsYXRlZFNpY2tEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnZlcmlmaWVkUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyZ2VudERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mRXh0cmFjb3Jwb3JlYWxDaXJjdWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBlcmJhcmljUHJlc3N1cml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwZXJ0ZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cG90ZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cG90aGVybWlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhbmNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYW5jZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljdWxhclJhZGlvcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpZWRSZWNlaXB0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzaXRhdGlvbkZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2ljZVN0b3JhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9pZFZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVTaHJpbmthZ2VBZGp1c3RtZW50T3JBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RpbmdTaGFyZXNIZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyUmUtSW5qZWN0ZWRPblByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2Vla3NXb3JrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q2hhbmdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRHYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRMb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVyVG9XaG9sZXNhbGVyU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZGVBcmVhVGVsZXBob25lU2VydmljZVBlcjgwMFNlcnZpY2VVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0NhbGVuZGFyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrSW5Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGltZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGltZVVuaXRzUGVyU2hpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc0luU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc0luVGhpc0xpbmVPZldvcmtPclByb2Zlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzT25Kb2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzUmVtYWluaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZXNWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50SW52ZW50b3J5UXVhbnRpdHlBdmFpbGFibGVGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFBlcmlvZEltYmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNlcnZpY2VMaWZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2hhcmVCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVzdGltYXRlZExhdGVzdE1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFc3RpbWF0ZWRQcmV2aW91c01ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWFkaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaWx5QWRqdXN0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaWx5QXZlcmFnZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseVdvcmtTaGlmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVN0b3JhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c09wZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzUHJvZHVjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNTdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYmVudHVyZUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYmVudHVyZXNGaWxlZEFnYWluc3REaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRDb2xsZWN0b3JzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXRhbG9nUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRhbG9nVVJMIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXRhbG9nSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGFsb2dJdGVtSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdGFsb2dSZWZlcmVuY2UiIHR5cGU9IkNhdGFsb2dSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRyYWN0SXRlbSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udHJhY3RJdGVtIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250cmFjdEl0ZW0iIHR5cGU9Ikxpc3RPZkNvbnRyYWN0SXRlbSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3RJdGVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cmFjdEl0ZW1OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0SXRlbSIgdHlwZT0iQ29udHJhY3RJdGVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25kaXRpb25zT2ZTYWxlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTYWxlc1JlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvbkNvZGVkIiB0eXBlPSJTYWxlc0FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25WYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29uZGl0aW9uc09mU2FsZSIgdHlwZT0iQ29uZGl0aW9uc09mU2FsZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2FsZXNSZXF1aXJlbWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2FsZXNSZXF1aXJlbWVudENvZGVkIiB0eXBlPSJTYWxlc1JlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNSZXF1aXJlbWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNhbGVzUmVxdWlyZW1lbnQiIHR5cGU9IlNhbGVzUmVxdWlyZW1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2FsZXNSZXF1aXJlbWVudENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRRdWFudGl0eVRvTWFrZU1pbmltdW1XZWlnaHRSZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVySWZJdGVtc0FyZU91dE9mU3RvY2tPck5vdFlldFB1Ymxpc2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVySWZPdXRPZlN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJPbmx5SWZOZXdJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NBbmRMYWJvclN1cnBsdXNBcmVhU2V0LUFzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RQcmVzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVhbFByb2R1Y3RBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdWRlSW1wb3J0UXVvdGFJbkZpcnN0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yeVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZWRTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNsdWRlSW1wb3J0UXVvdGFJbkZpcnN0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdXJwbHVzQXJlYVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFyZ2VQdXJjaGFzZVNldC1Bc2lkZUZvclNtYWxsQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heVByZXNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLXllYXJBd2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9CYWNrT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vU3Vic3RpdHV0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVByaW9yVG9TaGlwbWVudElmUXVhbnRpdHlTcGVjaWZpZWRJc05vdEF2YWlsYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25RdWFsaWZpZWRCaWRkZXJzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25RdWFsaWZpZWRNYW51ZmFjdHVyZXJzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFNhbGVzQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsTGFib3JTdXJwbHVzQXJlYVNldEFzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9BcHByb3ZlZFNvdXJjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0VkdWNhdGlvbmFsSW5zdGl0dXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9IaXN0b3JpY2FsbHlCbGFja0NvbGxlZ2VPclVuaXZlcnNpdHlPck1pbm9yaXR5SW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0luZHVzdHJpYWxQcmVwYXJlZG5lc3NQcm9ncmFtUGFydGljaXBhbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9RdWFsaWZpZWRQcm9kdWN0c0xpc3RQcm9kdWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvVVNBbmRDYW5hZGlhblNvdXJjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1lvdW5nSW52ZXN0aWdhdG9yUHJvZ3JhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbjhhU2V0LUFzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXQtYXNpZGVGb3JBbWVyaWNhbkluZGlhbi1vd25lZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwQXNTb29uQXNQb3NzaWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnVsbFRydWNrT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEluLVBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbC1CYWxhbmNlQmFja09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEJhbGFuY2VDYW5jZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsQmFsYW5jZVN1YnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsQ2FybG9hZExvdHNPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEl0ZW1RdHlQcm9wb3J0aW9uYWxUb1RvdGFsT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsVHJ1Y2tsb2FkTG90c09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQZXJSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyUmVsZWFzZW9yQnV5ZXJBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3NXaXRoU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NDb25zaWRlcmF0aW9uU2V0LUFzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzc1NldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxQdXJjaGFzZVNldEFzaWRlRm9yU21hbGxCdXNpbmVzc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbFJlbWFpbmluZ0JhbGFuY2VDYW5jZWxsYXRpb25BbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbFJlbWFpbmluZ0JhbGFuY2VDYW5jZWxsYXRpb25Ob3RBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlSXRlbUFsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucmVzdHJpY3RlZFByb2N1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTYWxlc0FjdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxCYWxhbmNlVGhhdEV4Y2VlZHNTYWxlc0FjdGlvblZhbHVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsRW50aXJlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlZCIgdHlwZT0iSGF6YXJkQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDbGFzc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNSZWZlcmVuY2VzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzQ29udGFjdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVU5ER051bSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRU1TTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNZmFnIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXMiIHR5cGU9IkhhemFyZG91cyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyIgdHlwZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c0lkZW50aWZpZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNSZWd1bGF0aW9uc0NvZGVkIiB0eXBlPSJBZ2VuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNSZWd1bGF0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENvZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVFeHRlbnNpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVWZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRPZmZpY2lhbFRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyZW1DYXJkTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNJZGVudGlmaWVycyIgdHlwZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZElkZW50aWZpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNQbGFjYXJkVGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIiB0eXBlPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGbGFzaHBvaW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRW1lcmdlbmN5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJvbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZlRlbXBlcmF0dXJlQ29kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIiB0eXBlPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkUGFja2luZ0NvZGVkIiB0eXBlPSJIYXphcmRQYWNraW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkUGFja2luZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZWQiIHR5cGU9IkhhemFyZG91c1NoaXBtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1pvbmVDb2RlZCIgdHlwZT0iSGF6YXJkb3VzWm9uZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1pvbmVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIiB0eXBlPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdERhbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtRGFuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vckRhbmdlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVzY3JpcHRpdmVJbmZvcm1hdGlvbk5vdFJlcXVpcmVkQnlSZWd1bGF0aW9uQnV0RGVzaXJlZFRvQWNjb21wYW55VGhlTW92ZW1lbnRCeVRoZVNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWlybGlmdE9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPVC0xMTNEb05vdEJ1bXBPckN1dE9mZkNhcldoaWxlSW5Nb3Rpb25EZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZENhck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzV2hlbldldERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTVNQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWVzUHJvZHVjdHNJbkFIZWF0ZWRNb2x0ZW5TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzU3Vic3RhbmNlQ29uc3RpdHVlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmhhbGF0aW9uSGF6YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUXVhbnRpdHlEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUZBR1BhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1PcGVyYXRpbmdTcGVlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lUG9sbHV0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2lzb24tSW5oYWxhdGlvbkhhemFyZERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2lzb25EZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVNYXRlcmlhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9yQ2hlbWljYWxHcm91cE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVEZWNsYXJhdGlvbiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRvdXNab25lQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVEIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljaW5nRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1BbGxvd2FuY2VzT3JDaGFyZ2VzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQWxsb3dPckNoYXJnZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFZhbHVlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljaW5nRGV0YWlsIiB0eXBlPSJQcmljaW5nRGV0YWlsIi8+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+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIiB0eXBlPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2hpcFRvU3ViSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBUb1N1YkxvY2F0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBUb1N1YlF1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3ViTG9jYXRpb25JdGVtUGFja2FnaW5nUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIgdHlwZT0iU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VSZWZlcmVuY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiIHR5cGU9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VJRFJlZmVyZW5jZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQYWNrYWdlUmVmZXJlbmNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlUmVmZXJlbmNlIiB0eXBlPSJQYWNrYWdlUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXJnb0NsYXNzaWZpY2F0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5hdHVyZU9mR29vZHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9wZXJhdGlvbmFsVHlwZUNvZGVkIiB0eXBlPSJPcGVyYXRpb25hbFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUeXBlT2ZDYXJnbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIgdHlwZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZU5vbi1EdXRpYWJsZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVEdXRpYWJsZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFZhbHVlQ29uc2lnbm1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck5vbi1Db250YWluZXJpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbC1PblJvbGwtT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFBvbGx1dGFudENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3QtSGF6YXJkb3VzQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcGxvbWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYm5veGlvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mR2F1Z2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZEdvb2RzQW5kUGVyc29uYWxFZmZlY3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5DYXJnbyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFja2FnZURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFja2FnZURldGFpbCIgdHlwZT0iTGlzdE9mUGFja2FnZURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYWNrYWdlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik51bWJlck9mUGFja2FnZXMiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZURldGFpbCIgdHlwZT0iUGFja2FnZURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZVR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VUeXBlQ29kZWQiIHR5cGU9IlBhY2thZ2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlVHlwZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZVR5cGUiIHR5cGU9IlBhY2thZ2VUeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhY2thZ2VUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFlcm9zb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW1vUGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1wb3VsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1wb3VsZS1Ob24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbXBvdWxlLVByb3RlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNTcGVjaWZpZWRCeVRoZURPVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRvbWl6ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsZS1Db21wcmVzc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxlLU5vbi1Db21wcmVzc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxsb29uLU5vbi1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGxvb24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJyZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcnMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFza2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWVyQ3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbHRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluZ0NoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmQtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9iYmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2x0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZWNyYXRlLUJvdHRsZXJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZS1Ob24tUHJvdGVjdGVkLUJ1bGJvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZS1Ob24tUHJvdGVjdGVkLUN5bGluZHJpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGUtUHJvdGVjdGVkQnVsYm91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlLVByb3RlY3RlZEN5bGluZHJpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveFdpdGhJbm5lckNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhY2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrLUdhcy1BdDEwMzFNYmFyQW5kMTVEZWdDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrLUxpcXVlZmllZEdhcy1BdEFibm9ybWFsVGVtcGVyYXR1cmVPclByZXNzdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrLUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1Tb2xpZC1GaW5lUGFydGljbGVzLVBvd2RlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGstU29saWQtR3JhbnVsYXJQYXJ0aWNsZXMtR3JhaW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrLVNvbGlkLUxhcmdlUGFydGljbGVzLU5vZHVsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5kbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmxhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV0dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FiaW5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuLUN5bGluZHJpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5pc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuLVJlY3Rhbmd1bGFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW52YXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJveSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyYm95LU5vbi1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJveS1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhckxvYWQtUmFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVlc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbGx5SGFyZGVuZWRGaWJyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNodXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG90aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvdGhPckZhYnJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvdGhUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29mZmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXBzaWJsZVR1YmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXByZXNzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25leCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQ29tbWVyY2lhbEhpZ2h3YXlMaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItRW5naW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItTWFjLUlzby1MdC5XZ3Q4WDhYMjBGb290QWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItTXVsdGktV2FsbGVkLVNlY3VyZWRUb1dhcmVob3VzZVBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU5hdnlDYXJnb1RyYW5zcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJzT2ZCdWxrQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcm5lclJlaW5mb3JjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJ1Z2F0ZWRPclNvbGlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3lsaW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWlqb2huLU5vbi1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWlqb2huLVByb3RlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLUxlbmd0aFJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1MZW5ndGhTa2lkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtTGVuZ3RoVG90ZUJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlV2FsbENvcnJ1Z2F0ZWRCb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLVdhbGxQYXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5QnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVmZmVsYmFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGdlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWdnQ3JhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52ZWxvcGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYmVyYm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYmVyYm9hcmRNZXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlicmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYnJlLVBhcGVyYm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbG1wYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJraW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG8tQmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2FtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb290bG9ja2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkUmVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW1lZENyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcnVpdENyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNCb3R0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lyZGVycy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZi1TdGFuZGFyZFJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGYtU3RhbmRhcmRUb3RlQmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW1wZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRzT2ZCZWVmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2dzaGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZEdvb2RzQ29udGFpbmVyLVdvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZ290Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmdvdHMtSW5CdW5kbGVCdW5jaFRydXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbklubmVyQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybW9kYWxUcmFpbGVyT3JDb250YWluZXJMb2FkLVJhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25PclN0ZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkplcnJpY2FuLUN5bGluZHJpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKZXJyaWNhbi1SZWN0YW5ndWxhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW1ibyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV0ZWJhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iktub2NrZG93blJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iktub2NrZG93blRvdGVCaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZ0VmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcE9yVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ3MtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRjaEJveCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsQ2FucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsa0NyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWx2YW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZENvbnRhaW5lclR5cGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2lzdHVyZVJlc2lzdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9sZGVkUGxhc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXNjdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZS1XYWxsUGFwZXItMk9yTW9yZVdhbGxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZS1XYWxsUGFwZXIzT3JNb3JlV2FsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGx5QmFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS1Sb2xsUGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGl3YWxsU2FjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RPdGhlcndpc2VTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZ2VyT3JSYWNrSW5Cb3hlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Pd25XaGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJUaGFuR2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVGhhbk1ldGFsT3JQbGFzdGljVHViZXNPckdsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZWQtTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWludW1QYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlZWxQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2RQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE9UUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXQtMldheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0LTRXYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlci1WY2kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGl0aW9uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlUmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZXMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlybnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpdGNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFua3MtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYy1JbmplY3Rpb25Nb2xkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtUmVncmluZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYy1TdHJ1Y3R1cmFsRm9hbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYy1WYWN1dW1Gb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtVmlyZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLVdyYXBwZWRUcmF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGVzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2x5ZXRoeWxlbmVMaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9seXN0eXJlbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG91Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlMaWZ0Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVscGJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyT2ZCZWVmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsLVNlbWljb25kdWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZG5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbmZvcmNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzZVJlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9kcy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdWJiZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1YmJlckFuZEZhYnJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FjaGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWEtQ2hlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VwYXJhdG9yT3JEaXZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFsbG93Q3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVldG1ldGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVldHMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvb2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmlua1dyYXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmlua3dyYXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVPZkJlZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVdhbGxDb3JydWdhdGVkQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNrZWxldG9uQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpZC1FbGV2YXRpbmdPckxpZnRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwc2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxKdW1ibyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BpbkN5bGluZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BpbmRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Bvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWlubGVzc1N0ZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlZWwtVmlueWxDb2F0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmV0Y2hXcmFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWl0Y2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFuay1DeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFuay1SZWN0YW5ndWxhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua1RydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWEtQ2hlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpZXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RlQmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF5UGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcGxlV2FsbENvcnJ1Z2F0ZWRCb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydW5rQW5kQ2hlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydW5rLVNhbGVzbWVuU2FtcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWJlLUNvbGxhcHNpYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWJlcy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWJlcy1NZXRhbE9yUGxhc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhY2tlZE9yVW5wYWNrYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjdXVtLVBhY2tlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuUGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlSW5PcGVyYXRpbmdDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVlbGVkQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lja2VyYm90dGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXJlTWVzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lyZU9yQ29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JhcHBlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFja2FnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFja2FnZSIgdHlwZT0iTGlzdE9mUGFja2FnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUlEIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZJdGVtUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mT3JkZXJSZWZlcmVuY2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZU1hcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYWNrYWdlRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydFJlZmVyZW5jZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJTcGVjaWFsSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1BhY2thZ2luZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkhhemFyZG91cyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkFzc29jaWF0ZWREb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJldHVybmFibGVDb250YWluZXJJbmZvIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlIiB0eXBlPSJQYWNrYWdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZPcmRlclJlZmVyZW5jZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik9yZGVyUmVmZXJlbmNlcyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mT3JkZXJSZWZlcmVuY2VzIiB0eXBlPSJMaXN0T2ZPcmRlclJlZmVyZW5jZXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2VNYXJrIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlTWFyayIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFja2FnZU1hcmsiIHR5cGU9Ikxpc3RPZlBhY2thZ2VNYXJrIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlTWFyayI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZU1hcmtDb2RlZCIgdHlwZT0iUGFja2FnZU1hcmtDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlTWFya0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VNYXJrVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VNYXJrIiB0eXBlPSJQYWNrYWdlTWFyayIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYWNrYWdlTWFya0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXItQXNzaWduZWRQYWNrYWdlSWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdE1hcmtTdXBwbGllcnNDb21wYW55TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXJlU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5SW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQWRkaXRpb25hbGx5Q3VzdG9tZXJzQXJ0aWNsZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQXJ0aWNsZU51bWJlckN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQ3VzdG9tZXJzQ29tcGFueU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtDdXN0b21lcnNSZWZlcmVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrRGF0ZU9mUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0V4Y2x1c2l2ZWx5Q3VzdG9tZXJzQXJ0aWNsZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrRXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0ZyZWVUZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtQYWNrYWdlc0RpbWVuc2lvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtSdW5uaW5nTnVtYmVyT2ZQYWNrYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya1NlcmlhbFNoaXBwaW5nQ29udGFpbmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya1N1cHBsaWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrVGFyZVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQ2FydG9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yQXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldENvbmZpZ3VyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlTWFya2VkQnlCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJBc3NpZ25lZERyb3Bab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmLUlkZW50aWZ5aW5nQ29udGFpbmVyVmlhUmFkaW9GcmVxdWVuY3lJZERldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyLUFzc2lnbmVkQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFzc2lnbmVkUm9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFzc2lnbmVkU2tpZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1NDQy0xOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1NDQy0xOEFuZEFwcGxpY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDU2hpcHBpbmdDb250YWluZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ0NPckVBTjEyOEFwcGxpY2F0aW9uSWRlbnRpZmllckFuZERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db2RlQ291bmNpbEZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ29uc3VtZXJQYWNrYWdlQ29kZS0xLTUtNS0xIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFja2FnZUNoYXJhY3RlcmlzdGljIiB0eXBlPSJMaXN0T2ZQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljQ29kZWQiIHR5cGU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpY0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpY0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWNEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljIiB0eXBlPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nUGFja2FnZUxhYmVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1BhY2thZ2VTZWFsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TWFya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZW9mUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFycGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1PclNraWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhcmluZ1BpZWNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudG9uQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2luZ0RpcmVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ0RldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TWFya2luZ1BhdHRlcm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RNYXJraW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VPckNvbnRhaW5lck1hcmtMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZ01ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29yZUNoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRmFjaWxpdHlMaW1pdGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFnZ2luZ09yQmFyQ29kZUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpZE9yUGFsbGV0VHlwZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFja2FnZURlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VEZXNjcmlwdGlvbiIgdHlwZT0iTGlzdE9mUGFja2FnZURlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYWNrYWdlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFpbmVyQ291bnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9hZE9yZGVyQ291bnRlciIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZURlc2NyaXB0aW9uIiB0eXBlPSJQYWNrYWdlRGVzY3JpcHRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2VJZGVudGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlSWRlbnRpZmllciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFja2FnZUlkZW50aWZpZXIiIHR5cGU9Ikxpc3RPZlBhY2thZ2VJZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUlkZW50aWZpZXJDb2RlZCIgdHlwZT0iUGFja2FnZUlkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlSWRlbnRpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VJZGVudGlmaWVyVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VJZGVudGlmaWVyIiB0eXBlPSJQYWNrYWdlSWRlbnRpZmllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYWNrYWdlSWRlbnRpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQU44T3JFQU4xM0JhcmNvZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEYxNE9ySVRGNkJhcmNvZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ0NPckVBTjEyOEJhcmNvZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRFIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNwZWNpYWxIYW5kbGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3BlY2lhbEhhbmRsaW5nQ29kZWQiIHR5cGU9IlNwZWNpYWxIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNwZWNpYWxIYW5kbGluZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNwZWNpYWxIYW5kbGluZ05vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNwZWNpYWxIYW5kbGluZyIgdHlwZT0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNwZWNpYWxIYW5kbGluZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkUmVzdHJpY3RlZFRvMTVNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkUmVzdHJpY3RlZFRvMjVNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkUmVzdHJpY3RlZFRvMzVNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkUmVzdHJpY3RlZFRvNDVNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vRmFjaWFsSGFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FySXNBaXJCcmFrZUNvbnRyb2xsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVxdWlyZWRQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZXF1aXJlZFBST051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZXF1aXJlZEFwcG9pbnRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkT25Ub3BPZlJlc2lkdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2VPZlJlc2lkdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtQXV0b0tleXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRUb01vdmVXaXRoQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRzLUFkdmFuY2VPbmx5V2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdob3VzZUJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb3dhYmxlTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWZCYWRPcmRlcmVkTm90aWZ5U2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFNoaXBwZXJGb3JXZWlnaENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyQ29uc29saWRhdG9yTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1DdXN0b21lcnNEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJlZEZvckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRmFjdG9yeUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LUNvdHRvbk1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb01hcnNoYWxsaW5nUmVxdWlyZWRGb3JIYXphcmRvdXNNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1c1JhbXBPbmx5VE9GQ1ZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbENvbnNpZ25lZUZvcldlaWdoQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9wTG9hZE9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25UaGF0VGhpc1NoaXBtZW50SXNGb3JSZWN5Y2xpbmdBc0RlZmluZWRJbkFwcGxpY2FibGVUYXJpZmZzQ29udGFpbmluZ1N1Y2hQcm92aXNpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBdXRob3JpemF0aW9uUmVxdWlyZWRGb3JEaXZlcnNpb25PckNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wWWFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPbmx5T25TdXJyZW5kZXJPZldyaXR0ZW5PcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZEluVG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFVuY291cGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uV2VpZ2h0c0FwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NpdmVEaW1lbnNpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRXF1aXBtZW50VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxDb250cm9sTGltaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuRW1wdHlWaWFSZXZlcnNlUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZXNJbmN1cnJlZElmU2hpcG1lbnRGYWlsc1RvTWVldFZlc3NlbExvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc2l2ZVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwbG9zaXZlRmxhbW1hYmxlR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNlQS1FbmRUb0hlYWRPZlRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNlQi1FbmRUb0hlYWRPZlRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZpbmdVbmRlckZvckZ1cnRoZXJhbmNlSW5zdHJ1Y3Rpb25zQW5kTWF5QmVEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFtbWFibGVHYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYW1tYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhbW1hYmxlUG9pc29uR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFnaWxlLUhhbmRsZVdpdGhDYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb250cmFuc2l0RmxhdFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRFbmRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZWRBc0hhemFyZG91c01hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkRm9yT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0ZWRQcmlvclRvTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUZvclJlcGFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFZhbHVlTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFdpZGVMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1Cb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50VG9CZUluc3BlY3RlZEF0RGVzdGluYXRpb25BbmREaXNwb3NpdGlvbkluc3RydWN0aW9uc1dpbGxCZUZ1cm5pc2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJvZmZpY2VNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEluY2VudGl2ZVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZlaWxsYW5jZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bmN0aW9uU2V0dGxlbWVudEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRCcmlkZ2VJbXBvcnRPckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyVHJpcExlYXNlZFRvQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nRGV2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkVG9GdWxsVmlzaWJsZUNhcGFjaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbkNvbnRhaW5lckNvbnNvbGlkYXRvckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RMb3dlc3RUaHJvdWdoUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5Db250YWluZXJGYWN0b3J5TG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTZXJ2aWNlT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5GdWxsQ2FybG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uSW5DaGFyZ2VPZkNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJlZEZvckJvcmRlckNyb3NzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaWNhbFJlZnJpZ2VyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeUNvbnNpZ25lZUJlZm9yZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdERpdmVydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9TcGVjaWFsRW50cmFpbm1lbnRSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RIdW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdFcXVpcG1lbnRGaXJzdFRyYW5zYm9yZGVyTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90UG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5U2hpcHBlckJlZm9yZVJlY29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90VHJhbnNmZXJDb250ZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXNlT2ZGaXJlRG9Ob3RVc2VXYXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90Rm9yRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlMb2FkZWRMZXNzVGhhbk9yRXF1YWxUb1RoZUNhck9yZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ3ZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlzaGFibGVJbkJveENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZWx5Q29udHJvbGxlZFByaXZhdGVFcXVpcG1lbnRTdWJqZWN0VG9EZW11cnJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvaXNvbm91c0dhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWNlZFByaW9yVG9Mb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UHJvdGVjdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtUHJlcGFpZFdheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmRlckJpbGxGb3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZENvbnRyb2xsZWRQcml2YXRlRXF1aXBtZW50U3ViamVjdFRvRGVtdXJyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2ZU1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXNoT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJSaWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdEhvdXJseUlmQ2FyU3RvcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkRm9yVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRPckNhcnJpZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvdmVUb1Jlc3RBbmRDb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFRvU3BlY2lhbERldGVudGlvblJ1bGVzT3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LVNoaXBwZXJzRXhwb3J0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0YWJsZUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUb0Nyb3NzRG9ja09yUG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZXNTaGVsZkNvdXBsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LVNoaXBwZXJzTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtU2hpcHBlcnNQYWNraW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrVHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmV0Y2hXcmFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJzVGVtcG9yYXJpbHlBcnRpY3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlckNvbnNvbGlkYXRvckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJGYWN0b3J5TG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVybkNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtVHJhY2tEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVZvbHVtZVJhdGVzT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkQXRCdW1wZXJDaXJjdXNSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkRnJvbUxlZnRTaWRlT2ZDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZEFzUGxhY2FyZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnByb3RlY3RlZFBlcmlzaGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZEZyb21SaWdodFNpZGVPZkNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckNlcnRpZmllc0dyb3NzV2VpZ2h0VW5kZXIyNDAwMDBQb3VuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvbldlaWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW50aWxhdGlvbkluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkZS1Cb2R5UGlja3VwVHJ1Y2tBcHBsaWVzVG9GaW5pc2hlZFZlaGljbGVMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZWRJbnNwZWN0aW9uLVNldERpcmVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2hFbXB0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudHMtSGlnaFdpZGVOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXZlSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RNdXN0QWNjb21wYW55V2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2hUb0NoZWNrRm9yT3ZlcmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NUb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFN1cmNoYXJnZUF1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNob3JlLUFsYXNrYU9ySGF3YWlpU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNpemVkUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkFpcldheWJpbGwtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQ2FuYWRpYW5DdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkV4cG9ydEVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mSW5zdXJhbmNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZVLlMuRXhwb3J0RG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrLVVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNpZ25hdHVyZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXR0ZW5Qcm9vZk9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZTEwMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZTMwMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZTUwMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGFudHNBY2NvbXBhbnlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDcmFmdEZ1cm5pc2hlZEFuZE5vdFVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZVRlbmRlckRpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm1lZEd1YXJkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEluamVjdGlvbk9yQmxlbmRpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Q2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZBbHRlcm5hdGVUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQS5NLkRlbGl2ZXJ5UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuY2hvcmluZ0FuZFVuYW5jaG9yaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQ29weU9mU2hpcHBpbmdQYXBlcnNGb3JQcm9vZk9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpYW5jZVNlcnZpY2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ29uZGl0aW9uaW5nRGlzY29ubmVjdEFuZENvbm5lY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxBcm1lZEd1YXJkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVRyYWN0b3JTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVHJ1Y2tTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseVNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1eGlsaWFyeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ5cGFzc0NvbnNvbGlkYXRpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa3lBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9ja2luZ0FuZEJyYWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsaW5kU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbHN0ZXJMb2FkRG9Ob3RTd2l0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGluZ1NlcnZpY2UtRHJ5QnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyU3VyY2hhcmdlQXV0aG9yaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudC0yMEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2VlQ2FyT3JQaWNrLVVwVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRDb21tZXJjaWFsQmlsbE9mTGFkaW5nQm9sVG9Hb3Zlcm5tZW50Qm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQ2Fib29zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycm9zaW9uQWRkaXRpdmVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRmVlcy1Db250YWluZXJMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtTGlmdExldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyR3VhcmRDYXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5DYXJyaWVyR3VhcmRDYXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1RheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpbkFuZEJpbmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlUHJlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0YW50U3VydmVpbGxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NSYXRlc0FwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWIuUmF0ZXNPdmVyRGV0cm9pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkFuZExpbmVIYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJhdGVzQXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25UaGF0VGhlTmV3c3ByaW50V2luZGluZ0NvcmVzQmVpbmdSZXR1cm5lZEVtcHR5V2VyZVJlY2VpdmVkRmlsbGVkQnlSYWlsRnJlaWdodFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cmllck92ZXJuaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29waWxvdFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQYXBlcnNNYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyU2FtZURheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudENhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJNb3VudGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdG91c1JvdXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZVdpZGVTZXBhcmF0ZUFuZFJlYXNzZW1ibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbUJhcmdlVG9QaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9kQ29uc3RhbnRTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsRHJpdmVyV2l0aE5hdGlvbmFsQWdlbmN5Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1YWxEcml2ZXJQcm90ZWN0aXZlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VBdFBvcnRPZkRlYmFya2F0aW9uUmF0ZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZDb252ZXlpbmdFcXVpcG1lbnRBbmRUaGVQb3dlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mQ29udmV5aW5nRXF1aXBtZW50RXhjbHVkaW5nVGhlUG93ZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZFbWJhcmthdGlvblJhdGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwRnJvbUZyZWV6aW5nUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDEwRHJvbWVkYXJ5V2l0aE1lY2hhbmljYWxSZXN0cmFpbmluZ0RldmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQxMERyb21lZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uU2VydmljZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPZkZ1ZWxGcm9tUmFpbFRhbmtDYXJUb1BpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlTaGlwcGVySW1tZWRpYXRlbHlJZlNoaXBtZW50SXNEZWxheWVkRW5Sb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RDb3VwbGVUb090aGVyRGlhcGhyYWdtZWRDYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdEZyZWV6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RDb3VwbGVUb1RhbmtDYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGF0aW9uLVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpdmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPZkZ1ZWxGcm9tUGlwZWxpbmVUb0JhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVBpcGVsaW5lVG9SYWlsVGFua0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPZkZ1ZWxGcm9tUGlwZWxpbmVUb1RhbmtUcnVja09yVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uV2l0aFBvd2VyVW5pdHMzME1pbnV0ZVBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3AtT2ZmRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1taW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RDb3VwbGVUb0RvdWJsZVNoZWxmQ291cGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvbWVkYXJ5V2l0aE1lY2hhbmljYWxSZXN0cmFpbmluZ0RldmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb21lZGFyeVNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvb3JTaWRlVmFubmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JBc3NvY2lhdGVkV2l0aERldGVudGlvbk9mQ29udmV5aW5nRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21UYW5rVHJ1Y2tPclRyYWlsZXJUb1BpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25WZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25XaXRoUG93ZXJVbml0czYwTWludXRlUGVyaW9kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0T3JDb3VyaWVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlSYWlsY2FyT3JkZXJlZEJ1dE5vdFVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudEhvc2VBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRIb3NlQXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMaWdodHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5TW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0aXNmYWN0b3J5U2VydmljZVN0YW5kYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzaXZlVmFsdWF0aW9uQXV0aG9yaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlT2ZWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYURyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMZW5ndGhTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRSYXRlc0FwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZU9mVmVoaWNsZURhbWFnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGFuZFJlbW92ZUFuZEluc3RhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlFYXN5UmF0ZXNBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZUZyZWlnaHRBbGxLaW5kc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcmVhcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJuaXNoaW5nQ2hhc3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbEZpbHRlcnNGdXJuaXNoZWRCeUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxGaWx0ZXJzRnVybmlzaGVkQnlTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0cmFja1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yUHJvY2Vzc2luZ0luVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0ZWRCeUNhcnJpZXJBdE93bmVyU1Jpc2tPZkZyZWV6aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JTdG9yYWdlSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWx0cmF0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybWVudFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1Pd25lZENvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRHdWFyZENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXRlclNlY3VyaXR5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEF0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kQnJha2VzQXRFYWNoRW5kTXVzdEJlUmVsZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZG92ZXJGb3JIb2xpZGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkb3ZlckZvcldlZWtlbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0SW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0LVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRXaXRoU3RlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc2libGVIYXphcmRvdXNNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5hY2Nlc3NpYmxlSGF6YXJkb3VzTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bmRheU9ySG9saWRheVBpY2t1cE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI0SG91ckF2YWlsYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDdWJlVHJhaWxlclJhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0ZXJPclJlZnJpZ2VyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpdGNoSW5zdGFsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvT25EZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGxlckNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkljaW5nSW5oaWJpdG9yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0b2dyYXBocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtb2RhbFNoaXBtZW50U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmEtUGxhbnRNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybGluZVRyYW5zZmVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVzdC1Jbi1UaW1lSml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludExpbmVFeGNlcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25UaGF0VGhlQ29udGFpbmVyc0JlaW5nUmV0dXJuZWRFbXB0eVdlcmVSZWNlaXZlZEZpbGxlZEJ5UmFpbEZyZWlnaHRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwTWF0ZXJpYWxEcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yRGlzdHVyYmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheW92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGx5QVVDQ09yRUFOU2VyaWFsU2hpcHBpbmdDb250YWluZXJMYWJlbFRvVGhlU2hpcHBpbmdDb250YWluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodEJhclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd0JveVRyYWlsZXJPckZsYXRCZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3ItMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudERpZmZlcmVudGlhbC1MZXNzVGhhbkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsRnJvbVBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eU9mQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFBlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsVG9Qb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5UcnVja2xvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheW92ZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RpZmllZEF0bW9zcGhlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydFNlcnZpY2VXaXRoT3Zlcm5pZ2h0U3Vic2lzdGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0U2VydmljZXNUZWxlcGhvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVRyYWZmaWNFeHBlZGl0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1vdG9yU3VydmVpbGxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdEh1bXBPckh1bXBJbnRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFVzZUhlbHBlckxvY29tb3RpdmVUb1B1c2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUGxhY2FyZHNSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9zZVNpZGVWYW5uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG93QXdheUZyb21IZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9ja1N0b3dhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyTG9hZEFuZENvbnNpZ25lZVVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlckhlaWdodENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGluZ1NoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVZlcmlmaWNhdGlvbk5vdFJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG93V2l0aERvb3JzRmFjaW5nSW53YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRDb21tb2RpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluRnJvbnRPZkhvdXNlU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybWxlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbEZpZWxkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlTm9Ib29rcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVzdHJpY3RlZENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb09uQm9hcmRDZXJ0aWZpY2F0aW9uUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uRGVja1N0b3dhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJMb2FkQW5kQ2FycmllclVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaXNoYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG93QmVsb3dEZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG93QmV0d2VlbkRlY2tzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVPZkRlbGl2ZXJ5QW5kU2lnbmF0dXJlUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uVG9wSW4tSGF0Y2hTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblRvcE9uLURlY2tTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlckNvbnRhaW5lck9uLURlY2tTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWxvd1dhdGVyTGluZVN0b3dhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJmbG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyV2lkdGhDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZVdheVJhdGVzQXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcGluZ0VxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwT2ZTaGlwbWVudHNPblNhdHVyZGF5U3VuZGF5QW5kT3JIb2xpZGF5c1JlcXVpcmluZ0Fic29sdXRlTmV4dERheURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBBbmREZWxpdmVyeUZyb21TdG9yYWdlSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBBbmREZWxpdmVyeUJleW9uZFNlcnZpY2VBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGVybWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdEZyb21IZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJIb3VyUmF0ZXNBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0c09yU2tpZHNPclBsYXRmb3JtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUC5NLkRlbGl2ZXJ5UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlck1pbGVSYXRlc0FwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBPZlNoaXBtZW50c1JlcXVpcmluZ1NhbWVEYXlEZWxpdmVyeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cE9mU2hpcG1lbnRzUmVxdWlyaW5nU2FtZURheURlbGl2ZXJ5U2VydmljZUFuZE9yRGVsaXZlcnlBdEFTcGVjaWZpZWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWFub09yT3JnYW5DYXJyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwQW5kRGVsaXZlcnlTZXJ2aWNlRm9yUGVyaXNoYWJsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxvZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVmZmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2VTZWN1cml0eVdpdGhBcm1lZEd1YXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlY3VyaXR5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVRhcnBGb3JTZWN1cml0eVB1cnBvc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cEFuZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrQW5kVW5wYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVBUcmFpbGVyUmF0ZXNBcHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZGVkUHJpdmF0ZWx5T3duZWRWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZlByaXZhdGVseU93bmVkVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5vcGVyYWJsZVByaXZhdGVseU93bmVkVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ09yVW5sb2FkaW5nT2ZQcml2YXRlbHlPd25lZFZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVPd25lZFZlaGljbGVQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLU9mZnNGb3JQcml2YXRlbHlPd25lZFZlaGljbGVTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZWx5T3duZWRWZWhpY2xlSW5UcnVja2F3YXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxoZWFkSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRyYWlsZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb3R0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZWRWYWx1ZUNoYXJnZUluRXhjZXNzT2ZDYXJyaWVyTWF4aW11bUxpYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsb2NhdGlvbk9mVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuT2ZFbXB0eUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuTW92ZW1lbnRPZlBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFN1cnZlaWxsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyQ2FyZ29QZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3VuZFRyaXBTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkU3BlZWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJld2VpZ2h0UmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRvdmVyT25XZWVrZW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRBbmRDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEcm9tZWRhcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRXF1aXBtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyRXhwb3J0RGVjbGFyYXRpb25SZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhaXJzRWxldmF0b3JFeGNlc3NDYXJyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZUFwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5RXNjb3J0VmVoaWNsZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uT3JEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yT3JpZ2luYXRpb25PclBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JQb3J0T2ZFbWJhcmthdGlvbk9yRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUcmFpbk1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkb3Zlck9uSG9saWRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRvdmVyT25XZWVrZGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpcnRpbmdBbmRVbnNraXJ0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZEFuZENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbFBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0QVNoaXBOb3RpY2VPck1hbmlmZXN0VHJhbnNhY3Rpb25TZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdGVsbGl0ZVN1cnZlaWxsYW5jZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RnJvbU5vbi1UZW1wU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1PZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQW5kQ2FycmllclVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBlcm1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ByZWFkZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90Rm9yU3RvcmFnZS1Ob1NoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5aW5nUm91dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpcHBpbmdTb3J0aW5nQW5kQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVNlcnZpY2VOb3RUb0JlVXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sZUxhc2hpbmdFcXVpcG1lbnRQbGVTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1Y3Rpdml0eU9yQW50aS1TdGF0aWNBZGRpdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1PZmZBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLU9mZkF0T3JpZ2luYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hdHVyZUFuZFRhbGx5UmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90Rm9yVW5sb2FkaW5nRnJvbUFFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3RGb3JVbmxvYWRpbmdGcm9tQkJyYWtlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlT2ZWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tsb2FkLURvdWJsZU9wZXJhdG9yLUNvbW1vbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZC1Eb3VibGVPcGVyYXRvci1QYWRkZWRWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsSGFuZGxpbmdDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJlZEFzVHJ1Y2tsb2FkVHJ1Y2tsb2FkU2VydmljZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGktVGFua1N1cnZlaWxsYW5jZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlcmluZ09mTXVsdGlwbGVWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlck9uRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0b3JPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1JhdGVzQXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclByZXBhcmF0aW9uLVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcmVSZXBhaXJBbmRSZXBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZVNob3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0b3JBbmRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWQtU2luZ2xlT3BlcmF0b3ItQ29tbW9uQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tsb2FkLVNpbmdsZU9wZXJhdG9yLVBhZGRlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua1N1cnZlaWxsYW5jZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyQ2FycmlhZ2VGdXJuaXNoZWRCeUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFja2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nT3JSZWxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpdGllc0Rpc2Nvbm5lY3RBbmRDb25uZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWN1dW1TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2VlVmFuVHlwZVRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW5DbGVhbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXNGdXJuaXNoZWRCdXROb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlc0lub3BlcmFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3AtT2ZmRGVsaXZlcnlPZlBlcnNvbmFsVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVzSW5UcnVja2F3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUJyZWFrYnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlcmZyb250RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrQ3Jld0JvbnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl0aW5nVGltZUF1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFZlcmlmaWNhdGlvbiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXNzb2NpYXRlZERvY3VtZW50cyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRvY3VtZW50TG9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRG9jdW1lbnRBdHRhY2hlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXNzb2NpYXRlZERvY3VtZW50cyIgdHlwZT0iQXNzb2NpYXRlZERvY3VtZW50cyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRG9jdW1lbnRMb29zZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9IkRvY3VtZW50TG9vc2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYWNrYWdlRG9jIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRvY3VtZW50TG9vc2UiIHR5cGU9Ikxpc3RPZkRvY3VtZW50TG9vc2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VEb2MiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRG9jdW1lbnRUaXRsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iRG9jdW1lbnRUeXBlQ29kZWQiIHR5cGU9IkRvY3VtZW50VHlwZUNvZGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iRG9jdW1lbnRUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlRG9jIiB0eXBlPSJQYWNrYWdlRG9jIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRvY3VtZW50VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQW5hbHlzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUXVhbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFBlcmZvcm1hbmNlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3BlY2lmaWNhdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0RhdGFSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U2FtcGxlVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VTYWxlc0NhdGFsb2d1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbExhYmVsQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdFJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRDZXJ0aWZpY2F0ZU9mVmFsdWVBbmRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmVtZW50Q2VydGlmaWNhdGVBVHIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlEYXRhTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9RdWVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGlzY2hhcmdlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlU3VwZXJhbm51YXRpb25Db250cmlidXRpb25zQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVN1cGVyYW5udWF0aW9uQ29udHJpYnV0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlU3VwZXJhbm51YXRpb25NZW1iZXJNYWludGVuYW5jZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5U3VwZXJhbm51YXRpb25NZW1iZXJNYWludGVuYW5jZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VQYXlyb2xsRGVkdWN0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJib25kUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJib25kQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZTZWFsaW5nT2ZFeHBvcnRNZWF0TG9ja2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29TdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvQVRyYWRlU3RhdGlzdGljc01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2NpbmF0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2aW5nTGljZW5jZU5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2aW5nTGljZW5jZUludGVybmF0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVQYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFzb25UaWNrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U3RhdHVzUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2luZ1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmEtQ29tbXVuaXR5VHJhZGVTdGF0aXN0aWNhbERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0dGVuSW5zdHJ1Y3Rpb25zSW5Db25mb3JtYW5jZVdpdGhBZHJBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGF0ZWRQcmljZWRUZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlU2FsZXNDYXRhbG9ndWVSZXNwb25zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VOZWdvdGlhdGlvblJlc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kSGF6YXJkRGF0YVNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFN0YXRlbWVudE9mQW5BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTdGF0ZW1lbnRPZkFuQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T24tSGlyZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T2ZmLUhpcmVSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudC1OaWxPdXR0dXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQtVGltZS1VcFVuZGVyYm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50LVVuZGVyYm9uZEJ5U2VhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQtUGVyc29uYWxFZmZlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudC1UaW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5Q3JlZGl0QXNzZXNzbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsRGlzcHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc3NpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2hpcFBlcm1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEZWZpbml0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yU3RhdGlzdGljYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsLU9mZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudFN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5TW92ZW1lbnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVN0YXR1c0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlUmVsYXRlZFRvR29vZHNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlUmVsYXRlZFRvR29vZHNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlcmVkU2VydmljZXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlUmVsYXRlZFRvRmluYW5jaWFsQWRqdXN0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZVJlbGF0ZWRUb0ZpbmFuY2lhbEFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFVucGFja1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvU3VtbWFyeU1hbmlmZXN0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudFVucGFja1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdEFuZE1lYXRCeS1Qcm9kdWN0c1Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRGb29kUHJvZHVjdHNTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3VsdHJ5U2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yc2VtZWF0U2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY2V1dGljYWxTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmVkaWJsZVNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGVuZGluZ0Fycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29SZWxlYXNlTm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGlyZWN0SW50ZXJjaGFuZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEltcGVuZGluZ0Fycml2YWxBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudERhbWFnZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrRXN0aW1hdGVBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEVtcHR5UmVsZWFzZUluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRNb3ZlbWVudEdhdGVJblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TW92ZW1lbnRHYXRlT3V0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRVbnBhY2tpbmdJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50VW5wYWNraW5nUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQaWNrLVVwQXZhaWxhYmlsaXR5UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGljay1VcEF2YWlsYWJpbGl0eUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGljay1VcFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U2hpZnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERpc2NoYXJnZUluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREaXNjaGFyZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Jlc1JlcXVpc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRMb2FkaW5nSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydExvYWRpbmdSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGVwYXJ0dXJlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFbXB0eUVxdWlwbWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50QWNjZXB0YW5jZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTcGVjaWFsU2VydmljZUluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdG9ja1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q2FyZ29SZWxlYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RhdGFTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGFja2luZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2xlYXJhbmNlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRG9jdW1lbnRzRXhwaXJhdGlvbk5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T24tSGlyZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uLUhpcmVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T2ZmLUhpcmVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5T3JkZXJSZXNwb25zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0l0ZW1zVG9CZUJvb2tlZFRvQUZpbmFuY2lhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29ya0VzdGltYXRlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckRpc3Bvc2l0aW9uT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvVmVzc2VsRGlzY2hhcmdlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvVmVzc2VsTG9hZGluZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aWRyb3BPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsVHJhbnNwb3J0T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlZmluaXRlRGVsaXZlcnlJbmRlZmluaXRlUXVhbnRpdHlDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5RGVmaW5pdGVRdWFudGl0eUNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudHNDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFza09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWtlT3JCdXlQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdERhdGFTdW1tYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRDb3N0QW5kUHJpY2VEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RGdW5kc1N0YXR1c1JlcG9ydENmc3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZEluc3BlY3Rpb25BbmRUZXN0UmVzdWx0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxJbnNwZWN0aW9uQW5kUmVjZWl2aW5nUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yUGVyZm9ybWFuY2VCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFNlY3VyaXR5Q2xhc3NpZmljYXRpb25TcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5QW1lcmljYUNlcnRpZmljYXRlT2ZDb21wbGlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPZmYtSGlyZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BY2NlcHRhbmNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2stVXBOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzYXRpb25Ub1BsYW5BbmRTdWdnZXN0T3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3Jpc2F0aW9uVG9QbGFuQW5kU2hpcE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Q3ByRm9ybWF0MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFNjaGVkdWxlU3RhdHVzUmVwb3J0Q3NzciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Q3ByRm9ybWF0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Q3ByRm9ybWF0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Q3ByRm9ybWF0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Q3ByRm9ybWF0NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NpdmVEaXNjaGFyZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0cmlwcGluZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25EZXBhcnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VEZWNsYXJhdGlvbkNvbWJpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UmVjb3ZlcnlQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvZHVjdGlvblBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsQW5kT3RoZXJBZG1pbmlzdHJhdGl2ZUludGVybmFsRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFzdGVyU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlZEFsdGVybmF0ZVRlbmRlckJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQcmljZWRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRDb2xsZWN0aW9uSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JBbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkFuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9BbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdElzc3VhbmNlSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbFBheW1lbnRWYWx1YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QmlsbE9mUXVhbnRpdGllcy1Cb3EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucHJpY2VkQmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlZFRlbmRlckJvcSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5xdWlyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbUFwcGxpY2F0aW9uRm9yUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50VG9QYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JGaW5hbmNpYWxDYW5jZWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1BdXRob3Jpc2VkRGlyZWN0RGViaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkludGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRVbnByaWNlZEJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uRm9yVW5zY2hlZHVsZWRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxQYXltZW50UmVxdWVzdEJhc2VkT25Db21wbGV0aW9uT2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UmVxdWVzdEZvckNvbXBsZXRlZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1c2hPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxPZmZPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YXBPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckNoYW5nZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZXNwb25zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFyZVBhcnRzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbXBhaWduUHJpY2VTYWxlc0NhdGFsb2d1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlGb3JlY2FzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nU2VydmljZXNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByZS1BdXRob3Jpc2VkRGlyZWN0RGViaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZERpcmVjdERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5SnVzdC1Jbi1UaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQXV0aG9yaXNlZERpcmVjdERlYml0UmVxdWVzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmUtQXV0aG9yaXNlZERpcmVjdERlYml0UmVxdWVzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9mQUxldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVG9CYW5rRnVuZHNUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQYXltZW50T3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZVBheW1lbnRPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdMaXN0RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9QcmV2aW91c0JhbmtpbmdTdGF0dXNNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFzdGVyUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBsYW5uaW5nQXZhaWxhYmxlUmVzb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGxhbm5pbmdDYWxlbmRhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Nb3ZlbWVudEV2ZW50TG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FuYWx5c2lzVm95YWdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmQmlsbGVkQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkQ3JlZGl0Tm90ZS1Hb29kc0FuZFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlBZGp1c3RtZW50U3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNb3ZlbWVudEluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNb3ZlbWVudFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RhdHVzQ2hhbmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmVDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbEhlYWx0aENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdDb2RlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29kZUNoYW5nZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZURhdGFFbGVtZW50UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltcGxlRGF0YUVsZW1lbnRDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb3NpdGVEYXRhRWxlbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvc2l0ZURhdGFFbGVtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdNZXNzYWdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUluRGV2ZWxvcG1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RpZmljYXRpb25PZkV4aXN0aW5nTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tpbmdOdW1iZXJBc3NpZ25tZW50UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VyRGlyZWN0b3J5RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc1N0YW5kYXJkTWVzc2FnZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VEaXJlY3RvcnlEZWZpbml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbmJhblNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDbGFpbUZvclBhcnRzQW5kT3JMYWJvdXJDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkFja25vd2xlZGdlbWVudEFuZEVycm9yUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVZhcmlhdGlvbkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVGb3JQcmljZVZhcmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25Ub0NvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uUmVuZXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsZW1lbnRhdGlvbkd1aWRlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JBbmRBY2tub3dsZWRnZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sRmluYW5jaWFsU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXF1ZW5jZWREZWxpdmVyeVNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxjcmVkZXJlQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJRdW90YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JRdW90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50TWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvck1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTW92ZW1lbnRWb3lhZ2VTdW1tYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JVc2FnZU9mQmVydGhPck1vb3JpbmdGYWNpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckRlc2lnbmF0aW9uT2ZCZXJ0aGluZ1BsYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JTaGlmdGluZ0Zyb21UaGVEZXNpZ25hdGVkUGxhY2VJblBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhcnlEb2N1bWVudEZvckFwcGxpY2F0aW9uRm9yQ2FyZ29PcGVyYXRpb25PZkRhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRPZk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5RG9jdW1lbnRGb3JBcHBsaWNhdGlvbkZvclRyYW5zcG9ydE9mRGFuZ2Vyb3VzR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxDaGFyYWN0ZXJSZWFkaW5nT2NyUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlTYWxlc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1lcmdlbmN5Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lUHJvZHVjdFBsYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmFuY2VDZWRpbmdCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JEZWxpdmVyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2VXaGljaEluY2x1ZGVzQVBhY2tpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbkZvckNhcmdvRXhhbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbkZvckNhcmdvRXhhbWluYXRpb25BbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ3Jld0FuZENvbnZleWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdW1tYXJ5RGVjbGFyYXRpb25XaXRoQ29tbWVyY2lhbERldGFpbEFsdGVybmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbXNCb29rZWRUb0FGaW5hbmNpYWxBY2NvdW50UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRPZlRyYW5zYWN0aW9uc1doaWNoTmVlZEZ1cnRoZXJJbmZvcm1hdGlvbkZyb21UaGVSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzTGV0dGVyT2ZJbnN0cnVjdGlvbnNBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydE9mVHJhbnNhY3Rpb25zRm9ySW5mb3JtYXRpb25Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJ0YWdlT3JkZXJMb2NhbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpQXNzb2NpYXRlZE9iamVjdEFkbWluaXN0cmF0aW9uTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlGb3JEZXNwYXRjaEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWFyeVNhbGVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXR1c0VucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyU3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvblJlZ2FyZGluZ1RoZUlud2FyZEFuZE91dHdhcmRNb3ZlbWVudE9mVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZVc2FnZU9mQmVydGhPck1vb3JpbmdGYWNpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclZlc3NlbHNFbnRlcmluZ0ludG9Qb3J0QXJlYUluTmlnaHQtVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZFbWVyZ2VuY3lTaGlmdGluZ0Zyb21UaGVEZXNpZ25hdGVkUGxhY2VJblBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdW1tYXJ5RGVjbGFyYXRpb25XaXRob3V0Q29tbWVyY2lhbERldGFpbEFsdGVybmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZEaXN0cmlidXRpb25PZkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25Ob3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBheW1lbnRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZi1CaWxsZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxjcmVkZXJlSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yZWRDcmVkaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsQWNjb3VudFN1bW1hcnlSZXNwb25zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnREZXNwYXRjaEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXB0aW9uYWxPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0RvY2tpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydGF0aW9uQXZhaWxhYmlsaXR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRhdGlvblNjaGVkdWxlSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudERlbGl2ZXJ5Tm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNGb3JCYW5rVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUGF5bWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRQYXltZW50QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY2VwdGFuY2VBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0TmVnb3RpYXRpb25BZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yQmFua2Vyc0d1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0d1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRMZXR0ZXJPZkluZGVtbml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYWR2aWNlT2ZBQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50c1ByZXNlbnRhdGlvbkZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlUGF5bWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkQ3JlZGl0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzYWxPZkRlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZlcnNhbE9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0VHJhbnNmZXJBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0YW5jZUFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudE9mQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50T2ZBY2NvdW50TWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBvbGljeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlRGVjbGFyYXRpb25TaGVldEJvcmRlcmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlcnNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Zlck5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNBZHZpY2VUb0ltcG9ydEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQWR2aWNlVG9FeHBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNDZXJ0aWZpY2F0ZU9mUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzV2FyZWhvdXNlUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Q2hhcmdlc0RvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlV2FycmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZVBhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbE11bHRpcHVycG9zZVRyYW5zcG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpcHRDYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0NvcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyQmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua2VyQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU5lZ290aWFibGVNYXJpdGltZVRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXNSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZJbmRlbW5pdHlGb3JOb24tU3VycmVuZGVyT2ZCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDb25zaWdubWVudE5vdGVHZW5lcmljVGVybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZExpc3QtU21ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0T2ZmaWNpYWxSZWNvZ25pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaGFyZ2luZ0RvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ29uc2lnbm1lbnROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBaXJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlQWlyV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jld3NFZmZlY3RzRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nlbmdlckxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWNlUmFpbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlUG9zdFBhcmNlbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpbW9kYWxDb21iaW5lZFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaEJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0NlcnRpZmljYXRlT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aW1vZGFsVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFRyYW5zcG9ydEJpbGxPZkxhZGluZ011bHRpbW9kYWxCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxpbmdGb3J3YXJkTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbE5vdGljZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VPZkNpcmN1bXN0YW5jZXNQcmV2ZW50aW5nRGVsaXZlcnlHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlT2ZDaXJjdW1zdGFuY2VzUHJldmVudGluZ1RyYW5zcG9ydEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGljZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0TWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlcmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTWFuaWZlc3RVbml0UGFja2luZ0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkNvbGxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eU9mU2hpcENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZlJhZGlvQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eU9mRXF1aXBtZW50Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdmlsTGlhYmlsaXR5Rm9yT2lsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRsaW5lRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcmF0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lRGVjbGFyYXRpb25PZkhlYWx0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlJlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwc1N0b3Jlc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbmNlQXBwbGljYXRpb25Gb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQ29udHJvbERlY2xhcmF0aW9uRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xEb2N1bWVudFQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1TZW5kaW5nQ29uc2lnbm1lbnROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQyTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckV4cG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0RlY2xhcmF0aW9uRGVwYXJ0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckdvb2RzQ29udHJvbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbnRyb2xDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JQaHl0b3Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXRvc2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckluc3BlY3Rpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luQXBwbGljYXRpb25Gb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsQXBwZWxsYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVyZW5jZUNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW5Gb3JtR3NwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWxhckludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRG9jdW1lbnRFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhc3RhdERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVZlcmlmaWNhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlQXBwbGljYXRpb25Gb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhvdXRDb21tZXJjaWFsRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRoQ29tbWVyY2lhbEFuZEl0ZW1EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhvdXRJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckV4Y2hhbmdlQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlUGVybWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUNvbnRyb2xEZWNsYXJhdGlvbkltcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckltcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9ySG9tZVVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ltbWVkaWF0ZVJlbGVhc2VEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlbGl2ZXJ5Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29EZWNsYXJhdGlvbkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Qb3N0UGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVjbGFyYXRpb25WYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZWNsYXJhdGlvbkdlbmVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb1Blcm1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckN1c3RvbXNUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWZGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJDYXJuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRhQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVBZG1pbmlzdHJhdGl2ZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXJyb3JSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENhbGN1bGF0aW9uQ29uZmlybWF0aW9uUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YVByaW9yQWxsb2NhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Q29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRG9jdW1lbnRJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VzdG9tc0RvY3VtZW50TWVzc2FnZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRG9jdW1lbnRBdHRhY2hlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9IkRvY3VtZW50QXR0YWNoZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYWNrYWdlRG9jIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRvY3VtZW50QXR0YWNoZWQiIHR5cGU9Ikxpc3RPZkRvY3VtZW50QXR0YWNoZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldHVybmFibGVDb250YWluZXJJbmZvIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldHVybmFibGVDb250YWluZXJQYXJ0TnVtYmVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydE51bSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50UmVzcG9uc2liaWxpdHlDb2RlZCIgdHlwZT0iUGF5bWVudFJlc3BvbnNpYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFJlc3BvbnNpYmlsaXR5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmV0dXJuTG9hZENvZGVkIiB0eXBlPSJSZXR1cm5Mb2FkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmV0dXJuTG9hZENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldHVybk5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJldHVybmFibGVDb250YWluZXJJbmZvIiB0eXBlPSJSZXR1cm5hYmxlQ29udGFpbmVySW5mbyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXltZW50UmVzcG9uc2liaWxpdHlDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEJ5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeVN1cHBsaWVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJldHVybkxvYWRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkRWl0aEVtcHR5NEJsb2NrRm9yQmxvY2tpbmdQdXJwb3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJXaXRoRHVubmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZFdpdGhQcm9kdWN0aW9uTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkRW1wdHlBbmRMb2FkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic29sZXRlTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZFdpdGhFeGNlc3NSZXR1cm5lZFByb2R1Y3Rpb25NYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkV2l0aFJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQYXJ0T2Jzb2xldGVDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZFdpdGhSZXR1cm5lZFByb2Nlc3NlZE1hdGVyaWFsIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlclN1bW1hcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTnVtYmVyT2ZMaW5lcyIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxUYXgiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsQW1vdW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zcG9ydFBhY2thZ2luZ1RvdGFscyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VtbWFyeU5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyU3VtbWFyeSIgdHlwZT0iT3JkZXJTdW1tYXJ5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnRQYWNrYWdpbmdUb3RhbHMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxQYWNrYWdlcyIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxQYWNrYWdlRGVwdGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsVHJhbnNwb3J0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbEdyb3NzV2VpZ2h0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxOZXRXZWlnaHQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbE5ldE5ldFdlaWdodCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsVGFyZVdlaWdodCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikdyb3NzVm9sdW1lIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UGFja2FnaW5nVG90YWxzIiB0eXBlPSJUcmFuc3BvcnRQYWNrYWdpbmdUb3RhbHMiLz4KLSAgICA8IS0tIFNPWCBmb3JtYXQgZGF0YXR5cGVzIHdoZXJlIHRoZXkgZGlmZXIgZnJvbSBzdGFuZGFyZCBYU0RMIGRhdGF0eXBlcy0tPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRGF0ZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldezR9KCgoMDF8MDN8MDV8MDd8MDh8MTB8MTIpKCgwWzEtOV0pfChbMS0yXVswLTldKXwoM1swLTFdKSkpfCgoMDR8MDZ8MDl8MTEpKCgwWzEtOV0pfChbMS0yXVswLTldKXwzMCkpfCgoMDIpKCgwWzEtOV0pfChbMS0yXVswLTldKSkpKSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsVGltZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IigoKFswLTFdWzAtOV0pfCgyWzAtM10pKSg6KFswLTVdWzAtOV0pKXsyfSgoXCt8LSkoKFswLTFdWzAtOV0pfCgyWzAtM10pKTooWzAtNV1bMC05XSkpPykiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibERhdGV0aW1lIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV17NH0oKCgwMXwwM3wwNXwwN3wwOHwxMHwxMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMV0pKSl8KCgwNHwwNnwwOXwxMSkoKDBbMS05XSl8KFsxLTJdWzAtOV0pfDMwKSl8KCgwMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pKSkpVCgoKFswLTFdWzAtOV0pfCgyWzAtM10pKSg6KFswLTVdWzAtOV0pKXsyfSgoXCt8LSkoKFswLTFdWzAtOV0pfCgyWzAtM10pKTooWzAtNV1bMC05XSkpPykiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibEJvb2xlYW4iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0idHJ1ZXxmYWxzZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRmxvYXQiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpmbG9hdCI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IihcK3wtKT9bMC05XSpcLj9bMC05XSooRXxlKT9bMC05XSoiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibERvdWJsZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRvdWJsZSI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IihcK3wtKT9bMC05XSpcLj9bMC05XSooRXxlKT9bMC05XSoiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlckNvbmZpcm1hdGlvbi54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXJDb25maXJtYXRpb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU1NmFjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlckNvbmZpcm1hdGlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNzA2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxucz0icHVibGljaWQ6b3JnLnhDQkw6c2NoZW1hcy9YQ0JMMzUvT3JkZXJDb25maXJtYXRpb24ueHNkIiB0YXJnZXROYW1lc3BhY2U9InB1YmxpY2lkOm9yZy54Q0JMOnNjaGVtYXMvWENCTDM1L09yZGVyQ29uZmlybWF0aW9uLnhzZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICBYTUwgQ29tbW9uIEJ1c2luZXNzIExpYnJhcnkgMy41Ci0gICAgICAgICAgICBDb3B5cmlnaHQgMjAwMCBDb21tZXJjZSBPbmUsIEluYy4KLSAgICAgICAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgICAgICAgIERURCdzLCBzY2hlbWFzIGFuZCBtb2R1bGVzIGluIHRoZSBDb21tZXJjZSBPbmUgWE1MIENvbW1vbiBCdXNpbmVzcwotICAgICAgICAgICAgTGlicmFyeSBWZXJzaW9uIDMuNSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBzcGVjaWZpZWQKLSAgICAgICAgICAgIGF0IGh0dHA6Ly93d3cueGNibC5vcmcvbGljZW5zZS5odG1sCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCVBMRUFTRSBOT1RFOiBUaGlzIHNjaGVtYSwgd2hpbHN0IGl0IGRlc2NyaWJlcyBpbiBlbnRpcmV0eSBhIHZhbGlkLCBzaW5nbGUsCi0gICAgICAgIAl4Q0JMIDMuNSBkb2N1bWVudCwgaXMgZGVmaW5lZCB0byBiZSBpbiBhIG5hbWVzcGFjZSBvdGhlciB0aGFuIHRoZSBtYWluIHhDQkwgMy41Ci0gICAgICAgIAluYW1lc3BhY2UuIFRoZXJlZm9yZSBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBmdWxsIHhDQkwgMy41IHNjaGVtYSBpcyB1c2VkCi0gICAgICAgIAlmb3IgZnVsbCBwcm9kdWN0aW9uIHNpdHVhdGlvbnMuIFBsZWFzZSBzZWUgdGhlIG5vdGVzIGF0Ci0gICAgICAgIAk8YSBocmVmPSJodHRwOi8vd3d3LnhjYmwub3JnL3hjYmwzNS94c2Qvc2NoZW1hcy5odG1sIj53d3cueENCTC5vcmc8L2E+LgotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJDb25maXJtYXRpb25EZXRhaWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25IZWFkZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlbGxlck9yZGVyQ29uZmlybWF0aW9uTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VsbGVyT3JkZXJOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbklzc3VlRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlckNvbmZpcm1hdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlclNob3J0RGVzY3JpcHRpb24iIHR5cGU9IkFscGhhTnVtNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mQXR0YWNobWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25IZWFkZXIiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZUNvZGVkIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblR5cGUiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkRlbGl2ZXJ5Ii8+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+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1cnJlbmN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUNvZGVkIiB0eXBlPSJDdXJyZW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkN1cnJlbmN5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ3VycmVuY3kiIHR5cGU9IkN1cnJlbmN5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkN1cnJlbmN5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFGQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBREYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFEUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJTRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkhEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJCRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQllCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJaRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCV1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk5EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCR0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0hSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNWRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYT0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFBGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ05ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRKRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE9QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQ0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUdQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVSTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEVVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGS1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZKRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR01EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdIQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1RRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhOTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEtEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUxTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlBZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktaVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0VTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLV0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0dTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxWTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEJQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxTTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFVGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1LRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUdGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNV0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1STyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ETCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1aTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk9WIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkxHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBT04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWlJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkdOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEtSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFlHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBIUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUExOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9NUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk9MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJXRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1NUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0JMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0dEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTS0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1JXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFU1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxLUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0hQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNERCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0RQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNaTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNZUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEpSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUWlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRIQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUT1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE5EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRNTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVHWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUFIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQ1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVZVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZVViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllFUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVVOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpXRCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25QYXJ0eSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdXllclBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwVG9QYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFydHlDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25QYXJ0eSIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25QYXJ0eSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydHkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5SUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTURGQnVzaW5lc3MiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik5hbWVBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckNvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlY2VpdmluZ0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBwaW5nQ29udGFjdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3RoZXJDb250YWN0cyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29ycmVzcG9uZGVuY2VMYW5ndWFnZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5IiB0eXBlPSJQYXJ0eSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJZGVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSWRlbnRpZmllciIgdHlwZT0iSWRlbnRpZmllciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWdlbmN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2VuY3lDb2RlZCIgdHlwZT0iQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWdlbmN5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWdlbmN5RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGVkIiB0eXBlPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2VuY3kiIHR5cGU9IkFnZW5jeSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBZ2VuY3lDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUFNVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCQ0QtVGhlTWljcm9jb21wdXRlckluZHVzdHJ5QXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDR0lIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ09SRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUVDTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydEFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGFiYW1hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGFza2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbnVtQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuQXBwYXJlbE1hbnVmYWN0dXJlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5GdXJuaXR1cmVNYW51ZmFjdHVyZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuSXJvbkFuZFN0ZWVsSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkxhbmRUaXRsZUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbk1lZGljYWxBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QYXBlckluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQV0FBbmRPQ1NJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblNvY2lldHlGb3JBdXRvbWF0aW9uSW5QaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UZXh0aWxlTWFudWZhY3R1cmVyc0luc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU5TSUFjY3JlZGl0ZWRTdGFuZGFyZHNDb21taXR0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyaXpvbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFya2Fuc2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU01FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5QnV5ZXJPckJ1eWVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeURpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5TWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5TWFya2V0UGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlOYXRpb25hbFRyYWRlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5T3duZXJPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVBhcnR5T3JpZ2luYXRpbmdUaGVNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5U2VsbGVyT3JTZWxsZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlUcmFuc3BvcnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1RNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtR2VsZGF1c2dhYmVhdXRvbWF0ZW5TZXJ2aWNlR2VzZWxsc2NoYWZ0TUJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1BdXN0cmlhbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUF1c3RyaWFuUFRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1WZXJiYW5kT2VzdGVycmVpY2hpc2NoZXJCYW5rZW5VbmRCYW5raWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQUNPUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQURBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BSUhXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BUENBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BUUlTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BdXN0cmlhbkN1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ET0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUhJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtTElGQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtTkNDSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtUk9BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1TQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVRyYWRlZ2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbkJhbmtlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFLUJlbGdpYW5NaW5pc3RyeU9mRmluYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVsbGNvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tJbmR1c3RyeVN5c3RlbXNBZHZpc29yeUNvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlItQmFuY29DZW50cmFsRG9CcmF6aWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSLU1BQW5kUkFBQW5kTElNTkVUQW5kUklORVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLUNQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtQ1NJTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsaWZvcm5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsaWZvcm5pYUxhbmRUaXRsZUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkZyZWlnaHRDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyYmlkZU1hbnVmYWN0dXJlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLVJldmVudWVDYW5hZGFDdXN0b21zQW5kRXhjaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLVNDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0NDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWElJSUQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hYSTAxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hYSUIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hYWElWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUZJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUFkbWluaXN0cmF0aW9uRmVkZXJhbGVEZXNDb250cmlidXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1Bc3NvY2lhdGlvblN1aXNzZUNvZGVEZXNBcnRpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQ2FyYnVyYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQ2VudHJhbGVTdWlzc2VQb3VyTEltcG9ydGF0aW9uRHVDaGFyYm9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1EaXJlY3Rpb25HZW5lcmFsZURlc0RvdWFuZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILURpdmlzaW9uRGVzSW1wb3J0YXRpb25zRXRFeHBvcnRhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUVudHJlcHJpc2VEZXNQVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILU1pbmlzdHJ5T2ZUYXhhdGlvbkNlbnRyYWxDdXN0b21zQW5kVGF4QWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILU9mZmljZUZpZHVjaWFpcmVEZXNJbXBvcnRhdGV1cnNEZURlbnJlZXNBbGltZW50YWlyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILVN3aXNzU2VjdXJpdGllc0NsZWFyaW5nQ29ycG9yYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILVRlbGVrdXJzQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJRFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJRUNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2RlQXNzaWduZWRCeVRoZU9yZ2FuaXphdGlvblRoYXRJc1RoZVVsdGltYXRlRGVzdGluYXRpb25PZlRoZVRyYW5zYWN0aW9uU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTy1ESUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvcmFkbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWFuZGVyUm9tZUFpckRldmVsb3BtZW50Q2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jb3JkRURJR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpY3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uc09uU0FEQW5kVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29wcGVyQW5kQnJhc3NGYWJyaWNhdG9yc0NvdW5jaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPLVNCREMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eURlc2lnbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTSUV4dGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVVNJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1BUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJESSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQklBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLURJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRFRBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRURJQkFVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlTG9naXN0aWNzQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HRFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdlcm1hbkJhbmtlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR2VybWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR01CSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXdhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkFpckZvcmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZBcm15Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZIZWFsdGhBbmRIdW1hblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZIb3VzaW5nQW5kVXJiYW5EZXZlbG9wbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZlRoZU5hdnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLVNpZW1lbnNBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtVkRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERkFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdGlvbkdlbmVyYWxlRGVzRG91YW5lc0V0RHJvaXRzSW5kaXJlY3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mQ29sdW1iaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1FQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLU1IQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstTkJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1QQlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpYnVpbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaWVsTm9yZGljRm9ydW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESUZJQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESVRFVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESVRFWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUVHNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUlEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RyaWNVdGlsaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNJbmR1c3RyaWVzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTRFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTLU9ERVRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUy1TcGFuaXNoQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtRURJRklDQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVLUVUSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVLVJPRkVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQVNMSU5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhpZ2h3YXlBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLUFUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktRmlubmlzaEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLVRCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1UaGVGaW5uaXNoQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9yaWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQUdGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1BcnZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1CYW5xdWVEZUZyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQ0ZPTkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUNOQU1UUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRENQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1ER0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUVESUZDQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUVESUZSQU5DRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJVFJBTlNQT1JUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1HQUxJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItR0VOQ09EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1JTlNFRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1BQkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFCVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFydGljbGVOdW1iZXJBc3NvY2lhdGlvbkxpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFzc29jaWF0aW9uRm9yUGF5bWVudENsZWFyaW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUJBQ1NMaW1pdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1DSEFQU0FuZFRvd25DbGVhcmluZ0NvbXBhbnlMaW1pdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1GTEVFVE5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItSE1DdXN0b21zQW5kRXhjaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLVRoZUNsZWFyaW5nSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb3JnaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXBoaWNzQ29tbXVuaWNhdGlvbnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUi1HcmVla0N1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1RJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF3YWlpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZUFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISy1Ib25nS29uZ0N1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVBTTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFSQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNBTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkYWhvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUtUmV2ZW51ZUNvbW1pc3Npb25lcnNDdXN0b21zQUVQcm9qZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTC1Jc3JhZWxDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxpbm9pcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpYW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlckNvbnRhaW5lckludGVyRnJpZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3NvY2lhdGlvbk9mQ29ycG9yYXRpb25BZG1pbmlzdHJhdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc29jaWF0aW9uT2ZJbmR1c3RyaWFsQWNjaWRlbnRCb2FyZHNBbmRDb21taXNzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkc09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW93YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25BbmRTdGVlbFN0YW5kYXJkc0NvbW1pdHRlZUlTTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVMtSWNlbGFuZEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlU2VydmljZXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1Bc3NvY2lhemlvbmVCYW5jYXJpYUl0YWxpYW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1JdGFsaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtT0RFVFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1Tb2NpZWF0YUludGVyYmFuY2FyaWFQZXJMQXV0b21hemlvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkphcGFuZXNlU3RhbmRhcmRzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLUphcGFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTU9UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1NU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU5BQ0NTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLYW5zYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlbnR1Y2t5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzaW5nSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVBbmRBbm51aXR5SW5kdXN0cnlDb21taXR0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxJLUxpZWNodGVuc3RlaW5BdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxsb3lkc1JlZ2lzdGVyT2ZTaGlwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG91aXNpYW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFUtTHV4ZW1ib3VyZ0N1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyeWxhbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3NhY2h1c2V0dHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0UHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pY2hpZ2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5uZXNvdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3Npc3NpcHBpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzb3VyaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGFuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VCYW5rZXJzQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZLURhZ2FuZ05ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktTWFsYXlzaWFDZW50cmFsQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktTWFsYXlzaWFDdXN0b21zQW5kRXhjaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUdTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFsY29ob2xCZXZlcmFnZUNvbnRyb2xBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBc3NvY2lhdGlvbk9mQnVzaW5lc3NBbmRFZHVjYXRpb25hbFJhZGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEJ1c2luZXNzRm9ybXNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDZW50ZXJmb3JTdGF0ZUNvdXJ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3R0b25Db3VuY2lsT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSZXRhaWxNZXJjaGFudHNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxXaG9sZXNhbGVEcnVnZ2lzdHNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFUTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJhbEdhc1V0aWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkNJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVicmFza2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldmFkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SGFtcHNoaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdKZXJzZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld01leGljbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3c3BhcGVyQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1lvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5GUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JQ0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JT1NIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0aGVybGFuZHNSYWlsd2F5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtQmFua0dpcm9jZW50cmFsZUJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1CRUFORVRCViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1JbnRlcnBheUNhcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1JbnRlcnBheUdpcmFhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtTmV0aGVybGFuZHNDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcndlaWdpYW5TdGF0ZVJhaWx3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1OT1JQUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5vcndlZ2lhbkJhbmtlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuSW50ZXJiYW5rUmVzZWFyY2hPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYS1UZWxlY29tbXVuaWNhdGlvbnNJbmR1c3RyeUZvcnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aENhcm9saW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aERha290YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWi1OZXdaZWFsYW5kQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0RFVFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZk1hbmFnZW1lbnRBbmRCdWRnZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VQcm9kdWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2hpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2tsYWhvbWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JlZ29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPU0hBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5uc3lsdmFuaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbm5zeWx2YW5pYUNvdXJ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1DQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtUG9ydHVndWVzZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULVNJQlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVJbmZvcm1hdGlvbkluZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaG9kZUlzbGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUklORVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVS1CSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVLVNGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQS1TYXVkaUFyYWJpYUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1DZW50cmFsQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtT0RFVFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1TdmVuc2thQmFua2ZvZXJlbmluZ2VuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1Td2VkaXNoQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lTQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3V0aENhcm9saW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3V0aERha290YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBZ2VuY3lBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudExvYW5HdWFyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5SGVscEluZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5uZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXhhc0xhbmRUaXRsZUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXh0aWxlRGlzdHJpYnV0b3JzQXNzb2NpYXRpb25JbmMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlREQ0MtRURJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFctQ2hpbmVzZVRhaXBlaUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXLVRyYWRlLXZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkVDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5DVEFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNDb3VydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc01hcmluZUNvcnBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNOdWNsZWFyUmVndWxhdG9yeUNvbW1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BSUFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BaXJUcmFuc3BvcnRBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUlTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFOU0lBU0NYMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFQSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVNUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1CQVRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1CWEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNISVBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DSURYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ09QQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURBbmRCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1EQ0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURFQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREhIUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRElTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRElTQ1VTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ETE1TTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPREFBQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURTQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUVJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRkNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZJUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZNQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRldTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1HU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhCSUNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ISSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEw3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1JU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU1BUkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQUJDQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTkFJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOYXRpb25hbENlbnRlckZvckhlYWx0aFN0YXRpc3RpY3NDb21taXNzaW9uT2ZQcm9mZXNzaW9uYWxBbmRIb3NwaXRhbEFjdGl2aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5hdGlvbmFsTW90b3JGcmVpZ2h0Q2xhc3NpZmljYXRpb25Bc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTmF0aW9uYWxSZXRhaWxGZWRlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQ0NNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTklTVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTlJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OV0RBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1PRFRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1PRkFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1PTUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVN0YW5kYXJkQ2FycmllckFscGhhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVERDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVUNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VTi1TUFNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VT1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTQ2Vuc3VzQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VU0N1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VU1BTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1WQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtV1NTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRhaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl0eUluZHVzdHJ5R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcm1vbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpcmdpbmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXNoaW5ndG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZXN0VmlyZ2luaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldITUlTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXNjb25zaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ild5b21pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yR2VuZXJhbE9mQ2FuYWRhIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlU2l0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50UGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3JkRXVyb3BlZW5SZWxhdGlmQXVUcmFuc3BvcnRJbnRlcm5hdGlvbmFsRGVzTWFyY2hhbmRpc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50QW5hbHlzaXNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENoYXJhY3RlcmlzdGljc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdJbmZvcm1hdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRSZWxhdGlvbnNoaXBUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbkFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25NZXRob2RTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0ZVByaW5jaXBhbGVFeGVyY2VlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ0RpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJzZUV2ZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJzZUV2ZW50T3V0Y29tZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlkVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNvbW1vZGl0eUFuZFNwZWNpYWxIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0TWlzc2lvbkRlc2lnblNlcmllc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRpbWVuc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRPckNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVGVybWluYWxJZGVudGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsZWdhdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQYXRpZW50RGlhZ25vc2lzUmVsYXRlZEdyb3VwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsUGF0aWVudFJlZmluZWREaWFnbm9zaXNSZWxhdGVkR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9uTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWJ1bGF0b3J5UGF0aWVudEdyb3VwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRtZW50Q29kZS1DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBzeWNoaWF0cmljQXNzb2NpYXRpb25EaWFnbm9zdGljU3RhdGlzdGljYWxNYW51YWxPZk1lbnRhbERpc29yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Tb2NpZXR5Rm9yVGVzdGluZ0FuZE1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50ZW5uYVBvbGFyaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50ZW5uYVN0cnVjdHVyZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudENsYXNzaWZpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25BY2tub3dsZWRnZW1lbnRBbmRFcnJvckNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25RdWVzdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYU9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGljbGVTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0RGV0YWlscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRSZWN1cnJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFN0YXR1c09yVHJhbnNhY3Rpb25SZXBvcnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFRyYW5zZmVyU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5UmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc0RlcHJlc2NyaXB0aW9uRGlzdHJpYnV0aW9uTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzRGVwcmVzY3JpcHRpb25FeGNlcHRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNSYXRlRWRpTmV0d29ya0Vycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVEZXNjcmlwdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVNYXN0ZXJEZXNjcmlwdGlvbkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTd2l0Y2hSZWxlYXNlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc3VyZWREZWxpdmVyeUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZENsZWFyaW5nSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZERhdGFQcm9jZXNzaW5nRXF1aXBtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBd2FyZFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQWRtaW5pc3RyYXRpb25JbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtCcmFuY2hTb3J0aW5nSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1NlY3VyaXRpZXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpc09mSnVyaXNkaWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRSZWplY3Rpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZE9mZmljZUluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQ2xhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkluc3BlY3Rpb25BbmRTdXJ2ZXlQYXJ0TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVJlc3BvbnNpYmlsaXR5TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVNoaXBMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NyZWRpdFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdEZXRhaWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdSZXBvcnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdTZWN1cml0aWVzSW5mb3JtYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmluYW5jaWFsSW5mb3JtYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRnVuY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzTGVnYWxTdHJ1Y3R1cmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1NpemVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxTaWduRGlyZWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkludGVyRWRpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlRGVzaWduYXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9yaWdpbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hEaXNjb3VudFN0aXB1bGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZU9mTG9zc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlaWxpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblJlcXVpcmVtZW50c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0aXplbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5U3ViZGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUGF5bWVudFJlbWFya0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZQaXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhdXNlU3RhdHVzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlQXV0b21hdGVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1QYXJ0aWNpcGFudHNJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1Vbml2ZXJzYWxJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hc3REZXNpZ25hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZ25pemFuY2VTeW1ib2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Mb3NzQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tUG9pbnRzT2ZJbXBhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tUHJvZmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYml0ZXJtczE5OTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxBbmRHb3Zlcm5tZW50RW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsRHJpdmVyc0xpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc0NvbW1vZGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc0hhemFyZG91c01hdGVyaWFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNTYWZldHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVJlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pY2F0aW9uc1JvdXRpbmdJZGVudGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGVuc2F0aW9uVHlwZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZUNoYXJhY3RlcmlzdGljc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludFJlcXVlc3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlUmV2aWV3Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2x1c2lvbkV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbkRldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1ByZW1pc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUHJlbWlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25BbmRDb250YWluZXJpemF0aW9uUG9pbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25NYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdG9yQWxlcnRMaXN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyQW5kUm9sbC1Pbk9yUm9sbC1PZmZOdW1iZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVudEluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q2xvc2UtT3V0R3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdERlbGl2ZXJ5RGF0ZVJldmlzaW9uQWdlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEZ1bmRSZXBvcnRpbmdUcmFuc2FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JBbGVydExpc3RTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JSZXZpZXdMaXN0U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBheW1lbnREZWR1Y3Rpb25PckNvbGxlY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBheW1lbnRMaW5lSXRlbVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2hpcG1lbnRBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkSW52ZW50b3J5SXRlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0RGVzaWduQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvdmVydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3Rpb25PZmZlbnNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVMb2dpc3RpY3NQcm9ncmFtU3VwcG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZUZpbmFuY2lhbEZpbGluZ0NyaXRlcmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVTdGF0ZW1lbnRGaWxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aW9uT3JDaGFuZ2VGb3JTdG9yYWdlSXRlbVJlY29yZHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5QW5kQWN0aXZpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Q29kZS1GaW5hbmNlQW5kQWNxdWlzaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlTdWItRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eURlc2lnbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25BZGp1c3RtZW50UmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRBcHBlYXJhbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0Q2FzZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RGlzcG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydERvY3VtZW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0SXNzdWVkV2FycmFudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydE9mTGF3RXZlbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydE9mTGF3VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRQYXJ0eVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRQbGVhZGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZU1vZGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcGEtQ2FuYWRpYW5QYXltZW50c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxDaGFyZ2VHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxpdHlEZXNpZ25hdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Vpc2luZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXNzZXREZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGVudGFsVGVybWlub2xvZ3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGlhYmlsaXR5RGV0YWlscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFByb2NlZHVyYWxUZXJtaW5vbG9neUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlTGV2ZWxMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyV2l0aGluQ291bnRyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWl6ZWROb3RpY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0FyZWFPZlRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRG9tZXN0aWNQb3J0TG9jYXRpb25Db2Rlcy1VU1NjaGVkdWxlRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZvcmVpZ25Qb3J0TG9jYXRpb25Db2Rlcy1VU1NjaGVkdWxlSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0luZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0luc3BlY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1Byb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1JlbGVhc2VOb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTaW1wbGlmaWVkUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3BlY2lhbENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3RhdHVzT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaXRHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUcmFuc2l0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ZhbHVhdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1dhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNQYWNraW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlU2hpcHBlZE9yUmVjZWl2ZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JCdXNpbmVzc1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5kYW50UGxlYVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlUHJpb3JpdGllc0FuZEFsbG9jYXRpb25zU3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyYWxMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaWVuY3lDYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpZW5jeUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaW5xdWVuY3lJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U291cmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUZXJtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtYW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtaWxpdGFyaXphdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUF2YWlsYWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VFdmVudFByb2JsZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VPcGVyYXRvclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VVc2FnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzRW5jb3VudGVyZWREdXJpbmdFeGFtaW5hdGlvbkFuZEludmVzdGlnYXRpb25PZkluZGl2aWR1YWxzQW5kUG9wdWxhdGlvbnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3N0aWNBbmRTdGF0aXN0aWNhbE1hbnVhbE9mTWVudGFsRGlzb3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3ROdW1lcmljYWxDb250cm9sU3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5QWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5U3RhdHVzT3JEaXNwb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsQXV0aG9yaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXF1ZXN0ZWRCeUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvZGFhYy1EZXBhcnRtZW50T2ZEZWZlbnNlQWN0aXZpdHlBZGRyZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNMaW5lT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvc2VGb3JtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbER1ZVByb2Nlc3NTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbEV4dGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRGV0YWlsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1N0YXR1c0FkdmVyc2VFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW1waW5nT3JDb3VudGVydmFpbGluZ0Fzc2Vzc21lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bXBpbmdTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0Q2FuYWRhczhEaWdpdFN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVucy1EdW5BbmRCcmFkc3RyZWV0UGx1czQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bnNTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbjJQbHVzMkR1bkFuZEJyYWRzdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlUYXhPckZlZVBheW1lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5bmFtaWNHZW5lcmF0b3JTZXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeW5hbWljTG9jb21vdGl2ZVRhZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXJhLUlkLUVkaVJlZ2lzdHJhdGlvbkF1dGhvcml0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0RXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxTdHVkeUFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9tYWduZXRpY1RyYW5zbWl0dGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuaGFuY2VkUGFydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eVJlbGF0aW9uc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RhdHVzTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcnJvckNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNzZW50aWFsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkVGltZU9mQXJyaXZhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlVHlwZUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGluZ01ldGhvZFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV0aG5pY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhbHVhdGVXb3JrQ2FuZGlkYXRlTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0ZVdvcmtDYW5kaWRhdGVSZWFzb25Mb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50QWJhdGVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRPckV4cG9zdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRSZWFwcGVhcmFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5hdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNhdmF0aW9uSW5mb3JtYXRpb25Db2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzTWF0ZXJpYWxEaXNwb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZUR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydENvbW1vZGl0eUNsYXNzaWZpY2F0aW9uLVVTU2NoZWR1bGVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuc2lvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXllQ29sb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eVNlY3VyaXR5Q2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlVG9Bd2FyZFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlQWRqdXN0YWJsZVJhdGVNb3J0Z2FnZVBsYW5Db2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tTW9ydGdhZ2VJbnN1cmFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1Qb29sRmVhdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVJlbWl0dGFuY2VQcm9ncmFtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tU3BlY2lhbEZlYXR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVSZWZpbmFuY2VQbGFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEZpbmFuY2VDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIZWFsdGhDYXJlQ29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTG9naXN0aWNzQ29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUHJvY3VyZW1lbnRDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUcmFuc3BvcnRhdGlvbkNvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQW5hbHlzaXNDYXRlZ29yaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbmZvcm1hdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1BbGxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJdGVtQXR0cmlidXRlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1SZWNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxNYW5hZ2VtZW50U2VydmljZUNhc2gtTGlua0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUmVnaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSb3V0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZWV0UGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvd09mVGhlR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbGxvdy1VcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkxpbmVPZkJ1c2luZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNDb3VudHJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nUmVzdHJpY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjLUZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb24tTW9ydGdhZ2VJbnN1cmFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjLUZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb24tUmVtaXR0YW5jZVByb2dyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjLUZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb24tU3BlY2lhbENoYXJhY3RlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNSZWZpbmFuY2VQbGFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZU9uQm9hcmRTaXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5QmFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRQdXJwb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWluT3JMb3NzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFNlcnZpY2VzQWRtaW5pc3RyYXRpb25DdXN0b21lclN1cHBseUNlbnRlck51bWJlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxUZXJyaXRvcnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXRNb3VudGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xhc3NBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWdlbmN5UHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZU9mRGlmZmljdWx0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWlyQ29sb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ0FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXplZFN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNDcmVkZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNSZXNwb25zZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlQ2xhaW1TdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25Db21tb25Qcm9jZWR1cmFsQ29kaW5nU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25Db21tb25Qcm9jZWR1cmFsQ29kaW5nU3lzdGVtUHJpbmNpcGFsUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25EdXJhYmxlTWVkaWNhbEVxdWlwbWVudFJlZ2lvbmFsQ2FycmllckNlcnRpZmljYXRlT2ZNZWRpY2FsTmVjZXNzaXR5Rm9ybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVQcm92aWRlckNoYXJhY3RlcmlzdGljc0FuZFJlc291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb3ZpZGVyVGF4b25vbXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbmR1c3RyeU9yZ2FuaXphdGlvbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2JieSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWNkMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZnlpbmdDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5RGlzY2xvc3VyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbXVuaXphdGlvbkluamVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdEF4aXNPckFuYWxvZ1BvcnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhY3RSZWNvcmRlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Q29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRDb25zZXF1ZW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50TG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudFJlbGF0ZWRBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvdGVybXMxOTgwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsSW5zdXJhbmNlRmluYW5jaWFsRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsUGFydGljaXBhdGlvbkluQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFNlY3VyaXR5Q2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25JbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlcXVlc3RSZXN1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVxdWVzdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyZWF0bWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlTZWxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25QYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3ZlcmFnZURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlSW5mb3JtYXRpb25JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBsYW5EZXNjcmlwdGlvbkNoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29udGFpbmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29udGFpbmVyUXVhbnRpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb25Qcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvblByaW5jaXBhbFByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uLUljZC05LUNtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkRGVzaWduYXRpb25TeXN0ZW1Gb3JUZWV0aEFuZEFyZWFzT2ZUaGVPcmFsQ2F2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDYXRlZ29yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudEZ1bmRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJzUXVhbGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1NYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNvdXJjaW5nQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JDaGFyYWN0ZXJpc3RpY3NMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk9yaWdpbmF0b3JMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50TGlmZUluc3VyYW5jZUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxIZWFyaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsT3JkZXJUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxTZW50ZW5jZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2luZE9mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaW5kT2ZNb2RpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5UmVzdWx0c0lkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVRlc3RDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbENhc2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEV2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFN0cnVjdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mUmVjb21tZW5kYXRpb25SYXRpbmdDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlhYmlsaXR5RGV0YWlscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlhYmlsaXR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5U2VydmljZUZlYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5U3RhdHVzQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVSZWluc3VyYW5jZU1lc3NhZ2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQnVzaW5lc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxlT2ZBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25zRm9yVGFyaWZmQ2FsY3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpY2FsT2JzZXJ2YXRpb25JZGVudGlmaWVyTmFtZXNBbmRDb2Rlc0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpc3RpY3NDb2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc0Rlc2NyaXB0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc1NldmVyaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yRm9yY2VQcm9ncmFtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRJbmRpY2F0b3JDb2RlLVBldHJvbGV1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWFsQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVCZXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lV2hhcmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFBsYWNlT3JnYW5pemF0aW9uSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFBsYWNlVHJhZGluZ1BhcnRuZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb250cm9sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mQ29tbXVuaWNhdGlvbnNJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbml6YXRpb25PZkNvbnRyYWN0QWRtaW5pc3RyYXRpb25TZXJ2aWNlc1N5c3RlbUVycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWFBbmRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQmVuZWZpdHNTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtT2ZUcmFuc21pc3Npb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJPcmdhbml6YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RFdmFsdWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0aG9kc09mUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlBbmRDaXZpbGlhbkdyYWRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlBc3Npc3RhbmNlUHJvZ3JhbUFkZHJlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2lvbkltcGFjdFN0YXRlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV0YXJ5RnVuY3Rpb25EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5kZXhTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS1NZWRpYU9iamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFjaGEtTmF0aW9uYWxBdXRvbWF0ZWRDbGVhcmluZ0hvdXNlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbEZvclByZXNjcmlwdGlvbkRydWdQcm9ncmFtc1JlamVjdE9yUGF5bWVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZU5hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2VQYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2VTb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsTW90b3JGcmVpZ2h0Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFN0YW5kYXJkVG9vdGhOdW1iZXJpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkRlYnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkV2ZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZlN1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mU3VpdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vTG9uZ2VyQ29uc2lkZXJlZEZvckF3YXJkUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21lbmNsYXR1cmVBY3Rpdml0eUNsYXNzaWZpY2F0aW9uRWNvbm9teUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qb3N0YWxUb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtZUFjdGl2aXRlRnJhbmNhaXNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JsaWdhdGlvblZhcmlhbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25OYXR1cmVPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eUFuZEhlYWx0aEFkbWluaXN0cmF0aW9uUGFydE9mQm9keUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eUFuZEhlYWx0aEFkbWluaXN0cmF0aW9uU291cmNlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5DYXJyaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJBbmRSZWxlYXNlT3B0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNOYXR1cmVPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zT2NjdXBhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zUGFydE9mQm9keUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zU291cmNlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzaXplT3JPdmVyd2VpZ2h0Q3JlZGVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUmlnaHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlRmFpbHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdBbmRPclVucGFja2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUmVxdWlyZW1lbnRMZXZlbEFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUmVxdWlyZW1lbnRMZXZlbEJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUmVxdWlyZW1lbnRMZXZlbENDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0T2ZCb2R5QWZmZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRPZkJvZHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEV2ZW50UHJvYmxlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCZWhhdmlvdXJSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVkZXN0cmlhbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlBbmRDb250ZW50c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUJpbGxUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1MYW5kQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUxlYXNlU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0RGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RQb2ludC1PZi1TYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0U2VsbGluZ0FycmFuZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0VmFsdWVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1SZWd1bGF0b3J5UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5QWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUm95YWx0eUNhbGN1bGF0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5VHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVVuaXRlZFN0YXRlc0dlb2xvZ2ljYWxTdXJ2ZXlGb3JtYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsQ2xhc3NpZmljYXRpb25TdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbFNodXQtSW5SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxUZXN0SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsQ2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRDbGVhcmFuY2VPZmZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51c0luZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU9uQ2xhaW1JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVJlc2VydmVWYWx1YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0YWxJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbFNlcnZpY2VDYXJyaWVyUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3Rjb2RlRGlyZWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0TWFya2V0U3R1ZHlTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjaW91c01ldGFsc0luZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGlvbkRhdGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZXJ2YXRpb25NYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZlbnRpdmVNZWFzdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5RGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFBhcnR5Q2l0aXplbnNoaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eURlc2lnbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXJGaW5hbmNpYWxIaXN0b3J5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UXVhbGl0eURlZmljaWVuY3lSZXBvcnRTdW1tYXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFN1cHBseUNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsRGVzaWduYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbU9yaWdpbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtWWVhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPd25lcnNoaXBFeHRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5T3duZXJzaGlwVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5UmVjb3JkU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5VW5kZXJ3cml0aW5nQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcHJpZXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdDb250cmFjdE9mZmljZXJJbnN0cnVjdGlvbnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJwb3NlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFsZXJ0TGlzdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFzc3VyYW5jZVNpdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29uZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJVbml0UGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXJ5T3B0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnlTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvRnJlcXVlbmN5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9TZXJ2aWNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9TeXN0ZW1UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQWRkaXRpb25hbENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxjYXJMZXR0ZXJNYXJraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsRG9jdW1lbnROYW1lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEhhbmRsaW5nUmVzdHJpY3Rpb25zQW5kSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFybW9uaXplZENvZGlmaWNhdGlvbk9mVGFyaWZmcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEhhcm1vbml6ZWRFcXVpcG1lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsUm91dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVW5pZmllZE5vbWVuY2xhdHVyZU9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlDb21wYW55TmV0d29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5RnJvbnRpZXJBbmRUcmFuc2l0UG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlTZXJ2aWNlc0hhcm1vbml6ZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGluZ1N1bW1hcnlWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZUFzc2V0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yQ29udHJhY3REZWxpdmVyeURhdGVSZXZpc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckRlbGF5ZWRDbG9zaW5nT2ZDb250cmFjdEZpbGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JEaXNwb3NhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckZpbmFuY2lhbEl0ZW1EZXRhaWxDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvclB1YmxpY1JlY29yZEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yUmVxdWlzaXRpb25pbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNpcGllbnRPZkJpbGxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRhdGlvbnNSZWdhcmRpbmdEZWxheWVkRGVsaXZlcmllc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZFByZWNlZGVuY2VCYXNlZE9uSXRzQ3VycmVuY3lJblRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZUFuZFN0YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uVW5pdE9wZXJhdGluZ01vZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDb250cmFjdG9yQWN0aXZpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZU1vbmV0YXJ5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VQb2xpY3lBdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRGV2aWNlQXBwbGljYWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlnaW91c0FmZmlsaWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtZWRpYWxBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVBY2Nlc3Nvcmllc0FuZFNwZWNpYWxFcXVpcG1lbnRPblJhaWxjYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRhYmxlRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRhYmxlRXZlbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnREaXN0cmlidXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGl2ZUJ1eUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50c0luZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmN5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbEFuZENvbW1lcmNpYWxSb29tQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGlvbnNBbmRQcm9oaWJpdGlvbnNQbGFjZWRPblRoZVJlLVVzZU9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1bHRFdmFsdWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3UGVyaW9kSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza0NsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ2hhcmFjdGVyaXN0aWNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Fkd2F5RGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Fkd2F5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlBbmRGaXRuZXNzRWxlY3Ryb25pY1JlY29yZFN5c3RlbXNFcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEZpdG5lc3NFbGVjdHJvbmljUmVjb3JkU3lzdGVtc1N1YnNjcmlwdGlvbk9wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5SGF6YXJkTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1ByaWNlQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZURpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlRXh0cmFjdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF2YW5Pd25lcnNoaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVNvdXJjZU9mSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNoYXJlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUFuZEFnZW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdEFjdE9jY3VwYXRpb25DYXRlZ29yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdEFjdE9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdEFjdE9wZXJhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRPclBheW91dE9wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmTGlmZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50QWNjZXB0YW5jZURpc2NyZXBhbmN5RXhwbGFuYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudFJlbGVhc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVTdGF0ZVJlZ2lzdHJhdGlvblN5c3RlbUFuZE9wZXJhdGluZ0F1dGhvcml0eUNyZWRlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVVzZUxhYmVsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZUFuZFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraW5Ub25lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxBcm1zRXJyb3JUcmFuc2FjdGlvblJlamVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQXJtc1RyYW5zYWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uQ2FuY2VsbGF0aW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VNYWludGVuYW5jZUFuZFJlY292ZXJhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZEZXBvc2l0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZEaXNjbG9zdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mTGVhZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mTG9zc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDYXRlZ29yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb250cmFjdFByb3Zpc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hcmtldGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWFya2luZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXRlcmlhbElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2dyYW1SZXF1aXJlbWVudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZWltYnVyc2FibGVQcm92aXNpb25zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlcXVpcmVtZW50TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVxdWlyZW1lbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkT2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0QWNjb3JkaW5nVVNFbWJhcmdvUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGV4dENsYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGV4dEZvckV4cG9ydEFjY29yZGluZ05hdGlvbmFsUHJlc2NyaXB0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aW9uQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25DbGFzc2lmaWNhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsQWRtaW5pc3RyYXRpdmVJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsTmF0dXJlT2ZUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxPYmplY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsUHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljQnVuZGVzQW10Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRnVuZE9yTm9uLVN0b2NrRnVuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudEFjdGl2aXR5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRBd2FyZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25QYXltZW50T3B0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25SZXF1ZXN0Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uUmVzcG9uc2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lzdGVuY2VUeXBlT2ZQYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZml4T3JMaW1pdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1vbnNUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFyeUFjY291bnRpbmdDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc1N0b2NrVHVybm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseUNvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEZXNjcmlwdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bnRheE5vdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1hdGl6ZWROb21lbmNsYXR1cmVPZkh1bWFuQW5kVmV0ZXJpbmFyeU1lZGljaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1TdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBc3Nlc3NtZW50TWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhPckZlZUV4ZW1wdGlvblJlYXNvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBhcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbEFzc2Vzc21lbnRDaGVja2xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZURpcmVjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVDaGFyYWN0ZXJpc3RpY0xvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVPd25lckxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVUeXBlTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJ0aWFyeURpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0RlbW9ncmFwaGljQ2F0ZWdvcnlDb2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2VRdWVzdGlvbkNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU3RhdGlzdGljYWxDYXRlZ29yeUNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UmVzdWx0c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlRG9jdW1lbnRDb2RlTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVFeGNlcHRpb25BbmRSZXF1aXJlbWVudENvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uU3RhdHVzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25CaWxsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Ib2xkaW5nRGVsYXlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk1vZGVPck1ldGhvZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uTW9kZVJlYXNvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uUHJpb3JpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlQW5kQmFua1NlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeVN5bWJvbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVuZFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUFkanVzdG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQW5kQ2F1c2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlRHVlLUluSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlSWRlbnRpdHlDaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlSW5zcGVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVOdW1lcmljYWxDb250cm9sU3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQXNzZXRzQW5kTGlhYmlsaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkFzc2lzdGFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZCaWxsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQnVzaW5lc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDYXJnb0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNvbnRyYWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29udHJhY3RvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkRlbGF5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRmluYW5jaWFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRmlybUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkluZHVzdHJpYWxBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5xdWlyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZklzc3VlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTG9jYXRpb25SZWNvbmNpbGlhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZk1lZGlhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mUHJvY3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlN0b3JhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTdXJ2ZXlRdWVzdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlUGh5c2ljYWxJbnZlbnRvcnlPclRyYW5zYWN0aW9uSGlzdG9yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUmVjaXBpZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jbGFpbWVkUHJvcGVydHlBZGRpdGlvbnNEZWxldGlvbnNBbmREZWR1Y3Rpb25zQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY2xhaW1lZFByb3BlcnR5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1GcmVpZ2h0Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtUmVzaWRlbnRpYWxBcHByYWlzYWxBdHRyaWJ1dGVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNDb21tb25Db2RpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNTdGFuZGFyZFByb2R1Y3RzQW5kU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0RlcGFydG1lbnRPZkhlYWx0aEFuZEh1bWFuU2VydmljZXNPZmZpY2VPZlZpdGFsU3RhdGlzdGljc0UtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zb2xpY2l0ZWRQcm9wb3NhbFJlamVjdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl6YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNjaW5hdGlvbklubm9jdWxhdGlvbk9ySXNvbGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZU9jY3VwYW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN0YXR1c0FuZFRlcm1zT2ZDYXJyaWFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN0b3dhZ2VMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN1c3RhaW5pbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWV3UGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlvbGF0aW9uVHlwZUNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3lhZ2VEb2N1bWVudE51bWJlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZU1hbmlmZXN0UmVmZXJlbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSZXNlcnZlTWF0ZXJpYWxSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyQ29tbW9kaXR5QW5kU3BlY2lhbEhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJUZXJtaW5hbElkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRPckZyYWdpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZW5EaXNjb3ZlcmVkTG9va3VwIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJZGVudGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZJZGVudGlmaWVyIiB0eXBlPSJMaXN0T2ZJZGVudGlmaWVyIi8+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+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWRlb0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0SUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb250YWN0RnVuY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3REZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZDb250YWN0TnVtYmVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0IiB0eXBlPSJDb250YWN0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0RnVuY3Rpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGVkIiB0eXBlPSJDb250YWN0RnVuY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0RnVuY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0RnVuY3Rpb24iIHR5cGU9IkNvbnRhY3RGdW5jdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb250YWN0RnVuY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0aW5nT2ZmaWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdjb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsSW5zdXJhbmNlSW5mb3JtYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdGl2ZUNvbnRyYWN0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZ0ZXItSG91cnNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudFNjaGVkdWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbnRpb24tVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEZpbmFuY2lhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWROZWdvdGlhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRTaWduYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZENsZWFyaW5naG91c2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbElucXVpcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZFN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVW5pdE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyTmFtZW9yRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FEQW5kQ0FNU3BlY2lhbGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWlybWFuT2ZUaGVCb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VPcmRlckFwcHJvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkV4ZWN1dGl2ZU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmRmluYW5jaWFsT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZJbmZvcm1hdGlvbk9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmT3BlcmF0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVdvcmtzQXV0aG9yaXR5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbXNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ2hvdXNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtPZkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Cb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlZ2VvZkVkdWNhdGlvbkFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcHV0ZXJTeXN0ZW1zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY3VycmVudEVtcGxveWVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVB1cmNoYXNpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFuZFNjaGVkdWxlQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udGFjdEdyYW50aW5nQXBwb2ludG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlbGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5SW5zdHJ1Y3Rpb25zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsU2Nob29sQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yRW1wbG95ZWVUb0V4ZWN1dGVFeHBvcnRQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JFbXBsb3llZVRvRXhlY3V0ZUltcG9ydFByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPclBlcnNvblJlc3BvbnNpYmxlRm9yUHJvY2Vzc2luZ1B1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZlbG9wbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yeUFkdmVydGlzaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb25EaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb25NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cmljaXR5U3VwcGx5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0RhdGFJbnRlcmNoYW5nZUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljU3VibWlzc2lvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1Db25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QtTWlsaXRhcnlUcmFmZmljTWFuYWdlbWVudENvbW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QtU2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGFuZ2Vyb3VzR29vZHNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGVyZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVuaW5nUHJvZ3JhbXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZVZpY2UtUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEFpZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3NpbmdMZW5kZXJBZG1pbmlzdHJhdGl2ZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTdXBwbHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXZpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlQnVzaW5lc3NPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlRW5naW5lZXJpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlRmluZUFydHNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1aWRhbmNlQ291bnNlbG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlVuaXRGb3JJbmZvcm1hdGlvbkRpc3NlbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlVuaXRGb3JJbmZvcm1hdGlvblByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlVuaXRPckNvbXB1dGVyRGF0YVByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHVtYW5SZXNvdXJjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFdvcmtBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRyZWdpc3RyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd0Zpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd1NjaG9vbEFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQXVkaXRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxQdXJjaGFzaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0aW5nRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0aW5nRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29udHJvbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzcG9zaXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbEhhbmRsaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVNlbmRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QnVzaW5lc3NQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEZXZlbG9wbWVudHNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnlQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWVyaWNhbENvbnRyb2xFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWR1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50b3JHdWFyZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0xhYm9yYXRvcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0NsYWltT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUV2YWx1YXRpb25Db21taXR0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkNvbGxlY3Rpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mRGVsaXZlcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50T3JFcXVpcG1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybU1haW50ZW5hbmNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydEVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhd2FyZFN1cnZleU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlUYXhwYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsU3R1ZHlDb250YWN0b3JBdXRob3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2JhdGlvbm9yTGVnYWxPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvblJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TWFuYWdlbWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1EaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3REaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG90eXBlQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNSZWxhdGlvbnNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdDb250cmFjdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBc3N1cmFuY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29vcmRpbmF0b3JDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5SW5zcGVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTdXJ2ZXlvckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVN1cGVydmlzb3JPckNsZXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHlLZXlIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eU9jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJhdGVPckNoYXJnZWJhY2tDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdEb2NrQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxDb21wYW55QWRtaW5pc3RyYXRpdmVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRBdXRob3JpemVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRQcmVwYXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb25Gb3JDb21wdXRlckRhdGFQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbmZvckluZm9ybWF0aW9uRGlzc2VtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb25Gb3JJbmZvcm1hdGlvblByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld0FuZFJlcHJpY2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwcmVzZW50YXRpdmVPckRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sQ2xlcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbG9mVGhlb2xvZ3lBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xvZlZldGVyaW5hcnlNZWRpY2luZUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JkZXJXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVGVjaG5pY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VydmljZXNXb3JrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlSG91c2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvZ3JhbUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRpbkFic2VudGlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkeVN1Ym1pdHRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbXNBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEb2N1bWVudGF0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxNYXJrZXRpbmdSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsV3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNOZXR3b3JrQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lQW5zd2VyaW5nU2VydmljZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyRGV2ZWxvcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmQtUGFydHlBZG1pbmlzdHJhdG9yQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93blBsYW5uaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZmZpY0FkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWZmaWNBdXRob3JpdHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0SW5mcmFzdHJ1Y3R1cmVBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyZ3JhZHVhdGVBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb25QcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpY2VQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXZlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJTdXBwbHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQnJva2VyTWFpbnRlbmFuY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2hvcENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzTWFuYWdlbWVudENvbnRhY3QiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRhY3ROdW1iZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiIHR5cGU9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3ROdW1iZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROdW1iZXJWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZWQiIHR5cGU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyIiB0eXBlPSJDb250YWN0TnVtYmVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWFpbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vYmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1dXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVSTE90aGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJMaXN0T2ZDb250YWN0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYXJ0eUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYXJ0eUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYXJ0eUNvZGVkIiB0eXBlPSJMaXN0T2ZQYXJ0eUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0eUNvZGVkIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlSb2xlQ29kZWQiIHR5cGU9IlBhcnR5Um9sZUNvZGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydHlSb2xlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlDb2RlZCIgdHlwZT0iUGFydHlDb2RlZCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXJ0eVJvbGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2ZEZXN0aW5hdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2YtT3JpZ2luUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyc1NlcnZpY2luZ0JhbmtPblRoZVJlY2VpdmluZ1NpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPd25lcnNTZXJ2aWNpbmdCYW5rT25UaGVTZW5kaW5nU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNyb255bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFB1cmNoYXNlcnNDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmVmZXJyZWRCeU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN1dGVDYXJlSG9zcGl0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUGlja1VwQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aW9uQ2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHVsdERheUNhcmVQcm9ncmFtRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZVRocm91Z2hCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlZENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0ZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lHcmFudGluZ1NlY3VyaXR5Q2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJRFNPckFSQ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJnb0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZvcmNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpc21BbmRPdGhlckNoZW1pY2FsRGVwZW5kZW5jeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sT3JEcnVnQWJ1c2VPckRlcGVuZGVuY3lJbnBhdGllbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sT3JEcnVnQWJ1c2VPckRlcGVuZGVuY3lPdXRwYXRpZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaWFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGllbkFmZmlsaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsZWdlZERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGllZEhlYWx0aFByb2Zlc3Npb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3RtZW50Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YWJsZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUmV0dXJuQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVBZGRyZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHpoZWltZXJzRGlhZ25vc3RpY09yQXNzZXNzbWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGVkTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5JbmRpYW4tT3duZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1pY3VzQ3VyaWFlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lvbG9neVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmdpb3BsYXN0eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxCZWluZ0ludmVzdGlnYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGFudFBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwZWxsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlbGxlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRDb21ha2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRGb3JKb2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzQ29zaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2VyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkSW1wb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmJpdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmNoaXRlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyY2hpdGVjdC1EZXNpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYU9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm1lZFNlcnZpY2VzTG9jYXRpb25EZXNpZ25hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJteUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRocml0aXNUcmVhdG1lbnRDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaXN0YW50U3VyZ2VvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaXN0YW50VVNUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVHZW5lcmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leUZvckRlZmVuZGFudFByaXZhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yRGVmZW5kYW50UHVibGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leUZvclBsYWludGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlPZlJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVjdGlvbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXR5Rm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25Bc3NpZ25lZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkQWNjZXB0aW5nT2ZmaWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRFeHBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZE1hcmtldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkT2ZmaWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFRyYWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXppbmdPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkRGF0YVByb2Nlc3NpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkVW5kZXJ3cml0aW5nU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVXaXRoQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5U2hpcFRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxpZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50V2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsUGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJha2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVJlZmVyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUGVyaW9kRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdHRlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYWxPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkT3BlbmluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kU2hpcFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbC1Ub1BhcnR5Rm9yRGl2ZXJzaW9uQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhpbmdSb29tT3JMRFJQUm9vbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aHBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9vZEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZSZWFsdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9idGFpbFNlcnZpY2VQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZHNtYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2tlZXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVyQ3Jvc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcnJvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3Jyb3dlcnNFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJha2VtYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha0J1bGtCZXJ0aE9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha0J1bGtQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvYWRjYXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPcGluaW9uT3JBbmFseXNpc1JlcXVlc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyT3JTYWxlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2Vyc0Fzc2lzdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRlck5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nSW5zcGVjdG9yYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdTaXRlRm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVQdXJjaGFzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdU9mTGFuZE1hbmFnZW1lbnRQcm9wZXJ0eVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cm5DYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBc3NvY2lhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1BhcnRuZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllckFzT2ZmaWNpYWxseVJlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29ycG9yYXRlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUXVhbGl0eVJldmlld0JvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlpbmdHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VzdG9tc0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZGlkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5keUFuZENvbmZlY3Rpb25zRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY0NhdGhlcml6YXRpb25MYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjSW50ZW5zaXZlQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNSZWhhYmlsaXRhdGlvblByb2dyYW1GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY1JlaGFiaWxpdGF0aW9uU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcm5ldElzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VPZk5lZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xMZXZlbEFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xTdWItQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbFRvcEFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VkaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbEJhbmtPclJlZ3VsYXRvcnlBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxDYXRhbG9ndWVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQWNjb3VudGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmeWluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpcnBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzUGF5ZXJBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydGVyU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNraW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZURyYXduQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmRGVwdXR5Q2xlcmtPZkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zQ2hyb25pY0Rpc2Vhc2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zRGF5Q2FyZUNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zRXllRWFyTm9zZUFuZFRocm9hdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNHZW5lcmFsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0hvc3BpdGFsVW5pdE9mQW5JbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zT3J0aG9wZWRpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNPdGhlclNwZWNpYWx0eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNQc3ljaGlhdHJpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNSZWhhYmlsaXRhdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNUdWJlcmN1bG9zaXNBbmRPdGhlclJlc3BpcmF0b3J5RGlzZWFzZXNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpcm9wcmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJvbmljRGlzZWFzZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJvbmljT2JzdHJ1Y3RpdmVQdWxtb25hcnlEaXNlYXNlU2VydmljZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHVyY2hPcGVyYXRlZEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaWdhcmV0dGVzQW5kVG9iYWNjb0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXRMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50QXV0aG9yaXplZFJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrT2ZDb3VydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWREb29yUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ09yUGFpbnRTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUNvdW5zZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Ecml2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUludmVzdGlnYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbEFzc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25hYmxlQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25Qcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pdHlIZWFsdGhQcm9tb3Rpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFzc2lnbmVkV2VsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUludGVydmlld2VyV29ya3NGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlJbldoaWNoSW50ZXJlc3RIZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55TWVyZ2VkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueS1Pd25lZE9pbEZpZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55V2hpY2hIb2xkc0ZpbmFuY2lhbEludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eUxpc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVSZW50YWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpbmdQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVQcm9wZXJ0eUxpc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBpbGF0aW9uQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW5hbnRzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudE1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcHJlaGVuc2l2ZUdlcmlhdHJpY0Fzc2Vzc21lbnRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY3VycmVudEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1Y3RvclBpbG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW5nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVUb0JlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUtVG9SZWNlaXZlTGFyZ2VQYXJjZWxzQW5kRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlLVRvUmVjZWl2ZU1haWxBbmRTbWFsbFBhcmNlbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGFudHNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyQ3JlZGl0QWNjb3VudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyUmVmZXJyYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJTZXJ2aWNlUHJvdmlkZXJDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdEJhbmsxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0QmFuazIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvY2F0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9wZXJhdG9yT3JMZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclJldHVybkNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN1cnZleUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW50QW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW50QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBZG1pbmlzdHJhdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RlZFNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0aW5nT2ZmaWNlclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLUdlbmVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0T3JDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3Rvci1MZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLU1haW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsRGVsaXZlcnlNZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxSZWNlaXB0TWV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZXJRdWFsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZveWluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1PY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tT3BlcmF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUJ1eWluZ0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLVBhcnRpY2lwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Qcm9kdWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU1lc3NhZ2VUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRpb25Gb3ItUHJvZml0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3NpZ25lcnNFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bmNpbE9mR292ZXJubWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEFwcG9pbnRlZEF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRHcmFudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJhdGluZ0FnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3J0aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3TWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltZVZpY3RpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3MtVG93blN3aXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1RTY2FubmVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEVtcGxveWVyLVByaW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRFbXBsb3llci1TZWNvbmRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9kaWFsUGFyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckZPcldob21TYW1lT3JTaW1pbGFyV09ya1dhc1BlckZvcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJJZGVudGlmaWNhdGlvbkZpbGVDdXN0b21lcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZkNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpcnlEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhUHJvY2Vzc2luZ1NlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3ItSW4tUG9zc2Vzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yc0F0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0UGF5bWVudEF1dGhvcmlzYXRpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjaXNpb25NYWtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNvbnNvbGlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdE9yRm9yZWNsb3N1cmVTcGVjaWFsaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGljYXRlc3NlbkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50aXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZKdXN0aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50SW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25hdGVkSGF6YXJkb3VzV2FzdGVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW5naW5lZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaENoYXJnZVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uRHJheW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25JbnRlcm1vZGFsUmFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25NYWlsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3N0aWNSYWRpb2lzb3RvcGVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhbHlzaXNDZW50ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWZmZXJlbnRQcmVtaXNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkSW5kaXZpZHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2luZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZVBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaXBsaW5hcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0aWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yQnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RKdXN0aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdG9yT2ZPcHRvbWV0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3Rvck9mT3N0ZW9wYXRoeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NvdW50UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QWNjb3VudFBhcnR5c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEJlbmVmaWNpYXJ5c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UmVpbWJ1cnNpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFNlY29uZEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudEN1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRPck1lc3NhZ2VJc3N1ZXJPclNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvaW5nQnVzaW5lc3NBcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbUZpcnN0U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1NZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpbGxpbmdDb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3AtT2ZmTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUdyb2NlcnlEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhYmxlTWVkaWNhbEVxdWlwbWVudFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkSW5kaXZpZHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0RhdGFJbnRlcmNoYW5nZUNvb3JkaW5hdG9yUG9pbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRmlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNSZWdpc3RyYXRpb25VdGlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUmV0dXJuT3JpZ2luYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlbWVudGFyeVNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2libGVQYXJ0eVRvVGhlQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmxlUGFydHlUb1RoZVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURlcGFydG1lbnRTb2NpYWxXb3JrU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU1lZGljYWxUZWNobmljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5UmVzcG9uc2VVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2luZ1NtYWxsQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lclJlc3BvbnNpYmxlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyUmV0dXJuQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5RXF1aXBtZW50RGVzcGF0Y2hQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlFcXVpcG1lbnRSZXR1cm5QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbU1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5SW5mb3JtYXRpb25BZG1pbmlzdHJhdGlvbi1Pd25lZE9pbEZpZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXItQ29uc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1Db25zdWx0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJQaWxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXItUmVzaWRlbnRDb25zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlIb2xkaW5nVGhlSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eUluV2hpY2hBRmluYW5jaWFsSW50ZXJlc3RJc0hlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eVByb3ZpZGluZ1RoZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eVJlc3BvbnNpYmxlRm9yRm9sbG93LVVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50VGVjaG5pY2FsQXNzZXNzbWVudEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnREcm9wLU9mZlBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmVwYWlyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGFibGlzaGVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhbWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1ZGVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZUNvbW1pdHRlZU1lbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0b3JPZkVzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlcnRXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXgtU3BvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZENhcmVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFjb3Jwb3JlYWxTaG9jay1XYXZlTGl0aG90cmlwdGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXllRWFyTm9zZUFuZFRocm9hdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3ItQ29ycmVzcG9uZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5TWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXRoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEdvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxseUNoYXJ0ZXJlZEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3RhdGVDb3VudHlPckNpdHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVsbG93c2hpcEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWxvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkb3JCcmFuY2hPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxDdXN0b21lck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNYWludGVuYW5jZVBlcmlvZERlc2lnbmF0aW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1lc3NhZ2VSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlZmVycmVkVG9Pcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2NoZWR1bGVkRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxQbGFubmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcmVtYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QXBwcmFpc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEJyZWFrVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml0bmVzc0NlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2RDZXJ0aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kRGV0ZXJtaW5hdGlvblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9yYWxEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kU2VydmljZU9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ0xlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkRpc2Nsb3N1cmVJbmZvcm1hdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkxhbmd1YWdlU3lub255bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblJlZ2lzdHJhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVybHlEb2luZ0J1c2luZXNzQXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lcmx5S25vd25BcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJSZWdpc3RlcmVkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JQcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91bmRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91bmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZW9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodE1hbmFnZW1lbnRGYWNpbGl0YXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodE9yQ2hhcmdlc1BheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5ZXJPbkJlaGFsZk9mVGhlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5ZXJPbkJlaGFsZk9mVGhlQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5EZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXR1cmVBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWluaW5nSW52ZW50b3J5TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FyYWdlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJuaXNoZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1BsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvbkVuZGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uU3RhcnRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZXdheVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsSW5wYXRpZW50Q2FyZUZvckFJRFNPckFSQ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTWVkaWNhbEFuZFN1cmdpY2FsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZXJjaGFuZGlzZURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmV0aWNDb3Vuc2VsaW5nT3JTY3JlZW5pbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VyaWF0cmljQWN1dGVDYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VyaWF0cmljQ2xpbmljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lmdFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb2xsZWN0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc093bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlbGVhc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUNvbWJpbmVkQ29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLU1pbGl0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1WZXRlcmFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEZ1cm5pc2hlZFByb3BlcnR5Rk9CUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRMb2FuQWdlbmN5U3BvbnNvck9yQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtTG9jYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW5kcGFyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmRBbWJ1bGFuY2VTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEFmZmlsaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGluZ0NlbnRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBQcmFjdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBQdXJjaGFzaW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJkaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzV2FzdGVHZW5lcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEFuZEJlYXV0eURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVQcm9mZXNzaW9uYWxTaG9ydGFnZUFyZWFGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1pc2NlbGxhbmVvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aFNjaWVuY2VzTGlicmFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVtb2RpYWx5c2lzRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc29wYXRob2xvZ3lMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXNwYW5pY1NlcnZpY2VJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aENhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhDb3Jwb3JhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lU3RhdGVOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxBdXhpbGlhcnlVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbERpc3RyaWN0T3JBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsVW5pdE9mQW5JbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxVbml0V2l0aGluQW5JbnN0aXR1dGlvbkZvclRoZU1lbnRhbGx5UmV0YXJkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3RpbGVXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlZEZyb21Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FyZU9mUGFydHlObzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FyZU9mUGFydHlObzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvbkp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUGxhY2VPZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50QWRqdXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50TGFiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlcGVuZGVudFBoeXNpY2lhbnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEZvci1Qcm9maXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZWxpZ2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk1haW50ZW5hbmNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlZmVyZW5jZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Tb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxNZWRpY2FsUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxTdWJzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmplY3Rpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tUGF0aWVudFBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVNlcnZpY2VTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQW5kQWNjZXB0YW5jZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQW5kQWNjZXB0YW5jZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkxlYWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbk9uU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVkQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uYWxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25Gb3JNZW50YWxSZXRhcmRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU3RvcmVCYWtlcnlEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2xhaW1BZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRPclN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXRlcmlhbE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVsbGVjdHVhbFByb3BlcnR5T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0ZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbUZ1bmRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1UcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmxpbmVTZXJ2aWNlQ29tbWl0bWVudEN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJhbmsxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlCYW5rMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5T3JCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlTGV2ZWxQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuc2hpcEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJwcmV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNvbnRyb2xsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNvbnRyb2xQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvbHZlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnJldm9jYWJsZUJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck9mRGViaXRPckNyZWRpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck9mSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1TaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1TaGlwRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50QW5udWl0YW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludERlYnRvckF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyQW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJKb2ludEFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckpvaW50QW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRWZW50dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVuaW9ySGlnaFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZURlZmVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVWaWN0aW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlV2l0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5UGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaWRuZXlEaWFseXNpc1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3VycGx1c0FyZWFGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kbG9yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFyZ2VCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEJyZWFrVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEtub3duU291cmNlT2ZTdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RW5mb3JjZW1lbnRBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd0Zpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsVGl0bGVIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGluZ0luc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZXNTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVuSG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkTGlhYmlsaXR5Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdE1haWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXRlcmFsbHlUcmFuc2xhdGVkTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQ29ycmVzcG9uZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkhvbGRlckZvclJlYWxFc3RhdGVBc3NldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbk9yaWdpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5TZXJ2aWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxHb3Zlcm5tZW50U3BvbnNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHNGb3JDdXN0b21zRXhhbWluYXRpb25CZWZvcmVDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZMb2FkRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZQcmluY2lwYWxBc3NldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZTcG90Rm9yU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ1Rlcm1DYXJlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmctVGVybURpc2FiaWxpdHlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NpbmdJbnZlbnRvcnlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzUGF5ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnaXN0cmF0ZUp1ZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXRpY1Jlc29uYW5jZUltYWdpbmdGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpZGVuTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbmxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlT3JnYW5pemF0aW9uVXNlZEZvckVzdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW1tb2dyYXBoeVNjcmVlbmluZ0NlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Q29udHJvbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Tm9uLU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnaW5nR2VuZXJhbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lU3VydmV5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlck93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRUaW1lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyay1Gb3JQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckdlbmVyYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzcG9zaXRpb25BdXRob3JpemF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNhZmV0eURhdGFTaGVldFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydENoYXJ0ZXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxEb2N0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbnN1cmFuY2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsTnVyc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdXJnaWNhbE9yT3RoZXJJbnRlbnNpdmVDYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFRyZWF0bWVudEV4ZWN1dGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFRyZWF0bWVudFByZXNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZXRpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVnYXZvbHRhZ2VSYWRpYXRpb25UaGVyYXB5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFudEJhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VkQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VkQ29tcGFueVdpdGhSZXRhaW5lZElkZW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlcmluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXhpY2FuQ3VzdG9tc0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkZGxlU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWdyYW50SGVhbHRoQ2xpbmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUJyYW5jaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJveWFsdHlQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5SW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5LU93bmVkQnVzaW5lc3NMYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHktT3duZWRCdXNpbmVzc1NtYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzSGVhbHRoQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25pdG9yaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUxpYWJpbGl0eUFjY291bnRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZVJlcG9ydFByb3ZpZGVyQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lQ2hhbmdlZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lTm90VG9CZUNvbmZ1c2VkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZW9uQ3JlZGl0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVVuZGVyV2hpY2hGaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVZhcmlhdGlvblN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ2hhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpdmVIYXdhaWlhbk9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF2eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdsZWN0ZWRPckRlbGlucXVlbnRJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVpZ2hib3Job29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZW9uYXRhbEludGVuc2l2ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXR3b3JrTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QXNzaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U2VjdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld3NwYXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlja25hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vSGVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9taW5hdGVkQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9taW5hdGVkRnJlaWdodENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Eb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25lbXBsb3ltZW50SW5jb21lU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSGVhbHRoQ2FyZU1pc2NlbGxhbmVvdXNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1JbnZhc2l2ZUNhcmRpYWNBc3Nlc3NtZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Nb3J0Z2FnZUxpYWJpbGl0eUFjY291bnRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1PY2N1cGFudENvLUJvcnJvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJvZHVjdGlvblN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJvZml0SGVhbHRoQ2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25wcm9maXRJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJhaWxyb2FkRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZWdpc3RlcmVkQnVzaW5lc3NOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVnaXN0ZXJlZEludmVzdG1lbnRBZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50Q3JlZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50R3JvdXBDb21wYW55V2l0aFdob21GaW5hbmNpYWxBY2NvdW50SXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEluc3RydWN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudFRoaXJkUGFydHlDb21wYW55V2l0aFdob21GaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1UZW1wb3JhcnlTdG9yYWdlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5UHVibGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RlQ28tU2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RGb3JQcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eUZvclNoaXBwZXJzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Tm8xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eU5vMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lQ2hhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic2VydmF0aW9uUm9vbVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnN0ZXRyaWNzQW5kR3luZWNvbG9neUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnN0ZXRyaWNzVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbEhlYWx0aFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVGFyaWZmQ29uZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0T3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbEFuZEdhc0N1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQW5kR2FzUmVndWxhdG9yeUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkQXNzaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkU2VjdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkJlaGFsZk9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbi1DYWxsUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uY29sb2d5Q2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuLUhlYXJ0U3VyZ2VyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yLUNvbW11bmljYXRpb25DaGFubmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvci1Fc3NlbnRpYWxTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlByb3BlcnR5T3JFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZQcm9wZXJ0eU9yVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVNvdXJjZVRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZUaGVUcmFuc2ZlclBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck9mU2hpcHBlcnNPcmRlcnMtVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT2ZUaGVTaGlwcGVyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyV3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkNvbXBsZXRpbmdDb25maWd1cmF0aW9uQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uSGF2aW5nU291cmNlQ29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemVkT3V0cGF0aWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZWRTb2NpYWxXb3JrU2VydmljZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuT3JUaXNzdWVUcmFuc3BsYW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxJbnRlcm1vZGFsUmFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRvck9mQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luRHJheW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luTWFpbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5TdWJsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvcGVkaWNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9wZWRpY1N1cmdlcnlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEZXBhcnRtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5kaXZpZHVhbERpc2FiaWxpdHlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTm90LUZvci1Qcm9maXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQZXJzb25PckVudGl0eUFzc29jaWF0ZWRXaXRoU3R1ZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUmVsYXRlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclNwZWNpYWx0eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkVHlwZU9mT3JnYW5pemF0aW9uYWxFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWFMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LU9mLVN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRwYXRpZW50U29jaWFsV29ya1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRwYXRpZW50U3VyZ2VyeVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRwYXRpZW50U3VyZ2ljZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVJbnNwZWN0aW9uQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlVGVzdEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnJpZGVJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyQW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lckFubnVpdGFudFBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lckpvaW50QW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZNZWFuc09mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZQcm9wZXJ0eU9yVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT3JMZXNzb3JzU3VydmV5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyUGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duaW5nSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1lZGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWNhbENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzaGlwRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0UmVtYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRzRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QWNjb3JkaW5nVG9Eb2N1bWVudGFyeUNyZWRpdFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUFzc2lnbmluZ0FTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXRGaW5hbFBsYWNlT2ZQb3NpdGlvbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdFBpY2stVXBMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemVkdG9EZWZpbml0aXplQ29udHJhY3RBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXplZFRvTWFrZURlZmluaXRlQUNvbnRyYWN0QWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6aW5nRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXppbmdSZWxlYXNlT2ZTZWN1cml0eUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURhdGFSZXNwb25zaWJsZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlY2xhcmluZ1RoZVZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvRXhlY3V0ZVJlLUljaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlc2lnbmF0ZWRUb0V4ZWN1dGVTYW5pdGFyeVByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvUHJvdmlkZUxpdmluZ0FuaW1hbENhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RXhlY3V0aW5nQW5kVmVyaWZ5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZpbGxpbmdTaGlwcGVyc09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZvcldob21JdGVtSXNVbHRpbWF0ZWx5SW50ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnJvbVdob21DdXN0b21zRG9jdW1lbnRzQXJlVG9CZVBpY2tlZFVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZyb21XaG9tTm9uLUN1c3RvbXNEb2N1bWVudHNBcmVUb0JlUGlja2VkVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnVsZmlsbGluZ0FsbE9wZXJhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5Qb3NzZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUlzc3VpbmdNdXR1YWxseUFncmVlZENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1haW50YWluaW5nVGhlQ29kZXNVc2VkSW5UaGVNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1haW50YWluaW5nVGhlSWRlbnRpZmllcnNVc2VkSW5UaGVNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1hbmRhdGVkVG9MaXF1aWRhdGVBbkVudGVycHJpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFudWZhY3R1cmVkRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU5vdFRvQmVDb25mdXNlZFdpdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGFzc2luZ1RoZVRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nVGFzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nVmVyaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVByb3ZpZGluZ0ZpbmFuY2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQcm92aWRpbmdHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVjb3ZlcmluZ1RoZVZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVwcmVzZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JEaXNpbmZlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JGaW5hbmNpYWxTZXR0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlc3BvbnNpYmxlRm9yUmVmdWVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVN1Ym1pdHRpbmdRdW90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUaGF0UmVjZWl2ZWREaXNjbG9zdXJlU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRoYXRSZW1pdHNQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvQXBwZWFyQmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQXBwcm92ZVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9iZWFkdmlzZWQtV3JpdHRlbk9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0JlQmlsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQmVCaWxsZWRGb3JPdGhlclRoYW5GcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9GaWxlUGVyc29uYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b0xlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUGVyZm9ybVBhY2thZ2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1ByaW50U29tZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUHJvdmlkZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUFsbERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWNhdGVPZkNvbXBsaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWNhdGVPZkNvbmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmllZEluc3BlY3Rpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWVkVGVzdFJlc3VsdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29tbWVyY2lhbEludm9pY2VSZW1pdHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvbnRyYWN0U2VjdXJpdHlDbGFzc2lmaWNhdGlvblNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29weSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb3JyZXNwb25kZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ3VzdG9tc0RvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVFbGVjdHJvbmljTWVtb09mSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlRnJlaWdodEJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnZpdGF0aW9uVG9PZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVJbnZvaWNlRk9yR29vZHNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUludm9pY2VGb3JMZWFzZVBheW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUxpbWl0YXRpb25zT2ZIZWF2eUVsZW1lbnRzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZU1hdGVyaWFsUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVOb24tQ3VzdG9tc0RvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVPcmRlclRvU3VwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVBhY2tpbmdDcmF0aW5nQW5kSGFuZGxpbmdDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUGFwZXJNZW1vT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVByb3Bvc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVB1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUmVwb3J0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTY2FsZVRpY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTaGlwcGluZ01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVNoaXBwaW5nTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNvbGljaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTdGF0ZW1lbnRPZkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU3RhdGVtZW50T2ZGZWVzRHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVUZWNobmljYWxEb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVRlc3RSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlVHJhbnNwb3J0YXRpb25DcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9XaG9tQWNrbm93bGVkZ21lbnRTaG91bGRCZVNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9XaG9tRG9jdW1lbnRzQXJlVG9CZVByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1dob21Qcm90ZXN0U3VibWl0dGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdhaXZpbmdSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hpY2hEZWxpdmVyc0NvbnNpZ25tZW50c1RvVGhlVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hpY2hQaWNrc1VwQ29uc2lnbm1lbnRzRnJvbVRoZVRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdob1NpZ25lZFRoZURlbGl2ZXJ5UmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaXRoS25vd2xlZGdlT2ZBZmZhaXJzT2ZUaGVDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdpdGhQb3dlclRvVm90ZVNlY3VyaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudENvbXBhbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEVkdWNhdGlvblVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudFJlcHJlc2VudGF0aXZlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNDb21wYW55TmFtZU9ySWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllck9mTGFzdFJlc29ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzQ29tcGFueU5hbWVPcklkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWluZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheS1Ub1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRlc3RyaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRpYXRyaWNBY3V0ZUlucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1lZEF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbkZvcldob3NlQmVuZWZpdFByb3BlcnR5d2FzU2VpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25uZWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9uQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9yT3RoZXJFbnRpdHlMZWdhbGx5UmVzcG9uc2libGVGb3JBQ2hpbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9yT3RoZXJFbnRpdHlMZWdhbGx5UmVzcG9uc2libGVGb3JBbmRXaXRoV2hvbUFDaGlsZFJlc2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9yT3RoZXJFbnRpdHlXaXRoV2hvbUFDaGlsZFJlc2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldGl0aW9uaW5nQ3JlZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldGl0aW9uaW5nQ3JlZGl0b3JzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWNpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuQ2xpbmljT3JHcm91cFByYWN0aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5Ib3NwaXRhbE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuLVNwZWNpYWxpc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Qm91bmRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCb3R0bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mRGlzdGlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZk9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZQZXJmb3JtYW5jZUNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFpbnRpZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5BZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ09yTWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nQ29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdTY2hlZHVsZU9yTWF0ZXJpYWxSZWxlYXNlSXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuU3BvbnNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Q2xlYXJhbmNlT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9kaWF0cmlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pbnRPZlNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5V3JpdGluZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xsaW5nU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RzZWNvbmRhcnlFZHVjYXRpb25SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RzZWNvbmRhcnlFZHVjYXRpb25TZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtU2Vjb25kYXJ5SW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGVudGlhbFNvdXJjZU9mU3VwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlck9mQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtS0RheUNhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1raW5kZXJnYXJ0ZW5Ub0dyYWRlMTJSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1raW5kZXJnYXJ0ZW5Ub0dyYWRlMTJTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5Q3VzdG9tZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5SW5zcGVjdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeU1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeU1haW50ZW5hbmNlUGVyaW9kRGVzaWduYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5UmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCdXNpbmVzc1BhcnRuZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0R3JhbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEZWJ0SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Rpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0luc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmFtZU9mRmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOZWlnaGJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNPY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUaXRsZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVHJhZGVVbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUNoZWNrU2hpcFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udHJvbFBvaW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnN1cmVkT3JTdWJzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW50ZXJleGNoYW5nZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRlcm5hdGlvbmFsVGVsZWNvbUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRyYS1MQVRBQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludmVudG9yeUNvbnRyb2xBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTdXBwb3J0T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U3VyZ2VvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVRheHBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltZUNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbEV4ZWN1dGl2ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJhc2VKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0SW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbnN1cmFuY2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclRpdGxlRXZpZGVuY2VIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVQcmUtS0VkdWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvQm9ub0F0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50UmVzcG9uc2liaWxpdHlGb3JPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFBvc2l0aW9uSG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U2VydmljZXNBbmRSZXBhaXJzQ2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb29yZGluYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VtZW50T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5T3JCdWlsZGluZ01hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb1NlQ291bnNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG90eXBlU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0NoaWxkT3JBZG9sZXNjZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljQ29uc3VsdGF0aW9uLUxpYWlzb25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNFZHVjYXRpb25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNFbWVyZ2VuY3lTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNHZXJpYXRyaWNTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNIZWFsdGhGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNJbnBhdGllbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY091dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNQYXJ0aWFsSG9zcGl0YWxpemF0aW9uUHJvZ3JhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaG9sb2dpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0FsdGVybmF0aXZlU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNIZWFsdGhTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aFNlcnZpY2VJbmRpYW5TZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY29yUHJpdmF0ZU9yZ2FuaXphdGlvbkZvclRoZURpc2FibGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNQcmUtS0VkdWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VkQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc0RlcGFydG1lbnRCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZnlpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGF0aW9uUmVxdWVzdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2ZUltcGxhbnRzVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9Db250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1N0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0TWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdFpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJPZkNoZXF1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJPZkZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNDb3JyZXNwb25kZW50QmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNTdWItRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdGYWNpbGl0eVNjaGVkdWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdQb2ludEZvckN1c3RvbWVyU2FtcGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nU3ViLUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNpcGllbnRPZkNpdmlsb3JMZWdhbExpYWJpbGl0eVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmQtS2VlcGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5Um9vbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmVhdGlvbmFsVGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZXNFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyaW5nSGVhbHRoQ2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJpbmdQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJ5T3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVzYWxQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJ1c2luZXNzTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEludmVzdG1lbnRBZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRQcmluY2lwYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyaW5nTm9ucGFyZW50UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyaW5nUGFyZW50UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uVHJpYnVuYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXJEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlTdGF0ZURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5U3RhdGVFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGFiaWxpdGF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGFiaWxpdGF0aW9uSW5wYXRpZW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25PdXRwYXRpZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW1idXJzaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VJbnRlcm1lZGlhcnlPckJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURyYXltYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VUb1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5kZXJpbmdQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpcmluZ091dGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JSZWZ1cmJpc2hMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjaW5nTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nQ2FycmllcnNOb21pbmF0ZWRBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcm9kdWN0aXZlSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZExlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGVDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzYWxlRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlYXJjaEluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2b2lyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY2VPckRvbWljaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY3lJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRJbnN0cnVjdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwaXJhdG9yeVRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcGl0ZUNhcmVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVFeGhpYml0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlR292ZXJubWVudEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVJbnN0YWxsYXRpb25EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVJbnN0YWxsYXRpb25PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbFBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyb2Nlc3Npb25haXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdHlPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVyYWxIZWFsdGhDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQXNzaXN0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNwZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVzcG9uc2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbHZhZ2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVzVG9CZVJldHVybmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbC1CYXNlZFNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDb3Jwb3JhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyZWVuaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlJbnZlbnRvcnlDb250cm9sQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUxvY2F0aW9uQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVRheHBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlXYXJyYW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZENvbnRhY3RPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEhvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZExldmVsUGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb244QVByb2dyYW1QYXJ0aWNpcGFudEZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5SW5kaXZpZHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyQXNPZmZpY2lhbGx5UmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyT2ZGdW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0NvcnJlc3BvbmRlbnRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5pb3JNZW1iZXJzaGlwUHJvZ3JhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmZvcm1hbmNlU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmZvcm1lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0RlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbHRlcmVkV29ya3Nob3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0xpbmVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1NjaGVkdWxlSXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3dpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2libGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25pZmljYW50T3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVBob3RvbkVtaXNzaW9uQ29tcHV0ZXJpemVkVG9tb2dyYXBoeVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdGVPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdvck90aGVyTG9uZy1UZXJtQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWROdXJzaW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbG90Q2hhcnRlclBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJhc2VTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5RGlzYWR2YW50YWdlZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxseURpc2FkdmFudGFnZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxseUluc3VyZWRQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXRpZXNDb2xsZWN0b3JzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpZXR5T2ZQcm9wZXJ0eUluZm9ybWF0aW9uQ29tcGlsZXJzQW5kQW5hbHlzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvQW5kU2hpcFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9JZkRpZmZlcmVudEZyb21CaWxsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGVQcm9wcmlldG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZVBhcnR5T2ZJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb3Vuc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsaXplZE1vYmlsZVJhZGlvU2VydmljZUxpY2Vuc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsaXplZE91dHBhdGllbnRQcm9ncmFtRm9yQUlEU09yQVJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpZWRSZXBvc2l0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlY2hUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3J0c01lZGljaW5lQ2xpbmljT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHVkQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ2hhcnRlcmVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWFtc2hpcENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NraG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5YXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5QXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZUdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZUtlZXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkeVN1Ym1pdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLUFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0T3JDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3Rvci1Ob21pbmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JXaXRoRGlyZWN0UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLUVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZ3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RPZklucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXJPZlNhbXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlcnNFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlcnNTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLVNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5RGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2Vzc2Z1bEpvYkFwcGxpY2FudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzaW5nUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yeUFwcHJhaXNlck5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllck9yTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyV29ya1RlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydGluZ1BlcnNvbm5lbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUZvckFkZGl0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Rm9yQW50aWR1bXBpbmdPckNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURpc2NoYXJnZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZU1hbmFnZW1lbnRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmdlb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnBsdXNEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleW9yLVBvZmVzc2lvbmFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleW9yUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleW9yVG9wb2dyYXBoaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0Zhcm1Pd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmSXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENvbGxlY3RvcnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4ZW1wdE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVBbnN3ZXJpbmdTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVydGlhcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0xhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3BvbnNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRlckNpcmN1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZWF0cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcGV1dGljUmFkaW9pc290b3BlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5SW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlNYXJrZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJlcHJpY2luZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJlcHJpY2luZ1ByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmV2aWV3aW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmV2aWV3aW5nUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlaG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUluc3VyYW5jZVNlcnZpY2VzUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlVW5kZXJ3cml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdEZXNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdGYWJyaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9wUGFyZW50Q29tcGFueUluU2FtZUNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd2luZ0FnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVuYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWVTeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZVVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0luc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdENoYXJnZVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0RnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFByaW5jaXBhbHNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0ZXJPZkhhemFyZG91c1dhc3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXVtYUNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWJhbEdvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVlc0F0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdE9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0T3JFc3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YmVyY3Vsb3Npc0FuZE9UaGVyUmVzcGlyYXRvcnlEaXNlYXNlc0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVNhbWVDb3VudHJ5UGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0cmFzb3VuZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYXNzaWduZWRBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZXhwZWN0ZWRIYW5kbGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzQ3VzdG9tc0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzT3ZlcnNlYXNTZWN1cml0eUFkbWluaXN0cmF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNpdHktQ29sbGVnZU9yU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zZXJ2aWNlYWJsZU1hdGVyaWFsQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVHJ1c3RlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl6YXRpb25NYW5hZ2VtZW50T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhdGlvbkhvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkYXRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZE5ldHdvcmtQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUN1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVNhbHZhZ2VBc3NpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE1hc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbi1Pd25lZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25Mb2FuQXV0aG9yaXplZFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uTG9hbkd1YXJhbnR5QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmluYXJpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcnlIb3NwaXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmljdGltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWRlb0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVudGVlclNlcnZpY2VzRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VFYXJuZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRGVwb3NpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VLZWVwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJBbWJ1bGFuY2VTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsQ2FzaW5nRGVwdGhBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxQYWRDb25zdHJ1Y3Rpb25Db250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sbHktT3duZWRTdWJzaWRpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5uZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3YWxQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzc0ZvckRlZmVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzc0ZvclBsYWludGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzc0ZvclByb3NlY3V0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21hbi1Pd25lZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21hbi1Pd25lZEJ1c2luZXNzTGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3NTbWFsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tZW5zSGVhbHRoQ2VudGVyT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NpdGVIZWFsdGhQcm9tb3Rpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdGluZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYLVJheVJhZGlhdGlvblRoZXJhcHlVbml0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb25Db2RlZCIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFscGhhTnVtNDAiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjQwIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU3RydWN0dXJlZE5vdGUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIiB0eXBlPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0dXJlZE5vdGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iR2VuZXJhbE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5vdGVJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5vdGVVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRleHRUeXBlQ29kZWQiIHR5cGU9IlRleHRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGV4dFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVkTm90ZSIgdHlwZT0iU3RydWN0dXJlZE5vdGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGV4dFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZGxpbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5Rm9yQnJlYWNoT2ZDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSaWRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckNvbnRyYWN0dWFsU3RpcHVsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvUmVjb3JkUE9UZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFBPVGV4dCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTmFtZVZhbHVlU2V0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVNldCIgdHlwZT0iTGlzdE9mTmFtZVZhbHVlU2V0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lVmFsdWVTZXQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNldE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNldElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lVmFsdWVTZXQiIHR5cGU9Ik5hbWVWYWx1ZVNldCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTmFtZVZhbHVlUGFpciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iTmFtZVZhbHVlUGFpciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mTmFtZVZhbHVlUGFpciIgdHlwZT0iTGlzdE9mTmFtZVZhbHVlUGFpciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZVZhbHVlUGFpciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRhdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZVZhbHVlUGFpciIgdHlwZT0iTmFtZVZhbHVlUGFpciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQXR0YWNobWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQXR0YWNobWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQXR0YWNobWVudCIgdHlwZT0iTGlzdE9mQXR0YWNobWVudCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXR0YWNobWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50QWN0aW9uQ29kZWQiIHR5cGU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50QWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaWxlTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudFRpdGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1JTUVUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXBsYWNlbWVudEZpbGUiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudExvY2F0aW9uIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJBdHRhY2htZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcGRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFuZ2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZk9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWwiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIiB0eXBlPSJMaXN0T2ZPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25JdGVtTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbFNob3J0RGVzY3JpcHRpb24iIHR5cGU9IkFscGhhTnVtNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsUmVmZXJlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVsaXZlcnlDb21wbGV0ZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikl0ZW1EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mQWNjb3VudEFzc2lnbm1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbFJlZmVyZW5jZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUHVyY2hhc2VPcmRlclJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXRhbG9nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbnRyYWN0QW5kU3lzdGVtUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbFJlZmVyZW5jZXMiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsUmVmZXJlbmNlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHVyY2hhc2VPcmRlclJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHVyY2hhc2VPcmRlck51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJjaGFzZU9yZGVyRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJjaGFzZU9yZGVyTGluZUl0ZW1OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRpYWxPcmRlckNvZGVkIiB0eXBlPSJBU05QYXJ0aWFsT3JkZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0aWFsT3JkZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJjaGFzZU9yZGVyUmVmZXJlbmNlIiB0eXBlPSJQdXJjaGFzZU9yZGVyUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZk51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9IlJlZmVyZW5jZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBU05QYXJ0aWFsT3JkZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbE9yZGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXRlZ29yeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXRlZ29yeUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlN0YW5kYXJkQ2F0ZWdvcnlJRCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcnkiIHR5cGU9IkNhdGVnb3J5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdGFuZGFyZENhdGVnb3J5SUQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2xhc3NpZmljYXRpb25JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGVjaG5pY2FsSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCIgdHlwZT0iU3RhbmRhcmRDYXRlZ29yeUlEIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXRhbG9nUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRhbG9nVVJMIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXRhbG9nSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGFsb2dJdGVtSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdGFsb2dSZWZlcmVuY2UiIHR5cGU9IkNhdGFsb2dSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0SUQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJRCIgdHlwZT0iQ29udHJhY3RJRCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3RBbmRTeXN0ZW1SZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udHJhY3RJRCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0SXRlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTeXN0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RBbmRTeXN0ZW1SZWZlcmVuY2UiIHR5cGU9IkNvbnRyYWN0QW5kU3lzdGVtUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUmVmZXJlbmNlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIiB0eXBlPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVR5cGVDb2RlZCIgdHlwZT0iUmVmZXJlbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZmVyZW5jZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwb3J0aW5nUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cHBvcnRpbmdTdWJSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmZXJlbmNlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZUNvZGVkIiB0eXBlPSJSZWZlcmVuY2VDb2RlZCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFiYnJldmlhdGVkTmV3RHJ1Z0FwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlU291cmNlRFVOU051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZVB1cmNoYXNlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlU291cmNlU3VwcGxpZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzb3JpYWxSYWlsRGl2ZXJzaW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NvcmlhbFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nRXF1aXBtZW50TG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdGaWxlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50TWFuYWdlcnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGFydHlzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFBhcnR5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFBheWFibGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRTZXJ2aWNpbmdCYW5rc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlQ3VzdG9tZXJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZU9wZW5JdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVTdGF0ZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRPZk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPblN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkcmVzc2VlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFJlcHJpY2VkQ2xhaW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkUmVwcmljZWRMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRNZW1vQ2hhcmdlQmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVyc2FyeUNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mQ29sbGVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlVGhyb3VnaEJhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZXJvbmF1dGljYWxFcXVpcG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFGRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmZWN0ZWRTdWJzeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5QXNzaWduZWRFbXBsb3llZUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lBc3NpZ25lZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Q2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Q2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlEQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUhpZXJhcmNoaWNhbExldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeXNTdHVkZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudENsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNTaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUdFUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50VG9QYXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvVHJhbnNmZXJNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlySGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lc0ZsaWdodElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUmVjaXBpZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1idWxhdG9yeVBhdGllbnRHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRlZFVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnRGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuQmFua2Vyc0Fzc29jaWF0aW9uVHJhbnNpdE9yUm91dGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5HYXNBc3NvY2lhdGlvbkVxdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbk9zdGVvcGF0aGljQXNzb2NpYXRpb25DZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZURlZHVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlV2VsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5hbHlzaXNOdW1iZXJPclRlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaWFMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTcGVjaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTdHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGlEdW1waW5nQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhYmxlQ29lZmZpY2llbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYWJsZUluc3RydWN0aW9uc09yU3RhbmRhcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2VyTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm9wcmlhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlMaW5lRmVlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXNzbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVRyYW5zYWN0aW9uU2V0U2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25tZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25tZW50UmVjb3JkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkQ2FzZUNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRJbnZvaWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvckpvaW5lZFVuaXROb3RSZXN1YmRpdmlkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWROdW1iZXJGb3JMaW1pdGVkQ29tbW9uRWxlbWVudFBhcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWROdW1iZXJGb3JVbml0UGFya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFB1cmNoYXNlT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNSYWlsd2F5QWNjb3VudGluZ1J1bGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3N1bWluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0YUNhcm5ldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRvbWljU2FmZXR5YW5kTGljZW5zaW5nQm9hcmRQYW5lbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNoZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3Jpc2F0aW9uRm9yUmVwYWlyUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpdHlJc3N1ZWRFcXVpcG1lbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbk51bWJlckZvckV4Y2VwdGlvblRvRGFuZ2Vyb3VzR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25Ub01lZXRDb21wZXRpdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b0xvc3NJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hSZXR1cm5Pck5vdGlmaWNhdGlvbk9mQ2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRW50cnlEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU3RhbmRhcmRFbnRyeUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hUcmFjZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkVW5kZXJ3cml0aW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlUmF0aW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvdXRQcm9jZWR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWRnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZUR1ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0Fzc2lnbmVkQmFua2Vyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0Fzc2lnbmVkU2VjdXJpdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzQWNjZXB0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVByb2NlZHVyZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3NDb21tb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3NJbmRpdmlkdWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUZWxlZ3JhcGhpY051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RvQmFua0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJDb2RlZExhYmVsU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJDb2RlZFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljQ29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0Y2hOdW1iZXJPckxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0Y2hTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbUFzc2VtYmx5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5NaWxlTWFya2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nS2FuYmFuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdNZXRlclJlYWRpbmdBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ01ldGVyUmVhZGluZ0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsYXRlcmFsQ2FyU2VydmljZUFncmVlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRIb2xkSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdDZW50ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbG9mTWF0ZXJpYWxSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mUXVhbnRpdGllc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluYXJ5T2JqZWN0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluTG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rZXRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxlbmRlZFdpdGhCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxlbmRlZFdpdGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlQ3Jvc3NQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZVNoaWVsZFByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kZWRDYXJyaWVySW50ZXJuYWxSZXZlbnVlU2VydmljZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJlYXVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPclNhbGVzT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJSZWZlcmVuY2UxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJSZWZlcmVuY2UyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Q2hhcHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1b2ZMYWJvcmFuZFN0YXRpc3RpY3NTY2hlZHVsZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdVNpZ25pbmdPUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1U2lnbmluZ1NSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0FjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1RheE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQXBwcm92YWxNYXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDYXRhbG9ndWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDcmVkaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNEZWJpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RlYnRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1NoaXBtZW50TWFya051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FkRmlsZUxheWVyQ29udmVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsT2ZmT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxTaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkV4Y2lzZUVudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkZpbmFuY2lhbEluc3RpdHV0aW9uQnJhbmNoQW5kSW5zdGl0dXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuR29vZHNBbmRTZXJ2aWNlc29yUXVlYmVjU2FsZXNUYXhSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUHJvdmluY2VPcGVyYXRpbmdBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuU29jaWFsSW5zdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbldoZWF0Qm9hcmRQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGVkUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50UmVwb3J0aW5nSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRSZXBvcnRpbmdMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQmlsbGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkSXNzdWVyVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FjY2VwdGFuY2VPcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01hbmlmZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJuZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZENvbnNpZ25lZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkUGFja2FnZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFNoaXBwZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzQWdlbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzQ3VzdG9tc0JvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT2ZOZWVkUGFydHlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXN1YWx0eVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzdWFsdHlSZXBvcnRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2d1ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhc3Ryb3BoZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0ZWdvcnlPZldvcmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlZGVudHNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VkaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VpbGluZ0Zvcm11bGFSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c0F1dG9tYXRlZEZpbGVzSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c0Jsb2NrR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1N0YXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1RyYWN0U3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsU2VjcmV0YXJpYXRMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlckNoaWxkRGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsU2VjcmV0YXJpYXRMb2dOdW1iZXJQYXJlbnREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVvZkluY29ycG9yYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlb2ZUcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkTWFpbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JOQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFNUFVTSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZURvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9yZGVyQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VWZXJpZmljYXRpb25Qcm9jZWR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VDYXJkQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQ2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTm90ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxBYnN0cmFjdFNlcnZpY2VSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VsYXJQdWJsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uT2ZPcGluaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbk9mU3RhdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0aXplbnNoaXBEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l2aWxBY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdmlsTGlhYmlsaXRpZXNvZk9pbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3JDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50c0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1PZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZkNvbnRyYWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudHNTeXN0ZW1TZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1QYXJ0aWNpcGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1Vc2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhclRleHRDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudENvbXBhbnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudFJlcG9ydGluZ0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNhbExhYm9yYXRvcnlJbXByb3ZlbWVudEFtZW5kbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FsQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2RlT2ZGZWRlcmFsUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGRSb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsb2NhdGlvbkluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbE9yUHJpdmF0ZVBhc3NlbmdlclZlaGljbGVRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxBY2NvdW50U3VtbWFyeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbGFuZEdvdmVybm1lbnRFbnRpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsRHJpdmVyc0xpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVNhZmV0eUFzc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVlT25Vbmlmb3JtU2VjdXJpdHlJZGVudGlmaWNhdGlvblByb2NlZHVyZXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uQWNjZXNzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFuZFBsYWNlUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kU3luZGljYXRlUmVmZXJlbmNlMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFuZFN5bmRpY2F0ZVJlZmVyZW5jZTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlJc3N1ZWRFcXVpcG1lbnRJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVBlbmRpbmdTYWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlTYWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlWZXJpZmljYXRpb25Tb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGVudEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRVbml0c1BheW1lbnRSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25PZlB1cmNoYXNlRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbk9mU2FsZURvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kb21pbml1bUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25ncmVzc2lvbmFsRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNGdXJ0aGVyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzU2hpcG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50Q2xhc3NpZmljYXRpb25JRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc0Z1cnRoZXJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvblNoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3JzUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RyYWludE5vdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bXB0aW9uRGF0YVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9yRXF1aXBtZW50UmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3JQYWNrYWdpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNwb3NpdGlvbk9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPcGVyYXRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcm9yRXF1aXBtZW50UmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUHJlZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV29ya09yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25GaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvblVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c01vdmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBZGRlbmR1bU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBdWRpdG9ySUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnJlYWtkb3duUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvb3BOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0SG9sZGVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE9wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckRhdGFSZXF1aXJlbWVudHNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yRXN0YWJsaXNobWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBhcnR5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSaWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpb25Db250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ybmJvcmVDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFsbG9jYXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RhUmljYW5KdWRpY2lhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdENlbnRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEVsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUJ1c2luZXNzUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlMZWdpc2xhdGl2ZURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25EaXN0cmlidXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvblJlZGVtcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q291bnNlbGluZ0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRNZW1vTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JEZWJpdEFkanVzdG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmF0aW5nQWdlbmN5c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlcG9zaXRvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbEFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbGl0eURlc2lnbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3BZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0xpc3RlZENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTNTRLZXlUcmFpbkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTNTRLZXlUcmFpbkluZGljYXRvckdyb3VwTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50SW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudG9yTGF0ZXN0Q291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNhdGFsb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VQZXJpb2RTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYXRlcmlhbFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUHJvY2Vzc1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlZmVyZW5jZU51bWJlckFzc2lnbmVkVG9QcmV2aW91c0JhbGFuY2VPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc0luZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNVbml0SW52ZW50b3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclRyYWNraW5nTnVtYmVyRm9yTG9hbmVkTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQmFyQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2lzaW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHJhd2JhY2tFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0d1YXJhbnRlZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc2hvdXNlQnJva2VyTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcmVmZXJlbmNlSW5xdWlyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1JlbGVhc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVmFsdWF0aW9uRGVjaXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNUcmFuc3BvcnRMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQXV0aGVudGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFJdGVtRGVzY3JpcHRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFRdWFsaXR5UmVqZWN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhUmVsaWFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhU3RydWN0dXJlVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVycHVyY2hhc2VvcmRlcm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyVHlwZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNDdXN0b21zSWRlbnRpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVjdENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZVByaW9yaXRpZXNBbGxvY2F0aW9uU3lzdGVtUHJpb3JpdHlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVybWVudEFwcHJvdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFBheW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VHJhaWxlck1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVZlcmlmaWNhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pYWxSZWFzb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5zaXR5T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRhbEluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRhbEluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGlzdExpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mQWdyaWN1bHR1cmVBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkNvbW1lcmNlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlRm9ybTI1MFJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRERUU0NOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZFZHVjYXRpb25BY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkVuZXJneUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEhTQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVREFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZJbnRlcmlvckFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mSnVzdGljZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mTGFib3JBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlN0YXRlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2Z0aGVUcmVhc3VyeUFjcXVpc2l0aW9uT3JQcm9jdXJlbWVudFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlRyYW5zcG9ydGF0aW9uQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZUcmFuc3BvcnRhdGlvbkJvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlRyYW5zcG9ydGF0aW9uSGF6YXJkb3VzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZWZXRlcmFuc0FmZmFpcnNBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50V2hlcmVJbmp1cnlPY2N1cnJlZElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvbkNsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudHNJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdG9yeVRydXN0Q29tcGFueUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcmF0Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2NyaXB0aW9uT2ZDaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaEFkdmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlUG9zdFBhcmNlbHNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25vZlNoaXBtZW50SGFybW9uaXplZEJhc2VkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzUmVsYXRlZEdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3REZWJpdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eUluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHlJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50ZXJSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BlbnNhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxUdXJuSW5Eb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcHV0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uQ2VudGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25TdGF0ZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckFzc2lnbmVkT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yQXNzaWduZWRUcmFuc2FjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0T3JJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNBY2NvdW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc1JlcHJlc2VudGF0aXZlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc1NwbGl0QWdlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25BdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeVBheW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXRpb25BZmZlY3RlZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFZvbHVtZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNGbGlnaHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljSW52ZW50b3J5TWFuYWdlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWljaWxlQnJhbmNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pbmlvbk9mQ2FuYWRhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbVNoaXBwZXJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluaG9sZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2Vlc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ0xpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25PcmRlckJsYW5rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRm9ybXVsYXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0Q2FuYWRhczhEaWdpdFN0YW5kYXJkSW5kdXN0cmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldFVTOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TTnVtYmVyd2l0aEZvdXJDaGFyYWN0ZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRVTlNOdW1iZXJEdW5BbmRCcmFkc3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVXYXliaWxsaW5Sb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlV2F5YmlsbE5vdEluUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlGcmVlUHJvZHVjdHNSZWNlaXB0QXV0aG9yaXNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUZyZWVQcm9kdWN0c1NlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5TWVtb051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQ0NOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0aW9uRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNEYXRhSW50ZXJjaGFuZ2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNkZXZpY2VwaW5udW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGdW5kc1RyYW5zZmVySUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNQYXltZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGV2YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFyZ29OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFyZ29QZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWlzc2lvbkRlc2lnbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlT3JOb25FbXBsb3llZUNsYXNzaWZpY2F0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRheEZpbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVySWRlbnRpZmljYXRpb25OdW1iZXJPZlNlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcnNTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFZpc2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyQmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlSZXBvc2l0aW9uaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nS2FuYmFuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdNZXRlclJlYWRpbmdBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ01ldGVyUmVhZGluZ0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRNaWxlTWFya2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2Vyc1B1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlUHJvcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nRGF0YUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5xdWlyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRBc3Nlc3NtZW50TG9nTnVtYmVyQ2hpbGREbXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRBc3Nlc3NtZW50TG9nTnVtYmVyUGFyZW50RG1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvbkFnZW5jeUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lUZXN0VHlwZVB1cnBvc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvbkFnZW5jeVRyYW5zcG9ydGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudEluaXRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50T3duZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRUcmFuc3BvcnRDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWl2YWxlbnRDb3Vyc2VOdW1iZXJhdFJlcXVlc3RpbmdJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXJyb3JJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY3Jvd0ZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZU9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdGVybXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cjFDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1RyYW5zcG9ydGF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0RGlzdHJpYnV0aW9uTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGFuc2lvbm9uRWZmZWN0b2ZDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydENsZWFyYW5jZUluc3RydWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0ZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRFc3RhYmxpc2htZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRPckV4aGliaXRMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eUlETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eU1lYXN1cmVtZW50UG9pbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5TmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlQW5hbHlzaXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVtZWNoYW5pc21udW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbWlseU1lbWJlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVTZWxsZXJTZXJ2aWNlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxCdXJlYXVPZkludmVzdGlnYXRpb25JbmRpdmlkdWFsSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25Db25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvblRyYWRlT3JCcmFuZElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxFbmVyZ3lSZWd1bGF0b3J5Q29tbWlzc2lvbkNlcnRpZmljYXRlT2ZQdWJsaWNDb252ZW5pZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkhMTUNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBZG1pbmlzdHJhdGlvbkNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIVU1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0FkbWluaXN0cmF0aW9uT3JpZ2luYXRvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSW5mb3JtYXRpb25SZXNvdXJjZXNNYW5hZ2VtZW50UmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1hcml0aW1lQ29tbWlzc2lvbkZvcndhcmRlcnNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNYXJpdGltZUNvbW1pc3Npb25UYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseVNjaGVkdWxlSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVGF4cGF5ZXJzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxXaXJlVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFRFdJUkVDb25maXJtYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZVNjaGVkdWxlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVDb252ZXJzaW9uSm91cm5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUxpbmVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlckNvZGVJc3N1ZWRieUJ1cmVhdU9mQ2Vuc3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlckNvZGVJc3N1ZWRCeUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVUcmFuc2ZlckZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVUcmFuc2ZlclByb3RvY29sTG9jYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbG1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsV29ya0NhbmRpZGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxEZXRhaWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxNYW5hZ2VtZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxQaGFzZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU2V0dGxlbWVudFBhcnR5c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluZUxpbmVDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFRyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNjYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNjYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZWV0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGV4aWJsZVNwZW5kaW5nQWNjb3VudEluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZXhpYmxlU3BlbmRpbmdBY2NvdW50SW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZERhdGFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZFpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vclBsYW5BcHByb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvd1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uQWNjZXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Qcm9kdWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3NpbmdTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zdXJlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRXhjaGFuZ2VDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc05vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25UcmFkZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVzdHJ5UGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYWxTdGF0ZW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yUGlja3VwTGltaXRlZEZyZWlnaHRUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNPckFnZW50c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlVGF4QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1NlbGxlclNlcnZpY2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlWm9uZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheW9yUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsVGltZU9yUGFydFRpbWVFbXBsb3llZUNsYXNzaWZpY2F0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxXb3JrR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRNYW5hZ2Vyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNBbmFseXNpc1NvdXJjZU1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNDdXN0b2RpYW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F1Z2VUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnb0NvbnNpZ25tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsRGVjbGFyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxMZWRnZXJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxQdXJwb3NlTWVzc2FnZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFNlcnZpY2VzQWRtaW5pc3RyYXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0Rlc3RpbmF0aW9uWm9uZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0luZGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljS2V5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljU2NvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdpbm5pZU1hZVBvb2xQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzYW5kU2VydmljZVRheFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJuaW5nQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWNjb3VudGluZ0NsYXNzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWR2YW5jZVByb2dyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWdlbmN5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QmlsbG9mTGFkaW5nT2ZmaWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UHJpb3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRRdWFsaXR5QXNzdXJhbmNlQW5kQ29udHJvbExldmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50VHJhbnNwb3J0YXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkJsb2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbk9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmF2aXR5U291cmNlTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWVuQ2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBY2NvdW50aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBPclBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3d0aEZhY3RvclJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudG9yTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudG9yVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pc2VkU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pemVkQ29kZVN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFzdGVuaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNFeGVtcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1dhc3RlTWFuaWZlc3REb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uTmF0aW9uYWxQYXllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25OYXRpb25hbFByb3ZpZGVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZU1hbnBvd2VyU2hvcnRhZ2VBcmVhRmFjaWxpdHlJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJQkNDTGFiZWxlcklkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZUNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZVJhdGluZ0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZVJhdGluZ1N1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hPcldpZGVGaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoRmFicmljYXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0Q2Vuc3VzVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RCbG9ja051bWJlckFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RDb3VudHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0TWV0cm9wb2xpdGFuU3RhdGlzdGljYWxBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0U3RhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9udGFsQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yc2Vwb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG90Um9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWF0YUNhcmdvQWdlbnRDYXNzQWRkcmVzc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWF0YUNhcmdvQWdlbnRDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0Q5Q00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpY2F0aW9uQ2FyZFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbWFnZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWVkaWF0ZUV4cG9ydGF0aW9uTm9Gb3JJbkJvbmRNb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tZWRpYXRlVHJhbnNwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsZW1lbnRhdGlvblZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydENsZWFyYW5jZUluc3RydWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZXJzUmVmZXJlbmNlTnVtYmVyVG9MZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0UGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXB1dGF0aW9uQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5Cb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kVG9Pck91dGJvdW5kRnJvbVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExlZ2FsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEZWFsZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbEZhaWx1cmVDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFNhbXBsZUluc3BlY3Rpb25SZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxUcm91YmxlSW5kaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kVHJhbnNwb3J0T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uYW5kU3VydmV5U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGVPZlNlY3VyaXR5QW5kRnV0dXJlTWFya2V0RGV2ZWxvcG1lbnRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25Ob3RlSG9sZGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2VydGlmaWNhdGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvbnRyYWN0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRQYXJjZWxQb3N0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkc0xvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJBc3NpZ25lZFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJvclBvb2xJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZExvZ2lzdGljU3VwcG9ydENyb3NzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTWFzdGVyUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hc3RlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VOdW1iZXJOZXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlTnVtYmVyT2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZVRyYWluSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZ292ZXJubWVudGFsTWFyaXRpbWVPcmdhbml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1GdW5kaW5nT3JnYW5pemF0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsQ3VzdG9tZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsRGF0YVByb2Nlc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsUHVyY2hhc2VPcmRlckl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsUHVyY2hhc2VPcmRlclJlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsVmVuZG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRMb2dOdW1iZXJDaGlsZERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRMb2dOdW1iZXJQYXJlbnREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGbGlnaHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGdWVsVGF4QWdyZWVtZW50QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJlZ2lzdHJhdGlvblBsYW5BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsUmVnaXN0cmF0aW9uUGxhblN0aWNrZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbkRvbWluaW9uT2ZDYW5hZGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRJbmR1c3RyeUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJzdGF0ZUNvbW1lcmNlQ29tbWlzc2lvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhUGxhbnRSb3V0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRvcmlhbE5ld0RydWdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvckFzc2lnbmVkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JOb3RlSG9sZGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZU51bWJlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nRGF0YVNoZWV0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU0ZNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JPclByb2plY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRDcmVkaXRTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludGx5QWRtaW5pc3RlcmVkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRWZW50dXJlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ21lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25hbENvbW11bml0eU5hbWVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25hbENvbW11bml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JPcGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yb3JBZmZpbGlhdGlvbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0VHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGl0dWRlRXhwcmVzc2VkaW5EZWdyZWVzTWludXRlc2FuZFNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGl0dWRlRXhwcmVzc2VkaW5TZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VBZ3JlZW1lbnRBbWVuZG1lbnROdW1iZXJNYXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQ29udHJhY3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVJpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyQmxhbmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlclByaW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckVudGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWVCaWxsQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2VlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcm9mQ3JlZGl0RHJhZnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJvZkNyZWRpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyc29yTm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldnlpbmdPZmZpY2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VQbGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZUJpbGxpbmdBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlQmlsbGluZ1N1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRQYXJ0bmVyc2hpcElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVvZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZDcmVkaXRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlua1NlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0QmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdE9mTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMbG95ZHNDbGFpbXNPZmZpY2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkTGluZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkUGxhbm5pbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5BY3F1aXNpdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkZlYXR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUHJvc3BlY3RvcktleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxseUFzc2lnbmVkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxNZWRpYUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2Nob29sQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNjaG9vbERpc3RyaWN0Q291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFN0dWRlbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25FeGNlcHRpb25PcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9ub25Qcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25TcGVjaWZpY1NlcnZpY2VzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbldpdGhpbkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9ja2JveCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpY2FsT2JzZXJ2YXRpb25JZGVudGlmaWVyTmFtZXNhbmRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naXN0aWNzU3VwcG9ydERvY3VtZW50YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ2l0dWRlRXhwcmVzc2VkSW5EZWdyZWVzTWludXRlc2FuZFNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdpdHVkZUV4cHJlc3NlZGluU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ1Rlcm1EaXNhYmlsaXR5UG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzT3JFdmVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlckFydGljbGVOdW1iZXJPZlJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWdhemluZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxib3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxTbG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUF2YWlsYWJpbGl0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JGb3JjZVByb2dyYW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yU3lzdGVtQWZmZWN0ZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWtlZ29vZENvbW1lcmNpYWxMaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW1tb2dyYXBoeUNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlT3JnYW5pemF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb25JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RLZXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVhbFByb2Nlc3NpbmdBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlckRlZmluZWRSZXBhaXJSYXRlc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nRGlyZWN0aXZlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nT3BlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpdGltZURlY2xhcmF0aW9ub2ZIZWFsdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmdPckxhYmVsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBaXJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMYWJlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGVhc2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyU29saWNpdGF0aW9uUHJvY2VkdXJlc1Rlcm1zQW5kQ29uZGl0aW9uc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU3RvcmFnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXR1cmVkQ2VydGlmaWNhdGVPZkRlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRQcm9jZXNzaW5nRXN0YWJsaXNobWVudFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRSZWNpcGllbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEFzc2lzdGFuY2VDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFJlY29yZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVZlcnNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFuZGlzZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFudENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUFkZHJlc3NvcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VEZXNpZ25Hcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUHJvdmluZ1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nQXRUaGVCZWdpbm5pbmdPZlRoZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmdBdFRoZUVuZE9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JQ1JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pY3JvZmlsbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlncmFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUNhbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SW50ZXJkZXBhcnRtZW50YWxQdXJjaGFzZVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5T3JkbmFuY2VTZWN1cml0eVJpc2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5UmFua09yQ2l2aWxpYW5QYXlHcmFkZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsaW5naW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Sb3lhbHR5UGF5b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaXN0ZXJpYWxDZXJ0aWZpY2F0ZU9mSG9tb2xvZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVseWVhcm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9STkVUUGx1c0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNJbnN0aXR1dGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9STkVUUGx1c1VzZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VCYWNrZWRTZWN1cml0eUxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQmFja2VkU2VjdXJpdHlQb29sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUVsZWN0cm9uaWNSZWdpc3RyYXRpb25TeXN0ZW1Pcmdhbml6YXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZWVMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyYW5jZUNvbXBhbnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJhbmNlSW5kaWNhdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JDYXJyaWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yRnVlbENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGVJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlmYW1pbHlQcm9qZWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlQm9va1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VNYXBYQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZU1hcFlDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlU3ViQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVQT09mQW5JbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVpvbmVPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsaXR5QXNzaWduZWRCdXNpbmVzc1JlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVkQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWVyb25hdXRpY3NhbmRTcGFjZUFkbWluaXN0cmF0aW9uRkFSU3VwcGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBc3NvY2lhdGlvbk9mQm9hcmRzT2ZQaGFybWFjeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBc3NvY2lhdGlvbk9mSW5zdXJhbmNlQ29tbWlzc2lvbmVyc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDcmltaW5hbEluZm9ybWF0aW9uQ2VudGVyT3JpZ2luYXRpbmdBZ2VuY3lJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1Db21tdW5pdHlOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvbW11bml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1Db3VudHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtTWFwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbVN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEdvdmVybm1lbnRCdXNpbmVzc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmFsR2FzUG9saWN5QWN0Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEcnVnQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0hlYWx0aEluc3VyYW5jZUNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmVudGFsQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmVudGFsQWdyZWVtZW50UmVhc29uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0U2hpcG1lbnRJZGVudGlmaWNhdGlvbk51bWJlckNvbnRpbnVvdXNNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWluYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbkFtZXJpY2FuSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbkNvbmZvcm1hbmNlUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25OZWdvdGlhYmxlTWFyaXRpbWVUcmFuc3BvcnREb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uT3JpZ2luYXRpbmdUaGlyZFBhcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25QaWNrdXBMaW1pdGVkVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Qcm92aXNpb25hbFBhdGVudEFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25TcG91c2VUaWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vT1Q1QXV0aG9yaXR5WmVyb01pbGVhZ2VSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuRGF0dW1TdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkZyZWVUcmFkZUFncmVlbWVudENvbXBsaWFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5IYXphcmRvdXNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkhhemFyZG91c0dvb2RzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5JbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25TeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT1RJQ09MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRlbXBvcmFyeUltcG9ydGF0aW9uRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWVyb2RlQ2VkdWxhZGVJZGVudGlkYWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWVyb2RlSWRlbnRpZmljYWNpb25UcmlidXRhcmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmplY3RJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlhbmRIZWFsdGhBZG1pbmlzdHJhdGlvbkNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5CaWxsb2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ29udGFpbmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2Vhbk1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlbmRlclRyYWNraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlbnNlVHJhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZXJMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTeW1ib2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZE1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVDYWxsQWdlbmN5VGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmxpbmVQcm9jdXJlbWVudGFuZEFjY291bnRpbmdDb250cm9sVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5hbmRQcmVwYWlkU3RhdGlvbkxpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JBc3NpZ25lZFVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9ySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yTGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvblBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPclBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lckNvbnNpZ25tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0N1c3RvbWVyc1NlY29uZFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25CcmVha2Rvd25TdHJ1Y3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRmRvVHJhbnNhY3Rpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFB1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFJldHVyblJlcXVlc3RSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU2hpcHBlcnNCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyQ2hpbGREYXRhTWFpbnRlbmFuY2VSZXF1ZXN0TG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlckxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJQYXJlbnREYXRhTWFpbnRlbmFuY2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxWb3VjaGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0Nhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQ29tcGFueUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nRGVwb3NpdG9yeUZpbmFuY2lhbEluc3RpdHV0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRvcnNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5PZlNoaXBtZW50SGFybW9uaXplZEJhc2VkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1Q1QXV0aG9yaXR5Q29uZGl0aW9uT3JSZXN0cmljdGlvbm9uQ2FySGlyZVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRUeXBlT2ZSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGJvdW5kRnJvbVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQmxvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVycGFja2FnaW5nVW5pdElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRsZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dG9mU2VydmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duaW5nQnVyZWF1SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tBbmRIb2xkSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdHcm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFncmFwaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWNhbElETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRGaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0Q2F1c2luZ1JlcGFpck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydENvbnNpZ25tZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsUGF5bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRJbnRlcmNoYW5nZWFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZWZlcmVuY2VJbmRpY2F0b3JJbkFEcmF3aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUluZm9ybWF0aW9uTWVzc2FnZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRlbnRDb29wZXJhdGlvblRyZWF0eUFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRyb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzRmluYW5jaWFsSW5zdGl0dXRpb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNGaW5hbmNpYWxJbnN0aXR1dGlvblRyYW5zaXRSb3V0aW5nTm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJBc3NpZ25lZFJlc3VibWlzc2lvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvblRyYW5zaXRSb3V0aW5nTm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5R3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEhpc3RvcnlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbkFkdmFuY2VSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5zdGFsbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQbGFuUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlvcnNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBjc0NhdGFzdHJvcGhlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uQXBwcm92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmdDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5zaW9uQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbElkZW50aXR5Q2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUG9vbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5UHJlc2NyaXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaG9uZUNhbGxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEludmVudG9yeVJlY291bnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZU9mQWN0dWFsUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZU9mQUdlbmVyaWNQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWdneWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbG90TGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5OZXR3b3JrSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbG90RmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1Z051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5Rm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TGlua051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xsdXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdEVudHJ5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVBd2FyZFN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2luY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRlY2Vzc29yQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGV0ZXJtaW5hdGlvbm9mQmVuZWZpdHNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkQ2FsbFNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uU2l0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlXb3JrQ2FuZGlkYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtYXJrZXRBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWFya2V0Tm90aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQXVkaXRQcmlvcml0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFB1cnBvc2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQXVkaXRUeXBlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVJhdGVUYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXJzVmVyaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzRm9ybUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCaWxsb2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ2FyZ29Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NsYWltSGlzdG9yeUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NyZWRpdE9yRGViaXRBZGp1c3RtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NyZWRpdEFkdmljZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEZWxpdmVyeUluc3RydWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlbGl2ZXJ5U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGlzdHJpYnV0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRHJpdmVyc0xpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSGlnaGVzdFNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlSZXBvcnRlZFNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01lbWJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVudGFsQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXF1ZXN0Rm9yTWV0ZXJlZFJlYWRpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2NoZW1lT3JQbGFuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NlcXVlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NoaXBtZW50SWRlbnRpZmljYXRpb25OdW1iZXJDb250aW51b3VzTW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUYXhDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VPclNhbGVzQ2F0YWxvZ3VlUmVzcG9uc2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQXJlYU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMaXN0Q2hhbmdlb3JJc3N1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3RWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVZhcmlhdGlvbkZvcm11bGFSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbHNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JEYXRhVW5pdmVyc2FsTnVtYmVyU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckhlYWx0aEluZHVzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcklkZW50aWZpZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0QmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0U29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUGhvbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBvc3RhbFppcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JwdXJjaGFzZW9yZGVybnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclRheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclRyYWRpbmdQYXJ0bmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVW5pdmVyc2FsUHJvdmlkZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2VlZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0hhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29ySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvcnNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudEJ1ZGdldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VJbmZvcm1hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZU5vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpY2Vuc2luZ0FncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQZXJpb2RGb3JXaGljaExhYm9yQ29zdHNBcmVGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UmVzZXJ2YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTb3VyY2luZ0FncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNwZWNpZmljYXRpb25Eb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2ZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25PckRlYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mT2ZEZWxpdmVyeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlDb21wb25lbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUxvc3NJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zYWxQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkR3JvdXBXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b2NvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdHJhY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyQ29tbWVyY2lhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlck9yZGVyVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclBsYW5OZXR3b3JrSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyU2l0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJVUElOTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aW5jaWFsQ2FuYWRpYW5TYWxlc1RheEV4ZW1wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmluY2lhbFRheElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbFBhdGVudEFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvbklzc3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNEZWVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNGaWxpbmdSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1V0aWxpdGllc0NvbW1pc3Npb25DZXJ0aWZpY2F0ZU9mUHVibGljQ29udmVuaWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3B0aW9uQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTGluZUl0ZW1JZGVudGlmaWVyQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJJbmNsdWRlZGluT25PcmRlclBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyT2ZPcmRlclJlY2VpdmVkU2luY2VMYXN0UmVwb3J0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlck9mU2hpcG1lbnRSZWNlaXZlZFNpbmNlTGFzdFJlcG9ydGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZXNwb25zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVJlcXVpc2l0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzUmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0FjdGl2aXR5Q2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZpZWRNYXRlcmlhbHNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZpZWRQcm9kdWN0c0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlEaXNwb3NpdGlvbkFyZWFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5SW5zcGVjdGlvbkFyZWFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5UmV2aWV3TWF0ZXJpYWxDcmliSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcmFudGluZU9yVHJlYXRtZW50U3RhdHVzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyU3BvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlc3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZU9yU2hvcHBpbmdDYXJ0SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhY2tUeXBlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsT3JSb2FkUm91dGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkQ29tbWlzc2lvbk9pbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRDb21taXNzaW9uUmVjb3JkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsUm91dGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxXYXlCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q29uc2lnbm1lbnROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5V2Fnb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb25mZXJlbmNlSURDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlTm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXdtYXRlcmlhbFN1cHBsaWVyRHVuQW5kQnJhZHN0cmVldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZU93bmVkUHJvcGVydHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbk5vdExvd2VzdENvc3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2FsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQXNzaWduZWREcm9wWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJJRFF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzRmlsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJTdWJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQWR2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdCYW5rc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbXBhbnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdEZXBvc2l0b3J5RmluYW5jaWFsSW5zdGl0dXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BhcnR5c01lbWJlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbmNpbGlhdGlvblJlcG9ydFNlY3Rpb25JZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWNlZEVhcm5pbmdXZWVrSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkUGF0dGVybklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VEcmF3aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJBc3NpZ25lZEJ5VGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyT2ZBUmVxdWVzdEZvck1ldGVyZWRSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJRdW90ZWRPblN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyVG9QcmV2aW91c01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZVZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZFByb2R1Y3RGb3JDaGVtaWNhbEFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZFByb2R1Y3RGb3JNZWNoYW5pY2FsQW5hbHlzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lyaXN0b0ZlZGVyYWxEZUNvbnRyaWJ1eWVudGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpcmlzdG9GZWRlcmFsZGVDb250cmlidXllbnRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENhcGl0YWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDb250cmFjdG9yQWN0aXZpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkTWFpbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25OdW1iZXJPZlByZXZpb3VzQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3Ryb0luZm9ybWFjaW9uRmlzY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3Ryb05hY2lvbmFsZGVDb250cmlidXllbnRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3Ryb1VuaWNvZGVDb250cmlidXllbnRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0aW9uUHJpbWFyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdGlvblNlY29uZGFyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeUd1aWRlbGluZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyZXJzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaXNzdWVDZXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkQ29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkTm9uY29uZm9ybWFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRPYmplY3RJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkVmVuZG9yT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VJbnZvaWNlTnVtYmVyRm9yUHJpb3JCaWxsQW5kSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0YW5jZUFkdmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFBheW9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckFjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQ2F0ZWdvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckRhdGFSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJFc3RpbWF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGVhdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlQm9va2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZUNhcmdvU2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVQYXR0ZXJuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZVdheWJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEFzc2VtYmx5TW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50QXNzZW1ibHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50Q2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50Q3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50RHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2luZ1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UHVyY2hhc2VPcmRlclJhbmdlRW5kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UHVyY2hhc2VPcmRlclJhbmdlU3RhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0Zvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJpY2VkQ2xhaW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJpY2VkTGluZUl0ZW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JDYW5jZWxsYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3Rmb3JRdW90YXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVBc3NlbWJseUxpbmVGZWVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlU2NyZWVuaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZVV0aWxpemF0aW9uR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNldG9hUmVxdWVzdGZvclF1b3RhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEF2YWlsYWJpbGl0eUF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBdmFpbGFiaWxpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXRudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbE1lcmNoYW50c0NlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRQbGFuQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudFBsYW5Qb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXJTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkR29vZHNBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Hb29kc0JpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuTWF0ZXJpYWxBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5zTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZlbnVlU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld2VyRmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3UGVyaW9kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDb25zaWdubWVudE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT3JkZXJOdW1iZXJFbWVyZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT3JkZXJOdW1iZXJFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdJbnN0cnVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdWxlU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZla2VlcGluZ0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUVxdWlwbWVudENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlvZlJhZGlvQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eW9mU2hpcENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09yVGVycml0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBbGxvd2FuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzRGVwYXJ0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNGb3JlY2FzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUGVyc29uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1Byb2dyYW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVnaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXByZXNlbnRhdGl2ZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1Jlc3BvbnNpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdmluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYW5MaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZW1lT3JQbGFuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxPZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxPbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhcmNoS2V5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDb3ZlcmFnZUNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDb3ZlcmFnZUNvbXBhbnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUN1c3RvbXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUVtcGxveWVlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUhlYWx0aEluc3VyYW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlTdWZmaXhDb2RlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRCZW5lZmljaWFyeXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyaWFkZUNvbWVyY2lheUZhbWVudGFJbmR1c3RyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcnlvZlN0YXRlQXNzaWduZWRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbk9mVGhlTmF0aW9uYWxIb3VzaW5nQWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlJbnN0cnVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmFuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyZXJBdXRob3JpemF0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmVyT3JnYW5pemF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0NhdGFsb2d1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0NyZWRpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNEZWJpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzU2FsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ0FycmFuZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJEZWZpbmVkQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzQ2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzRmlsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc1JlZmVyZW5jZVRvVGhlT3JpZ2luYWxNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nQmFua1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGluZ0NvbXBhbnlBdWRpdE51bWJlckF1dG9tYXRlZENsZWFyaW5naG91c2VUcmFuc2ZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVsbGV0aW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUVzdGltYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlR3JvdXBJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUludGVycnVwdFRyYWNraW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJmb3JtZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VyTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREZXN0aW5hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50T3JpZ2luQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RpY2VPck1hbmlmZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwb3duZXJzQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckNhck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0JvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzSGF6YXJkb3VzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0xhYmVsU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ05vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nVW5pdElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1pvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0VGVybURpc2FiaWxpdHlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3dJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVRyYW5zYWN0aW9uU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJUkVOTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVJFVE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZVNwZWNpZmljUHJvY2VkdXJlc1Rlcm1zQW5kQ29uZGl0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0dWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsSW5zdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWV0eW9mUHJvcGVydHlJbmZvcm1hdGlvbkNvbXBpbGVyc2FuZEFuYWx5c3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZUFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRBbmRTZWdyZWdhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZURvY3VtZW50SW50ZXJuYWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNpbmdVbml0T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEJ1ZGdldEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDaGFyZ2VPckFsbG93YW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxHb3Zlcm5tZW50QWNjb3VudGluZ0NsYXNzaWZpY2F0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSW5zdHJ1Y3Rpb25zTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTW92ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBhY2thZ2luZ0luc3RydWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGF5bWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2Nlc3NpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWx0eUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25DbGFzc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvblJldmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaW1lbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0Qm9va2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQcmVtaXVtQXVkaXRDaGFuZ2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFNoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlVGllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja1RyYWluSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJ5Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZE51bWJlck9mSW5zcGVjdGlvbkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFBvaW50TG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZHNDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZHNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc1ZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlQnJpZGdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZVJlcGxhY2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRpbmdQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFzc2VtYmx5RGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ2hhcnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDb250cm9sbGVkU3Vic3RhbmNlTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDcmltaW5hbEhpc3RvcnlSZXBvc2l0b3J5SW5kaXZpZHVhbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZURlcGFydG1lbnRJMjBGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZURlcGFydG1lbnRJQVA2NkZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlSGF6YXJkb3VzV2FzdGVFbnRpdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUluZHVzdHJpYWxBY2NpZGVudFByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxlZ2lzbGF0aXZlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGljZW5zZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50T2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU5vblJlc2lkZW50VmlvbGF0b3JDb21wYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2VBc3NpZ25lZEJ1c2luZXNzUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jZUFzc2lnbmVkRW50aXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2FsZXNUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTZW5hdGVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTdHVkZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRld2lkZUNvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29tcGFueUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrS2VlcGluZ1VuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViYXNzZW1ibHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yRGF0YVJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZGF5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJkaXZpc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmV4aGliaXRMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViRmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViaG91c2VCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eU5vblNhbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5VmVyaWZpY2F0aW9uU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJsaW5lb2ZJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YlNlcnZpY2VyTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lzdGVuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RhbnRpdmVseUNvbnNvbGlkYXRlZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVBaXJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlTWFudWZhY3R1cmVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVOYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViU3ViaG91c2VCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Y2Nlc3NvckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJpbnRlbmRlbmNpYWRlSW52ZXJzaW9uZXNFeHRyYW5qZXJhc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnlBcHByYWlzZXJDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxBZ3JlZW1lbnRBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbENsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJSZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJEb2N1bWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDcmVkaXRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydGluZ0RvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlCb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5zaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dhcE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlRNVDEwMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlRNVDIwMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlRDb25maXJtYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bWJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltYm9sTnVtYmVyRm9yTWlsZXN0b25lT3JMT0JSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1hdGl6ZWROb21lbmNsYXR1cmVvZkh1bWFuYW5kVmV0ZXJpbmFyeU1lZGljaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1lSW5mb3JtYXRpcXVlUG91ckxlUmVwZXJ0b2lyZURlc0VudHJlcHJpc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1lSW5mb3JtYXRpcXVlUG91ckxlUmVwZXJ0b2lyZURlc0V0YWJsaXNzZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZSdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTdWZmaXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlN1cHBsZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhc2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4ZW1wdGlvbkxpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4ZW1wdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhGb3JtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aW5nQXV0aG9yaXR5SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpY2Vuc2VFeGVtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpZW5KdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4U2NoZWR1bGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhTaGVsdGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhXb3Jrc2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhbUFzc2lnbm1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsSW5mb3JtYXRpb25QYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUGhhc2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uQ2lyY3VpdFN1cHBsZW1lbnRhbElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleE1lc3NhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsT3BlcmF0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsUmVsZWFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbkZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXh0RWxlbWVudElkZW50aWZpZXJEZWxldGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRlclNjcmVlbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRCYW5rc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFkbWluaXN0cmF0b3JDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU9yZ2FuaXphdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlPcmlnaW5hdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UHVyY2hhc2VPcmRlckl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UHVyY2hhc2VPcmRlclJlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUZhaWx1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpckNhcm5ldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElSTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUNvbXBhbnlDb2RlQm9va1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVEb2N1bWVudFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlWElYSWRlbnRpZmllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9reW9TaG9rb1Jlc2VhcmNoQnVzaW5lc3NJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xsQmlsbGluZ1RlbGVwaG9uZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDeWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPcmRlckN5Y2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3duc2hpcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG94aWNvbG9neUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjZXJBY3Rpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlckFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRpbmdQYXJ0bmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJUeXBlUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyVXNlQWdyZWVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdGbGlnaHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uQ2F0ZWdvcnlPclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdEd1YXJhbnRlZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb25kZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQWNjb3VudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkV4cG9ydGF0aW9uTm9Gb3JJbkJvbmRNb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Qcmlvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udHJhY3RSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvc3RzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UmV0dXJuUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHJpcHBpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3R1ZmZpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Um91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFNlY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbE1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwbGViYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2Vyc0JpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFNSQnVzaW5lc3NJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb21tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZFc2Nyb3dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkhvdXNlaG9sZEdvb2RzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTGF3U3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mT3V0c3RhbmRpbmdKdWRnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU2NpZW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5EZWZlbnNlRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvblN1cHBsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5EZXBhcnRtZW50T2ZWZXRlcmFuc0FmZmFpcnNBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5Hb3Zlcm5tZW50VHJhbnNwb3J0YXRpb25Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lcnNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNjZXB0YWJsZVNvdXJjZURVTlNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNjZXB0YWJsZVNvdXJjZVB1cmNoYXNlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VTdXBwbGllcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRpbmdBbGVydFJlZmVyZW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOREciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZW1wbG95bWVudEluc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nQ29sbGF0ZXJhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybVJlc291cmNlTG9jYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUNsYWltc1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDb25zaWdubWVudElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUNvbnNpZ25tZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDdXJyYWNSZWZlcmVuY2VOdW1iZXJPZlRoZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlTWFya2V0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVSZWluYWNSZWZlcmVuY2VOdW1iZXJPZlRoZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlU3VwcGxpZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0hhemFyZG91c0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNHb3Zlcm5tZW50VmlzYU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzU3RhbmRhcmRNZXRyb3BvbGl0YW5TdGF0aXN0aWNhbEFyZWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TG9hZERldmljZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRSZWxpZWZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRSZXBvcnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRSZXBvcnRQZXJpb2RJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxSYWlscm9hZFJldmVudWVXYXliaWxsSWRlbnRpZmllZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yRWFzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yTm9ydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvclpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFpZEluc3RhbGxtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHBlclNlcmlhbE51bWJlck9mUmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtU2hpcHBlckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NGUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUFudGlEdW1waW5nRHV0eUNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VCaW5kaW5nUnVsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQ29tbWVyY2lhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQ291bnRlcnZhaWxpbmdEdXR5Q2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUVudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRW50cnlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVByZUFwcHJvdmFsUnVsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlUHJlQ2xhc3NpZmljYXRpb25SdWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VTdGF0ZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRE9FQW5kTkNFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNET1RCb25kU3VyZXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRkNDSW1wb3J0Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRmVkZXJhbEluZm9ybWF0aW9uUmVzb3VyY2VzTWFuYWdlbWVudFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvbkVzdGFibGlzaG1lbnRJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR2VuZXJhbFNlcnZpY2VzQWRtaW5pc3RyYXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dvdmVybm1lbnRBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhdFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUJ1c2luZXNzVXNlUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlTGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVJhZGl1c29mT3BlcmF0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUmVsYXRlZFNlcnZpY2VzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlU2l6ZUNsYXNzUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JBYmJyZXZpYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGFuZ2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNoYW5nZVByb2NlZHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yT3JkZXJOdW1iZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNQcmV2aW91c0pvYk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yVGVybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb25Db2RlTG9jYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb25Db2RlTmF0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnRpY2FsQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxBZ2VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25PcmlnaW5hdG9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWZmYWlyc0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzYVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lUHVyY2hhc2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdWNoZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZURldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVBpY2tUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVN0b3JhZ2VMb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlDb3ZlcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWFwb25TeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbENsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3YWxSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbFRheFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0JyZWFrZG93blN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nU2hpZnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtJdGVtUXVhbnRpdHlEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrU2hpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzaXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGFza0NoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllhcmRQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbURldGFpbCI+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+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVuaXRPZk1lYXN1cmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVT01Db2RlZCIgdHlwZT0iVU9NQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVU9NQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdE9mTWVhc3VyZW1lbnQiIHR5cGU9IlVuaXRPZk1lYXN1cmVtZW50Ii8+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+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRpbWVuc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGltZW5zaW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEaW1lbnNpb24iIHR5cGU9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGltZW5zaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGltZW5zaW9uQ29kZWQiIHR5cGU9IkRpbWVuc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpbWVuc2lvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRpbWVuc2lvbiIgdHlwZT0iRGltZW5zaW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudFZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnRSYW5nZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50IiB0eXBlPSJNZWFzdXJlbWVudCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWVhc3VyZW1lbnRWYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnRWYWx1ZSIgdHlwZT0iTWVhc3VyZW1lbnRWYWx1ZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXRlclRoYW5PckVxdWFsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0ZXJUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5PckVxdWFsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEVxdWFsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVlVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic2VydmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mUmFuZ2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29uZGl0aW9uc0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUFpckVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlQnV0eWxBY2V0YXRlRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVIMk9FcXVhbHMxT3JXYXRlckVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFRvNjBEZWdyZWVzRmFocmVuaGVpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVUb2x1ZW5lRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFwb3JJbkFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFwb3JJbk90aGVyVGhhbkFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZW1wZXJhdHVyZUFuZFByZXNzdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25zT3RoZXJUaGFuU3RhbmRhcmRUZW1wZXJhdHVyZUFuZFByZXNzdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkV0aHlsQWxjb2hvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5FdGh5bEV0aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbldhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdDFBdG1vc3BoZXJlUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlRXRoZXJFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRpY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyLURyaWVkQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzLVJlY2VpdmVkQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpbGlicml1bUJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2lzdHVyZUFuZEFzaC1GcmVlQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94aWRpemluZ0F0bW9zcGhlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjaW5nQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRjaGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmF0ZWRWYXBvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jb25kaXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnQtVGVybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZS1XZWlnaHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvcnJlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckdhbGxvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkb21pbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVPd25lZE9yQ29ycG9yYXRlT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkZWRPckJsb2NrZWRVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RXaGVuU29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNJcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNSZXBhaXJlZE9ySW1wcm92ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbnRhbmVvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9Hb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvTWVkaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb01vZGVyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bVRvR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtVG9IaWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb0dvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9IaWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvTWVkaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kVG9IaWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvY2F0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3JlYXNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGluaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90ZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFzdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyTWlkLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck9mZi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJTdXBlck9uLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lclN1cGVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck9uLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck1pZC1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJPZmYtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyU3VwZXJPbi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJTdXBlck9mZi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay0yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvdWxkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblRpbWVSZWxhdGVkRGVtYW5kIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudFJhbmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1pbmltdW1WYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWF4aW11bVZhbHVlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudFJhbmdlIiB0eXBlPSJNZWFzdXJlbWVudFJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaW5pbXVtVmFsdWUiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1pbmltdW1WYWx1ZSIgdHlwZT0iTWluaW11bVZhbHVlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNYXhpbXVtVmFsdWUiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1heGltdW1WYWx1ZSIgdHlwZT0iTWF4aW11bVZhbHVlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRpbWVuc2lvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXROZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Hcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzUGVyUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXRDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzVG9ubmFnZU9mVGhlVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRUb25uYWdlT2ZUaGVWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh1bWlkaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x0YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlckNvbnN1bXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0RGlzc2lwYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZsb3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob2NrSW1wYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpdmVUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uT3BlcmF0aXZlVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuc2lsZVN0cmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlicm9zaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXVnZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaXVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhaWdodG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRPZkNvbnZleWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VTdW1tZXJEZWFkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJpemVkQ2FyZ29PblZlc3NlbHNXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db250YWluZXJpemVkQ2FyZ29PblZlc3NlbHNXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodEFzY2VydGFpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxPdmVyYWxsTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nTWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkF4bGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlsb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFBvc2l0aW9uSW5UaGVMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZVdpZHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlV2lkdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZVRoaWNrbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZVRoaWNrbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udGFpbmVyQWN0dWFsRmlsbGluZ1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udGFpbmVyTWF4aW11bUNhcGFjaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0hlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tpbmdIZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0ZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlcnJpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHVyaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpblNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbnRoYW5pZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGFzdGljaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWxsaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJvbnRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFN0b3JhZ2VMaW1pdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2ZUluZGV4T2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZERyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZnRlckRyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUcmFuc3BvcnRFcXVpcG1lbnRHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNpZGl0eU9mSnVpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmV0cm9tZXRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVpY2VXZWlnaHRQZXIxMDBHcmFtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJ1aXRTa2luQ29sb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmdsZU9mQmVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRJbmNyZW1lbnRhbE1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsRDEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsRDI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsRDUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3RhY2tpbmdXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTWVhc3VyZUN1YmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRhZ2VGYXRDb250ZW50SW5EcnlNYXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhY2NoYXJvbWV0cmljQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmF0ZUNvbnRlbnRPZkFuQWxjb2hvbGljUHJvZHVjdEFmdGVyQm90dGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaHlkcm91c0NvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2luZ0xvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRpbnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWx2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVXYXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlR3Jhdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtR3Jvc3NPYnNlcnZlZFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtR3Jvc3NTdGFuZGFyZFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVmFyaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bU5ldFN0YW5kYXJkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbE9uLUJvYXJkUXVhbnRpdHktQWZ0ZXJEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVRvdGFsQ2FsY3VsYXRlZFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVG90YWxPYnNlcnZlZFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5uYWdlR2F1Z2VEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTmV0U3RhbmRhcmRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZGltZW50QW5kV2F0ZXJJblBldHJvbGV1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2ZWRSZWZlcmVuY2VIZWlnaHQtVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlSGVpZ2h0LVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsbGFnZUdhdWdlRGlzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW1Db3JyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3dUb0JyaWRnZURpc3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmlnaHRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFrZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2luZ1N0cmVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2luZ1N0cmVuZ3RoV2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRlbnRzT2ZQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbldlaWdodEFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhbWV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbHRhVmFsdWVMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5zaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXB0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0YW5jZUJldHdlZW5Qb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoLUJveGNhckRvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZE5ld1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxvbmdhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpdFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsYW1lbnRDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ2l0dWRpbmFsRmxhdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3ZlcnNlRmxhdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXVnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQtTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFyZG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHREaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdEVuZXJneSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlRGlhbWV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGgtTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZ3RoRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2lzdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlRGlhbWV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZVN0cmV0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclRvbm5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZUh1bWlkaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpc3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9ja3dlbGxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFtV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y3Rpb25PZkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bi1Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJlV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHQtVmFuRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtVmFuRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0UGVyVW5pdE9mQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGhEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoLU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0UGVyVW5pdE9mTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlSGVpZ2h0LUZsYXRCZWRXaXRoUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcXVhcmVuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9vbFNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllpZWxkU3RyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHVtaW5pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyc2VuaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcm9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXNtdXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJib24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGNpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbHVtYml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VyaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGxvcmluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29iYWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJvbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29wcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uUGx1c1NpbGljb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlcm1hbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcm9nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGFzc2l1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnbmVzaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5nYW5lc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbHliZGVudW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pdHJvZ2VuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2RpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pb2JpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pY2tlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaG9zcGhvcnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWxwaHVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpbW9ueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZW5pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGljb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGljaXVtT3h5ZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW50YWxpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGx1cml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0YW5pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbmFkaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdW5nc3RlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaaW5jIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaaXJjb25pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0VGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvT3BlcmF0aW5nVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVtZXJnZW5jeVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250cm9sVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eVJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHkiIHR5cGU9IlF1YW50aXR5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eVZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVZhbHVlIiB0eXBlPSJRdWFudGl0eVZhbHVlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eVJhbmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1pbmltdW1WYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWF4aW11bVZhbHVlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVJhbmdlIiB0eXBlPSJRdWFudGl0eVJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZRdWFudGl0eUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJRdWFudGl0eUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZRdWFudGl0eUNvZGVkIiB0eXBlPSJMaXN0T2ZRdWFudGl0eUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eUNvZGVkIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlF1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlZCIgdHlwZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlDb2RlZCIgdHlwZT0iUXVhbnRpdHlDb2RlZCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlVW5zZXJ2aWNlYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVBdmVyYWdlT3ZlcmR1ZURheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGxhY2VkRm9yQ29sbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudERvc2VQZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50RG9zZVBlclVuaXREaXNwZW5zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaXN0aW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTWFpbnRlbmFuY2VUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxVbml0c0N1bXVsYXRpdmVUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGVkRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVtYW5kUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQcm9tb3Rpb25TYWxlc0ZvcmVjYXN0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxSZXBsZW5pc2htZW50RGVtYW5kUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxVc2FnZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZENvcnJlY3RvclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRUb0ludmVudG9yeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VBdERlYXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VkQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VkTGluZUl0ZW1zQ29tcGxldGVkLUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRMaW5lSXRlbXNEZWxpbnF1ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VIaWdoVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUxvd1ZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VNb2RpZnlpbmdVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTmVhcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTmV4dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VPZkZpbmFuY2lhbEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGVCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyYWxXb3JrZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdFJhZGlvcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZUF0dGVuZGFudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdHRlZFVzYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsVGltZUJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpc2F0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvbkN1bXVsYXRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25PcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25Ub3RhbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZExlbmd0aE9mU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxPck9mZmVyRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mSG9sZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVOdW1iZXJPZlVuaXRzRm9yU2FsZVByb2plY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVOdW1iZXJPZlVuaXRzUHJvamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYU9mTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFQZXJVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNJc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFNlaXplcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0Q29tcGxldGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRDb21wbGV0aW9uUXVhbnRpdHlFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGFudC1IYW5kbGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3Jpc2VkU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUmV0ZW50aW9uTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVSZXNvdXJjZVRhc2tRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VOdW1iZXJPZkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvcmRlckxpbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrb3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1JlamVjdEl0ZW1Db3VudC4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lQZXRpdGlvbnNGaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0aHJvb21Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0aHJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcm9vbUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRyb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nVW5pdFBlclByaWNpbmdVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvb2RSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tPcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnNMZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9uc093bmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hPZmZpY2VMb2NhdGlvbnNFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb3RoZXJzRGVjZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb3RoZXJzTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldEF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldEN1bXVsYXRpdmVUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGVkSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlQ2xhc3NJbmNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZUluZHVzdHJ5SW5jaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVOYXRpb25hbEF2ZXJhZ2VJbmNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXl1cE9yQnV5ZG93blJhdGVQZXJCYXNpc1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCeXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YWxDaGFuZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRSZWdpc3RlcmVkTnVyc2VBbmVzdGhldGlzdE51bWJlck9mQ29uY3VycmVudFByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZXNJbkNhcGl0YWxTdHJ1Y3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUN1YmljTWVhc3VyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlRGlzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZkNvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlBhY2thZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZSYWlsV2Fnb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVUYXJlV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VsYXRpbmdPaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0YXRlbWVudEJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTdG9ja0JhbGFuY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28ySW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJlZC1Fc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdG1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdHRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pdHlTZXJ2aWNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luY2x1ZGVkSW5Db25zb2xpZGF0ZWRGaW5hbmNpYWxTdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luY2x1ZGVkSW5Db25zb2xpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW5pZXNJblNhbWVBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyaXNvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRDb250cmFjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZExpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkUHJvamVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudE1ldGVyUmVhZGluZ0NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50SXRlbU91dHB1dE9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWREaXNjb3VudEludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJSZXNlcnZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJ1eWRvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnV5dXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29tcGxldGVkRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdExpbmVJdGVtUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yQ3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RzQ29tcGxldGVkRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RzQ29tcGxldGVkRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25Ub3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxNb2JpbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252aWN0aW9uc1NlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2REIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLVZlcmJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLVdyaXR0ZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJDbGVya3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJzZVNlZ21lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZC1BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWQtRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUVhcm5lZFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlRWZmZWN0T2ZQcmlvclBlcmlvZEFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVHYXNJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVHYXNWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVMaXF1aWRJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVPaWxPckNvbmRlbnNhdGVWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5QWN0dWFsRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxNZWFzdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5QWN0dWFsUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5T3JkZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RNZWFzdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kUmVhY2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlY2VpdmVkRW5kT2ZQcmlvclllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZXF1aXJlZFByaW9yVG9UaGVGaXJzdFNjaGVkdWxlZFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTY2hlZHVsZWRVcFRvQWNjdW11bGF0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkTG9uZy1EaXNwb3NpdGlvbkNoYWxsZW5nZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRMb25nLURpc3Bvc2l0aW9uUGVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZFNob3J0LURpc3Bvc2l0aW9uQ2hhbGxlbmdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZFNob3J0LURpc3Bvc2l0aW9uUGVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVNjaGVkdWxlVmFyaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVTY3JhcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlVmFyaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVXYXRlclZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERheXNPbk1hcmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0aWJsZUJsb29kVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmF1bHROb3RpZmljYXRpb25SZXNwb25zZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVncmVlU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QmF0Y2hNdWx0aXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlRdWFudGl0eUJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50c0FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50VG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3Ryb3llZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbExlZ2FsRmlsaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0cmltZW50YWxMZWdhbEZpbGluZ3NBZ2FpbnN0RGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaW1lbnNpb25hbFNhbXBsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFNoaXBtZW50UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlZXRRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25DcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblBlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zaXRpb25VbmRldGVybWluZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9ySW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0FmZmlsaWF0ZWRDb21wYW5pZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljVXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZS1JbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyYXRpb25JbkN1cnJlbnRKb2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR3ZWxsaW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5lZFZhbHVlQ3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWVIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGFwc2VkRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNTaWduYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QtQWNjaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kLVNpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lNb2RpZnlpbmdVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEF0VGhpc0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEJ5VGhpc0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUHJvZmVzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRPblRoaXNKb2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1Ob25vd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzTm90SW5jbHVkaW5nT3duZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOdW1iZXJPZkRheXNBd2F5RnJvbVdvcmtEdWVUb0luanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzTnVtYmVyT2ZEYXlzT2ZSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9Jbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1Pd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLVBhcnRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtU2FtZUR1dGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLVNhbWVPY2N1cGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNTaGFyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc1RvdGFsTnVtYmVyT2ZEYXlzQXdheUZyb21Xb3JrRHVlVG9JbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsRmlyc3RNb250aE9mUXVhcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbFNlY29uZE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsVGhpcmRNb250aE9mUXVhcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mTW9udGhJbnZlbnRvcnlQcmlvclRvU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyZWRTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXR5U2VjdXJpdHlIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlQXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBY2NvdW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQW5udWFsVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkRW1wbG95ZWVzQXRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZWFkaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlbWFpbmluZ0Vjb25vbWljTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVtYWluaW5nUGh5c2ljYWxMaWZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRUb3RhbEVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhcG9yYXRlZFdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGlzdGVuY2VMaW1pdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5kaXR1cmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRUZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYVVucGxhbm5lZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVTaXplQWZ0ZXJDb21wcmVzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVNpemVCZWZvcmVDb21wcmVzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDb3ZlcmFnZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hPZmZzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFyZU9yRmxhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRFeHRyYVByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JzT2NjdXBpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdEF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0ZWRTY2FubmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0VG9Db21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblJlbGF0ZWRFbnRpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZW1lbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRmxvYXQtSW5DYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRmxvYXRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlR29vZHNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZWxhbmNlRGVidENvbGxlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVsYW5jZVNhbGVzcGVyc29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVF1YW50aXR5SW5jbHVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVRdWFudGl0eU5vdEluY2x1ZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxDb25zdW1lZE9yQnVybmVkQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsUHVtcHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxCYXRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEdyb3VwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFNhbXBsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJuaXNoZWRCbG9vZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VPckNhcnBvcnRBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0xpZnRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1JlY2VpcHRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1JldHVybmVkVG9FYXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmV0dXJuZWRUb1Byb3BlcnR5Rm9yRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzU2hyaW5rYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yRHJpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JGdWVsU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yUGxhbnRGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yUmVwcmVzc3VyaW5nT3JQcmVzc3VyZU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkT25Qcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxFbGltaW5hdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlcG9ydGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZVRyYW5zZmVyQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0FubnVhbEluY29tZU11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzQnVpbGRpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0VzdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0xpdmluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTGl2aW5nRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1JlbnRNdWx0aXBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRmVlQnV5dXBNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVSYXRlQWZ0ZXJBbHRlcm5hdGVQYXltZW50TWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVSYXRlQWZ0ZXJCdXl1cE9yQnV5ZG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvbkF1dGhvcml6YXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdE9yVHlwZUZseWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdFR5cGVPckxpZmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tQWlyY3JhZnRUeXBlT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tTGlmZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tVHlwZUZseWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWlybWVudER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhaXJtZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNyZW1lbnRhbE9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGlyZWN0RW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUJ1c2luZXNzRmFpbHVyZUluY2lkZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJvdmlkZXJTdGFuZGFyZGl6ZWRNb3RvclZlaGljbGVQZW5hbHR5UG9pbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlYWRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVkQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudFBheW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VmZmljaWVudEZ1bmRzUmV0dXJuZWRDaGVxdWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlbmRlZENoYW5nZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0Rm9yT3ZlcmRyYXduQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVRlcm1QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydGFua1RyYW5zZmVyQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRyYW5zaXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDYXRlZ29yeVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlEaXNjcmVwYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5TW92ZW1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5T25TaGVsZldvcmtJblByb2dyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlRdWFudGl0eUF0U3VwcGxpZXJzTm90U3ViamVjdFRvSW5zcGVjdGlvbkJ5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVF1YW50aXR5QXRTdXBwbGllcnNTdWJqZWN0VG9JbnNwZWN0aW9uQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5V2l0aGRyYXdhbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2x2ZW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFpbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlbWVudHNSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsU3RheUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VySG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhZ1RpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRIb2xkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVQYXltZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RDdW11bGF0aXZlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd1N1aXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VQZXJpb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGhPZlJlc2lkZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxSZXNvdXJjZS1RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxSZXNvdXJjZVRhc2tRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxzT2NjdXBpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VXaXRoZHJhd2FsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VXaXRoZHJhd2Fsc1NlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVuc1JlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmV0aW1lQ2FwYWNpdHlPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmUtVGltZVJlc2VydmUtQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZldGltZVJlc2VydmVEYXlzLUFwcGxpZWRUb1RoaXNDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZS1UaW1lUmVzZXJ2ZS1Fc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1zQ29tcGxldGVkRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1zQ29tcGxldGVkRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVUaHJlYWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXZlc3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUmVwYXltZW50VG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NPckdhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RHYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdE9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdFdvcmtUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0V29ya1RpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdFNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVSYWRpb3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFByaWNlQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRjaGluZ0VxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxPbi1Cb2FyZFF1YW50aXR5UHJpb3JUb0xvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZC1BY2NpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2RBY2NpZGVudFRvQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZC1TaWNrbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2RTaWNrbmVzc1RvQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUZvcmVjYXN0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1JbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1NYXR1cml0eUV4dGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZFbXBsb3llZXNBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZQdXJjaGFzZU9yZGVyc0FsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZlNoaXBtZW50c0FsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1PcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUHJvZHVjdGlvbkJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUXVhbnRpdHlUb1doaWNoVGF4UmF0ZUFwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1SZXF1ZXN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU2hpcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3RhY2thYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3RvY2tMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN1cHBseVF1YW50aXR5U3VwcGxpZXJFbmRvcnNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWNoYW5pY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXRpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyc0luR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NlbmdlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U2FsZXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbGlvbkRvbGxhclJvdW5kdGFibGVDcmVkaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQXZlcmFnZVRpbWVSZXF1aXJlbWVudFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ29udHJhY3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bURlbGl2ZXJ5QmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1FbXBsb3llZXNBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRmFicmljYXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUZvcmVjYXN0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1JbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1OdW1iZXJPZkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUGFja2FnZUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVByb2R1Y3Rpb25CYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVF1YW50aXR5VG9XaGljaFRheFJhdGVBcHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVxdWVzdGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNoaXBRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVN0b2NrTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1UcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9iaWxlTG9hZGluZ0FsbG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsT3JUYXJnZXRTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlUG9vbENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRRdWFudGl0eURlY3JlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRRdWFudGl0eUluY3JlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRUb1BheUl0ZW1Db3VudC4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vRGVsaXZlcnlSZXF1aXJlbWVudEluVGhpc0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQmlsbGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29tbWl0dGVkSW52ZW50b3J5T25TaGVsZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29uZm9ybWFuY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnNvbGlkYXRlZFRvdGFsLURvbWVzdGljU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29uc29saWRhdGVkVG90YWwtRm9yZWlnblN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY292ZXJlZC1BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db3ZlcmVkLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLURvbWVzdGljU3RvY2tob2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25leGNsdXNpdmVVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVW5pb25FbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1VcmdlbnREZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZXBsYWNlZEJsb29kVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWNjb3VudHNQYXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFjdGl2ZUFjY291bnRzVGhpc0N5Y2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFkZGVkTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFkanVzdG1lbnRQZXJpb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkF0dGFja3NPck9jY3VycmVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkJhdGNoZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQm9ycm93ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNhcmRzTm90UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2FyZHNPdXRzdGFuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDaGVja3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2xhaW1hbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNsb3NlZExvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDby1JbnN1cmFuY2VEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNvcGllc09mQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNyZXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGF5c0NvdmVyZWRCeUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlbGlucXVlbnRJbnN0YWxsbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVsaXZlcmllc1BlckRlc3BhdGNoUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlcGVuZGVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRW5kVXNlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRW50aXRsZWRFeGVtcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZhaWxlZEJ1c2luZXNzZXNPZkRpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZGcmFuY2hpc2VlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZGdWxsLVRpbWVFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSG9zcGl0YWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZklkZW50aWNhbEhhbmRsaW5nVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSW5zdXJlZExpdmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkludGVyZXN0UGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXJyZWd1bGFySW50ZXJlc3RQYXltZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJdGVtc0F1dGhvcml6ZWRBdFN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zQXV0aG9yaXplZEF0V2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zSW5TdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMYXRlQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMZXZlbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGltaXRlZFBhcnRuZXJzaGlwU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxpdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMb2FucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMb3N0Q2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTWVtYmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNZXNzYWdlUmVjaXBpZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb250aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTW9ydGdhZ29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb3VsZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTm9uLUNvdmVyZWREYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk5vbnN1ZmZpY2llbnRGdW5kSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlbkFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9wZXJhdGluZ1BlcmlvZHNBdEZhaWx1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlcmF0b3JDcmVkaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9yaWdpbmFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYWNrYWdlc0luSGFuZGxpbmdVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhc3NlbmdlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGF0aWVudEFkbWlzc2lvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGVvcGxlTGl2aW5nQXRSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGh5c2ljaWFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQcm9kdWNpbmdXZWxsc1JlbWFpbmluZ09uUHJvcGVydHlPckZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlByb2R1Y2luZ1dlbGxzUmVtYWluaW5nT25Sb3lhbHR5QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZRdWFudGl0YXRpdmVJbmNlbnRpdmVTY2hlbWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTZXJ2aWNlc09yUHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaGVsZkZhY2luZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2hlbGZUYWdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNpZ25lZEJpbGxzT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU3RhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU3RvbGVuQ2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU3RvcHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGhlYXRyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGltZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGltZXNEZXBvcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUcmFuc3BvcnREb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHMtSG91c2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0c0luVGhlRGVwdGhPZkFMYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0c0luVGhlV2lkdGhPZkFMYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbnNpZ25lZEJpbGxzT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mV2l0aGhvbGRpbmdFeGVtcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJzT2ZDb25zdW1lclVuaXRzSW5UaGVUcmFkZWRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJXZWVrc1BhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2VtSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VXb3JrZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZMZWFzZUZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlByZW1pc2VTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQcmVtaXNlc1NhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxDb25kZW5zYXRlU29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQ29uZGVuc2F0ZVVzZWRPblByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxPckNvbmRlbnNhdGVWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbFNlZGltZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbFRoZWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhhbmRBbmREdWUtSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSG9sZEZvclNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbk9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUHJlbWlzZVNhbGVzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUHJlbWlzZXNTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ1N0YXRlbWVudEJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5pbmdTdG9ja0JhbGFuY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdCZWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdEaXZpc2lvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yc1dvcmtpbmdJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJRdWFudGl0eU11bHRpcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2FuVGVybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQYXltZW50SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxUZXJtSW5ZZWFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR2FzRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck1pc2NlbGxhbmVvdXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJPaWxDb25kZW5zYXRlRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRQYXJ0aWNpcGFudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRTdG9ja2hvbGRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyV2FyUmVzZXJ2ZU1hdGVyaWFsUmVxdWlyZW1lbnRzUHJvdGVjdGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXRlckRpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRsaWVyRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZJbnZlbnRvcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c3RhbmRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c3RhbmRpbmdTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1UdXJuZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmZsb3dRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlclNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNFcXVpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcENoYW5nZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcFBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bk9jY3VwYXRpb25RdWFsaWZpY2F0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtSW5Db21tb25TaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtSW5QcmVmZXJyZWRTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtSW5TZWN1cml0eVNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFya2luZ1NwYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEJhdGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGFudFRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW9uU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFRpbWVFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3REdWVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRDYW5jZWxsYXRpb25JdGVtQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdXJhdGlvbldlZWtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RXhwZXJpZW5jZXNJblRoZUxhc3QxMk1vbnRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEV4cGVyaWVuY2VzSW5UaGVMYXN0M01vbnRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyc0ZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50c051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZU9mT3JkZXJlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY0NhcGFjaXR5T2ZUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkVtcGxveW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFF1YW50aXR5TWVhc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFF1YW50aXR5UGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlSZWFjaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzaXN0ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25zRmlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzSWlpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFN0YXR1c0l2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFN0YXR1c1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllY2VzRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxmZXJhZ2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZUFkanVzdG1lbnRPckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpdHRlZFdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRQZXJpb2RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkVW5pdERldmVsb3BtZW50VW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50U2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRXb3JrZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0YWJsZVJhZGlvcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydGVkVGVsZXBob25lTGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtT3BEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3VsdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkb21pbmF0ZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLU9wRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZFF1YW50aXR5Tm90U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZFF1YW50aXR5U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLVByb2R1Y3Rpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Eb3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkVmZmVjdGl2ZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzaWRlbnRpYWxWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3N1cmVCYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0JlbmVmaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1bXVsYXRpdmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNIaWdoZXN0Q3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5QW1vcnRpc2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTW9udGhzVXNhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTnVtYmVyT2ZBY2NvdW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkJyYW5jaExvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNPcmRlclF1YW50aXR5VG9CZUNhbmNlbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNXZWVrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNpbmdVbml0UGVyQmlsbGluZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlNYW5hZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU1ldGVyUmVhZGluZ1ZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TmV0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbHNJbmNsdWRlZEFzRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckN1bXVsYXRpdmVJbWJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVW5pdHNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvYmF0aW9uRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2luZ1dlbGxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RXhjaGFuZ2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25SZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25Xb3JrZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U2FsZXNBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkQXZhaWxhYmxlSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGhhc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0c0luUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFVuaXRzU29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVzdGVkQmlsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uVHVyblNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT2ZQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZpY2F0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZ5aW5nV2Vla3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sRmFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbEhlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXRhdGl2ZUluY2VudGl2ZVNjaGVtZUJhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QWR2aXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBcHByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdDEwMFBjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVGb3JSZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlRm9yU2FsZS1TdG9ja1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZU9uU2hlbGYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXdhaXRpbmdEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlCeVBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUNhbmNlbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlDYXJyaWVkRm9yd2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEZWZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzYXBwcm92ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzcGVuc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc3BsYXllZE5vdEF2YWlsYWJsZUZvclNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RWFybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeURlbGl2ZXJ5VmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlIZWxkQnlMb2dpc3RpY1NlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlIZWxkQnlSZXRhaWxPdXRsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5GbG9hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbkhvbGRPdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5NYW51ZmFjdHVyaW5nUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJblBoeXNpY2FsSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluUXVhcmFudGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUxvYWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlNYW5pZmVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU5vdEF2YWlsYWJsZUZvckRlc3BhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9mRGVhbGVyTGljZW5zZVBsYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPZk1hdGVyaWFsSW5PcmRlcmVkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPbkhhbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T25Ib2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlck5leHRIaWdoZXJBc3NlbWJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJQYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclNraWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyVW5pdE9mSXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVtYWluaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmVtZW50Rm9yTWFpbnRlbmFuY2VBbmRSZXBhaXJPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJlbWVudEZvclNhbXBsZUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyaW5nTWFuaXB1bGF0aW9uQmVmb3JlRGVzcGF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmV0dXJuZWREZWZlY3RpdmVPckRhbWFnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNlcnZpY2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U29sZE5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTdXNwZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VG9CZURlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVdpdGhkcmF3biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlXaXRoaGVsZEJ5T3duZXJPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVF1YW50aXR5T25JbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVQZXJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEFuZEFjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE5vdEFjY2VwdGVkVG9CZURlc3Ryb3llZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWROb3RBY2NlcHRlZFRvQmVSZXR1cm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21tZW5kZWRNYWludGVuYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRlZE92ZXJoYXVsQW5kUmVwYWlyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lkZXJhdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeUFmdGVyUG9zdFByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmlsbHNBdXRob3JpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnJhbmRzRGlzdHJpYnV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCcmFuZHNNYW51ZmFjdHVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkUmV0dXJuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRCdXNpbmVzc0VudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aW9uc2hpcER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZXNFbXBsb3llZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluaW5nQXV0aG9yaXplZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlb3JkZXJpbmdMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVvcmRlclBvaW50UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZEJsb29kVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRPdmVycmlkZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydERpZmZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVkRGVmaWNpZW5jaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50UXVhbnRpdHlUaGF0V2FzUHJldmlvdXNseVJlbGVhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXNpdGlvbmluZ09iamVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZWRRdWFudGl0eUN1c3RvbWVyRGlyZWN0RGVsaXZlcnlTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZWRRdWFudGl0eVJldGFpbFNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2UtUXVhbnRpdHktQXZhaWxhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0aW9uRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbFNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRCeUNvbnN1bWVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5zUmVwbGFjZW1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9vbUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3lhbHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNwZXJzb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1F1YW50aXR5Tm90SW5jbHVkZWRJblRoZVJlcGxlbmlzaG1lbnRDYWxjdWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNRdWFudGl0eVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhdHRlcmVkVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlVmFyaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmFwQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeU5ldFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkQ2hhcmdlc1JlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXRpZXNTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXJzSG9sZGluZ1JlbWFpbmRlck9mU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0FkZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNEZWxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNIZWxkQXNUcmVhc3VyeVN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPZkNvbW1vblN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPZlByZWZlcnJlZFN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPd25lZEJ5SW4tU3RhdGVSZXNpZGVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc093bmVkQnlPdXQtT2YtU3RhdGVSZXNpZGVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc1N1YnNjcmliZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc1N1YnNjcmliZWRCdXROb3RJc3N1ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90aWNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0LUxhbmRlZEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydFNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGVudFBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5jZUxhc3RUcmF2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZURlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpc3RlcnNEZWNlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lzdGVyc0xpdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZU9mSG91c2Vob2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkV29ya2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzVXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29ydGVkUXVhbnRpdHlSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2VPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZENhcGFjaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRPZmZzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jZU1vdG9yVmVoaWNsZVBlbmFsdHlQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsU2FsZXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tUcmFuc2ZlcnNJbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tUcmFuc2ZlcnNPdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2xlbkNoZXF1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yQ3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlZFF1YW50aXR5UmV0dXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlZFF1YW50aXR5U29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0aW9uYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckVzdGltYXRlZExhdGVzdE1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJFc3RpbWF0ZWRQcmV2aW91c01ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJMYXRlc3RNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyUHJldmlvdXNNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJwbHVzR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleXNJbkF2ZXJhZ2VSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbmRlZER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FuLUdhbnoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhYmxlc0F2YWlsYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFsa1BhdGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZMb3NzQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYWNoZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljaWFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlb3JldGljYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVFeHBlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUZyYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lSW5Db3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lSW5Qb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlSG9zcGl0YWxpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0QXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RDaXZpbGlhbkZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdEluc3VyYW5jZU1lZGljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RNaWxpdGFyeUZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhbENvbnN1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU1lZGljYXRpb25FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU1lZGljYXRpb25TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlT25zZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZVN1cmdlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZVRyaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzS25vd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c1BlclNoaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNTcGVudE9uRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvQ29tcGxldGVRdWFudGl0eUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9sZXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBZGp1c3RtZW50c1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBbW9ydGlzYXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEF1dGhvcml6ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxCZWdpbm5pbmdJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zQXNzb2NpYXRlZFdpdGhSZXBlYXRlZFRyYXVtYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoRGlzb3JkZXJzRHVlVG9QaHlzaWNhbEFnZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoRHVzdERpc2Vhc2VzT2ZUaGVMdW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRob3V0RGF5c0F3YXlGcm9tV29ya0FuZFdpdGhvdXRSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhQb2lzb25pbmdJbGxuZXNzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFJlc3BpcmF0b3J5Q29uZGl0aW9uc0R1ZVRvVG94aWNBZ2VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFNraW5EaXNlYXNlc09yRGlzb3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENvbnNvbGlkYXRlZERvbWVzdGljU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENvbnNvbGlkYXRlZEZvcmVpZ25TdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrRHVlVG9JbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmtEdWVUb0luanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT2ZSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09uTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNXaXRoUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoQ2xhaW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoc0FzQVJlc3VsdE9mSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWF0aHNBc0FSZXN1bHRPZkluanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZW1hbmRPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVtYW5kUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEVuZGluZ0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxGbG9hdFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsR2FzRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsR2FzSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aE9jY3VwYXRpb25hbElsbG5lc3Nlc05vdE90aGVyd2lzZUNsYXNzaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhvdXRMb3N0V29ya0RheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc1dpdGhMb3N0V29ya0RheXNPclJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW5qdXJ5Q2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW5qdXJ5Q2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmtPclJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW5qdXJ5Q2xhaW1zV2l0aG91dExvc3RXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTm9uLUNvbnNvbGlkYXRlZFN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkNvbnZpY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRG9tZXN0aWNTdWJzaWRpYXJpZXNJbmNsdWRlZEluRmluYW5jaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRG9tZXN0aWNTdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRm9yZWlnblN1YnNpZGlhcmllc0luY2x1ZGVkSW5GaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZGb3JlaWduU3Vic2lkaWFyaWVzTm90SW5jbHVkZWRJbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkxvYW5EZXRhaWxSZWNvcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mTW9ydGdhZ2VlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlBhcmtpbmdTcGFjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZTdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluVGhlRmluYW5jaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZVbml0c0ZvclNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uQ29tYmluZWRSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvbkZpcnN0UmVwb3J0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25TdWJzZXF1ZW50UmVwb3J0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZklzc3VhYmxlQXNzZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9pbEFuZE9yQ29uZGVuc2F0ZURpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9pbEFuZE9yQ29uZGVuc2F0ZUluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPdGhlclByb3BlcnRpZXNPd25lZEFuZEZpbmFuY2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBheW1lbnRzUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUG9zdC1BZHZpY2VzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUG9zdC1BZHZpY2VzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUG9zdC1BZHZpY2VzUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJvZHVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcm9wZXJ0aWVzT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUXVhbnRpdHlQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFJlc291cmNlLVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFJvb21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNlcnZpY2VCYWNrb3JkZXJRdWFudGl0eUhpZ2hQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTZXJ2aWNlQmFja29yZGVyUXVhbnRpdHlMb3dQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTaGFyZXNPZlN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFN5c3RlbUJhY2tvcmRlclF1YW50aXR5SGlnaFByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFN5c3RlbUJhY2tvcmRlclF1YW50aXR5TG93UHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRyYW5zYWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxVbmlkZW50aWZpZWRUcmFuc2FjdGlvbnNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXYXRlckRpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdhdGVySW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdvcmtlZEJ5QWxsRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdvcmtpbmdJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVtYXJrUmVwcmVzZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlbWFya3NVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uU2V0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWRJblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZE91dFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbGxpbmdFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1bmtlZENoYW5uZWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFja25vd2xlZGdlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFkanVzdGVkQ29ycmVjdG9yUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jb3ZlcmVkQ2hlcXVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb25FbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c0NvbXBsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNGb3JTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1BlclVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNQcm9kdWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNSZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkTGFzdERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkUGVyUXVhcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJXZWVrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2FsZWFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zb2xkUXVhbnRpdHlIZWxkQnlXaG9sZXNhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnRpbE5leHRUcmF2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudXNhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudXNlZEFjY3VtdWxhdGVkU2lja0RheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudmVyaWZpZWRSZWNlaXB0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXJnZW50RGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZFeHRyYWNvcnBvcmVhbENpcmN1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cGVyYmFyaWNQcmVzc3VyaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBlcnRlbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwb3RlbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwb3RoZXJtaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2FuY2llcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhbmNlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWN1bGFyUmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmllZFJlY2VpcHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXNpdGF0aW9uRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXNpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvaWNlU3RvcmFnZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2lkVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVNocmlua2FnZUFkanVzdG1lbnRPckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGluZ1NoYXJlc0hlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJSZS1JbmplY3RlZE9uUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWVrc1dvcmtlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDaGFuZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodEdhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodExvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXJUb1dob2xlc2FsZXJTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkZUFyZWFUZWxlcGhvbmVTZXJ2aWNlUGVyODAwU2VydmljZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQ2FsZW5kYXJVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0RheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtJblByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUaW1lVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUaW1lVW5pdHNQZXJTaGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzSW5TY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzSW5UaGlzTGluZU9mV29ya09yUHJvZmVzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNPbkpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNSZW1haW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlc1ZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbnZlbnRvcnlRdWFudGl0eUF2YWlsYWJsZUZvclNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UGVyaW9kSW1iYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2VydmljZUxpZmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTaGFyZUJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXN0aW1hdGVkTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVzdGltYXRlZFByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlYWRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlBZGp1c3RtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlBdmVyYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaWx5V29ya1NoaWZ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhU3RvcmFnZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzT3BlcmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNQcm9kdWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c1N1cHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViZW50dXJlQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViZW50dXJlc0ZpbGVkQWdhaW5zdERpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidENvbGxlY3RvcnMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRyYWN0SXRlbSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udHJhY3RJdGVtIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250cmFjdEl0ZW0iIHR5cGU9Ikxpc3RPZkNvbnRyYWN0SXRlbSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3RJdGVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cmFjdEl0ZW1OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0SXRlbSIgdHlwZT0iQ29udHJhY3RJdGVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250cmFjdElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbnRyYWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTeXN0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3QiIHR5cGU9IkNvbnRyYWN0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdFR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0VHlwZUNvZGVkIiB0eXBlPSJDb250cmFjdFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cmFjdFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdFR5cGUiIHR5cGU9IkNvbnRyYWN0VHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb250cmFjdFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzUmVsYXRlZEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJEaWVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYWJsZVBlckRpZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZEdyb3dpbmdFcXVpdHlNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBdXRob3JpdHlBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eVZldGVyYW5zQWZmYWlyc0ZpeGVkUmF0ZU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxTZWNvbmRNb3J0Z2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbEZpeGVkUmF0ZU1vcnRnYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBdXRob3JpdHlWZXRlcmFuc0FmZmFpcnNHcmFkdWF0ZWRQYXltZW50TW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRDb252ZW50aW9uYWxHcmFkdWF0ZWRQYXltZW50T3JTdGVwUmF0ZU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1c0luY2VudGl2ZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFNoYXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1c0F3YXJkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1c0ZpeGVkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVSaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlybW9yQWN0dWFsQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVGaXJtVGFyZ2V0V2l0aFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlRmlybVRhcmdldFdpdGhvdXRQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZVJlZGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZXdpdGhFc2NhbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlU3VjY2Vzc2l2ZVRhcmdldFdpdGhQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZVN1Y2Nlc3NpdmVUYXJnZXRXaXRob3V0UGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VBd2FyZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUxldmVsb2ZFZmZvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0cm9hY3RpdmVGaXhlZFByaWNlUmVkZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtRml4ZWRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZXdpdGhFY29ub21pY1ByaWNlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsb2ZFZmZvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9ySG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQ29udHJhY3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9zcGVjdFJlc2VydmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1lUGVyY2VudGFnZWFzRmlsbVJlbnRhbEVhcm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZWFuZE1hdGVyaWFscyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVmFsaWRpdHlEYXRlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhcnREYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFbmREYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkaXR5RGF0ZXMiIHR5cGU9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmRpdGlvbnNPZlNhbGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNhbGVzUmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uQ29kZWQiIHR5cGU9IlNhbGVzQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvblZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb25kaXRpb25zT2ZTYWxlIiB0eXBlPSJDb25kaXRpb25zT2ZTYWxlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Q29kZWQiIHR5cGU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2FsZXNSZXF1aXJlbWVudCIgdHlwZT0iU2FsZXNSZXF1aXJlbWVudCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZFF1YW50aXR5VG9NYWtlTWluaW11bVdlaWdodFJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJJZkl0ZW1zQXJlT3V0T2ZTdG9ja09yTm90WWV0UHVibGlzaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJJZk91dE9mU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlck9ubHlJZk5ld0l0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZEd1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzc0FuZExhYm9yU3VycGx1c0FyZWFTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFByZXNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWFsUHJvZHVjdEFsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1ZGVJbXBvcnRRdW90YUluRmlyc3RDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3J5U2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlZFNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2x1ZGVJbXBvcnRRdW90YUluRmlyc3RDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclN1cnBsdXNBcmVhU2V0LUFzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXJnZVB1cmNoYXNlU2V0LUFzaWRlRm9yU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF5UHJlc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGkteWVhckF3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0JhY2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9TdWJzdGl0dXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UHJpb3JUb1NoaXBtZW50SWZRdWFudGl0eVNwZWNpZmllZElzTm90QXZhaWxhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblF1YWxpZmllZEJpZGRlcnNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblF1YWxpZmllZE1hbnVmYWN0dXJlcnNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkU2FsZXNDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxMYWJvclN1cnBsdXNBcmVhU2V0QXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0FwcHJvdmVkU291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0hpc3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eU9yTWlub3JpdHlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvSW5kdXN0cmlhbFByZXBhcmVkbmVzc1Byb2dyYW1QYXJ0aWNpcGFudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1F1YWxpZmllZFByb2R1Y3RzTGlzdFByb2R1Y3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9VU0FuZENhbmFkaWFuU291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvWW91bmdJbnZlc3RpZ2F0b3JQcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uOGFTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldC1hc2lkZUZvckFtZXJpY2FuSW5kaWFuLW93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBBc1Nvb25Bc1Bvc3NpYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwQ29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGdWxsVHJ1Y2tPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwSW4tUGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsLUJhbGFuY2VCYWNrT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsQmFsYW5jZUNhbmNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxCYWxhbmNlU3Vic3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxDYXJsb2FkTG90c09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsSXRlbVF0eVByb3BvcnRpb25hbFRvVG90YWxPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxUcnVja2xvYWRMb3RzT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQZXJSZWxlYXNlb3JCdXllckF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQZXJTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzc1dpdGhTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzc0NvbnNpZGVyYXRpb25TZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzU2V0LUFzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbFB1cmNoYXNlU2V0QXNpZGVGb3JTbWFsbEJ1c2luZXNzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUmVtYWluaW5nQmFsYW5jZUNhbmNlbGxhdGlvbkFsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUmVtYWluaW5nQmFsYW5jZUNhbmNlbGxhdGlvbk5vdEFsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVJdGVtQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5yZXN0cmljdGVkUHJvY3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNhbGVzQWN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEJhbGFuY2VUaGF0RXhjZWVkc1NhbGVzQWN0aW9uVmFsdWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxFbnRpcmUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91cyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDbGFzc0NvZGVkIiB0eXBlPSJIYXphcmRDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENsYXNzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1JlZmVyZW5jZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNDb250YWN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJVTkRHTnVtIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFTVNOdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1mYWciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91cyIgdHlwZT0iSGF6YXJkb3VzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIiB0eXBlPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1JlZ3VsYXRpb25zQ29kZWQiIHR5cGU9IkFnZW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1JlZ3VsYXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUV4dGVuc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZVZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZE9mZmljaWFsVGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJlbUNhcmROdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c0lkZW50aWZpZXJzIiB0eXBlPSJIYXphcmRvdXNJZGVudGlmaWVycyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRDbGFzc0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNQbGFjYXJkSWRlbnRpZmljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1BsYWNhcmRUZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iIHR5cGU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZsYXNocG9pbnQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFbWVyZ2VuY3kiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cm9sIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mVGVtcGVyYXR1cmVDb2RlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiIHR5cGU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRQYWNraW5nQ29kZWQiIHR5cGU9IkhhemFyZFBhY2tpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRQYWNraW5nQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlZCIgdHlwZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGVkIiB0eXBlPSJIYXphcmRvdXNab25lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iIHR5cGU9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkUGFja2luZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0RGFuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1EYW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yRGFuZ2VyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZXNjcmlwdGl2ZUluZm9ybWF0aW9uTm90UmVxdWlyZWRCeVJlZ3VsYXRpb25CdXREZXNpcmVkVG9BY2NvbXBhbnlUaGVNb3ZlbWVudEJ5VGhlU2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BaXJsaWZ0T25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE9ULTExM0RvTm90QnVtcE9yQ3V0T2ZmQ2FyV2hpbGVJbk1vdGlvbkRlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkQ2FyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNXaGVuV2V0RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVNU1BhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpZXNQcm9kdWN0c0luQUhlYXRlZE1vbHRlblN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNTdWJzdGFuY2VDb25zdGl0dWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaGFsYXRpb25IYXphcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRRdWFudGl0eURlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRkFHUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9wZXJhdGluZ1NwZWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVQb2xsdXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvaXNvbi1JbmhhbGF0aW9uSGF6YXJkRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvaXNvbkRlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2ZU1hdGVyaWFsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT3JDaGVtaWNhbEdyb3VwTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZURlY2xhcmF0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZG91c1pvbmVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNpbmdEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRheCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUFsbG93YW5jZXNPckNoYXJnZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsVmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNpbmdEZXRhaWwiIHR5cGU9IlByaWNpbmdEZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlByaWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQcmljZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUHJpY2UiIHR5cGU9Ikxpc3RPZlByaWNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlByaWNpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlQmFzaXNRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhbGN1bGF0ZWRQcmljZUJhc2lzUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlUXVhbnRpdHlSYW5nZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUHJpY2VNdWx0aXBsaWVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZSIgdHlwZT0iUHJpY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNpbmdUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZVR5cGVDb2RlZCIgdHlwZT0iUHJpY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2luZ1R5cGUiIHR5cGU9IlByaWNpbmdUeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlByaWNlVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlRGVwZW5kZW50UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzSXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25OZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uR3Jvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEluY2x1ZGVkQWxsb3dhbmNlc0FuZENoYXJnZXNOb3RJbmNsdWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlU2VsbGluZ1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByaWNlVGF4SW5jbHVkZWRFeGNsdWRpbmdBbGxvd2FuY2VzT3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByaWNlRXhjbHVkaW5nQWxsb3dhbmNlc09yQ2hhcmdlc0FuZFRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGl2ZVVuaXRQcmljZUNvbXBvbmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUdlbmVyaWNQcm9kdWN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlV2hvbGVzYWxlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbERpc3RyaWJ1dGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RG9tZXN0aWNWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZFVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRDdXN0b21zVW5pdFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJBZGp1c3RlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRBbW91bnRBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RTdG9yZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RTaGlwUHJvZ3JhbVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFY3NjUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZU9yaWdpbmFsRXF1aXBtZW50TWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbnREZWxpdmVyeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kc1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVXBwZXJMaW1pdFByaWNlTWF4aW11bUFsbG93YWJsZUNvc3RQcmljaW5nRm9yRHJ1Z3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1QcmljZURvTm90QWR2aXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcmljZVRocm91Z2hRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cmlhbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VCaWxsaW5nUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5VG9BZHZpc2VVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BY3Rpdml0eVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9yZGVyUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJlbGVhc2VRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUHJpY2VSZWR1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNTdWdnZXN0ZWRSZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1SZWxlYXNlUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0SXRlbVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsVG9BZHZpc2VVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUHVyY2hhc2VPcmRlclByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcmljZUJlZ2lubmluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrUHVyY2hhc2VPcmRlckNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUNhdGFsb2d1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyRWFjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VJbkVmZmVjdEF0VGltZU9mU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcktpbG9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJMaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEZyZWlnaHRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXJzUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclRvbm5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpZWRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWREZWFsZXJOZXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkRmxlZXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEFuZERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRMaXN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUHJpY2VGYWN0b3JzRXF1YWxpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRSZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bU9mTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRXaG9sZXNhbGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9CZU5lZ290aWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVzaG9sZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZWRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdENvc3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJab25lUHJpY2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVuaXRQcmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlVmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2UiIHR5cGU9IlVuaXRQcmljZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMjFfNiI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjYiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNlTXVsdGlwbGllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2VNdWx0aXBsaWVyQ29kZWQiIHR5cGU9IlByaWNlTXVsdGlwbGllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNdWx0aXBsaWVyIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2VNdWx0aXBsaWVyIiB0eXBlPSJQcmljZU11bHRpcGxpZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHJpY2VNdWx0aXBsaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLU9yaWdpbmFsQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItUmV0YWlsQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRNdWx0aXBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1XaG9sZXNhbGVDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50U29sdXRpb25NdWx0aXBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nTXVsdGlwbGllciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGF4Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGVkIiB0eXBlPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheENhdGVnb3J5Q29kZWQiIHR5cGU9IlRheENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlZCIgdHlwZT0iUmVhc29uVGF4RXhlbXB0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheFR5cGVDb2RlZCIgdHlwZT0iVGF4VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFR5cGVDb2RlZE90aGVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGVkIiB0eXBlPSJUYXhQYXltZW50TWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheGFibGVBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhhYmxlQW1vdW50SW5UYXhBY2NvdW50aW5nQ3VycmVuY3kiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4QW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4QW1vdW50SW5UYXhBY2NvdW50aW5nQ3VycmVuY3kiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhMb2NhdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRheCIgdHlwZT0iVGF4Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxEdXR5VGF4T3JGZWVDdXN0b21zSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkFsbER1dGllc1RheGVzQW5kRmVlc0N1c3RvbXNJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mRWFjaER1dHlUYXhPckZlZVR5cGVDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZBbGxEdXRpZXNUYXhlc0FuZEZlZVR5cGVzQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFJlbGF0ZWRJbmZvcm1hdGlvbiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhDYXRlZ29yeUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZFZldGVyYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlQYWlkQnlTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Rm9yRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21Db3VudHlQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbUxvY2FsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21TY2hvb2xQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbVN0YXRlUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEdvb2RzYW5kU2VydmljZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdExldHRlck9uRmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TG9jYWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHROb3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1QZXJTdGF0ZUxhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0UHJvdmluY2lhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRTYWxlVG9VU0dvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFRvbGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRXhwb3J0SXRlbVRheE5vdENoYXJnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hlclJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUYXhhYmxlTWF0ZXJpYWxFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VyUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxUYXhhYmxlTGFib3JFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkVGF4UmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm8tTm90VGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHRGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VGF4YWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblNwYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclByb3BlcnR5VGF4RXhlbXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0V4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXNPdXRzaWRlU2NvcGVPZlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbGx5RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhEdWVGcm9tQVByZXZpb3VzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheE5vdE5vd0R1ZUZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZXMtVGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaZXJvUmF0ZWRHb29kcyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUZvckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzLVRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm8tTm90VGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtRm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHRPckZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LU5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Tm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXlJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVNhbGVUb1VTR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVBlclN0YXRlTGF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRheGFibGVNYXRlcmlhbEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxUYXhhYmxlTGFib3JFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRheGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRUb2xsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUdvb2RzQW5kU2VydmljZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Qcm92aW5jaWFsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuU3BhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdExvY2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRWZXRlcmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21TY2hvb2xQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbUxvY2FsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0V4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbUNvdW50eVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbGx5RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVN0YXRlUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUHJvcGVydHlUYXhFeGVtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1MZXR0ZXJPbkZpbGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFDaXR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFDb3VudHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExU3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb21tb2RhdGlvbnNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkVmFsb3JlbVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmFsRXhwb3J0UmViYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyYWxsZXZ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9saWNCZXZlcmFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbE1hcmtUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpLUR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Nlc3NtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0xpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzUHJpdmlsZWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlSZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29mZmVlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2luT3BlcmF0ZWREZXZpY2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eVNwZWNpZmljVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVJbmNvbWVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2hTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5UmVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0TGFib3JUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5oYW5jZWQ5MTFTdGF0ZUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZUR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmNvbWVUYXhXaXRoaG9sZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFZhbHVlQWRkZWRUYXhPbkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVmFsdWVBZGRlZFRheE9uU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZUluTGlldSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQU1lZGljYXJlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBU29jaWFsU2VjdXJpdHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbExVU1RUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTcGlsbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFN1cGVyRnVuZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FtaW5nVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ29uc3RydWN0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaWZ0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1JlY2VpcHRzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kaWNhcFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzV2FzdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2h3YXlVc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbHVtaW5hbnRzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxJbmNvbWVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaGVyaXRhbmNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRnVlbFRheEFncmVlbWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JCeVRyYWRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFreVVuZGVyZ3JvdW5kU3RvcmFnZVRhbmtUYXhGZWRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFreVVuZGVyZ3JvdW5kU3RvcmFnZVRhbmtUYXhTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlnaHREdWVzUGF5YWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxDb25zdHJ1Y3Rpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdXN0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm9wb2xpdGFuVHJhbnNpdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c0Nhc2hEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzU3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV0YXJ5Q29tcGVuc2F0b3J5QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckZ1ZWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlckNvbnNvcnRpdW1UYXgtSXRhbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdFRocmVzaG9sZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVyZW5jZUR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZVRocmVzaG9sZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxjb3VudGVydmFpbGluZ0R1dHlCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbENvdW50ZXJ2YWlsaW5nRHV0eUNhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsRHV0eUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsRHV0eUNhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aEFuZEVkdWNhdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FuZFVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQZXJjZW50YWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXZlcmFuY2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0ZWRTb2NpYWxTZWN1cml0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVkV2FnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWRXYXN0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnN0cnVjdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhZGl1bVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBEdXR5LUltcG9zdGFkaUJvbGxvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZWFuZExvY2FsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQW5kTG9jYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQW5kUHJvdmluY2lhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsRnVlbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNpYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxUYXhPbkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbFRheE9uU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlUmVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRheG9uU3BlY2lmaWNMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJmdW5kVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbmRlZER1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0RldmljZUZvclRoZURlYWZTZXJ2aWNlRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVzaG9sZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9iYWNjb1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9ubmFnZVRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG91cmlzbVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVybk92ZXJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZW1wbG95bWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXR5VXNlcnNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkRlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoaG9sZGluZ1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2Vyc0NvbXBlbnNhdGlvblRheCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMTBfNCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkFzc2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5VmVuZG9yIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMb2NhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGVkIiB0eXBlPSJMb2NhdGlvblF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsQWRkcmVzc0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTmFtZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iR1BTQ29vcmlkaW5hdGVzIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0iTG9jYXRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uVG9SZWNlaXZlQ3JlZGl0Rm9yVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRpbmdVdGlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1NjaGVkdWxlRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQmxvY2tHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVCYXNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1NjaGVkdWxlSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWFuZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhwbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ybGR3aWRlR2VvZ3JhcGhpY0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVhcmVzdENyb3NzU3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDcm9zc1N0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXJJZGVudGlmaWVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZVN1YmRpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmlkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGl0dWRlLUxvbmdpdHVkZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaWRTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaXF1b3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhaW5ob2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5QmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb3RhZ2VDYWxsRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkRpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbExlYXNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwUXVhZHJhbmdsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsTWVyaWRpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2lhbFByb3RyYWN0aW9uRGlhZ3JhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJRdWFydGVyU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJzdHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvclF1YWRyYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vyc2VEaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxTdGF0ZW1lbnRzTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlhbmRTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsUG9pbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm1lZFNlcnZpY2VzTG9jYXRpb25EZXNpZ25hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Vjb25vbWljQXJlYVJlZ2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsb2ZMYWRpbmdPZmZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb3BvbGl0aWNhbE5hbWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1hdGlvbk1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkN1c3RvbXNPZmZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZXNwb25kZW5jZU1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJhdGVCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2hBbmRTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UYW5rQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblNQTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eU9yUGFyaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25DZW50ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uLVNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RPZlJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taWNpbGVUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEVxdWFsaXphdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRnJlaWdodEZvcndhcmRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSW5mb3JtYXRpb25Qcm9jZXNzaW5nU3RhbmRhcmRzNTUtTmFtZWRQb3B1bGF0ZWRQbGFjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5DdXN0b21zRmFjaWxpdGllc0luZm9ybWF0aW9uYW5kUmVzb3VyY2VNYW5hZ2VtZW50U3lzdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFN0YXRpb25BY2NvdW50aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblRyYWRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUFsb25nc2lkZVZlc3NlbC1GcmVlT25Cb2FyZFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3RhdGlvbkdlb2dyYXBoaWNMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFpclRyYW5zcG9ydEFzc29jaWF0aW9uTG9jYXRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmRNb3ZlbWVudFByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5TdG9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlRk9CUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHlGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldHJvcG9saXRhblNhbXBsaW5nQXJlYVJlZ2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1leGljYW5Qb3N0YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5T3JTdGF0ZUZyb21Qb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbi1BZnRlckxvYWRpbmdPbkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZEZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5hbmRQcmVwYXlTdGF0aW9uTGlzdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRBY2NlcHRhbmNlUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbi1TaGlwcGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblZlc3NlbC1GcmVlT25Cb2FyZFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0b2ZBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0b2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRzQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFNlcnZpY2luZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRGlnaXRVU1pJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNERpZ2l0VVNaSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVEaWdpdFVTWklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRGlnaXRDYW5hZGlhblBvc3RhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjZEaWdpdENhbmFkaWFuUG9zdGFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUFyZWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblJhaWxDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsRWR1Y2F0aW9uU2VydmljZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZUFkbWluaXN0cmF0aXZlTWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnVyYmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5T3JTdGF0ZUFuZFBvaW50c1dpdGhpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sQ2FtcHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtU1BMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblN0b3JhZ2VUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2l0Y2hpbmdEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNjb250aW5lbnRhbEZyZWlnaHRCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ2FyZ29Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUZXJyaXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGluZ0Rpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlsbGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3Rvd2FnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2Vhc0FuZFBvaW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0Q2hhcmdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZk1hbmlmZXN0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlT2ZNYW5pZmVzdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5SYWlsSW50ZXJtb2RhbFRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvblJhaWxJbnRlcm1vZGFsVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0T3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQWNjZXB0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zb2xpZGF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlLUNvbnNvbGlkYXRpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXlhYmxlQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZFeGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1BvcnRPZkxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1BvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGF0Y2hpbmdQb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdPcmlnaW5PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuUG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudFBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRDaGFyZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUmVsZWFzZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXlQb3J0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMb2NhdGlvbklkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY0lEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhdGlvbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbklkZW50aWZpZXIiIHR5cGU9IkxvY2F0aW9uSWRlbnRpZmllciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR1BTQ29vcmlkaW5hdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJHUFNTeXN0ZW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMYXRpdHVkZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxvbmdpdHVkZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iR1BTQ29vcmlkaW5hdGVzIiB0eXBlPSJHUFNDb29yaWRpbmF0ZXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkFsbG93T3JDaGFyZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiIHR5cGU9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFsbG93T3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkluZGljYXRvckNvZGVkIiB0eXBlPSJJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbmRpY2F0b3JDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCYXNpc0NvZGVkIiB0eXBlPSJCYXNpc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhc2lzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlZCIgdHlwZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWxsb3dhbmNlT3JDaGFyZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkFsbG93T3JDaGdEZXNjIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzaXNRdWFudGl0eVJhbmdlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkJhc2lzTW9uZXRhcnlSYW5nZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRheCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2VxTm8iIHR5cGU9InhzZDppbnQiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWxsb3dPckNoYXJnZSIgdHlwZT0iQWxsb3dPckNoYXJnZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJbmRpY2F0b3JDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJvdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51c09yQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3RoZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQmFzaXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV0YXJ5QW1vdW50Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNoZWNrVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q3VzdG9tZXJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VUb0JlUGFpZEJ5VmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VUb0JlUGFpZEJ5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZHcm9zc1F1YW50aXR5SW52b2ljZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVRvQmVJc3N1ZWRCeVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlVG9CZUlzc3VlZEJ5UmVzZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZURlbmllZEJ5VmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVBheWFibGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY3J1YWxGdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaEluQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlQW5kQWRkdG9JbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBbGxvd09yQ2hnRGVzYyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlcnZpY2VDb2RlZCIgdHlwZT0iU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd09yQ2hnRGVzYyIgdHlwZT0iQWxsb3dPckNoZ0Rlc2MiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGVzY3JpcHRpb24iIHR5cGU9Ikxpc3RPZkRlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb25UZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlcnZpY2VDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJvdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFic29sdXRlTWluaW11bUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlLUZlZGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NoYXJnZS1TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE51bWJlckNvcnJlY3Rpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjaWRCYXR0ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnbWVudG9mRGVsaXZlcnlGZWVBT0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2YXRpb25PZkNhcm5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbENvbW1lcmNpYWxJbnZvaWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbENvcGllc09mRnJlaWdodEJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFRhcmlmZkNsYXNzaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT24tRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkcmVzc0NvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZFRvTWFrZU1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Rm9yTWF4aW11bUNoYXJnZXNCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Rm9yTWluaW11bUF2ZXJhZ2VUaW1lUmVxdWlyZW1lbnRCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkVmFsb3JlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUNoYXJnZXNIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZURlc3RpbmF0aW9uQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRGVzdGluYXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VPcmlnaW5BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VPcmlnaW5GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWRhdml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudERpc2J1cnNlbWVudC1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnREaXNidXJzZW1lbnQtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdE9uR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHBvcnRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRXhwcmVzc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZU9wZW5pbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRUZXJtaW5hbEhhbmRsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnRhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGljQmV2ZXJhZ2VSZXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGVnaGVueUNvdW50eVBBRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUZvckNvbnNpZ25tZW50TWVyY2hhbmRpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU5vbi1QZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kaW5nRXhwb3J0RG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5uZWFsSGVhdFN0ZWVsb3JHbGFzc1RyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5vZGl6aW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpLWR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJiaXRyYXJ5SW5BZGRpdGlvblRvVGhyb3VnaFJhdGVzYW5kQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0V29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudHNUb0JpbGxPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFkRGVidCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2luZ0RyYWZ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VGcmVpZ2h0QWxsS2luZHNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY1Jlb3JkZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW1pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZGRpbmdGZWVkaW5nRGlzaW5mZWN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWVmRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXlvbmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJleW9uZEZyZWlnaHRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdBdHRlbmRhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYWNrTHVuZ1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2tpbmdBbmRCcmFjaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG93ZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYnRhaWxDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3BTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVhdXhBcmJpdHJhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90aC1GbGF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2J1bGtTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtCdWxrU3VyZmFjZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpZGdlVG9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VuTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZW5QYWNrYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcmFnZU9yRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudC0yMEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmRlbk92ZXJoZWFkT3JBbGxvd2FuY2VGb3JJbmRpcmVjdENvc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllckhhbmRDYXJyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ2FyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJsZVByZXNzdXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJsZXNTZW5kaW5nT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbXBBcmJpdHJhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkYUdyZWF0TGFrZXNBZGRpdGlvbmFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DUUN1c3RvbXNDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VycmVuY3lFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5JbXBvcnRUZXJtaW5hdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5SZWNvbnNpZ25tZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblJlbWFuaWZlc3RGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGVkT3JkZXJIZWF2eUR1dHlGbGF0Y2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXB0dXJlQWRkaXRpb25hbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhckxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhclJlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckNyZWRpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckRlYml0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyTm90aWZpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJ0YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJ0YWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9naW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRzT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZSZWdpc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWluQW5kQmluZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2VTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VPZkFpcmJpbGwtU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlc0ZvcndhcmRBZHZhbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydGVyU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxNaWxsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGljYWdvTG9vcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lnYXJldHRlU3RhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eU1haW50ZW5hbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5UGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVRlcm1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhbmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1NlYWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdEaXBSdXN0cHJvb2ZFRFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPREFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09EQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdE9uRGVsaXZlcnlBbHRlcmF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeURlbGV0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1tYW51ZmFjdHVyaW5nRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5hdGlvblBlcmZvcm1hbmNlQW5kTm9uLXBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lQWxsU2FtZURheVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pY2F0aW9uc0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZUNhckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcHJlc3NvckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2Vzc2lvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2Vzc2lvbk1vbmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25nZXN0aW9uU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zZXJ2YXRpb25SZXNlYXJjaEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlVW5sb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFN1cnZlaWxsYW5jZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0YW50U3VydmVpbGxhbmNlU2VydmljZS1Bcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJpemF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWxhckxlZ2FsaXphdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEZXBvc2l0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGVzdHVmZmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpdmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxlYXNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvc3NEYW1hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcnZpY2VDaGFyZ2VVS0VVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VydmljZUNoYXJnZVVTQUNhbmFkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3R1ZmZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclRyYWlsZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNNaWxlYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RFc2NhbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1vcENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVBZHZlcnRpc2luZ01lcmNoYW5kaXNpbmdBbGxvd2FuY2VQZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU9mQmlsbE9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5T2ZEZWxpdmVyeVJlY2VpcHRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RSZWNvdmVyeUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RSZWNvdmVyeUZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ290dG9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudEFuZFJlY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uUmVpbWJ1cnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhZnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5RGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQWNjb3VudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVxdWlwbWVudEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlckZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0V4YW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUNvbnRhaW5lckxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRmVlcy1MaWZ0TGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGb3JtYWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnZvaWNlLUFkZGl0aW9uYWxQYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUGVuYWx0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXRBbmRQYXJhbGxlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0dGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZE1lcmNoYW5kaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0NhcnJpZXJFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvQ2FycmllclZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9Hb3Zlcm5tZW50RXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhRHJhd2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZGhlYWRNaWxlYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFmQW5kRGlzYWJsZWRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkVmFsdWVGb3JDYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkVmFsdWVGb3JJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdFRvTWFrZU1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlY3RpdmVBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaXRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZS1JbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGF5RnVybmlzaGluZ0Rlc3RpbmF0aW9uV2VpZ2h0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlLUF2ZXJhZ2VBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZS1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdEluTGlldU9mT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcmFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVycmlja0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduYXRlZFN1cHBsaWVySW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbkxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mUG93ZXJVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZUcmFpbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uLVNwZWNpYWxUeXBlRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlcm1pbmVkRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2ZWxvcG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFByb2R1Y3RIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb25uZWN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtRHJvcEJveENvbnZlbmllbmNlQ3RyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1JbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LU11bHRpcGxlU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNlcnZpY2VPcHRpb25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtU2VydmljZU9wdGlvblBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtU3BlY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGxheUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckRpc2NvdW50QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25BbmRSZWNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvblRvQWlyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrYWdlLUJvYXREZXRlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvb3ItVG8tRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93ZWxQaW5DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ0F0UG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VhdFBvcnRPZkRlYmFya2F0aW9uUmF0ZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VBdFBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlYXRQb3J0T2ZFbWJhcmthdGlvblJhdGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlTGluZUhhdWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlckFzc2lzdGVkVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzV2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BEb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wWWFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bUNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1EZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtVXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeWVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlJY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bm5hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlEcmF3YmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlCdXlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5UGF5bWVudEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlTaGlwQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lQb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5V2VpZ2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuY2xvc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneWNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5U3VyY2hhcmdlRnVlbEFkanVzdG1lbnRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ1N1cHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdyYXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGVyZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRNYW51ZmFjdHVyZXJSZXN0b3JhdGlvbkF1ZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NhbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2Nyb3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cjFQcmVzZW50YXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuUG9ydENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NpdmVWYWx1ZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzTWlsZWFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzUGVyaW9kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzVmFsdWVGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VBY2Nlc3NDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlT2ZFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRpb25EZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdGlvblBpY2t1cENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwYW5kZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRPbmVEYXlDb25zdWxhclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNoaXBtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGluZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGluZ1ByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEN1c3RvbXNDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydERlY2xhcmF0aW9ucy1BdXRvbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydERlY2xhcmF0aW9ucy1VU1NoaXBwZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRJbXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2Vuc2VBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0U2hpcHBpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhQ29waWVzYW5kTWFpbGluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGFib3JIZWxwZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMZW5ndGhTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhU2VydmljZS1Db3VudGVyLVRvLUNvdW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNzaW1pbGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNzaW1pbGVDaGFyZ2VzLUFkZGl0aW9uYWxQYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkTGFtcFBhbmVsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXhQcmUtYWxlcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUcmFuc2ZlclN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEFydGljbGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0RmxpZ2h0T3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0cmFja1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yU3RvY2tQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kTG9kZ2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc1JlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNTcGVjaWFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZENvdXBvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdBZ2VudENvbW1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZURvbWljaWxlU2hpcG1lbnRQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRCYXNlZE9uRG9sbGFyTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodENoYXJnZXNUb0JvcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodENoYXJnZXNUb0Rlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0RXF1YWxpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW50ZXJuYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWxOb24tVVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW50ZXJuYXRpb25hbFVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBhc3N0aHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVzaG5lc3NMZWFrZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsVHJ1Y2tsb2FkQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJtZW50RGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm1lbnRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ByZXNzdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRld2F5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGF6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29sZEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc0NyZWRpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRXYXJlaG91c2VGZWUtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRXYXJlaG91c2VGZWUtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkRvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkZsb3dDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXR1aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmluZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NSZWNlaXB0c1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBhZ2VEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBlZEl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVkSW5zcGVjdGlvblRlY2huaWNhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1bGZQb3J0RGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ0NoYXJnZXNPbkRpc3RyaWJ1dGlvbkZyZWlnaHRGb3J3YXJkZWRCZXlvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nRnJlaWdodEF0UG9zaXRpb25zTm90SW1tZWRpYXRlbHlBZGphY2VudFRvVmVoaWNsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFyYm9yTWFpbnRlbmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhcmJvck1haW50ZW5hbmNlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsaW5nQW5kSG9pc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxpbmdBbmRIb2lzdGluZ1RvQmVEaXJlY3RCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnb09uRGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzSGFuZGxpbmdGZWUtRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0hhbmRsaW5nRmVlLUludGVybmF0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1N0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRJblRyYW5zaXRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0VHJlYXRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXZ5RHV0eUZsYXRDYXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXZ5TGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNlY3VyaXR5UmVkSW4tYm9uZFNlYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2h3YXlJbnRlcmNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9pbnRpbnNBbmRIYXVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTGluZUZyZWlnaHRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbmV5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb29rLXVwY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NlQ2hhcmdlU3BlY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2Vob2xkR29vZHNQaWNrLXVwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFUQUFpcmJpbGxQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFUQUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHJvcGVyRG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZEZyZWlnaHRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVGcmVpZ2h0TWFudWZhY3R1cmluZ1RvU2hpcHBpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3JyZWN0QmlsbGluZ0FjY291bnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5UHJpY2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlQ2FibGVDb25uZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdEF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25BbmRUcmFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uV2FycmFudHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VsYXRlZFRhbmtDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQbGFjZW1lbnRDb3N0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQcm92aWRlZEJ5TGVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQcm92aWRlZEJ5TGVzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZGl2aXNpb25Qcm9maXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdE9uUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdE9uU2VjdXJpdHlEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVXNlUGVybWl0dGVkQXRTcGVjaWFsUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFpclRyYW5zcG9ydEFzc29jaWF0aW9uQ29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFpclRyYW5zcG9ydEFzc29jaWF0aW9uTWFya3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ291cmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbERvb3ItdG8tRG9vckhhbmRsaW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnBsYW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnN0YXRlSGlnaHdheVRvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdFByaWNlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmEtcGxhbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBZGRpdGlvbmFsQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUF0LUNvc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEZWxpdmVyeVRlcm1zQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTm8tQ2hhcmdlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VXaXRoR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklyaXNoQXJiaXRyYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklzbGFuZERlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc2xhbmRQaWNrLVVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGFsaWFuUmVsZWFzZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW0tVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcEZyb21GcmVlemluZ1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iktvc2hlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQ29zdE9mUmVtb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JNb2RpZnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yTm9Ucm91YmxlRm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yT3ZlcnRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yUHJlbWl1bU92ZXJ0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclJlcGFpckFuZFJldHVybk9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclN0cmFpZ2h0LXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGVzdEFuZENhbGlicmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFkaW5nQWRqdXN0bWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudEZhY3Rvci0yMEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3ItNDBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXNoaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlT3JkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVQYXltZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdXREZXNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheW92ZXJDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkRmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFraW5nVW5kZXJncm91bmRTdG9yYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNob3J0ZmFsbENvbnNpZGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhblRydWNrbG9hZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXRQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlQW5kVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVsaW5lU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZ0R2F0ZVRydWNrT3JGb3JrbGlmdFNlcnZpY2VBdFBpY2stdXBEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bEZyb21Qb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxQZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFRvUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRlZERhbWFnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uQW50aS1EdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25Db3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVGF4QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRvdGFsRHVlVVNDdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25Ub3RhbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdMYWJvckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRXZWlnaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxEZWxpdmVyeURyYXlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmVEZWxheWVkSW5Td2l0Y2hpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlVW5kZXJPd25Qb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3R0ZXJ5Q2hhcmdlQmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90dGVyeUNyb3NzUmVkZWVtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvdy1UaWVyTG90dGVyeUNhc2hpbmdCb251cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93LVRpZXJMb3R0ZXJ5V2lubmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVtcFN1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nLVBvc3RhZ2VDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nLVNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsSW52b2ljZVRvRWFjaExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0RGV2ZWxvcG1lbnRGdW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZ09yVGFnZ2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFycmlhZ2VSdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1vUmV0dXJuYWJsZUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbmRpc2VQcm9jZXNzaW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NlbmdlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsc1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZC1UaWVyTG90dGVyeUNhc2hpbmdCb251cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkLVRpZXJMb3R0ZXJ5V2lubmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZWFnZUZlZUZvclJlcGFpckFuZFJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZWFnZU9yVHJhdmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGlmaWVkQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhseVJlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW91bnREZW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3VudGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXNocm9vbUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0Rpc3RyaWJ1dGlvbkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SXRlbUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3RvcmVBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N0b3JlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1dhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3V2FyZWhvdXNlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1lvcmtEZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9ya1BpY2stdXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5IRFdoYXJmYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1EdXRpYWJsZUNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbkdlbmVyYXRlZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1yZXR1cm5hYmxlQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9SZXR1cm5DcmVkaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbFB1bXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyaXplZEFmZmlkYXZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5Q29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlDb25zaWduZWVCZWZvcmVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm96emxlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNoYXJnZXMtSGF6YXJkb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN1cHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzaG9yZS1BbGFza2FIYXdhaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQ2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uRGVja0JyZWFrQnVsa0RpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lLURheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZVRpbWVFbmdpbmVlcmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lLVRpbWVMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtVGltZS1Pbmx5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmV0aW1lVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IYW5kU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFNvZnR3YXJlU3VwcG9ydEZvck9wZXJhdGlvbmFsU3VwcG9ydFN5c3RlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsU29mdHdhcmVTdXBwb3J0Rm9yU3dpdGNoaW5nU3lzdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uQ2hhcmdlQ29sb3JGYWJyaWNPZmZpY2VGdXJuaXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyLUZsYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyTm90aWZ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFjY2Vzc29yaWFsU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBZHZhbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJFeHBvcnRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckdvdmVybm1lbnRBZ2VuY3lEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHb3Zlcm5tZW50QWdlbmN5RXhhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTWlzY2VsbGFuZW91c0Vhcm5pbmdPckFkZGl0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclNlZVJlbGF0ZWREZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZSb3V0ZU1pbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZlpvbmVQaWNrLXVwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUNhYmxlQ29ubmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlckRpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlckhlaWdodENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnJ1bkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNpemVkUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyV2lkdGhDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0NyYXRpbmdBbmRIYW5kbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0NyYXRpbmdIYW5kbGluZ0FuZFRyYW5zcG9ydGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrSW52b2ljZVdpdGhTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpbnRpbmdQcmltZXJPckZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRFeGNoYW5nZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0aXppbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFsbGVsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJpc2hDb3VudHlTYWxlc1RheE9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NpbmdTaGlwcGVyc0V4cG9ydEVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWRkaXRpdmVzT3ZlcnRpbWVMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbEFkZGl0aXZlc1N0cmFpZ2h0VGltZUxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlY2FuRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50RGlmZmVyZW50aWFsLUxlc3NUaGFuQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZTaGlwbWVudFZhbHVlVGhhdElzUmV0dXJuYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mU2hpcHBlZFF1YW50aXR5VGhhdElzUmV0dXJuYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckl0ZW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0c0JvbmRzRXNjb3J0QXR0ZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJPcmRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyUG91bmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob3NwaGF0aXppbmdTdGVlbFRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja2xlQW5kT2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2stdXBBbmREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwLU91dE9mQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyQ2hhcmdlc090aGVyVGhhbldoYXJmYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyQ2hhcmdlcy1XaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllclBpY2stdXBBbmRPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdEluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudEFuZE9yUmVtb3ZhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xlTGFzaGluZ0VxdWlwbWVudFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sZVdvb2QtU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ya0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRIYW5kbGluZ0FuZFVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdERhbWFnZWRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90YXRvRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlckZhY3RvckFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNhcnJpYWdlRXhjZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjaW91c01ldGFsQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbG9hZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbG9kZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pc2VVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZFVzYWdlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25BbmREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkFpcldheWJpbGwtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQ2FuYWRpYW5DdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkNvbW1lcmNpYWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mRXhwb3J0RW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZJbnN1cmFuY2VDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZlVTRXhwb3J0RG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLVBvc2l0aW9uZWRJbnZlbnRvcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0JpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudFBlcmNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQW5kTWFya2V0aW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZURldmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJpbGxpbmdBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yRGVsaXZlcnlPZkJpbGxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JNb250aENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZU93bmVkVmVoaWNsZVByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NJblRyYW5zaXRQcml2aWxlZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mb3JtYUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudFJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZDb21wb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2UtQ29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2UtSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZUhvdXNlaG9sZElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVOYW1lQW5kQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVsbGluZ0V5ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBBaXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbGhlYWRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVSZWR1Y3Rpb25Cb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLUJpbGxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmlsbGVkRHJheWFnZS1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViaWxsZWREcmF5YWdlLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNpcGllbnRBZGRyZXNzQ29ycmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXJIYW5kbGluZ0NodXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkZlZGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uU2hhcmVkUmVzcG9uc2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uY2lsaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbm5lY3RjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbkNvbnNpZ25lZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWduRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbm1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29vcGVyaW5nQXRPd25lcnNPclNoaXBwZXJzRXhwZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3JhdGluZ1JlY29vcGVyaW5nLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyYXRpbmdSZWNvb3BlcmluZy1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0hhcmR3YXJlTWFpbnRlbmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ0xpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ1NvZnR3YXJlTWFpbnRlbmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGlzdHJpYnV0aW9uQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y3Rpb25QcmVwYWxsZXRpemVkQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlckNhcmdvUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxDYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb25NZWNoYW5pY2FsRGV0ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVyYmlzaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25PZkV4cG9ydEZvclJlZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mRXhwb3J0U2hpcG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5UmVxdWlyZWRSZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlhYmlsaXR5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpbnF1aXNobWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvbkFudGktRHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25Db3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25UYXhBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25Ub3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25Ub3RhbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsRGVkdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50c0FuZExlYXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWNrQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckF0QnV5ZXJzRXhwZW5zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRDdXN0b21lckV4cGVuc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckF0R292ZXJubWVudEV4cGVuc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0VmlhQ2FuYWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlYXJjaERldmVsb3BtZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlbGxlcnNEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb3R0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0b2NraW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXJ0aWNsZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNhcmdvQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZExvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJld29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlkaW5nQXR0ZW5kYW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2NreU1vdW50YWluQnVyZWF1NTgzSXRlbTExMDBBcmJpdHJhcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxPdXRBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsUmViYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3lhbHRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbHZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWUtRGF5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrLVVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2stdXBPckRlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVDaGFyZ2VVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmFwQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNpZ25hdHVyZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ3JlZ2F0aW5nU29ydGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmVW5sb2FkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckhhbmRDYXJyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUFzc2lzdGFuY2VQcm9ncmFtU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlV2l0aENhc2hEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVVwZ3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldC11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlYXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWVwRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRBbmRDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRDYXJyaWVyQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQ29uc2lnbmVlVW5sb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdBbmRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHNpZGVQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUb1N0b2NrUXVhbGl0eUF1ZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG90Ymxhc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmlua2FnZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmstV3JhcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yT3JpZ2luYXRpb25EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yT3JpZ2luYXRpb25Qb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yUG9ydE9mRW1iYXJrYXRpb25EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlSW52b2ljZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlU2hpcG1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWV2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0VW5sb2FkaW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbG90dGluZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxPcmRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVTdXBwb3J0U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENpcmN1c1RyYWlucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRGV0ZW50aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRXF1aXBtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRmluaXNoQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRnJlaWdodFN1cHBsZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNaWxlYWdlTW92ZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGVybWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFB1bXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxTZWFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUZXN0RXF1aXBtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVG9vbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRvb2xpbmdyZXdvcmtjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUcmFpbk1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVmVoaWNsZVJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25SZXZpZXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFBpY2stVXBBdFBpZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90dGluZ09mVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ByZWFkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1wRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRieUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVNZXRyb3BvbGl0YW5UcmFuc2l0QXV0aG9yaXR5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU1vdG9yRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTYWxlc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWFtaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVuY2lsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXRPcmlnaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdFBpZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wcGluZ0luVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWlnaHRlbmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJlZXRMYW1wc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyaXBwaW5nU29ydGluZ0FuZENvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWZmaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVmZmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFRvQ29vcGVyYXRpdmVBZHZlcnRpc2luZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFRvVGF4T25SZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZlcmFuY2VXYXJlaG91c2VDaGFyZ2VFeHBvcnRPckltcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnYXJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bU9mQWRkc0FuZERlZHVjdHNUb01ha2VNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VuZGF5T3JIb2xpZGF5UGljay11cE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyQmFnQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2VsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dpdGNoQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2l0Y2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcnBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUFpcnBvcnRUYXhEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUFpcnBvcnRUYXhPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1CZXZlcmFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUNpdHlTYWxlc1RheE9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUV4Y2lzZVRheC1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUV4Y2lzZVRheC1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1GZWRlcmFsRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRmVkZXJhbEV4Y2lzZVRheE9uVGlyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Hb3Zlcm5tZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1IYW5kbGluZ0NoYXJnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGlhYmlsaXR5LUFtb3J0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGlhYmlsaXR5LU9uZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Mb2NhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTG9jYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1NZXRyb3BvbGl0YW5UcmFuc2l0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhPbk1pc2NlbGxhbmVvdXNDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhPblRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtUmVndWxhdG9yeVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVNhbGVzYW5kVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU2FsZXNUYXhTdGF0ZUFuZExvY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3RhdGVIYXphcmRvdXNTdWJzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN1cGVyRnVuZEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5vbG9neUV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlZ3JhbUNoYXJnZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmUtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5Vm9sdW50YXJ5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJlZEFzVHJ1Y2tsb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxEaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsSGFuZGxpbmdDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbFNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RRdWFsaWZpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UGFsbGV0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaHB1dEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaHB1dENvbnRhaW5lckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhydXdheUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlja2V0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9iYWNjb1Byb2R1Y3RzUmVwb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUT0ZDU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ1Jld29ya0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbHNGb3JQcmludGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBc3Nlc3NvcmlhbENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRHVlVVNDdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudE5vbi1VU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudFVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxNYXRlcmlhbEludm9pY2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNpbmdJbmJvdW5kVmlhT3RoZXJDYXJyaWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2luZ1NlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNrU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVJbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFuZFNldHVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkNoYXJnZU1pbmltdW1SYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkRpcmVjdEJpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uVGhpcmRQYXJ0eUJpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uVmVuZG9yUHJvdmlkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW1taW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0RldGVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tsb2FkRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1cm5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3by1EYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd29Eb29yUGlja1VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFic29yYmVkU3dpdGNoaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdMYWJvckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ1JlbG9hZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zYWxlYWJsZU1lcmNoYW5kaXNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNjaGVkdWxlZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlUGxhbkRldGFpbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUZsYXRBc3Npc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VNYXhpbXVtQXNzaXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RBSW5zcGVjdGVkU3RhbXBpbmdDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VDaGFyZ2VUb29saW5nUGVyc29ubmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2UtU3BlY2lhbFR5cGVGbGF0Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZlaGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbkNsZWFuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlT3JkZXJlZEJ1dE5vdFVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVQcmVwQ2hhcmdlQ291cnRlc3lEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVJvYWRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbnRpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpcmdpbklzbGFuZFRyYW5zZmVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50YXJ5Q29udHJpYnV0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl0aW5nVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0NyZXdJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlZEZ1dGlsZVRyaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVybWVsb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGxBbmRJbnZvaWNlRGlzdHJpYnV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWF0aGVyUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0VmVyaWZpY2F0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZS1CcmVha2J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZS1Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZGVBcmVhVGVsZXBob25lU2VydmljZVVzYWdlQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWxsQ2FsbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdHRlblByb29mT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWC1yYXlDaGFyZ2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJhc2lzTW9uZXRhcnlSYW5nZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlMaW1pdCIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2lzTW9uZXRhcnlSYW5nZSIgdHlwZT0iQmFzaXNNb25ldGFyeVJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNb25ldGFyeVJhbmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNaW5pbXVtTW9uZXRhcnlWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNYXhpbXVtTW9uZXRhcnlWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeVJhbmdlIiB0eXBlPSJNb25ldGFyeVJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNb25ldGFyeUxpbWl0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeUxpbWl0VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeUxpbWl0IiB0eXBlPSJNb25ldGFyeUxpbWl0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiIHR5cGU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJRdWFudGl0eU1vbmV0YXJ5VmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiIHR5cGU9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJhdGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGVQZXJVbml0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2VCYXNpcyIgdHlwZT0iRGVjaW1hbDE4XzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGUiIHR5cGU9IlJhdGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDE4XzMiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSIzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNb25ldGFyeVZhbHVlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeUFtb3VudCIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5VmFsdWUiIHR5cGU9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXJnZXRDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlT2ZFeGNoYW5nZSIgdHlwZT0iRGVjaW1hbDE5XzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkludmVyc2VSYXRlT2ZFeGNoYW5nZSIgdHlwZT0iRGVjaW1hbDE5XzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRhdGVPZlJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZlJhdGVPZkV4Y2hhbmdlUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIiB0eXBlPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMTlfOSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWZlcmVuY2UiIHR5cGU9Ikxpc3RPZlJlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBlcmNlbnRRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyY2VudGFnZU1vbmV0YXJ5VmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQZXJjZW50UXVhbGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZWQiIHR5cGU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudFF1YWxpZmllciIgdHlwZT0iUGVyY2VudFF1YWxpZmllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1MaXN0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU5ldENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LUdyb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1OZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZXBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlQW1vdW50TGVzc1ByZXZpb3VzRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldE1vbnRobHlPbkFsbEludm9pY2VzUGFzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRDaGFyZ2VCYXNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsUmF0ZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcFRvTG9jYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+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+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURpZmZlcmVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VG9vTGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRBdHRyaWJ1dGVkVG9TZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvVGhlQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvVGhlQ2FycmllciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGF0ZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEYXRlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRhdGVDb2RlZCIgdHlwZT0iTGlzdE9mRGF0ZUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEYXRlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRGF0ZVF1YWxpZmllciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZUNvZGVkIiB0eXBlPSJEYXRlQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGVRdWFsaWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVRdWFsaWZpZXJDb2RlZCIgdHlwZT0iRGF0ZVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRhdGVRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlUXVhbGlmaWVyIiB0eXBlPSJEYXRlUXVhbGlmaWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRhdGVRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzYwMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjU2MzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2MDI4MzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTI4MzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTYyODMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxc3RTY2hlZHVsZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxc3RTY2hlZHVsZVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VsZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZU9mR29vZHNEZWNsYXJhdGlvbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlVGltZU9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50QmVuZWZpdEFnZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50RGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRJbnN1cmFuY2VFbGltaW5hdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRMaWZldGltZUJlbmVmaXRRdWFsaWZpY2F0aW9uQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50YW50c09waW5pb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2xvc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ01ldGhvZG9sb2d5Q2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdUcmFuc2FjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3BlbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGUtU3RhdGVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlSZXBvcnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eVBlcmlvZERhdGVSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxBcmNoaXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFBvcnRPZkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZXR1cm5Ub1dvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN1dGVNYW5pZmVzdGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN1dGVNYW5pZmVzdGF0aW9uT2ZBQ2hyb25pY0NvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkam91cm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZEFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRDb250ZXN0YWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWREZWF0aEJlbmVmaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZEhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQcm9jZXNzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQcm9taXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFRvQmlsbERhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yT3JkZXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWlzc2lvbkRhdGVBbmRPclRpbWVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRvcHRpb25EYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VBZnRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VCZWZvcmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQ29tcGxldGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZU9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnRUb1BheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3RtZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YWJsZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dlZFJlbmV3YWxEdXJhdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlQmFzZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUHJvYmxlbVJlc29sdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5hbHlzaXNNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5lc3RoZXNpYUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0RGVsaW5xdWVudE9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0RmlsaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsUmVwb3J0TWFpbGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdHlDb21tZW5jZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZENsb3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpYW5jZVBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50U2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Mb2dnZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50RXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsT3JkZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxPZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lQXRJbml0aWFsUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZU9mVHJhbnNwb3J0TGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxJbkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGVyaWFsQmxvb2RHYXNUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRBbmRMaWFiaWxpdHlTY2hlZHVsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0RG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudFJlY29yZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRhbmNlRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpZW5jZURlZmljaWVuY3lQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0UGVyaW9kQWZ0ZXJTcGxpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0UGVyaW9kUHJpb3JUb1NwbGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW9uVmFsaWRhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGljUHJlbWl1bUxvYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJpbGl0eUR1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZURlbGl2ZXJ5RGVsYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VQYXltZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBd2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09uTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJEZWxpdmVyeURhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VTaGVldERhdGVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlbGluZUNvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlbGluZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWZvcmVJbnZlbnRvcnlJc1JlcGxlbmlzaGVkQmFzZWRPblN0b2NrQ2hlY2tMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTGF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5UaGVyYXB5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNCYW5rc0R1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFwcGxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDcmVkaXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDcmVkaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDcmVkaXRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdERlYml0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RGViaXRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBheW1lbnRzVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UmVsZWFzZUF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0c1BhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlckVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFR5cGVHcm9zc1dlZWtseUFtb3VudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFR5cGVOZXRXZWVrbHlBbW91bnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0QmVmb3JlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdFRpbWVUb0NhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpYW5udWFsVGVybWluYWxJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuRGF0ZUJpZHNXaWxsQmVPcGVuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZFByaWNlRXhjZXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRUaHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua3NWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVwcmludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc0luY29tcGxldGVBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzTm90QXV0aG9yaXplZEFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNOb3RDb21wbGV0ZUFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rRW50cnlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcml0aXNoVGhlcm1hbFVuaXRUZXN0UGVyZm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRMaW5lQXBwbGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NvbnRyb2xDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc09wZW5lZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNEb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNMb2NhbFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXJFeENvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyRXhGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdERlbGl2ZXJlZEJ5VGhpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90UHVibGlzaGVkQnlUaGlzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3RTaGlwcGVkQnlUaGlzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uRGF0ZVRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YWxpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGlvblBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGlvblBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0Jvb2tpbmdDb25maXJtZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29SZWxlYXNlRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZUNvbnZlcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZVJlb3BlbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQ2FsbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGVnb3J5Q2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlYXNlZE9wZXJhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uT2ZXZWlnaHREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUmV2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRBY2NvdW50aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUJhY2tEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0T2ZBY2NvdW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkYmlydGhEYXRlQW5kT3JUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZGJpcnRoRGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyaXN0ZW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuc2hpcENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvcktub3dsZWRnZU9mVGhlSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3JOb3RpZmllZE9mRW1wbG95ZWVMZWdhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUluY3VycmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1NYWRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1Ob3RpZmljYXRpb25SZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1zTWFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1TdGF0ZW1lbnRQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltU3RhdGVtZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJhbmNlRGF0ZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY2FsRXhhbWluYXRpb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFVudGlsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0RhdGVPZkZpcnN0QmFsYW5jZVNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3N1cmVEYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbERlcGVuZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbERlcGVuZGVudEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbkRhdGVUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZW5jZWRQdW1waW5nQmFsbGFzdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZW5jZWRUYW5rQ2xlYW5pbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJpc29uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21waWxhdGlvbkRhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFB1bXBpbmdCYWxsYXN0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFRhbmtDbGVhbmluZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVOb3RBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVOb3RCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25Jbml0aWFsVHJlYXRtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb25EYXRlTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFRdWFsaWZ5aW5nRXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25EYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2FmZXR5Q29udmVudGlvbkNzY0luc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTYWZldHlDb252ZW50aW9uQ3NjUGxhdGVFeHBpcmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3RyaXBwaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3R1ZmZpbmdEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZXN0YWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbmN5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uT2ZQYXlTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVpbmdFZHVjYXRpb25SZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c0NvdmVyYWdlRGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNQYXNzaXZlTW90aW9uQ1BNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF1ZGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBd2FyZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJpbmRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvbXBsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvc3RzVGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdERlZmluaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE1haWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJmb3JtYW5jZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmZvcm1hbmNlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJlLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsRGVsaXZlcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbFN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblBlcmlvZEVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25QZXJpb2RTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25zQ2Vhc2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvdmVydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnNpb25Qcml2aWxlZ2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnNpb25Ub1JlcGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvbkludG9Ib2xkaW5nQ29tcGFueURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRlZFRvRWxlY3Ryb25pY0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252aWN0ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25PZkJlbmVmaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25PZkJlbmVmaXRzQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHNFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZERhdGVPZkJpcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3NpZ25lclNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREaXNtaXNzYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEV2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydE5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUlzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEluY29tZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXREb2N1bWVudGF0aW9uRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0ZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2VCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0ZWRTZXJ2aWNlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNSZXF1ZXN0ZWRWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzYm9yZGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VyZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBdXRob3JpdHlDb250cm9sU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGlzYWJpbGl0eVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RMYXN0RGF5V29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGlzYWJpbGl0eVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50SW5jb21lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGVnYWxTdHJ1Y3R1cmVFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudE1vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TmFtZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2NoZWR1bGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNjaGVkdWxlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VydGFpbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJ0YWlsbWVudERhdGVmcm9tQWR2aWNlT2ZQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDYXJnb1JlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNFbnRyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBY2NvdW50TWF0dXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFjcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQW5kT3JUaW1lT2ZIYW5kbGluZ0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFzQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBc3NpZ25tZW50RmlsZWRGb3JSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lGaWxlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVCZWNhbWVBd2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUNsYWltUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUNvdXJzZU9mT3J0aG9kb250aWNzVHJlYXRtZW50QmVnYW5PcklzRXhwZWN0ZWRUb0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRGVlZEZpbGVkRm9yUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRGVmYXVsdFdhc0N1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRG9jdW1lbnRhdGlvbk9yUGFwZXJ3b3JrT3JCb3RoV2FzU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yZWNsb3N1cmVIZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yZWNsb3N1cmVQcm9jZWVkaW5nc0luc3RpdHV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZVNhbGVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JUaGVMYXN0VXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlSGF6YXJkSW5zdXJhbmNlUG9saWN5Q2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlSGF6YXJkSW5zdXJhbmNlUG9saWN5UmVmdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU1hdGVyaWFsVXNhZ2VTdXNwZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFiYW5kb25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY3F1aXNpdGlvbk9mVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXBwcmFpc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBc3NpZ25tZW50QXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFzc2lnbm1lbnRSZWplY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDbG9zaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEYW1hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2Vhc2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWVkSW5MaWV1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEaXZvcmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZFeHRlbnNpb25Ub0NvbnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlybUNvbW1pdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0TW9ydGdhZ2VQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdFJlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RVbmN1cmVkRGVmYXVsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRm9yZWNsb3N1cmVOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0RHJhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdEluc3RhbGxtZW50UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RQYXltZW50UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RVcGRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvY2FsT2ZmaWNlQXBwcm92YWxPZkNvbnZleWFuY2VPZkRhbWFnZWRSZWFsRXN0YXRlUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvY2FsT2ZmaWNlQXBwcm92YWxPZkNvbnZleWFuY2VPZk9jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUNlcnRpZmljYXRpb25PZkNvbnZleWFuY2VPZkRhbWFnZWRSZWFsRXN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZNYXhpbXVtTWVkaWNhbEltcHJvdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOb3RpY2VPZlByb2JhYmxlSW5lbGlnaWJpbGl0eUZvckFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZU9mUmVmZXJyYWxGb3JBc3NpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOb3RpY2VUb0NvbnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZPcmRlckxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQb3NzZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcm9kdWN0RmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJvcGVydHlJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRnJvbUJhbmtydXB0Y3lEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZSZXBhaXJPclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNlaXp1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNvdXJjZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9uV2hpY2hBc3NldHNKdWRnZWRJbnN1ZmZpY2llbnRUb1BheUNyZWRpdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU91dHN0YW5kaW5nTG9hbkJhbGFuY2VSZXBvcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQbGFjZWRJbkRpc2Zhdm91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVBvc3Nlc3NvcnlBY3Rpb25Jbml0aWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcmFjdGljZUNlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByYWN0aWNlRXN0YWJsaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcm9wZXJ0eVNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVSZWFkeUZvckNvbGxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVSZWRlbXB0aW9uUGVyaW9kRW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlZmVycmVkVG9BdHRvcm5leUZvckZvcmVjbG9zdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRocm91Z2hXaGljaFByb3BlcnR5VGF4ZXNIYXZlQmVlblBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaW1lT2ZEaXNjb3VudFRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mSW50ZXJlc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaW1lT2ZMYXRlc3RBY2NvdW50c0ZpbGluZ0F0UHVibGljUmVnaXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUb3RhbEFtb3VudE9mRGVsaW5xdWVuY3lSZXBvcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVZvbHVudGFyeUNvbnZleWFuY2VBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVdoZW5Db250YWluZXJFcXVpcG1lbnRCZWNvbWVzRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheWxpZ2h0T3ZlcmRyYWZ0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c09mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWF0aERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdFZhbHVlRGF0ZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidEluY3VycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNpc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvblByZXNlbnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uUmVmZXJlbmNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RpYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWVkTm90QXZhaWxhYmxlQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkRGlzdHJpYnV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpbml0aW9uT2ZEaXNhYmlsaXR5RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGF5ZWRCaWxsaW5nTm90RGVsYXllZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyTm90QmVmb3JlQW5kTm90QWZ0ZXJEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBcHBvaW50bWVudERhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lMVN0U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVDdXJyZW50U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVEZWZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVGaXJzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUxhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVQcm9taXNlZEZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVQcm9taXNlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVTY2hlZHVsZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9yZGVySXNzdWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pYWxFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbFJlc2Npc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRBZG1pc3Npb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50RGlzY2hhcmdlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mTGFib3JXYWdlRGV0ZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUZyb21MYXN0UG9ydE9mQ2FsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZUZyb21TcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0cmltZW50YWxJbmZvcm1hdGlvblJlY2VpcHREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RJbnRlcmNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHlXYWl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlQW5kTG9hZGluZ0NvbXBsZXRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2UtUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzZW1iYXJrYXRpb25EYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzbWlzc2FsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aWRlbmRBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0RXhwaXJ5RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0SXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFByZXNlbnRhdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRNZXNzYWdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVjZWl2ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXF1ZXN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3REZWxpdmVyQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90RGVsaXZlckJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RTaGlwQmVmb3JlRXhDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFNoaXBCZWZvcmVFeEZhY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nUmV2aXNpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcHBlZFRvTGVzc1RoYW5IYWxmVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlRGF0ZUxhc3RDb21wbGV0ZUluc3RhbGxtZW50UGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlRGF0ZU9mRmlyc3RQYXltZW50VG9QcmluY2lwYWxBbmRJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlQmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmxpZXN0RmlsaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJsaWVzdFNhbGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlXaXRoZHJhd2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuaW5nc0VmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZURhdGVPZkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJpbGl0eUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJpbGl0eUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJrYXRpb25EYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUVmZmVjdGl2ZURhdGVPZkNvdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUxhaWRPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGVtcG9yYXJ5TGFpZE9mZlBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUZW1wb3JhcnlMYWlkT2ZmUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVXYWdlc0NlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJLbm93bGVkZ2VPZlRoZUluanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJSZXBvcnRlZEluanVyeVRvQ2xhaW1BZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UG9zaXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRPckhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQb3NpdGlvblN0YXJ0RGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFByb2Zlc3Npb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRBdmFpbGFiaWxpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmREYXRlT2ZTdXBwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmREYXRlU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdMYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZkdyYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZkxhc3RGaXNjYWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlZENlcnRpZmljYXRlSXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlTGV2ZWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0RhdGFMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnJvbGxtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnJvbGxtZW50U2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeURhdGVFc3RpbWF0ZWRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRMb2dFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UG9zaXRpb25pbmdEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQcmVUcmlwRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmVjb25kaXRpb25pbmdEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmVwYWlyUmVhZHlEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXR1cm5QZXJpb2RFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RvY2tDaGVja0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NhbGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZUNvbW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQWNjZXB0YW5jZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZENvbXBsZXRpb24tRmlyc3RQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLVNlY29uZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZENvbXBsZXRpb24tVGhpcmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25EYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZCaXJ0aEVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEVzY3Jvd0Nsb3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEltbWlncmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9pbnRPZkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFBvaW50T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFBvcnRPZkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LUZpcnN0UHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkU3RhcnQtU2Vjb25kUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkU3RhcnQtVGhpcmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZVByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aW9uRGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXRQbGFudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkQ29udGFpbmVySGlyZUZyb21EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRGdW5kaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRQcm9ibGVtUmVzb2x1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkUmVwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRPbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVPZkV4dGVuc2lvblRvQXNzaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZU9mRXh0ZW5zaW9udG9Gb3JlY2xvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlVGltZU9mQ3VzdG9tc0RvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZVRvU3VibWl0VGl0bGVFdmlkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbk9mRXh0ZW5zaW9uVG9Db252ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkV4dGVuc2lvblRvU3VibWl0RmlzY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbk9mRm9yZWNsb3N1cmVUaW1lZnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyeURhdGVPZkV4cG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyeURhdGVPZkltcG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGxhbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRhdGlvbkRhdGVGb3JUZXh0aWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9zdXJlU291cmNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlRHVlQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZU1vZGVFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlYXNpYmlsaXR5U2lnbk9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhpZ2h3YXlBZG1pbmlzdHJhdGlvbkZod2FJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlQ2FwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkRmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlR2VuZXJhdGlvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNvbmNpbGlhdGlvblZhbHVlRXN0aW1hdGVBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNjaGVkdWxlZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENvdmVyYWdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbmZvcm1hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uU3VibWlzc2lvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hEYXRlT3JUaW1lTWFuZGF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hEYXRlT3JUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3REYXRlT2ZPcmRlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJbnRlcmVzdEJlYXJpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludGVyZXN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJbnZvbHZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RNYXJrZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQYXltZW50Q2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UHJvZHVjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UHVibGlzaGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTYWxlRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFN1Ym1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0VmlzaXRvckNvbnN1bHRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRFeHRyYUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRCaWxsRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9FYXJsaWVzdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0xhdGVzdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mTm90aWNlVG9Qcm9jZWVkVG9Db21tZW5jZW1lbnRPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk5vdGljZVRvUHJvY2VlZFRvQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb1NhbXBsZVJlYWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9TaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlJlY2VpcHRPZkl0ZW1Ub0FwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mUmVjZWlwdE9mVG9vbGluZ0FpZHNUb1NhbXBsZVJlYWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mU2FtcGxlQXBwcm92YWxUb0ZpcnN0UHJvZHVjdFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mVG9vbGluZ0F1dGhvcml6YXRpb25Ub1NhbXBsZVJlYWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tTGFzdEJvb2tlZE9yZGVyVG9EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kc0FwcHJvcHJpYXRpb24tRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kc0FwcHJvcHJpYXRpb24tU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1dHVyZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FsbG9uc1Blck1pbnV0ZVRlc3RQZXJmb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1Bvc2l0aW9uaW5nRGF0ZVRpbWVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNQb3NpdGlvbmluZ0RhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cENvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cENvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZE92ZXJEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZE92ZXJEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDYXBpdGFsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uUmVsZWFzZUF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hSYXdNYXRlcmlhbEF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVkRnJvbURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVkVW50aWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEFzU3RvY2tBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xpZGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xpZGF5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xpZGF5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VzQ29ubmVjdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VzRGlzY29ubmVjdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsQWRtaXNzaW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxEaXNjaGFyZ2VEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyb3Rlc3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxuZXNzQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3NSZWNvdmVyeURhdGVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1taWdyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsYW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxlbWVudGF0aW9uRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5hY3Rpdml0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRNb3ZlbWVudEF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVEb2N1bWVudGF0aW9uRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lSW5jcmVhc2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25EaXNzb2x1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jdW1iZW5jeVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEVkdWNhdGlvblBsYW5JRVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLWZvcmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlbGVhc2VBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbENsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbENvbnRhY3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RMYXN0RGF5V29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZFJldHVyblRvV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbEZlZUR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbEZpbmFuY2lhbEFjY291bnRzRmlsZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlSW5pdGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxQcmVtaXVtRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUmVxdWVzdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluanVyeUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluanVyeU9ySWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU2VydmljZVN1cnZleURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc29sdmVuY3lEaXNjaGFyZ2VHcmFudGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbkRhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbG1lbnRQYXltZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25zT3JpZ2luYWxFeGVjdXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1ZmZpY2llbnRBc3NldHNKdWRnZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdENhcGl0YWxpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFBhaWRUaHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFBhaWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UmF0ZVZhbGlkaXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudEFwcHJvdmFsRm9yUHVibGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsUmV2aWV3Q3ljbGVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycnVwdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJydXB0aW9uU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXJTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnROdW1iZXJBbGxvY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52aXRhdGlvblRvVGVuZGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURhdGVSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklycmVndWxhckludGVyZXN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Db250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW5lZEVtcGxveWVyRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbmVkRnVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5RXZlbnRDYWxlbmRhclllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50RmlzY2FsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyV2FnZURldGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QWN0aXZpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QW5udWFsUmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENhcGl0YWxDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENoZWNrRm9yQmFsYW5jZVNoZWV0VXBkYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENpdmlsaWFuRmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZUZvckFHb3Zlcm5tZW50QWdlbmN5VG9GaWxlQUNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZU9mQWNjb3VudHNGaWxlZEF0UHVibGljUmVnaXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlT2ZPcmRlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVUb0ZpbGVBQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlVG9PYmplY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RFcGlzb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Rm9sbG93LXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SW5zdXJhbmNlTWVkaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEludGVyZXN0QmVhcmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJdGVtRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RMb2dnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNYXJrZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1lYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZW5zdHJ1YWxDeWNsZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1lbnN0cnVhbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1pbGl0YXJ5RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0T2ZmSGlyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RPbkhpcmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UGFpZEluc3RhbGxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBheW1lbnRNYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UGh5c2ljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcmVtaXVtRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHJlbWl1bVBhaWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFB1YmxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHVibGlzaGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNhbGFyeUluY3JlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2FsZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNjcmVlbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNlZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0VmlzaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0WFJheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEFic2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0QmFsYW5jZVNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RDaGVja0luVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RGVsaXZlcnlEYXRlYXRQaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3REZWxpdmVyeURhdGVBdFJhaWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RGaWxpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0TWV0ZXJSZWFkaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0T25Cb2FyZENhcnJpZXJEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RQcmljZUFkanVzdG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RSZWNlaXZpbmdEYXRlQ3V0b2ZmRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0VmlzaXRvckNvbnN1bHRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5VGltZUZpcnN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlUaW1lTGFzdERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQ29tbWVuY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VUZXJtRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VUZXJtU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0RW1wbG95ZXJEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEFjdGlvbkNsb3NlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQWN0aW9uU3RhcnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTZXR0bGVtZW50VGVybXNNZXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFN0cnVjdHVyZUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlckNyZWRpdENoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkFncmVlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mTGlhYmlsaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VSZW5ld2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFByaWNlQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRvblZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0RhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUHVyY2hhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5TZXJ2aWNpbmdUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25FeGNlcHRpb25PcmRlck51bWJlckFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ROdW1iZXJFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlc3RBY3Rpdml0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsUmVjZWlwdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUNvbW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWtlZ29vZENvbW1lcmNpYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50QXZhaWxhYmxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlck5vdFJlZ2lzdGVyZWRBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlPclRhcmdldEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5T3JUYXJnZXRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RTaGlwTm90aWNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTWFycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxlYXNlQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXR1cml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQ3JlZGl0R3JhbnRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRBZ2VpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5mb3JtYXRpb25TaWduYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbmZvcm1hdGlvblN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBQ292ZXJhZ2VFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBRWxpZ2liaWxpdHlCZWdpbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFFbGlnaWJpbGl0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJDb3ZlcmFnZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJFbGlnaWJpbGl0eUJlZ2luRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkVsaWdpYmlsaXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QlRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRwb2ludE9mUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZXF1aXJlZERpc3RyaWJ1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNoZWxmTGlmZVJlbWFpbmluZ0F0VGltZU9mRGVzcGF0Y2hQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TaGVsZkxpZmVSZW1haW5pbmdBdFRpbWVPZlJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aFRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9vcmluZ0RhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZWVPZmZpY2lhbFNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZVJlcG9ydGVkQ3VydGFpbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZU5vdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5RWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5TGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUxhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudEhlbW9nbG9iaW5PckhlbWF0b2NyaXRPckJvdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRSZW5ld2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50UmV2aXNpb25vckluaXRpYWxWZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50U2VydW1DcmVhdGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92ZWRGcm9tTG9jYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkRXh0ZW5zaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGlvbnNTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldENyZWRpdFNlcnZpY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRXb3J0aERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QW5udWFsTWVldGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEluc3RhbGxtZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEludGVyZXN0Q2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFBheUluY3JlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJldmlld0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbldvcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUHJvZHVjdGlvblNjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1Byb21pc2VBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1NoaXBwaW5nU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mRGVhdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvblRpbWVMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlZ2lzdGVyZWRBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGFuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhbkZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSGlyZVN1cnZleURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljaWFsUmFpbENhckludGVyY2hhbmdlRWl0aGVyQWN0dWFsb3JBZ3JlZWRVcG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmYtTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldEZyb21Db29yZGluYXRlZFVuaXZlcnNhbFRpbWVVdGMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZGVzdFVucGFpZEluc3RhbGxtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Cb2FyZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGlyZVN1cnZleURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25zZXRPZkN1cnJlbnRTeW1wdG9tc09ySWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25zZXRPZlNpbWlsYXJTeW1wdG9tc09ySWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbkhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uc0NlYXNlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9waW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0Vhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckFtZW5kbWVudEJpbmRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvbXBsZXRpb25EYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJSZWNlaXZlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclRvUHJvY2VlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFc3RpbWF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSXNzdWVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxseVNjaGVkdWxlZFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTWF0dXJpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbE5hbWVDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFBvc3RpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvZG9udGljVHJlYXRtZW50UGVyaW9kUmVtYWluaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob2RvbnRpY1RyZWF0bWVudFBlcmlvZFRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtUG9ja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlQXVkaXRvcnNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJoYXVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJyaWRlRGF0ZUZvclNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJUYXJnZXRCYXNlbGluZU1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblNhdHVyYXRpb25UZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5RXZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweUZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0VuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRJbkZ1bGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1UaHJvdWdoRGF0ZUZvckFjY3J1ZWRTaWNrUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGVGb3JNaW5pbXVtUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1UaHJvdWdoRGF0ZUZvclNhbGFyeUNvbnRpbnVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlRm9yVG90YWxQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yVmFjYXRpb25QYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcGVyd29ya01haWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEFubnVpdGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0VGltZVdvcmtpbmdDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEZpcnN0VmlzaXRGb3JDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRDb21tZW5jZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RGF0ZVRpbWVEZWZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbml0aWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbnN0cnVjdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvblByZXNlbnRhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsRGVkdWN0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxQZXJpb2RCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVha0FjdGl2aXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uUFJPQXBwcm92ZWRTdGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uUFJPQXBwcm92ZWRTdGF5RnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmdBcmNoaXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjb2xhdGlvblRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEFuRXZlbnRJc0xhdGVEdWVUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQmV0d2VlbkNoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZENvdmVyZWRCeVNvdXJjZURvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RFeHRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kaWNJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZDYXJlRW5kRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZDYXJlU3RhcnREYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZklsbG5lc3NFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZklsbG5lc3NTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE92ZXJkdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RXb3JrZWRGb3JUaGVDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRUb0FkbWl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0xhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBDb2xsZWN0aW9uRGF0ZVRpbWVPZkNhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBEYXRlVGltZU9mRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudERhdGVQcmV2aW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50UGVyaW9kRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5FbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZER1cmF0aW9uT2ZXb3JrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZFJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5PZlRyZWF0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBhcnRpY2lwYXRpb25TdXNwZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGVyaW9kRWxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbkJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGVyaW9kRWxlY3Rpb25FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5UZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1Z2dlZEFuZEFiYW5kb25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmVPbk9yQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZU9uT3JCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVN1cnJlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nRGF0ZVRpbWVPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdEYXRlVGltZU9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0bWFya0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkVuZE9mU2Vjb25kWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRmlyc3RSZXBvcnRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25GaXJzdFNlbWktYW5udWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25TZWNvbmRTZW1pLWFubnVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXJyYW5nZWREZWFsTWF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1Bd2FyZFN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2VkaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2VydGlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZvcmVjbG9zdXJlQWNjZXB0YW5jZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZvcmVjbG9zdXJlU2FsZUNsb3NpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5RHVyYXRpb25BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUNoYW5nZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1QYWlkVG9EYXRlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1QYWlkVG9EYXRlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbkRhdGVUaW1lT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25EaXNwZW5zaW5nRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uSXNzdWVEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25UbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uRGF0ZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uRGF0ZU9mR29vZHNEZWNsYXJhdGlvbkN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvblRvQmFua3J1cHRjeVJlY2VpdmVyc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50ZWRUb1JlY2VpdmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudExlZ2FsU3RydWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50bHlSZXNpZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudFJlc2lkZW5jZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCb29raW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ291cnRFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdXJyZW50QWNjb3VudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNJbnZvaWNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlcG9ydGVkRGF0ZU9mQmlydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlSZXNpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01ldGVyUmVhZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2VTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudExpbWl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJhc2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXJFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3RBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDb250cmFjdElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckhvc3BpdGFsaXphdGlvbkRhdGVzUmVsYXRlZFRvQ3VycmVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdERhdGVPZkJpcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvck5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZpbGVnZURldGFpbHNWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdEYXRlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0QXZhaWxhYmlsaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEhlbGRVbnRpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkRhdGVOb1NjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25NYW51ZmFjdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaWZlc3BhbkF0VGltZU9mUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtbWVkQ2FsZW5kYXJZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtbWVkRmlzY2FsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRBY3Rpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRGb3JlY2xvc3VyZVNhbGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0T3ZlclRhcmdldEJhc2VsaW5lRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeUFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5UHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeVdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudEFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50UHJpb3J0b0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudFdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRGF0ZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkZsb29yU3RvY2tQcm90ZWN0LUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRmxvb3JTdG9ja1Byb3RlY3QtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkludm9pY2VQZXJmb3JtYW5jZS1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkludm9pY2VQZXJmb3JtYW5jZS1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JkZXItRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25PcmRlci1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUGVyZm9ybWFuY2UtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25QZXJmb3JtYW5jZS1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUmVxdWVzdGVkRGVsaXZlcnktRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25SZXF1ZXN0ZWREZWxpdmVyeS1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU2hpcC1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblNoaXAtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUFjcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUJ1aWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVUZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckxhdGVzdFBvc3NpYmxlQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXRJbnRvU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlckVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVUb0JlUmVjZWl2ZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlT2ZFeGNoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlUHJpY2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhY2hlZFRvdGFsRGVwdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWR5Rm9ySW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlVGF4WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVidWlsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjYXB0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZhYmxlc0NvbGxlY3Rpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlQXRMb2NrYm94RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRJblRoZU1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQXBwb2ludGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNoaXBQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc2hpcFJlc3VsdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhc3NpZmljYXRpb25FeGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLWV2YWx1YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZUV4cG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRJdGVtQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1c2FsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ29udHJhY3Rvck51bWJlckFzc2lnbm1lbnREYXRlT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkRhdGVPZlByZXZpb3VzQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25PZkJvYXJkT2ZEaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbWJ1cnNlbWVudENsYWltSXNzdWVEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZUltcG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN0YXRlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQWNjb3VudGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VDb3ZlcmFnZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUN1cnJlbnRBY2NvdW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VJc3N1ZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VQYWlkVXBEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBheW1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVPZkN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZU9mU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VkUmV0dXJuVG9Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlZFRvVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlT2ZJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb2RlbGluZ0NvbXBsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVuZXdhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50U3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJUdXJuYXJvdW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYXltZW50QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGF5bWVudFNjaGVkdWxlU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nQ3ljbGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWFsaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRGVwYXJ0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkRm9yQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGb3JEZWxpdmVyeVdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVJlcXVlc3RlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRm9yU2hpcG1lbnRXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZE9mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRTZXR0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclF1b3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2YXRpb25PZkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudExpY2Vuc2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50TGljZW5zZUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lnbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc29sdmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblJlbGVhc2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZW50aW9uUmVsZWFzZURhdGVUaW1lUGFydGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0cmFuc21pc3Npb25UaW1lU3RhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Ub1dvcmtEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Ub1dvcmtQYXJ0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkQWRqdXN0ZWRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRBZGp1c3RlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkRXN0aW1hdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2b2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2b2tlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZEZ1bmRUYXhFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxhcnlDaGFuZ2VFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxhcnlEZWZlcnJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZWFibGVTdG9ja0RlbWFuZENvdmVyUGVyaW9kRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQXZhaWxhYmxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQ29sbGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVSZXF1aXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FuY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdGlzZmFjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdGlzZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yRGVsaXZlcnlPbk9yQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5T25PckJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yRGVsaXZlcnlXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvclNoaXBtZW50QWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvclNoaXBtZW50UHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEludGVyY2hhbmdlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZVJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQWRtaXNzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGlzY2hhcmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaGFyZVByaWNlQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdGlvblBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdGlvblBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbEJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0xvY2FsVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VtaWFubnVhbEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGluZ1JvYWRUaW1lU3RhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcHRpY0FwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29tcGxldGlvbkRhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlSW50ZXJydXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VyU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0b2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGVBc1NwZWNpZmllZEJ5VGhlT3JpZ2luYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGVGcm9tSW50ZXJsaW5lU2V0dGxlbWVudFN5c3RlbU9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmTGlmZUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBEYXRlT3JpZ2luYWxseVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcER1cmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVQcm9taXNlZEZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVByb21pc2VkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdExhdGVyVGhhbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90QmVmb3JlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RCZWZvcmVBbmROb3RBZnRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwT25PckFib3V0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdEYXRlQW5kT3JUaW1lQ3VycmVudFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0RhdGVOb1NjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwV2Vla09mRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2h1dEluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0JlbmVmaXRBZ2VMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0luc3VyYW5jZUVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0xpZmV0aW1lQmVuZWZpdFF1YWxpZmljYXRpb25BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGV0cmFja2VkV2VsbGJvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hdHVyZVJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1pbGFySWxsbmVzc09uc2V0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltcGxlSW50ZXJlc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlcmluZ0VuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlcmluZ1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdHlDbGFpbXNWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkQm9va1B1YmxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xlRGlyZWN0b3JzaGlwUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VEb2N1bWVudENhcHR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjaW5nT3JkZXJVbml0QXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JlZERlcGVuZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JlZERlcGVuZGVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlUmV0aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3B1ZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZU1hbmRhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTm90QWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZU5vdEJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRlZERvaW5nQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0Tm9FYXJsaWVyVGhhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnROb0xhdGVyVGhhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVJlc2lkZW5jeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsVGltZVNlcmllc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0Fzc2lnbm1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQ29tbWVyY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzT3V0c2lkZVByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUHJpb3JBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BEaXN0cmlidXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wV29ya0FzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudFNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclBlcmlvZE9mSGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWlzc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudEludGVyZXN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudFN1Ym1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyc2VkZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsSXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0F2ZXJhZ2VDcmVkaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VDYXNpbmdBdXRob3JpdHlBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZ2VyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycmVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5kZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5zaW9uRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5zaW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd29ybkFuZFN1YnNjcmliZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bXB0b21zT25zZXRQYXRpZW50QWxsZWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1UZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWJsZVJhdGluZ0VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFpbENvdmVyYWdlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhaWxDb3ZlcmFnZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua3NBY2NlcHRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rc0luc3BlY3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQb2ludERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXhEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlQcm9zdGhlc2lzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyU3VibWlzc2lvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uT2ZGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNEaXNjb3VudER1ZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc01ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNOZXREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0Q29tcGxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RQZXJmb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RQZXJpb2RFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzTGluZVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXB5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRW1wbG95ZWVCZWdhbldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJblVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVOb3dEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nUmVxdWlyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNoZWxmTGlmZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZVN0eWxlUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2Zlck5vdGVBY2NlcHRhbmNlRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2hpcG1lbnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFRpbWVMaW1pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvbkRhdGVUaW1lT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0cmlwcGluZ0RhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0dWZmaW5nRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsQmFsYW5jZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU3RhcnREYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFN0YXJ0RGF0ZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGluZ1llYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGVkRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGl0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRpdHlTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkVW50aWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EYXRlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheENsYWltc1ZlcmlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEYXRlT2ZJbmRleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyYmFsUmVwb3J0TmVlZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25SZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFJlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzdGluZ1NlcnZpY2VCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzdGluZ1NlcnZpY2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVudGFyeVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3VjaGVyRGF0ZU9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlc0Vhcm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZVBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXRpbmdUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eUV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlZWtFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxMb2dSdW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZUNvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVDb250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbGxBZHZpc2VBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoaGVsZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtFZmZlY3RpdmVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc0NvbXBsZXRpb25EYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NDb21wbGV0aW9uRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JzdFRpbWVUb0NhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJCZWdpbm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJPZk9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJUb0RhdGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0SUQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNwb3J0TW9kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRNZWFucyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2Fycmllck5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcnJpZXJJRCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ3VzdFNoaXBwaW5nQ29udHJhY3ROdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VMZXZlbENvZGVkIiB0eXBlPSJTZXJ2aWNlTGV2ZWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwcGluZ0luc3RydWN0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZWQiIHR5cGU9IlRyYW5zcG9ydExlZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zaXREaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydCIgdHlwZT0iVHJhbnNwb3J0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnRNb2RlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNb2RlQ29kZWQiIHR5cGU9IlRyYW5zcG9ydE1vZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRNb2RlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TW9kZSIgdHlwZT0iVHJhbnNwb3J0TW9kZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRNb2RlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2hhcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRXhwcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJpZWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVGF4aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm1lZEZvcmNlc0NvdXJpZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNraGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RXYXktU2hpcHBlcnNPcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tQb3N0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FiT3JUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25JcnJlZ3VsYXJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJpemVkT2NlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsT2NlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBpY2t1cE9yQ3VzdG9tZXJzRXhwZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVhd2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZWF3YXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvcGVhbk9yUGFjaWZpY0Rpc3RyaWJ1dGlvblN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkVHJhbnNwb3J0SW5zdGFsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbHlhd2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljUmVjZWl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljUmVjZWl2aW5nT3JTaGlwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1NoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlclRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJ3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybW9kYWwtUGlnZ3liYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhblRyYWlsZXJMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUludHJhdGhlYXRlckFpcmxpZnRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeU9mZmljaWFsTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZVVua25vd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1CdWxrQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItQ29tbW9uQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItRmxhdGJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItUGFja2FnZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXV0aW1vZGFsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5Db25mZXJlbmNlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5Ob24tQ29uZmVyZW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmNlbFBvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZFBpZ2d5YmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkUmFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xUb1Bvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlUGFyY2VsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVpY2t0cmFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhT3JBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFnZW50LVRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrVHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWFtc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93YXdheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJPclBpcGVsaW5lSW50ZXJtb2RhbE1vdmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnRNZWFucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TWVhbnNDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TWVhbnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1lYW5zIiB0eXBlPSJUcmFuc3BvcnRNZWFucyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SUxDb250YWluZXItQ2xvc2VkVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SUxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElMQ29udGFpbmVyLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJTENvbnRhaW5lci1DbG9zZWRUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0LUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlQ2hlbWljYWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5T3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvZ2llIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhckN1c2hpb25VbmRlckZyYW1lT0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1EYW1hZ2VGcmVlRXF1aXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnRlcmlvckJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa3RydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRCdWxrVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZFRhbmtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhckNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQW5kUGFzc2VuZ2VyVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJXaXRoQ2FyYXZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VtZW50VmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzLUdvb3NlbmVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXItQ29udHJvbGxlZFRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYWxWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXN0ZXJDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbC1DYXJDb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsQ2FyT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQWx1bWludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1CdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQ2xvc2VkVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IaWdoU2lkZU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1Mb3dTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT25seVZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW4tU2lkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItUGxhdGZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcnJlc3RpbmdvbmFDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItU3RlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0NoZW1pY2FscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmtGb29kR3JhZGUtTGlxdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0dhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVVwZ3JhZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoQmFnSGFuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEZsb29yU2VjdXJpbmdSaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEZsdXNoRG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhIYW5nYXJCYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoU21vb3RoU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhXYXZ5T3JSaXBwbGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFRlbXBlcmF0dXJlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWRCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3J1ZGVPaWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRGV0ZXJtaW5lZERlYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmFpbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0LUluSGVscGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWVwU2VhQ2hlbWljYWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEJhY2tUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlCdWxrQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb2ZUcmFpbkRldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXB0aW9uYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlcnJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNoaW5nVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrRG91YmxlRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUmFjay1GbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRSYWNrLVNpbmdsZURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0YmVkU2xpZGluZ1RhbmRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyLVJlbW92YWJsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcndpdGhIZWFkYm9hcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcndpdGhOb0hlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXItRW5kQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Y2FyV2l0aFBlZGVzdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2tBbmRSZWZyaWdlcmF0ZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2tBbmRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5Gb29kVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVybml0dXJlVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItQ292ZXJlZEludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbmNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXZlbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZkhlaWdodEZsYXRSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRvZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkUG5ldW1hdGljRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmFudENhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkbGVyQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVja0FuZEZyZWV6ZXJUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVHJ1Y2tBbmRJc290aGVybWljVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY3RydWNrYW5kcmVmcmlnZXJhdGVkdHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1ZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWVmaWVkTmF0dXJhbEdhc0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVlZmllZFBldHJvbGV1bUdhc0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRPclVubG9hZERldmljZU9uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsUHJvZHVjdHNUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tVG9wT3JGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblRvcFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRyb2xWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2stVXBUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyUGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEJ1bGtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZE1haW50ZW5hbmNlT2ZXYXlDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxTaWxvVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2tBbmRGcmVlemVyVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2tBbmRJc290aGVybWljVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2tBbmRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZVNpZGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFsVHJ1Y2tBbmRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdpZFRydWNrV2l0aFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFua0FuZEJ1bGtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdpZFRydWNrV2l0aFRhbmtBbmRUYW5rVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFNpbG9UYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxPbi1Sb2xsT2ZmVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWRkbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckRldGVybWluZWRNZWFuc09mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVEFLLVJBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlZWxQcm9kdWN0c1Zlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyMjVUb25uZVdpdGg5MEN1YmljTWV0ZXJUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kUmVtb3ZhbFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kUmVtb3ZhbFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZhbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXNjb3BpbmdUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1iZXJPckxvZ0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcEFydGljdWxhdGVkVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcHRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Cb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1EcnlGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUVsZWN0cmljSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1QbmV1bWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstRm9vZEdyYWRlTGlxdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ1Zlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoMjBPck1vcmVXYWdvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluV2l0aE1vcmVUaGFuT25lQW5kTGVzc1RoYW4yMFdhZ29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoT25lV2Fnb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhcjIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtRnVsbHlFbmNsb3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoRG9vcnNOb1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcEhpZ2hTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wTG93U2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tPclRyYWlsZXJXaXRoVGlsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vckFuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vckFuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWdhbmRPclB1c2hib2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TG9hZERldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4tU3BlY2lhbEluc2lkZUxlbmd0aFdpZHRoT3JIZWlnaHRSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1MYWtlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Db250YWluZXJzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tTGFzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLVJvbGxPbi1Sb2xsT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29kY2hpcGNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtWZXNzZWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VydmljZUxldmVsQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtDb21tb2RpdHlUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVlRGF5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOUFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRWNvbm9teSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUJpbGxpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyRXhwcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWROZXh0RGF5QnlDYXJ0YWdlQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVkU2Vjb25kRGF5QnlDYXJ0YWdlQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVkVGhpcmREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb25maXJtYXRpb25SZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvb3JTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGlmaWNhdGlvbk9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mT2ZEZWxpdmVyeVdpdGhTaWduYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzc1NlcnZpY2VQbHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja2luZ0dyb3VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZVdvcmxkd2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzc1NlcnZpY2VXb3JsZHdpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldHJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERheUFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEZsaWdodE91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERheUh1bmRyZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRNb3JuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTZXJ2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJuaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5MTAzMEFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eU1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTkzMEFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eU1haWxJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5Tm9vbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE9Cb3haaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5Qnk1MDBQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhU2Vjb25kRGF5QnlOb29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5SW50ZXJtb2RhbEhpZ2hTcGVlZDcwTWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckludGVybW9kYWxBbmRTdGFja1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYwTWlsZXNQZXJIb3VyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdXNUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdXRlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXR1cm5TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1lRGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREYXlBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREYXlIdW5kcmVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEdyb3VuZEh1bmRyZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZE1vcm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbFNwZWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0U2VydmljZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdFRoZVN0YXRpc3RpY2FsVGVycml0b3J5TGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRCb3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0RGVwYXJ0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRm91cnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUZpZnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVNpeHRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVNldmVudGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRWlnaHRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUZpcnN0Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpQ2FycmlhZ2UtU2Vjb25kQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVRoaXJkQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJ3YXlUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q2FycmllckFsbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUHJlLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQWNjZXB0YW5jZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kT24tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1OaW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVGVudGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRWxldmVudGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVHdlbGZ0aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJuZENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNyZENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjR0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjV0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjZ0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijd0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijh0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijl0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1JvdXRpbmdPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5EZWxpdmVyeUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFTFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxhZ2VSaWdodHNDYXJyaWVyQW5kSnVuY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN3aXRjaENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxhZ2VNb3ZlbWVudENhcnJpZXJBbmRKdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luQ2FycmllckFpck1vdG9yT3JPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luQ2FycmllclJ1bGUxMVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc1JvdXRpbmdPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVTd2l0Y2hDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2FycmllckluUm91dGVPblJldHVyblJvdXRlTW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVuY3Rpb25TZXR0bGVtZW50Q2FycmllckZvbGxvd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVuY3Rpb25TZXR0bGVtZW50Q2FycmllclByZWRlY2Vzc29yIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRyYW5zcG9ydEVxdWlwbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50IiB0eXBlPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydEVxdWlwbWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRQcm92aWRlckNvZGVkIiB0eXBlPSJFcXVpcG1lbnRQcm92aWRlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50T3duZXJDb2RlZCIgdHlwZT0iRXF1aXBtZW50T3duZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFcXVpcG1lbnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50U2l6ZVR5cGVDb2RlZCIgdHlwZT0iRXF1aXBtZW50U2l6ZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcGVtZW50U2l6ZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlZCIgdHlwZT0iRXF1aXBtZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50U3RhdHVzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVsbEluZGljYXRvckNvZGVkIiB0eXBlPSJGdWxsSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVsbEluZGljYXRvckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29uZGl0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTZWFsSW5mbyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mRXF1aXBtZW50TWVhc3VyZW1lbnRzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydEVxdWlwbWVudCIgdHlwZT0iVHJhbnNwb3J0RXF1aXBtZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJTdXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3JTdXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjb25zb2xpZGF0b3JTdXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJTdXBwbGllZEZyb21BTGVhc2luZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlclN1cHBsaWVkRnJvbVRoZVJhaWx3YXlzUG9vbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RDdXN0b21lck93bmVkT3JMZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlck93bmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck93bmVkT3JMZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBMZWFzZWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50U2l6ZVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElsQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElsQ29udGFpbmVyLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJbENvbnRhaW5lci1DbG9zZWRUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJbENvbnRhaW5lci1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJlaWdodC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJpZGVWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlFbmNsb3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkV2l0aFJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvZ2llIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhckN1c2hpb25VbmRlckZyYW1lT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1EYW1hZ2VGcmVlRXF1aXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnRlcmlvckJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94UGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzLUdvb3NlbmVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXItQ29udHJvbGxlZFRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWwtQ2FyQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbENhck9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUFsdW1pbnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUNsb3NlZFRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGlnaFNpZGVPcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWMzMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItTG93U2lkZU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuLVNpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3BlblRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVBsYXRmb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJSZXN0aW5nT25BQ2hhc3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVN0ZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmstQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1Gb29kR3JhZGUtTGlxdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1VcGdyYWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVZlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEJhZ0hhbmdlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhGbG9vclNlY3VyaW5nUmluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhGbHVzaERvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoSGFuZ2FyQmFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFNtb290aFNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoV2F2eU9yUmlwcGxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRUZW1wZXJhdHVyZVRyYWlsZXItUmVlZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQtSW5IZWxwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVDb2F0ZWRUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BCYWNrVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVhbFRyYWlsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcG94eUNvYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9QYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlYWJsZVBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1Eb3VibGVEcm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1GbGF0LUJlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2stU2luZ2xlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0YmVkU2xpZGluZ1RhbmRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyLVJlbW92YWJsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcldpdGhIZWFkYm9hcmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcldpdGhOb0hlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXItRW5kQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Y2FyV2l0aFBlZGVzdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5Gb29kVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhdG9yU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLUNvdmVyZWQtSW50ZXJpb3JCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZIZWlnaHRGbGF0UmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZC1FbmRIZWxwZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZUcmFpbkRldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEN1YmVWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZC1QbmV1bWF0aWNEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYW50LUNhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkbGVyQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkT3JVbmxvYWREZXZpY2VPbkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjEwLjkwTUFuZDEzLjc1TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjYuMTVNQW5kNy44Mk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW43LjgyTUFuZDkuMTVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuOS4xNU1BbmQxMC45ME0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUxlc3NUaGFuNi4xNU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbndvcmtpbmdSZWVmZXJDb250YWluZXIyMEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb253b3JraW5nUmVlZmVyQ29udGFpbmVyNDBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uV29ya2luZ1JlZnJpZ2VyYXRlZE9yUmVlZmVyQ29udGFpbmVyMzBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5WZXNzZWwtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuLVRvcE9yRmxhdGJlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Ub3BWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2stVXBUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJQYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc3VyaXplZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkTWFpbnRlbmFuY2VPZldheUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhci1FbmRIZWxwZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZE9yUmVlZmVyQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rMzBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rSWMyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmtJYzQwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlU2lkZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbmRpbmF2aWFuUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pLVJlZnJpZ2VyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VtaS1UcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFpbmxlc3NTdGVlbFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWstUmFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVyMzBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVyNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWMyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzMwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlc2NvcGluZ1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENvbnRhaW5lcjIwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENvbnRhaW5lcjMwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENvbnRhaW5lcjQwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGViaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQm9hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1DYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRHJ5RnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1FbGVjdHJpY0hlYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Ob3RPdGhlcndpc2VTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUG5ldW1hdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVJlZnJpZ2VyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUNoZW1pY2FscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUZvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhcjIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtRnVsbHlFbmNsb3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoRG9vcnMtTm9Sb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcEhpZ2hTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wTG93U2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TG9hZERldmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuLVNwZWNpYWxJbnNpZGVMZW5ndGgtV2lkdGhPckhlaWdodFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLUxha2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUNvbnRhaW5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1MYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tUm9sbG9uLVJvbGxvZmYiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50U3RhdHVzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluT25Cb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydGxhbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmxhbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxvYWRlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25kaXRpb25zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZnJpZ2VyYXRpb25PbiIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc2lkdWUiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZDb25kaXRpb25zIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbmRpdGlvbnMiIHR5cGU9IkNvbmRpdGlvbnMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNlYWxJbmZvIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTZWFsSW5mbyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2VhbEluZm8iIHR5cGU9Ikxpc3RPZlNlYWxJbmZvIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsSW5mbyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbE51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJTZWFsSXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbEluZm8iIHR5cGU9IlNlYWxJbmZvIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsSXNzdWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSXNzdWVyQ29kZWQiIHR5cGU9IlNlYWxJc3N1ZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsSXNzdWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbElzc3VlciIgdHlwZT0iU2VhbElzc3VlciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZWFsSXNzdWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5rbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcmFudGluZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxPcGVyYXRvciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNDb2RlZCIgdHlwZT0iU2VhbFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsU3RhdHVzSW5mbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIiB0eXBlPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VhbFN0YXR1c0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluUmlnaHRDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVFbGVjdHJvbmljU2VhbElzRmF1bHR5Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uQ29kZWQiIHR5cGU9IlRyYW5zaXREaXJlY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlZCIgdHlwZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNpdERpcmVjdGlvbiIgdHlwZT0iVHJhbnNpdERpcmVjdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyVG9TZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JUb1NlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9Ecm9wU2hpcERlc2lnbmF0ZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9GcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb1N1YmNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdGhlclZlc3NlbFRvTGlnaHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlnaHRlclRvTW90aGVyVmVzc2VsIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhckRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyV2Vla3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNURheVdvcmtXZWVrIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIiB0eXBlPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2hpcFRvU3ViSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBUb1N1YkxvY2F0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBUb1N1YlF1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3ViTG9jYXRpb25JdGVtUGFja2FnaW5nUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIgdHlwZT0iU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VSZWZlcmVuY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiIHR5cGU9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VJRFJlZmVyZW5jZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQYWNrYWdlUmVmZXJlbmNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlUmVmZXJlbmNlIiB0eXBlPSJQYWNrYWdlUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtc09mRGVsaXZlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZWQiIHR5cGU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRUZXJtc0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRUZXJtc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZWQiIHR5cGU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXJtc09mRGVsaXZlcnlEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NDb2RlZCIgdHlwZT0iUmlza09mTG9zc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrT2ZMb3NzRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRlcm1zT2ZEZWxpdmVyeSIgdHlwZT0iVGVybXNPZkRlbGl2ZXJ5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VhbmREZXNwYXRjaENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGVkQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmRpdGlvbiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRUZXJtc0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeC1Xb3JrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZS1DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlQWxvbmdzaWRlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZU9uQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbmRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0LUluc3VyYW5jZUFuZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpYWdlUGFpZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWFnZS1JbnN1cmFuY2VQYWlkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZEF0RnJvbnRpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZEV4LVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZEV4LVF1YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZER1dHlVbnBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZER1dHlQYWlkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VDb2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlUHJlcGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaE9uRGVsaXZlcnlTZXJ2aWNlQ2hhcmdlUGFpZEJ5Q29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeVNlcnZpY2VDaGFyZ2VQYWlkQnlDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RGcmVpZ2h0Q3JlZGl0ZWRUb1BheW1lbnRDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdE9uRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGljay1VcE9yQmFja2hhdWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmluZWRCeUJ1eWVyQW5kU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2JQb3J0T2ZDYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmUHJlcGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Db3B5LU5vUGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29zdHNQYWlkQnlDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvc3RzUGFpZEJ5Q29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUmV2ZW51ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEJ5U3VwcGxpZXJPclNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5YWJsZUVsc2V3aGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEFuZFN1bW1hcnlCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQnV0Q2hhcmdlZFRvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRCeVByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZC1CeVNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZExvY2FsQ29sbGVjdE91dHN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodEZyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvbnRhaW5lckZyZWlnaHRQYWlkQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodFBhaWRCeVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdWxlMTFTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUZyZWlnaHQtTm9DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENvbmRpdGlvbiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSaXNrT2ZMb3NzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0Rlc3RpbmF0aW9uSXNCdXllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0ZyZWlnaHRFcXVhbGl6YXRpb25Qb2ludElzU2VsbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvUG9vbFBvaW50SXNTZWxsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9EZXN0aW5hdGlvbklzU2VsbGVycyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOYXR1cmVPZkdvb2RzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlZCIgdHlwZT0iT3BlcmF0aW9uYWxUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHlwZU9mQ2FyZ28iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhcmdvQ2xhc3NpZmljYXRpb24iIHR5cGU9IkNhcmdvQ2xhc3NpZmljYXRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVOb24tRHV0aWFibGVDb25zaWdubWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1ZhbHVlRHV0aWFibGVDb25zaWdubWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hWYWx1ZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJOb24tQ29udGFpbmVyaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGwtT25Sb2xsLU9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtidWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQb2xsdXRhbnRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90LUhhemFyZG91c0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXBsb21hdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jub3hpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZkdhdWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc0FuZFBlcnNvbmFsRWZmZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuQ2FyZ28iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkltbXV0YWJsZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlTGluayIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcGxpZXJTaG9wcGluZ0NhcnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iUm91bmRUcmlwT3JkZXIiIHR5cGU9InhjYmxCb29sZWFuIiBmaXhlZD0idHJ1ZSIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIgdHlwZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkFjY291bnRBc3NpZ25tZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBY2NvdW50QXNzaWdubWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWNjb3VudEFzc2lnbm1lbnQiIHR5cGU9Ikxpc3RPZkFjY291bnRBc3NpZ25tZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY2NvdW50QXNzaWdubWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudEFzc2lnbm1lbnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRpc3RyaWJ1dGlvblBlcmNlbnRhZ2UiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHTEFjY291bnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvc3RDZW50ZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFjY291bnRBc3NpZ25tZW50T3JkZXJOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9wZXJhdGlvbk51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNPcmRlclJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnVzaW5lc3NBcmVhIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cm9sbGluZ0FyZWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2ZpdENlbnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iV29ya0JyZWFrZG93blN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmV0d29yayIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRml4ZWRBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRml4ZWRBc3NldFN1YiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVuZHNDZW50ZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bmQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbW1pdG1lbnRJdGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdW5jdGlvbmFsQXJlYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iR2VuZXJpY0FjY291bnRpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mTmFtZVZhbHVlU2V0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50QXNzaWdubWVudCIgdHlwZT0iQWNjb3VudEFzc2lnbm1lbnQiLz4KLSAgICA8IS0tIFNPWCBmb3JtYXQgZGF0YXR5cGVzIHdoZXJlIHRoZXkgZGlmZXIgZnJvbSBzdGFuZGFyZCBYU0RMIGRhdGF0eXBlcy0tPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRGF0ZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldezR9KCgoMDF8MDN8MDV8MDd8MDh8MTB8MTIpKCgwWzEtOV0pfChbMS0yXVswLTldKXwoM1swLTFdKSkpfCgoMDR8MDZ8MDl8MTEpKCgwWzEtOV0pfChbMS0yXVswLTldKXwzMCkpfCgoMDIpKCgwWzEtOV0pfChbMS0yXVswLTldKSkpKSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsVGltZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IigoKFswLTFdWzAtOV0pfCgyWzAtM10pKSg6KFswLTVdWzAtOV0pKXsyfSgoXCt8LSkoKFswLTFdWzAtOV0pfCgyWzAtM10pKTooWzAtNV1bMC05XSkpPykiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibERhdGV0aW1lIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV17NH0oKCgwMXwwM3wwNXwwN3wwOHwxMHwxMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMV0pKSl8KCgwNHwwNnwwOXwxMSkoKDBbMS05XSl8KFsxLTJdWzAtOV0pfDMwKSl8KCgwMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pKSkpVCgoKFswLTFdWzAtOV0pfCgyWzAtM10pKSg6KFswLTVdWzAtOV0pKXsyfSgoXCt8LSkoKFswLTFdWzAtOV0pfCgyWzAtM10pKTooWzAtNV1bMC05XSkpPykiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibEJvb2xlYW4iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0idHJ1ZXxmYWxzZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRmxvYXQiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpmbG9hdCI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IihcK3wtKT9bMC05XSpcLj9bMC05XSooRXxlKT9bMC05XSoiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibERvdWJsZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRvdWJsZSI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IihcK3wtKT9bMC05XSpcLj9bMC05XSooRXxlKT9bMC05XSoiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9hbm51aXR5bmV0X25ldy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvYW5udWl0eW5ldF9uZXcueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWY1OGUyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9hbm51aXR5bmV0X25ldy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmFubnVpdHluZXQuY29tL25hbWVzcGFjZS9wcm9maWxlcyIKLQotICB4bWxucz0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiCi0gIHhtbG5zOmN2b2U9Imh0dHA6Ly93d3cuY29udGl2by5jb20veG1sbnMvMjAwMi9lbnJpY2htZW50IgotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPREUiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+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+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NTk5Y2IuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2N4bWwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08IS0tVzNDIFNjaGVtYSBnZW5lcmF0ZWQgYnkgWE1MIFNweSB2NC40IFUgKGh0dHA6Ly93d3cueG1sc3B5LmNvbSktLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQWNjb3VudGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VnbWVudCIgcmVmPSJTZWdtZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQWNjb3VudGluZ1NlZ21lbnQiIHJlZj0iQWNjb3VudGluZ1NlZ21lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQWNjb3VudGluZ1NlZ21lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQWRkcmVzcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxBZGRyZXNzIiByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRW1haWwiIHJlZj0iRW1haWwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUGhvbmUiIHJlZj0iUGhvbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRmF4IiByZWY9IkZheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXNvQ291bnRyeUNvZGUiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhZGRyZXNzSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBcmVhT3JDaXR5Q29kZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCaWxsVG8iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQWRkcmVzcyIgcmVmPSJBZGRyZXNzIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCcm93c2VyRm9ybVBvc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQnV5ZXJDb29raWUiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0lGQ29udGVudCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ2hhbmdldGltZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ2hhcmdlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1vbmV5IiByZWY9Ik1vbmV5Ii8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb21haW4iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDb21tZW50cyI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHJlZj0iQXR0YWNobWVudCIvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDb250YWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlBvc3RhbEFkZHJlc3MiIHJlZj0iUG9zdGFsQWRkcmVzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkVtYWlsIiByZWY9IkVtYWlsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUGhvbmUiIHJlZj0iUGhvbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJGYXgiIHJlZj0iRmF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icm9sZSIgdHlwZT0ieHM6Tk1UT0tFTiIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDb250cmFjdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb21tZW50cyIgcmVmPSJDb21tZW50cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtU2VnbWVudCIgcmVmPSJJdGVtU2VnbWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZWZmZWN0aXZlRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4cGlyYXRpb25EYXRlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2UiIHJlZj0iVW5pdFByaWNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkV4dHJpbnNpYyIgcmVmPSJFeHRyaW5zaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNvdW50cnkiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXNvQ291bnRyeUNvZGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDb3VudHJ5Q29kZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpc29Db3VudHJ5Q29kZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNyZWRlbnRpYWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSWRlbnRpdHkiIHJlZj0iSWRlbnRpdHkiLz4KLQkJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hhcmVkU2VjcmV0IiByZWY9IlNoYXJlZFNlY3JldCIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEaWdpdGFsU2lnbmF0dXJlIiByZWY9IkRpZ2l0YWxTaWduYXR1cmUiLz4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hcmtldHBsYWNlIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRlbGl2ZXJUbyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaG9ydE5hbWUiIHJlZj0iU2hvcnROYW1lIi8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRpZ2l0YWxTaWduYXR1cmUiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IlBLNyBzZWxmLWNvbnRhaW5lZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJCYXNlNjQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGlzdHJpYnV0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFjY291bnRpbmciIHJlZj0iQWNjb3VudGluZyIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNoYXJnZSIgcmVmPSJDaGFyZ2UiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRvY3VtZW50UmVmZXJlbmNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXlsb2FkSUQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFZmZlY3RpdmVEYXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFbWFpbCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRXhwaXJhdGlvbkRhdGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkV4dGVuc2lvbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRXh0cmluc2ljIj4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkZheCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGVsZXBob25lTnVtYmVyIiByZWY9IlRlbGVwaG9uZU51bWJlciIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWFpbCIgcmVmPSJFbWFpbCIvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGb2xsb3d1cCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGb3JtYXQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkZyb20iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ3JlZGVudGlhbCIgcmVmPSJDcmVkZW50aWFsIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJHZXRQZW5kaW5nUmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNZXNzYWdlVHlwZSIgcmVmPSJNZXNzYWdlVHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWF4TWVzc2FnZXMiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXN0UmVjZWl2ZWRUaW1lc3RhbXAiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJHZXRQZW5kaW5nUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY1hNTCIgcmVmPSJjWE1MIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJIZWFkZXIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRnJvbSIgcmVmPSJGcm9tIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVG8iIHJlZj0iVG8iLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZW5kZXIiIHJlZj0iU2VuZGVyIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJZGVudGl0eSI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Imxhc3RDaGFuZ2VkVGltZXN0YW1wIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiIHJlZj0iQ29tbWVudHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoR3JvdXAiIHJlZj0iU2VhcmNoR3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW0iIHJlZj0iSW5kZXhJdGVtIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbUFkZCIgcmVmPSJJbmRleEl0ZW1BZGQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1EZWxldGUiIHJlZj0iSW5kZXhJdGVtRGVsZXRlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtUHVuY2hvdXQiIHJlZj0iSW5kZXhJdGVtUHVuY2hvdXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1BZGQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1EZXRhaWwiIHJlZj0iSXRlbURldGFpbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbURldGFpbCIgcmVmPSJJbmRleEl0ZW1EZXRhaWwiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbURlbGV0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1EZXRhaWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTGVhZFRpbWUiIHJlZj0iTGVhZFRpbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHBpcmF0aW9uRGF0ZSIgcmVmPSJFeHBpcmF0aW9uRGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFZmZlY3RpdmVEYXRlIiByZWY9IkVmZmVjdGl2ZURhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoR3JvdXBEYXRhIiByZWY9IlNlYXJjaEdyb3VwRGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRlcnJpdG9yeUF2YWlsYWJsZSIgcmVmPSJUZXJyaXRvcnlBdmFpbGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbVB1bmNob3V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaG91dERldGFpbCIgcmVmPSJQdW5jaG91dERldGFpbCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW50ZXJuYWxJRCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb21haW4iIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVuaXRQcmljZSIgcmVmPSJVbml0UHJpY2UiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgcmVmPSJEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVuaXRPZk1lYXN1cmUiIHJlZj0iVW5pdE9mTWVhc3VyZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNsYXNzaWZpY2F0aW9uIiByZWY9IkNsYXNzaWZpY2F0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyUGFydElEIiByZWY9Ik1hbnVmYWN0dXJlclBhcnRJRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJOYW1lIiByZWY9Ik1hbnVmYWN0dXJlck5hbWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRyaW5zaWMiIHJlZj0iRXh0cmluc2ljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJQYXJ0SUQiIHJlZj0iU3VwcGxpZXJQYXJ0SUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllclBhcnRBdXhpbGlhcnlJRCIgcmVmPSJTdXBwbGllclBhcnRBdXhpbGlhcnlJRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbURldGFpbCIgcmVmPSJJdGVtRGV0YWlsIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcHBpbmciIHJlZj0iU2hpcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGF4IiByZWY9IlRheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGluZU51bWJlciIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1PdXQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1EZXRhaWwiIHJlZj0iSXRlbURldGFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcFRvIiByZWY9IlNoaXBUbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwcGluZyIgcmVmPSJTaGlwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUYXgiIHJlZj0iVGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRpc3RyaWJ1dGlvbiIgcmVmPSJEaXN0cmlidXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb250YWN0IiByZWY9IkNvbnRhY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb21tZW50cyIgcmVmPSJDb21tZW50cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGluZU51bWJlciIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpc2l0aW9uSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0ZWREZWxpdmVyeURhdGUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtU2VnbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb250cmFjdEl0ZW0iIHJlZj0iQ29udHJhY3RJdGVtIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWdtZW50S2V5IiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTGVhZFRpbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlck5hbWUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlclBhcnRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTWVzc2FnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXMiIHJlZj0iU3RhdHVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0T3JkZXJNZXNzYWdlIiByZWY9IlB1bmNoT3V0T3JkZXJNZXNzYWdlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNoYW5nZU1lc3NhZ2UiIHJlZj0iU3Vic2NyaXB0aW9uQ2hhbmdlTWVzc2FnZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckNoYW5nZU1lc3NhZ2UiIHJlZj0iU3VwcGxpZXJDaGFuZ2VNZXNzYWdlIi8+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ltZW50TW9kZSIgZGVmYXVsdD0icHJvZHVjdGlvbiI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvZHVjdGlvbiIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZXN0Ii8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluUmVwbHlUbyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2VUeXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjdXJyZW5jeSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYWx0ZXJuYXRlQW1vdW50IiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhbHRlcm5hdGVDdXJyZW5jeSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik51bWJlciIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3B0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImEtZHR5cGUiIHR5cGU9InhzOk5NVE9LRU5TIiBmaXhlZD0ibmFtZSBzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJNZXRob2QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJUYXJnZXQiIHJlZj0iT3JkZXJUYXJnZXQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclByb3RvY29sIiByZWY9Ik9yZGVyUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlck1ldGhvZHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJNZXRob2QiIHJlZj0iT3JkZXJNZXRob2QiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb250YWN0IiByZWY9IkNvbnRhY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclByb3RvY29sIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJSZXF1ZXN0SGVhZGVyIiByZWY9Ik9yZGVyUmVxdWVzdEhlYWRlciIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1PdXQiIHJlZj0iSXRlbU91dCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJSZXF1ZXN0SGVhZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRvdGFsIiByZWY9IlRvdGFsIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcFRvIiByZWY9IlNoaXBUbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJCaWxsVG8iIHJlZj0iQmlsbFRvIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcHBpbmciIHJlZj0iU2hpcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGF4IiByZWY9IlRheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQYXltZW50IiByZWY9IlBheW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiIHJlZj0iQ29tbWVudHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRm9sbG93dXAiIHJlZj0iRm9sbG93dXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRG9jdW1lbnRSZWZlcmVuY2UiIHJlZj0iRG9jdW1lbnRSZWZlcmVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXh0cmluc2ljIiByZWY9IkV4dHJpbnNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ib3JkZXJJRCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im9yZGVyRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIGRlZmF1bHQ9Im5ldyI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibmV3Ii8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGUiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlzaXRpb25JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNoaXBDb21wbGV0ZSI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyVGFyZ2V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQaG9uZSIgcmVmPSJQaG9uZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkVtYWlsIiByZWY9IkVtYWlsIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRmF4IiByZWY9IkZheCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPdGhlck9yZGVyVGFyZ2V0IiByZWY9Ik90aGVyT3JkZXJUYXJnZXQiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPdGhlck9yZGVyVGFyZ2V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBDYXJkIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlBvc3RhbEFkZHJlc3MiIHJlZj0iUG9zdGFsQWRkcmVzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im51bWJlciIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4cGlyYXRpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUGF5bWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQQ2FyZCIgcmVmPSJQQ2FyZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUGhvbmUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGVsZXBob25lTnVtYmVyIiByZWY9IlRlbGVwaG9uZU51bWJlciIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBvc3RhbEFkZHJlc3MiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVsaXZlclRvIiByZWY9IkRlbGl2ZXJUbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN0cmVldCIgcmVmPSJTdHJlZXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDaXR5IiByZWY9IkNpdHkiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0ZSIgcmVmPSJTdGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxDb2RlIiByZWY9IlBvc3RhbENvZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgcmVmPSJDb3VudHJ5Ii8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQ29kZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHJvZmlsZVJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGUvPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQcm9maWxlUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3B0aW9uIiByZWY9Ik9wdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRyYW5zYWN0aW9uIiByZWY9IlRyYW5zYWN0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlZmZlY3RpdmVEYXRlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYS1kdHlwZSIgdHlwZT0ieHM6Tk1UT0tFTlMiIGZpeGVkPSJlZmZlY3RpdmVEYXRlIGRhdGVUaW1lIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0T3JkZXJNZXNzYWdlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkJ1eWVyQ29va2llIiByZWY9IkJ1eWVyQ29va2llIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRPcmRlck1lc3NhZ2VIZWFkZXIiIHJlZj0iUHVuY2hPdXRPcmRlck1lc3NhZ2VIZWFkZXIiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSW4iIHJlZj0iSXRlbUluIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dE9yZGVyTWVzc2FnZUhlYWRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUb3RhbCIgcmVmPSJUb3RhbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcHBpbmciIHJlZj0iU2hpcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGF4IiByZWY9IlRheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbkFsbG93ZWQiIHVzZT0icmVxdWlyZWQiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNyZWF0ZSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnNwZWN0Ii8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVkaXQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRTZXR1cFJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQnV5ZXJDb29raWUiIHJlZj0iQnV5ZXJDb29raWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRyaW5zaWMiIHJlZj0iRXh0cmluc2ljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlckZvcm1Qb3N0IiByZWY9IkJyb3dzZXJGb3JtUG9zdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb250YWN0IiByZWY9IkNvbnRhY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllclNldHVwIiByZWY9IlN1cHBsaWVyU2V0dXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcFRvIiByZWY9IlNoaXBUbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWxlY3RlZEl0ZW0iIHJlZj0iU2VsZWN0ZWRJdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1PdXQiIHJlZj0iSXRlbU91dCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB1c2U9InJlcXVpcmVkIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjcmVhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW5zcGVjdCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJlZGl0Ii8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0U2V0dXBSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGFydFBhZ2UiIHJlZj0iU3RhcnRQYWdlIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaG91dERldGFpbCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgcmVmPSJEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbiIgcmVmPSJDbGFzc2lmaWNhdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlck5hbWUiIHJlZj0iTWFudWZhY3R1cmVyTmFtZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0SUQiIHJlZj0iTWFudWZhY3R1cmVyUGFydElEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkV4cGlyYXRpb25EYXRlIiByZWY9IkV4cGlyYXRpb25EYXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkVmZmVjdGl2ZURhdGUiIHJlZj0iRWZmZWN0aXZlRGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hHcm91cERhdGEiIHJlZj0iU2VhcmNoR3JvdXBEYXRhIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGVycml0b3J5QXZhaWxhYmxlIiByZWY9IlRlcnJpdG9yeUF2YWlsYWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHJvZmlsZVJlcXVlc3QiIHJlZj0iUHJvZmlsZVJlcXVlc3QiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclJlcXVlc3QiIHJlZj0iT3JkZXJSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRTZXR1cFJlcXVlc3QiIHJlZj0iUHVuY2hPdXRTZXR1cFJlcXVlc3QiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNVcGRhdGVSZXF1ZXN0IiByZWY9IlN0YXR1c1VwZGF0ZVJlcXVlc3QiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJHZXRQZW5kaW5nUmVxdWVzdCIgcmVmPSJHZXRQZW5kaW5nUmVxdWVzdCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkxpc3RSZXF1ZXN0IiByZWY9IlN1YnNjcmlwdGlvbkxpc3RSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ29udGVudFJlcXVlc3QiIHJlZj0iU3Vic2NyaXB0aW9uQ29udGVudFJlcXVlc3QiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxpc3RSZXF1ZXN0IiByZWY9IlN1cHBsaWVyTGlzdFJlcXVlc3QiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckRhdGFSZXF1ZXN0IiByZWY9IlN1cHBsaWVyRGF0YVJlcXVlc3QiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ltZW50TW9kZSIgZGVmYXVsdD0icHJvZHVjdGlvbiI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvZHVjdGlvbiIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZXN0Ii8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN0YXR1cyIgcmVmPSJTdGF0dXMiLz4KLQkJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQkJCQkJPHhzOmNob2ljZT4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9IlByb2ZpbGVSZXNwb25zZSIgcmVmPSJQcm9maWxlUmVzcG9uc2UiLz4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0U2V0dXBSZXNwb25zZSIgcmVmPSJQdW5jaE91dFNldHVwUmVzcG9uc2UiLz4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9IkdldFBlbmRpbmdSZXNwb25zZSIgcmVmPSJHZXRQZW5kaW5nUmVzcG9uc2UiLz4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkxpc3RSZXNwb25zZSIgcmVmPSJTdWJzY3JpcHRpb25MaXN0UmVzcG9uc2UiLz4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXNwb25zZSIgcmVmPSJTdWJzY3JpcHRpb25Db250ZW50UmVzcG9uc2UiLz4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyTGlzdFJlc3BvbnNlIiByZWY9IlN1cHBsaWVyTGlzdFJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckRhdGFSZXNwb25zZSIgcmVmPSJTdXBwbGllckRhdGFSZXNwb25zZSIvPgotCQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEF0dHJpYnV0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hEYXRhRWxlbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoR3JvdXAiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoQXR0cmlidXRlIiByZWY9IlNlYXJjaEF0dHJpYnV0ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoR3JvdXBEYXRhIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaERhdGFFbGVtZW50IiByZWY9IlNlYXJjaERhdGFFbGVtZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTZWdtZW50Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNlbGVjdGVkSXRlbSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTZW5kZXIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ3JlZGVudGlhbCIgcmVmPSJDcmVkZW50aWFsIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVXNlckFnZW50IiByZWY9IlVzZXJBZ2VudCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2hhcmVkU2VjcmV0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIi8+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBZGRyZXNzIiByZWY9IkFkZHJlc3MiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1vbmV5IiByZWY9Ik1vbmV5Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InRyYWNraW5nRG9tYWluIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHJhY2tpbmdJZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InRyYWNraW5nIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2hvcnROYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdGFydFBhZ2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3RhdGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlN0YXR1cyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2RlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXh0IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzVXBkYXRlUmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFJlZmVyZW5jZSIgcmVmPSJEb2N1bWVudFJlZmVyZW5jZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN0YXR1cyIgcmVmPSJTdGF0dXMiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN0cmVldCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkludGVybmFsSUQiIHJlZj0iSW50ZXJuYWxJRCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNoYW5nZXRpbWUiIHJlZj0iQ2hhbmdldGltZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZvcm1hdCIgcmVmPSJGb3JtYXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25DaGFuZ2VNZXNzYWdlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbiIgcmVmPSJTdWJzY3JpcHRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5ldyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNJRkNvbnRlbnQiIHJlZj0iQ0lGQ29udGVudCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkluZGV4IiByZWY9IkluZGV4Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udHJhY3QiIHJlZj0iQ29udHJhY3QiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaWxlbmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkludGVybmFsSUQiIHJlZj0iSW50ZXJuYWxJRCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ29udGVudFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbiIgcmVmPSJTdWJzY3JpcHRpb24iLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50IiByZWY9IlN1YnNjcmlwdGlvbkNvbnRlbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkxpc3RSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uTGlzdFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbiIgcmVmPSJTdWJzY3JpcHRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIiByZWY9IkNvbW1lbnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyTG9jYXRpb24iIHJlZj0iU3VwcGxpZXJMb2NhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iY29ycG9yYXRlVVJMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic3RvcmVGcm9udFVSTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyQ2hhbmdlTWVzc2FnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllciIgcmVmPSJTdXBwbGllciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibmV3Ii8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGUiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJEYXRhUmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyRGF0YVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyIiByZWY9IlN1cHBsaWVyIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyTGlzdFJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGUvPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxpc3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllciIgcmVmPSJTdXBwbGllciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMb2NhdGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBZGRyZXNzIiByZWY9IkFkZHJlc3MiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlck1ldGhvZHMiIHJlZj0iT3JkZXJNZXRob2RzIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllclBhcnRBdXhpbGlhcnlJRCI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSIvPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllclBhcnRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJTZXR1cCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUYXgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiIHJlZj0iTW9uZXkiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgcmVmPSJEZXNjcmlwdGlvbiIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVGVsZXBob25lTnVtYmVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvdW50cnlDb2RlIiByZWY9IkNvdW50cnlDb2RlIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQXJlYU9yQ2l0eUNvZGUiIHJlZj0iQXJlYU9yQ2l0eUNvZGUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOdW1iZXIiIHJlZj0iTnVtYmVyIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXh0ZW5zaW9uIiByZWY9IkV4dGVuc2lvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRlcnJpdG9yeUF2YWlsYWJsZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVG8iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ3JlZGVudGlhbCIgcmVmPSJDcmVkZW50aWFsIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUb3RhbCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNhY3Rpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9wdGlvbiIgcmVmPSJPcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVlc3ROYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYS1kdHlwZSIgdHlwZT0ieHM6Tk1UT0tFTlMiIGZpeGVkPSJyZXF1ZXN0TmFtZSBOTVRPS0VOIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlVSTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVW5pdE9mTWVhc3VyZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1vbmV5IiByZWY9Ik1vbmV5Ii8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVc2VyQWdlbnQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9ImNYTUwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSGVhZGVyIiByZWY9IkhlYWRlciIvPgotCQkJCQk8eHM6Y2hvaWNlPgotCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWVzc2FnZSIgcmVmPSJNZXNzYWdlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0IiByZWY9IlJlcXVlc3QiLz4KLQkJCQkJPC94czpjaG9pY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZSIgcmVmPSJSZXNwb25zZSIvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iMS4xLjAwOSIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXlsb2FkSUQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0aW1lc3RhbXAiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19maWVsZHMueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL29hZ2lzX2ZpZWxkcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzUzMmEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL29hZ2lzX2ZpZWxkcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5NDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPCEtLUdlbmVyYXRlZCBieSBYTUwgQXV0aG9yaXR5LiBDb25mb3JtcyB0byB3M2MgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtLT4KLTx4czpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfZmllbGRzIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfZmllbGRzIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQk8eHM6YW5ub3RhdGlvbj4KLQkJPHhzOmRvY3VtZW50YXRpb24+Ci0KLQkJTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmaWxlIGlzIHByb3ZpZGVkIGluIExJQ0VOU0UuVFhULCBhcyBwdWJsaXNoZWQKLQkJb24gdGhlIE9wZW4gQXBwbGljYXRpb25zIEdyb3VwIHdlYiBzaXRlLiB3d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcKLQotCQlGb3Igc3VwcG9ydCwgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gcmVwb3J0IGltcGxlbWVudGF0aW9uIGJ1Z3MsCi0JCXBsZWFzZSBjb250YWN0IHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBhdCB4bWxAb3BlbmFwcGxpY2F0aW9ucy5vcmcKLQotCQkkUmV2aXNpb246IDEuMiAkCi0JCSREYXRlOiAyMDA0LzAyLzI2IDAwOjU5OjU2ICQKLQkJT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWE1MCi0JCUNvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotCQkkTmFtZTogICQKLQotCQlhancJNy4yCQkwOS8xNC8yMDAxCUZpZWxkcyB0byBzdXBwb3J0IEVDYXRhbG9nOiBDTEFTU0ZOSUQsQ0xBU1NGTixDTEFTU0xFVkVMLENMU1NTQ0hNUlYsRlRHUk9VUCwKLQkJCQkJCQkJCUZUVkFMSU5ELEZUVkFMUVVBTCwJUFJJQ0VDT0RFLAlQUklDRVRZUEUsU0VRTkNFTlVNLFVTQUdFUkVTVE4KLQkJYWp3CTcuMgkJMDkvMTQvMjAwMQlGaWVsZHMgdG8gc3VwcG9ydCBDb25zdW1wdG46IENPTlNMSU5FTlVNLFJPVVRFTEVWRUwxLVJPVVRFTEVWRUw5Ci0JCW1scgk3LjIgCQkwOS8xNC8yMDAxCUFkZGVkIGZpZWxkcyB0byBzdXBwb3J0IHVwZGF0ZWQgZGVsaXZlcnk6IEFDS01PREUsIERJU0NSUFRZUEUsIFJFQ0VJUFRZUEUuCi0JCWFqdwk3LjIuMQkxMC8zMS8yMDAxCVczQyBTY2hlbWEgUmVsZWFzZQotCi0KLQkJU3RydWN0dXJlIE92ZXJ2aWV3Ci0KLQkJCVRoaXMgc2NoZW1hIGRlZmluZXMgdGhlIE9BR0kgRmllbGQgZGF0YXR5cGVzIHVzZWQgdGhyb3VnaG91dCB0aGUgc3BlY2lmaWNhdGlvbi4KLQkJCUJlbG93IGlzIGFuIG91dGxpbmUgZGVwaWN0aW5nIHRoZWlyIHBsYWNlbWVudCBhbmQgdXNhZ2UuCi0KLQkJCUJPRCBOYW1lc3BhY2UgKCJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL25ubl92ZXJiX25vdW5fcmVsIikKLQkJCQl8Ci0JCQkJfC0tLSBTZWdtZW50cyBOYW1lc3BhY2UgLSBvYWdpc19zZWdtZW50cy54c2QgKG9zOiAiaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIpCi0JCQkJfAl8Ci0JCQkJfC0tLQl8LS0tIEZpZWxkcyBOYW1lc3BhY2UgLSBvYWdpc19maWVsZHMueHNkIChvZjoiaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiKQotCi0KLQotCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JPC94czphbm5vdGF0aW9uPgotCTx4czplbGVtZW50IG5hbWU9IlZFUkIiIHR5cGU9IlZFUkIiLz4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJWRVJCIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDS05PV0xFREdFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTE9DQVRFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFERCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5DRUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJUk0iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JFQVRFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkdFVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJHRVRMSVNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklTU1VFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxJU1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9BRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQT1NUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0NFU1MiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVDRUlWRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNQT05EIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNIT1ciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1lOQyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFOU0ZFUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVUERBVEUiLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iTk9VTiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RJVklUWSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCT00iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQk9EIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNBVEFMT0ciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09BIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTlNVTVBUTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT1VOVElORk8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JFRElUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNVU1RPTUVSIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFTElWRVJZIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRTUFRDSExJU1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRUNBVEFMT0ciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU5HQ0hHT1JEUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWENITkdSQVRFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOU1BFQ1RJT04iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WRU5DT1VOVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZFTlRPUlkiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WT0lDRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NVRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NVRUlORk8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVNQ0xBU1MiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTVNQRUNTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU1YUkVGIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkpPVVJOQUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTERHUkFDVFVBTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMREdSQlVER0VUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BSU5UT1JERVIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFUQ0hET0MiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFUQ0hGQUlMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENIT0siLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUZHVExDT0RFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1JU0NJVEVNIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWUFCTEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEVSU09OTkVMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUlNPTlRJTUUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUElDS0xJU1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExBTlNDSEQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExJTlZPSUNFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBPIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBSSUNFTElTVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9EQVZBSUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPRE9SREVSIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0RVQ1RSRVEiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPSkFDQ1RORyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9KSU5GTyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJRVU9URSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUNFSVZBQkxFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVJU0lUTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPVVJDRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRlEiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUk9VVElORyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTQUxFU09SREVSIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVNDSEQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUE1FTlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUFNDSEQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0lURUxFVkVMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNUQVRVUyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTVVBQTElFUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVT01HUk9VUCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBDT05GSVJNIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldJUE1FUkdFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldJUE1PVkUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQUkVDT1ZFUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBTUExJVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBTVEFUVVMiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV1JLU0NIRFVMRSIvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJSRVZJU0lPTiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iTE9HSUNBTElEIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJDT05GSVJNQVRJT04iPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJMCAtIE5vIENvbmZpcm0gQk9EIHJlcXVlc3RlZCwgMSAtIFNlbmQgQ29uZmlybSBCT0Qgb25seSBvbiBlcnJvciwgMiAtIFNlbmQgQ29uZmlybSBCT0QgYWx3YXlzCQkJCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIyIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PQ09ORklSTSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPTkVSUk9SIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IllFU0NPTkZJUk0iLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iTEFOR1VBR0UiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkNIQVJHRVRZUEUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRPQ1RZUEUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRPQ1VNRU5USUQiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRPQ1VNRU5UUlYiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IklURU0iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9Ik9SSUdSRUYiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlBBUlROUklEIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJQQVJUTlJUWVBFIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsVG8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBheUZyb20iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXRUbyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlciIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKViIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlBBWU1FVEhPRCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iUkVBU09OQ09ERSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iU0NITElORU5VTSI+Ci0JCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlNUQVRVU0xWTCI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+MDAgLSBTdWNjZXNzLCA5OSAtIEZhaWx1cmU8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIwMCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSI5OSIvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJTVUJMSU5FTlVNIj4KLQkJPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEFYQ09ERSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEFYSlJTRENUTiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEVSTUlEIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOT1VOIiB0eXBlPSJOT1VOIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVWSVNJT04iIHR5cGU9IlJFVklTSU9OIi8+Ci0JPCEtLSBBVzogc3VwcG9ydCBCU1IgVHlwZSAtIEVuZCAtLT4KLQk8IS0tIEFXOiBCZWxvdyBzdXBwb3J0IFNFTkRFUiBUeXBlIC0gU3RhcnQgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTE9HSUNBTElEIiB0eXBlPSJMT0dJQ0FMSUQiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT01QT05FTlQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRBU0siIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFRkVSRU5DRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT05GSVJNQVRJT04iIHR5cGU9IkNPTkZJUk1BVElPTiIvPgotCTx4czplbGVtZW50IG5hbWU9IkxBTkdVQUdFIiB0eXBlPSJMQU5HVUFHRSIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPREVQQUdFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBVVRISUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gRW5kIC0gU3VwcG9ydCBTRU5ERVIgVHlwZSAtLT4KLQk8IS0tIFN0YXJ0IC0gU3VwcG9ydCBEQVRFVElNRSBUeXBlIC0tPgotCTx4czplbGVtZW50IG5hbWU9IllFQVIiIHR5cGU9InhzOmdZZWFyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTU9OVEgiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEQVkiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJIT1VSIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUlOVVRFIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0VDT05EIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1VCU0VDT05EIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVElNRVpPTkUiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gRW5kIC0gU3VwcG9ydCBEQVRFVElNRSBUeXBlIC0tPgotCTwhLS0gU3RhcnQgLSBBbHBoYWJldGljYWwgZnJvbSBoZXJlIG9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9IkFCU0VOQ0VUWVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFDQ1RQRVJJT0QiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFDQ1RUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0NUWUVBUiIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkFDS0NPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFDS01PREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFDS1JFUVVFU1QiPgotCQk8eHM6c2ltcGxlVHlwZT4KLQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMiIvPgotCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9BQ0siLz4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9OQ0hBTkdFIi8+Ci0JCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJZRVNBQ0siLz4KLQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCTwveHM6c2ltcGxlVHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNUSU9OQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ1RUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBRERSTElORSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFERFJUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBTExPV1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkFMIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQVBQUk9WRSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkVEIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQVBQUk9WRVJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQVVUSENPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJBQ0tPUkRJTkQiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCSUxMT0xBRE5HIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCS1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJPTUFMVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCT01JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCT01UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCT01VU0FHRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQlVER1NUQVQiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCVURHVFhOIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQlVER1ZFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQlVTTkFSRUEiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJVWUVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNBUlJJRVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNBUlJTUlZMVkwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNBVEFMR05BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNBVEFMT0dSViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0hBUkdFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNIQVJHRVRZUEUiIHR5cGU9IkNIQVJHRVRZUEUiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDSEdMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDSVRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTEFTU0ZOIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xBU1NGTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTEFTU0xFVkVMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTFNTU0NITVJWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTFNFTE1MVkwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNMU1NFTE1UIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xTU0xNTlRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xTU1NDSE1JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ01QUlNOSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNNUFJTTlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNOVENUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09NTUVOVFMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTU1PRElUWSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNPTVBMRVZFTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09NUFJFRkRFUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09ORFNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlNVTVBUTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVEFJTlJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVENUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVE5SU0VBTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVE5SVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVFJBQ1RCIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT05UUkFDVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT05UUkFDVFMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPU1RDRU5URVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPU1RUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFJZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFJZRFNUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFJZT1JHIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNSQUZUSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNUQ0hXQ09OViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ1RDSFdGTEFHIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ1VSUkVOQ1kiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNVUlJGUk9NIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDVVJSVE8iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRBVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEQVlPRk1PTlRIIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFZU05VTSIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRFRkFVTFQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRFRkxUVkFMVUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRFTElWRVJUTyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREVOU0lUWUZBQyIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRFUEFSVE1FTlQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRFU0NSSVBUTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElTQ1JQVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElTUE9TSVROIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJESVNQT1NJVE9OIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJESVNUQ0VOVEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJESVZJU0lPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRE9DS0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJET0NUWVBFIiB0eXBlPSJET0NUWVBFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRE9DVU1FTlRJRCIgdHlwZT0iRE9DVU1FTlRJRCIvPgotCTx4czplbGVtZW50IG5hbWU9IkRPQ1VNRU5UUlYiIHR5cGU9IkRPQ1VNRU5UUlYiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEUkFXSU5HIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEUkNSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEUk9QU0hJUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFNQU1ROSU5WIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEVU5TTlVNQkVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFQ09BUFBTVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFQ09OQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFQ09QUklPUklUWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUxFTUVOVCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkVNQUlMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTVBDQVRFR1JZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTVBERVBUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTVBMT1lFRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTVBOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTVBRVUFMSUYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVNUFNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU5ESVRFTUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFWENMVVNJVkUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFWENQTElOTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFWENQVE5DT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFWFBJUkVGTEFHIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFWFBPUlRMSUMiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGQUNUT1IiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGQUlMQ0xBU1MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZBSUxDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGQUlMVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFJTFVSRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGQVgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGRUFUVVJFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZFQVRWQUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZJRUxESUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZJRUxEVkFMVUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZJTEVOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSUxFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRklYRFFUWUlORCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkZJWEVEQVNTRVQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZMRVhCS1RJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlJFSUdIVENMUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlJHSFRDTFMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSR0hUSVRFTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlJHSFRURVJNUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlJNSVRNQ0xTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlJNSVRNTk0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSTUlUTU5NUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSTVNJVEVMVkwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGUk9NUEFSVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZUREFUQVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZUR1JPVVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZUVkFMSU5EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVFZBTFFVQUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZVTkQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkdFT0dSQVBIWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iR0xFTlRJVFlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJHTEVOVElUWVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkdMTk9NQUNDVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSEFaUkRNQVRMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJIRFJTVEFUVVMiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8IS0tCTx4czplbGVtZW50IG5hbWU9IkhPVVIiIHR5cGU9InhzOmludGVnZXIiLz4gIGRlZidkIGFib3ZlIC0tPgotCTx4czplbGVtZW50IG5hbWU9IkhST1JHIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU1QT1JUTElDIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5DUExBTkZMRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IklORExJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IklOTVJQUExBTiIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IklOUVVFVUVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5TTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5TUERPQ1JFViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5TUEVDVERPQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5TUEVDVFJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5WRU5ESVNQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJTlZMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNIiB0eXBlPSJJVEVNIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTVgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1DQVRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTUNMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNQ0xBU1NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTURFRk4iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1ERVNDIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1SVlgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1TVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNVkFSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVE1GVFZBTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRNSURGTEciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJKRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJKT0JDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJKUElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJLQU5CQU4iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxBQk9SSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxFREdFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTElORSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTElORUZFRUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IkxJTkVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMT0FEUE9JTlQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxPQ0siIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMT1RMRVZFTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkxPVFNORkxBRyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFDSENMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNQUNISUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hJTkVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFDSFNUQVRFIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFDSFNVREVQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNQUNIVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFJTlRDQUxJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFJTlRMT0NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFJTlRPUkRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFOREFUT1JZIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFUQ0hUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNQ0hET0NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUNIRE9DVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUNITElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTU9QQVJFTlRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTU9QUklPUklUWSIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1PU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNT1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1TRFNJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTVNHSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1TR1RFWFQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1TR1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik5BTUUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJORVdJVE1SRVYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik5FV1JFVkZMQUciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik5PVEVTIiB0eXBlPSJOT1RFUyIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJOT1RFUyI+Ci0JCTx4czpzaW1wbGVDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6c2ltcGxlQ29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9Ik5VTU9GREVDIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT0lMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPTERJVE1SRVYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9ORVRJTUUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUEVOSVRFTSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVE5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVE5JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BFUkFUTlNFUSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BFUkFUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BSQU1UQVVUSCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BSR1JQTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BSR1JQVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QVENMU05BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QVENMU1NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BUSU9OSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QVElPTk5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9SSUdSRUYiIHR5cGU9Ik9SSUdSRUYiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPVEVMSUdJQkxFIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1VUUVVFVUVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1ZFUklEUFJJQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1ZFUlRJTUUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPV05SU0hQQ0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQUNLSU5HIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQUNLTkdERVNDIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJDTlROUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJFTlRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSRU5UTE9UIiB0eXBlPSJQQVJFTlRMT1QiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iUEFSRU5UTE9UIj4KLQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpzaW1wbGVDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSRU5UU05VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSVElBTFNIUCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlROUklEIiB0eXBlPSJQQVJUTlJJRCIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlROUklEWCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSVE5SUkFURyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSVE5SUk9MRSIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlROUlRZUEUiIHR5cGU9IlBBUlROUlRZUEUiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVlNRVRIT0QiIHR5cGU9IlBBWU1FVEhPRCIvPgotCTx4czplbGVtZW50IG5hbWU9IlBFUlNPTkNPREUiIHR5cGU9IlJFQVNPTkNPREUiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQSUNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQTEFOTkVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBNSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBPRU5USVRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlBPTE5TVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBPUkVMRUFTRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9TSVRJT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBPU1RBTENPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBPU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSQ0VTU0NPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSRExJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlBSRUZFUkVOQ0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSUNFQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJJQ0VMU1RJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJJQ0VMU1RSViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJJQ0VUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUklOVCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSU5UQ05UTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJJT1JJVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSTlRDTFNFTE0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0RDVExJTkUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0RPUkRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPRE9SRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9ET1NUQVRTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9ET1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0RTRVFCRUciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0RTRVFFTkQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0RTRVFOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0ZJVENUUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPSkFDVFNUUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPSkFDVFZUWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPSkVDVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPSlJFU0VMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPSlNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPSlRYVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPUEVSVFkiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9YTU9OVEgiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQU0JMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQU0NMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQU0RMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQU1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFVCTElTSEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlFTTElORVNUQVQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFTTElORVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFURUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVJRFgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFURUxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlFURUxOU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVRFUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVRFU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVUFMRk5JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTEZOVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTEZOVkFMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVUFMSUYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJBVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUFTT05DT0RFIiB0eXBlPSJSRUFTT05DT0RFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVDRUlQVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUNFSVBUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUNFUFRESVNQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUYiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUdJT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFTElURU1JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVMTE9DSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFTE1BQ0hJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVNSVRUQU5DRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVQUlRHRkxBRyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVRTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVRTE5TVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVFVRVNURVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFUVVJU1ROSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ0VVU0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gRGVwcmVjYXRlZCAtLT4KLQkJPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDS0lOIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDVVNFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIERlcHJlY2F0ZWQJLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDR1JQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVNPUkNMVkwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ1RZUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1VSQ0VJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVTVFJJQ1ROIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tCTx4czplbGVtZW50IG5hbWU9IlJFVklTSU9OIj4gICBBbHJlYWR5IGRlZmluZWQgYWJvdmUgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVWSVRNU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJGUUlEWCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRTE5TVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRlFOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRlFSRVZJU09OIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRlFTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJGUVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJPVVRFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJPVVRFTEVWRUwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VURVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJPVVRFVkFSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VUSU5HSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJPVVRJTkdSRVYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJPVVRJTkdWQVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJRU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJTQkxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJTTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUlNMSU5FVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUlNQTElOTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU1BSRVZOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJTUFNDSEVESUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJTUFNETE5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0FGRVRZSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBRkVUWVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBRlRZQ0xBU1MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBTEVTT1JESUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBTEVTT1JHIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0FMRVNQRVJTTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0FWRVNFVFVQIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0NIRFVMRVRZUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0NIRURVTEVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0NITElORU5VTSIgdHlwZT0iU0NITElORU5VTSIvPgotCTx4czplbGVtZW50IG5hbWU9IlNDUkFQIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0VSSUFMTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTRVFOQ0VOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNISUZUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElQTUFUTElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElQTk9URVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNISVBQRVJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFBFUk5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFBPSU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElQUFJJT1IiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElQU1JWTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSFBNVExERVNDIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSFBVTklUU0VRIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSFBVTklUU1RTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSFBVTklUVE9UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSUdOIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSVRFTEVWRUwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTT0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlNPTE5TVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNPU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlNPU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTUEVDSUFMSE5EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTUExJVEFCTEUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVEFHRVBPSU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVEFURVBST1ZOIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVEFUVVNMVkwiIHR5cGU9IlNUQVRVU0xWTCIvPgotCTx4czplbGVtZW50IG5hbWU9IlNURVBJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RFUE5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RFUFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNVQkxJTkVOVU0iIHR5cGU9IlNVQkxJTkVOVU0iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVUJTRkxBRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlNVRkZJWCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1VQRVJWSVNPUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1lOQ0lORCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBTZWUgYWJvdmUKLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVNLIiB0eXBlPSJUQVNLIi8+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEFTSyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+IC0tPgotCTx4czplbGVtZW50IG5hbWU9IlRBWENPREUiIHR5cGU9IlRBWENPREUiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVhFWEVNUFQiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVhJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEFYSlJTRENUTiIgdHlwZT0iVEFYSlJTRENUTiIvPgotCTx4czplbGVtZW50IG5hbWU9IlRBWExJTkUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVhXSEVYTVBUIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEVMRVBIT05FIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEVSTUZMQUciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJURVJNSUQiIHR5cGU9IlRFUk1JRCIvPgotCTx4czplbGVtZW50IG5hbWU9IlRJVExFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT0lUTUNMU1MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRPSVRNTk0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRPSVRNTk1SViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVE9PTENMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT09MSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRPUEFSVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRPU0lURUxWTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRSQUNLRkxHIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVFJBQ0tJTkdJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVFJBS05HRkxBRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlRSQU5TTUVUSEQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRSQU5TVEVSTVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRSTlNGUlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRYQU5BTFlTSVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVOSVQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVOSVRUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVT00iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVPTUdST1VQSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVPTU5VTURFQyIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlVPTVZBTFVFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUEMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVQQ1BLR0lORCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVBDU0NDMTQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVQRFRXSVBGRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlVSSSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLXhzOnVyaVJlZmVyZW5jZSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVTQUdFUkVTVE4iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVTRVJBUkVBIiB0eXBlPSJVU0VSQVJFQSIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJVU0VSQVJFQSIgbWl4ZWQ9InRydWUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVNFUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVU0VVUElURU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVTVVBJTlZGRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlZBTFVFIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVkFMVUVDTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVk9VQ0hFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV0FHRUdST1VQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJXQUdFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV0FSRUhPVVNFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJXQVJSQU5UWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV09SS0NFTlRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV09SS09SREVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJXUktTQ0hESUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlhSRUZUWVBFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gRW5kIC0gU3VwcG9ydGluZyBGaWVsZHMgJiBUeXBlcyAtLT4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL29hZ2lzX3NlZ21lbnRzLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19zZWdtZW50cy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmI0ZTAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL29hZ2lzX3NlZ21lbnRzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfc2VnbWVudHMiIHhtbG5zOm9mPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfZmllbGRzIiBzY2hlbWFMb2NhdGlvbj0ib2FnaXNfZmllbGRzLnhzZCIvPgotCTx4czphbm5vdGF0aW9uPgotCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQotCQlMaWNlbnNlIGluZm9ybWF0aW9uIGZvciB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgaW4gTElDRU5TRS5UWFQsIGFzIHB1Ymxpc2hlZAotCQlvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCi0JCUZvciBzdXBwb3J0LCBtb3JlIGluZm9ybWF0aW9uLCBvciB0byByZXBvcnQgaW1wbGVtZW50YXRpb24gYnVncywKLQkJcGxlYXNlIGNvbnRhY3QgdGhlIE9wZW4gQXBwbGljYXRpb25zIEdyb3VwIGF0IHhtbEBvcGVuYXBwbGljYXRpb25zLm9yZwotCi0JCSRSZXZpc2lvbjogMS4yICQKLQkJJERhdGU6IDIwMDQvMDIvMjYgMDA6NTk6NTYgJAotCQlPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBYTUwKLQkJQ29weXJpZ2h0IDE5OTgtMjAwMSwgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi0JCSROYW1lOiAgJAotCi0JCWFqdwk3LjIuMQkxMC8zMS8yMDAxCVczQyBTY2hlbWEgUmVsZWFzZQotCi0KLQkJU3RydWN0dXJlIE92ZXJ2aWV3Ci0KLQkJCVRoaXMgc2NoZW1hIGRlZmluZXMgdGhlIE9BR0kgU2VnbWVudCBkYXRhdHlwZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBzcGVjaWZpY2F0aW9uLgotCQkJQmVsb3cgaXMgYW4gb3V0bGluZSBkZXBpY3RpbmcgdGhlaXIgcGxhY2VtZW50IGFuZCB1c2FnZS4KLQotCQkJQk9EIE5hbWVzcGFjZSAoImh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvbm5uX3ZlcmJfbm91bl9yZWwiKQotCQkJCXwKLQkJCQl8LS0tIFNlZ21lbnRzIE5hbWVzcGFjZSAtIG9hZ2lzX3NlZ21lbnRzLnhzZCAob3M6ICJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIikKLQkJCQl8CXwKLQkJCQl8LS0tCXwtLS0gRmllbGRzIE5hbWVzcGFjZSAtIG9hZ2lzX2ZpZWxkcy54c2QgKG9mOiJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIpCi0KLQotCi0JCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzOmFubm90YXRpb24+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ05UUk9MQVJFQSIgdHlwZT0iQ05UUk9MQVJFQSIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJDTlRST0xBUkVBIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJCU1IiLz4KLQkJCTx4czplbGVtZW50IHJlZj0iU0VOREVSIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkRBVEVUSU1FQU5ZIi8+Ci0JCQk8IS0tIEVpdGhlciBEQVRFVElNRSBvciBEQVRFVElNRUlTTyAtLT4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkJTUiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlZFUkIiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVU4iLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlJFVklTSU9OIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTRU5ERVIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpMT0dJQ0FMSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTVBPTkVOVCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFTSyIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UkVGRVJFTkNFSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTkZJUk1BVElPTiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TEFOR1VBR0UiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPREVQQUdFIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBVVRISUQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRBVEVUSU1FQU5ZIiBhYnN0cmFjdD0idHJ1ZSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRBVEVUSU1FSVNPIiB0eXBlPSJEQVRFVElNRUlTTyIgc3Vic3RpdHV0aW9uR3JvdXA9IkRBVEVUSU1FQU5ZIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRBVEVUSU1FSVNPIj4KLQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRhdGVUaW1lIj4KLQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdHlwZT0iREFURVRJTUVxdWFsIi8+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpzaW1wbGVDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPCEtLSBEQVRFVElNRUlTTyAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEQVRFVElNRSIgdHlwZT0iREFURVRJTUUiIHN1YnN0aXR1dGlvbkdyb3VwPSJEQVRFVElNRUFOWSIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJEQVRFVElNRSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6WUVBUiIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpNT05USCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEQVkiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SE9VUiIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpNSU5VVEUiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0VDT05EIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNVQlNFQ09ORCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUSU1FWk9ORSIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdHlwZT0iREFURVRJTUVxdWFsIiB1c2U9InJlcXVpcmVkIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkJPHhzOnNpbXBsZVR5cGUgbmFtZT0iREFURVRJTUV0eXBlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDQ09VTlRJTkciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNURU5EIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVFNUQVJUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFQUFJFUSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBUFBST1ZBTCIvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJEQVRFVElNRXF1YWwiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNDT1VOVElORyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUkVRIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFQUFJPVkFMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFWQUlMQUJMRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCS1RFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQktUU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOQ0VMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRURBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09NUERBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09OU1VNRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDUkVBVElPTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDVU1VTEFUSVZFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFTElWQUNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFTElWU0NIRUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRElTQ05UIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRPQ1VNRU5UIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRVRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFQVJMU1RFRkYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRUFSTFNUU0hJUCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFRkZFQ1RJVkUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU5HQ0hHIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVYRUNGSU5JU0giLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhFQ1NUQVJUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVYUElSQVRJT04iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRkFJTERBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SRUNBU1RGIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZPUkVDQVNUUyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGUk9NIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkdFTkVSQVRJT04iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSk9CRFVFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklNUEwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WT0lDRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMQUJPUkZJTlNIIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxBQk9SU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTEFTVFVTRUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9BRElORyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQVRDSElORyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNU01FTlREQVRFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5FRURERUxWIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9QRklOSVNIIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9QU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEFZRU5EIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBMQU5FTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExBTlNUQVJUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBPIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST01ERUxWIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST01TSElQIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBZTVRURVJNIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFQ0VJVkVEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUE9SVERBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVQT1JUTkdGTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVBPUlROR1NUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVJUkVEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFU09SQ0RXTkYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1JDRFdOUyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSU1BEREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSU1BET0NHRU4iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIRU5EIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNDSFNUQVJUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNFVFVQRklOU0giLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0VUVVBTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSElQIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBTQ0hFRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTVEFUVVNEQVRFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRFQVJET1dORiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJURUFSRE9XTlMiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVE8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPCEtLSBEQVRFVElNRSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBRERSRVNTIiB0eXBlPSJBRERSRVNTIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFERFJFU1MiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFERFJMSU5FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFERFJUWVBFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q0lUWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPVU5UUlkiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT1VOVFkiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpGQVgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9TVEFMQ09ERSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlJFR0lPTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNUQVRFUFJPVk4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVhKUlNEQ1ROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEVMRVBIT05FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVSTCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlRBQ1QiIHR5cGU9IkNPTlRBQ1QiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ09OVEFDVCI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TkFNRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05UQ1RUWVBFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RU1BSUwiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpGQVgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TkFNRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURUxFUEhPTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQU1PVU5UIiB0eXBlPSJBTU9VTlQiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQU1PVU5UIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpWQUxVRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOVU1PRkRFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTSUdOIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNVUlJFTkNZIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRSQ1IiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHVzZT0icmVxdWlyZWQiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVFVBTCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFQUFJWT1JEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVZBSUxBQkxFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQlVER0VUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09NTUlTU0lPTiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFQ0xBUkVWQUwiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEU0NQUkNOVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRTQ1ZBTFVFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRElTQ05UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRE9DVU1FTlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RFTkdJTVAiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RGUkVJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUSFJTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUSU1BVEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RNQU5JTVAiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RVQ09TVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVYVEVOREVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRlJFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU0iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUEVOSVRFTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9SREVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1JETElNSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQQVlSQVRFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkFURSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBSQ0JSSyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRBWCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRBWEJBU0UiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUT1RBTCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRPVExJTUlUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJPC94czpzaW1wbGVUeXBlPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4KLQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRBWCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+Ci0JCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPCEtLSBBTU9VTlQgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQVRUQ0hSRUYiIHR5cGU9IkFUVENIUkVGIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFUVENIUkVGIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJEQVRFVElNRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IlFVQU5USVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q01QUlNOVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNNUFJTTklEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RklMRVRZUEUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUSVRMRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8IS0tIDx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPiAtLT4KLQkJCTx4czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpGSUxFTkFNRSIvPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUkkiLz4KLQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpGSUxFTkFNRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDSEFSR0UiIHR5cGU9IkNIQVJHRSIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJDSEFSR0UiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Ik9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDSEFSR0VJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNIQVJHRVRZUEUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDSEdMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJESVNUUklCVVROIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJESVNUUklCVVROIiB0eXBlPSJESVNUUklCVVROIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRJU1RSSUJVVE4iPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Ik9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpCVVNOQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPU1RDRU5URVIiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVBBUlRNRU5UIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RElWSVNJT04iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpFTEVNRU5UIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZVTkQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpHRU9HUkFQSFkiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpHTEVOVElUWVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpHTE5PTUFDQ1QiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQUk9GSVRDVFIiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQUk9KRUNUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VU5JVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOldBUkVIT1VTRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBTVQiIHR5cGU9Ik9QRVJBTVQiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iT1BFUkFNVCI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VkFMVUUiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TlVNT0ZERUMiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0lHTiIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDVVJSRU5DWSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVT01WQUxVRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVT01OVU1ERUMiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VU9NIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB1c2U9InJlcXVpcmVkIj4KLQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT1NUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhURU5ERUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGUkVJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+Ci0JCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0JCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkYiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSVE5FUiIgdHlwZT0iUEFSVE5FUiIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJQQVJUTkVSIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOQU1FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk9ORVRJTUUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUlRZUEUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTWU5DSU5EIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUNUSVZFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q1VSUkVOQ1kiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEVU5TTlVNQkVSIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6R0xFTlRJVFlTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSRU5USUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJJRFgiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJSQVRHIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SUk9MRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBWU1FVEhPRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWEVYRU1QVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWElEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEVSTUlEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJBRERSRVNTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkNPTlRBQ1QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IlRFTVBSQVRVUkUiIHR5cGU9IlRFTVBFUkFUVVJFIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlRFTVBFUkFUVVJFIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpWQUxVRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOVU1PRkRFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTSUdOIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB1c2U9InJlcXVpcmVkIj4KLQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RVQUwiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxJVkVSWSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPQURJTkciLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNFTFNJVVMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGQUhSRU5IRUlUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iS0VMVklOIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJPC94czpzaW1wbGVUeXBlPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IlFVQU5USVRZIiB0eXBlPSJRVUFOVElUWSIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJRVUFOVElUWSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VkFMVUUiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TlVNT0ZERUMiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0lHTiIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVT00iLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHVzZT0icmVxdWlyZWQiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDQ0VQVEVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNURFVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUSFJTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMT0NBVEVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMT1dFRFdUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVZBSUxBQkxFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVZHUlVOU0laRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJBQ0tPUkRFUkQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCQVRDSFNJWkUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCQVRDSFRJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCTE9DS0VEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQlJFQUtUSU1FIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FQUEVSQ0VOVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNBVENIV0VHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT01NSVNTSU9OIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09NUExFVEVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VNVUxBVElWRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFTElWRVJFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRVUkFUSU9OIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFVST1ZFUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRVUlVOREVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QTE9ZRUVTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QUkVRRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVERVUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVEhSUyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVFdFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJTEVOQU1FIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklMRVNJWkUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSVhFRFRJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJIRUlHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlNQRUNURUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlNQRUNUSU9OIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxEVE1PRkZTRVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMRU5HVEgiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMQUJPUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPQURJTkdXVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPVFNJWkVNQVgiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT1RTSVpFTUlOIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9UU0laRU1MVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPV0VSTElNSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQUNISU5FSFJTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFYSU1VTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BWFBBUkxUTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTklNVU0iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNT1ZFVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1TTUVOVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1VTFRJUExJRVIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJORVRXRUlHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUEVOIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1JERVJFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSUkVKIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1ZFUlNISVAiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQQUNLSU5HIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEVSQ0VOVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUkNFTlRSRVEiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJTSEJOT1BSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEVSU0hXSU9QUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBMTkRQUkNUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJDQlJLIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJJT1IiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJRVUVVRVRJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSQVRFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVDRUlWRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUpFQ1RFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFSkZJWEVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVKUEVSQ0VOVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFTURVUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFTUhSUyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVJUkVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVUVVJORUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVdPUksiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSVU5USU1FIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0NSQVAiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVRVUFRJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSEVMRkxJRkUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSElQUEVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUFVOSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTVEFSVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRFQVJET1dOIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVE9PTFJFUUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUT1RXRUlHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFOU0ZSTE9UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERVJTSElQIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVQUEVSTElNSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWT0xVTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXQUlUVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldJRFRIIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJPC94czpzaW1wbGVUeXBlPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTwhLS0gUVVBTlRJVFkgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRE9DVU1OVFJFRiIgdHlwZT0iRE9DVU1OVFJFRiIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJET0NVTU5UUkVGIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpET0NUWVBFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1VNRU5USUQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SSUQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SVFlQRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpET0NVTUVOVFJWIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0NITElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNVQkxJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJET0NVTUVOVCIgdHlwZT0iRE9DVU1FTlQiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iRE9DVU1FTlQiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1VNRU5USUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpET0NVTUVOVFJWIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkxPVFNFUklBTCIgdHlwZT0iTE9UU0VSSUFMIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkxPVFNFUklBTCI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0iUVVBTlRJVFkiIG1pbk9jY3Vycz0iMCIvPgotCQkJPCEtLSglUVVBTlRJVFkuSVRFTTspPyAtLT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TE9UTEVWRUwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSRU5UTE9UIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUkVOVFNOVU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTRVJJQUxOVU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvQ29uc29saWRhdGVUZXN0LnhtbCBiL3YxL3Rlc3QvY2FzZXMvc3RvcmUvQ29uc29saWRhdGVUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjOWVlYS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3N0b3JlL0NvbnNvbGlkYXRlVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxlbXBsb3llZXM+Ci0gIDxlbXBsb3llZT4KLSAgICA8bmFtZT5GcmVkIEpvbmVzPC9uYW1lPgotICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJob21lIj4KLSAgICAgIDxzdHJlZXQ+OTAwIEF1cm9yYSBBdmUuPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5TZWF0dGxlPC9jaXR5PgotICAgICAgPHN0YXRlPldBPC9zdGF0ZT4KLSAgICAgIDx6aXA+OTgxMDk8L3ppcD4KLSAgICA8L2FkZHJlc3M+Ci0gICAgPGFkZHJlc3MgbG9jYXRpb249IndvcmsiPgotICAgICAgPHN0cmVldD4yMDExIDE1Mm5kIEF2ZW51ZSBORTwvc3RyZWV0PgotICAgICAgPGNpdHk+UmVkbW9uZDwvY2l0eT4KLSAgICAgIDxzdGF0ZT5XQTwvc3RhdGU+Ci0gICAgICA8emlwPjk4MDUyPC96aXA+Ci0gICAgPC9hZGRyZXNzPgotICAgIDxwaG9uZSBsb2NhdGlvbj0id29yayI+KDQyNSk2NDEtOTM4NTwvcGhvbmU+Ci0gICAgPHBob25lIGxvY2F0aW9uPSJob21lIj4oMjA2KTQ0MS0xNjk1PC9waG9uZT4KLSAgICA8cGhvbmUgbG9jYXRpb249Im1vYmlsZSI+KDIwNik3MTQtMjUxNTwvcGhvbmU+Ci0gIDwvZW1wbG95ZWU+Ci0gIDxlbXBsb3llZT4KLSAgICA8bmFtZT5TYWxseSBTbWl0aDwvbmFtZT4KLSAgICA8YWRkcmVzcyBsb2NhdGlvbj0iaG9tZSI+Ci0gICAgICA8c3RyZWV0PjE0MzAgT2FrIFBsYWNlPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5TYWxlbTwvY2l0eT4KLSAgICAgIDxzdGF0ZT5PUjwvc3RhdGU+Ci0gICAgICA8emlwPjk3MTI1PC96aXA+Ci0gICAgPC9hZGRyZXNzPgotICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJ3b3JrIj4KLSAgICAgIDxzdHJlZXQ+NzY1IE1haW4gU3QuPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5LYWlzZXI8L2NpdHk+Ci0gICAgICA8c3RhdGU+T1I8L3N0YXRlPgotICAgICAgPHppcD45NzEwMzwvemlwPgotICAgIDwvYWRkcmVzcz4KLSAgICA8cGhvbmUgbG9jYXRpb249IndvcmsiPig1MDMpMjY0LTM4NTY8L3Bob25lPgotICAgIDxwaG9uZSBsb2NhdGlvbj0iaG9tZSI+KDUwMyk0MTYtNjk1MTwvcGhvbmU+Ci0gICAgPHBob25lIGxvY2F0aW9uPSJtb2JpbGUiPig1MDMpMjE0LTUxNTI8L3Bob25lPgotICA8L2VtcGxveWVlPgotPC9lbXBsb3llZXM+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2Vhc3lwbzEueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9lYXN5cG8xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkYWYyMy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2Vhc3lwbzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08cG86cHVyY2hhc2Utb3JkZXIgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iPgotICA8cG86Y3VzdG9tZXI+Ci0gICAgPHBvOm5hbWU+RGF2aWQgQmF1PC9wbzpuYW1lPgotICAgIDxwbzphZGRyZXNzPkdsYWR3eW5lLCBQQTwvcG86YWRkcmVzcz4KLSAgPC9wbzpjdXN0b21lcj4KLSAgPHBvOmRhdGU+MjAwMi0wOS0zMFQxNDoxNjowMC0wNTowMDwvcG86ZGF0ZT4KLSAgPHBvOmxpbmUtaXRlbT4KLSAgICA8cG86ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDE8L3BvOmRlc2NyaXB0aW9uPgotICAgIDxwbzpwZXItdW5pdC1vdW5jZXM+NTwvcG86cGVyLXVuaXQtb3VuY2VzPgotICAgIDxwbzpwcmljZT4yMS43OTwvcG86cHJpY2U+Ci0gICAgPHBvOnF1YW50aXR5PjI8L3BvOnF1YW50aXR5PgotICA8L3BvOmxpbmUtaXRlbT4KLSAgPHBvOmxpbmUtaXRlbT4KLSAgICA8cG86ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDI8L3BvOmRlc2NyaXB0aW9uPgotICAgIDxwbzpwZXItdW5pdC1vdW5jZXM+NTwvcG86cGVyLXVuaXQtb3VuY2VzPgotICAgIDxwbzpwcmljZT4xOS44OTwvcG86cHJpY2U+Ci0gICAgPHBvOnF1YW50aXR5PjI8L3BvOnF1YW50aXR5PgotICA8L3BvOmxpbmUtaXRlbT4KLSAgPHBvOmxpbmUtaXRlbT4KLSAgICA8cG86ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDM8L3BvOmRlc2NyaXB0aW9uPgotICAgIDxwbzpwZXItdW5pdC1vdW5jZXM+NTwvcG86cGVyLXVuaXQtb3VuY2VzPgotICAgIDxwbzpwcmljZT4xOS44OTwvcG86cHJpY2U+Ci0gICAgPHBvOnF1YW50aXR5PjE8L3BvOnF1YW50aXR5PgotICA8L3BvOmxpbmUtaXRlbT4KLSAgPHBvOnNoaXBwZXI+Ci0gICAgPHBvOm5hbWU+VVBTPC9wbzpuYW1lPgotICAgIDxwbzpwZXItb3VuY2UtcmF0ZT4wLjc0PC9wbzpwZXItb3VuY2UtcmF0ZT4KLSAgPC9wbzpzaGlwcGVyPgotPC9wbzpwdXJjaGFzZS1vcmRlcj4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvZXJpY3Rlc3QueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9lcmljdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Y2ZmMzAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zdG9yZS9lcmljdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxiYXI+PGZvbz4xPC9mb28+PGZvbz4yPC9mb28+PC9iYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zdG9yZS9zbWFsbC54bWwgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL3NtYWxsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmNGI3OC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3NtYWxsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sCi0KLSAgIHZlcnNpb24KLT0KLQotCi0iCi0iCi1zdGFuZGFsb25lPSd5ZXMnICAgPz4KLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGFhYWEgYT0iYV92YWx1ZSIgYjphID0gJ2JfdmFsdWUnICB4bWxuczpiPSJiX25zIj4KLSAgPD9waQl0YWIgIHRlc3h0IHJ0Pz4KLTwvYWFhYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvdGVzdC54bWwgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ5MjhhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08Zm9vIHg9InkiPmFiPC9mb28+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8wXzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8wXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNkZjlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMF8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTx4bWwtZnJhZ21lbnQgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOWZjNDkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgotICA8YSB0ZXN0PSJ0ZXN0Ii8+Ci0gIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KLSAgICA8YS8+Ci0gIDwvYj4KLTwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEwXzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM4ZGQxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEwXzIueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMzVlMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEwXzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMy54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEwXzMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2FiYzFhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzExXzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMV8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxYjU1My4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzExXzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudCB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEyXzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMl8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlODc5Ny4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEyXzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudD48IS0tIC0tPjwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTNfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEzXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM4ZGQxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTNfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEzXzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xM18xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhYmMxYS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEzXzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPGEgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTRfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkY2RmOWYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTx4bWwtZnJhZ21lbnQgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8xLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTRfMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTE5NjMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTx4bWwtZnJhZ21lbnQgYXR0cjE9ImExIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE0XzIueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMDQ5MS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE0XzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudCBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTVfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE1XzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmYzQ5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTVfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEgdGVzdD0idGVzdCIvPgotICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+Ci0gICAgPGEvPgotICA8L2I+Ci08L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE1XzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNV8xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMzVlMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE1XzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTVfMi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE1XzIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2FiYzFhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTVfMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE2XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNl8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMzVlMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE2XzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmE4OTA5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQ+Ci0gIDwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM4ZGQxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzIueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF8yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhODkwOS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eG1sLWZyYWdtZW50PgotICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzMueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF8zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMzVlMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmY3OGQxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQ+Ci08L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzUueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF81LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhNmE5YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eG1sLWZyYWdtZW50IHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+Ci0gICAgPC94bWwtZnJhZ21lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF82LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWJjMWEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF82LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNy54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM1NDVkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4gCi0gIDwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfOC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg0ZjA1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfOC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE5XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOV8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjZGY5Zi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE5XzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudCB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDhmZjcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+Ci0gIDxhIHRlc3Q9InRlc3QiLz4KLSAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgotICAgIDxhLz4KLSAgPC9iPgotPC9kb2M+Ci08IS0tIC0tPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmYzQ5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgotICA8YSB0ZXN0PSJ0ZXN0Ii8+Ci0gIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KLSAgICA8YS8+Ci0gIDwvYj4KLTwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8xMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM1NDVkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8xMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4gCi0gIDwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8xMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg0ZjA1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8xMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTg3OTcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudD48IS0tIC0tPjwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8zLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhODkwOS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQ+Ci0gIDwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV80LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV80LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzOGRkMS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTg5MDkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eG1sLWZyYWdtZW50PgotICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjM1ZTAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV83LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV83LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmNzhkMS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4bWwtZnJhZ21lbnQ+Ci08L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfOC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfOC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTZhOWEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eG1sLWZyYWdtZW50IHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+Ci0gICAgPC94bWwtZnJhZ21lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzkueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2FiYzFhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV85LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjBfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2FiYzFhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjBfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMzVlMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjBfMi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmYzQ5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjBfMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEgdGVzdD0idGVzdCIvPgotICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+Ci0gICAgPGEvPgotICA8L2I+Ci08L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzMueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0OGZmNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+Ci0gIDxhIHRlc3Q9InRlc3QiLz4KLSAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgotICAgIDxhLz4KLSAgPC9iPgotPC9kb2M+Ci08IS0tIC0tPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjFfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWJjMWEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjFfMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIxXzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmIzNWUwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjFfMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgotICA8YS8+Ci08L2I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8yLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjFfMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzhkZDEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8yLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTxhIHRlc3Q9InRlc3QiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjJfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIyXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmIzNWUwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjJfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgotICA8YS8+Ci08L2I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMl8xLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjJfMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWJjMWEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMl8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjNfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIzXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM4ZGQxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjNfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzI0XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yNF8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMzVlMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzI0XzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMl8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMl8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5ZmM0OS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzJfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEgdGVzdD0idGVzdCIvPgotICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+Ci0gICAgPGEvPgotICA8L2I+Ci08L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzNfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzNfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzhkZDEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8zXzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPGEgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNkZjlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNF8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTx4bWwtZnJhZ21lbnQgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGExOTYzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNF8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTx4bWwtZnJhZ21lbnQgYXR0cjE9ImExIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzRfMi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzRfMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDA0OTEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudCBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNV8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNV8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0OGZmNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzVfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEgdGVzdD0idGVzdCIvPgotICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+Ci0gICAgPGEvPgotICA8L2I+Ci08L2RvYz4KLTwhLS0gLS0+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzZfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzZfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDhmZjcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+Ci0gIDxhIHRlc3Q9InRlc3QiLz4KLSAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgotICAgIDxhLz4KLSAgPC9iPgotPC9kb2M+Ci08IS0tIC0tPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmYzQ5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgotICA8YSB0ZXN0PSJ0ZXN0Ii8+Ci0gIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KLSAgICA8YS8+Ci0gIDwvYj4KLTwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8yLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzOGRkMS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzZfMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzZfMy54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzZfMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjM1ZTAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KLSAgPGEvPgotPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl80LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl80LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhYmMxYS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzZfNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08YSB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzdfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzdfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOWZjNDkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF83XzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+Ci0gIDxhIHRlc3Q9InRlc3QiLz4KLSAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgotICAgIDxhLz4KLSAgPC9iPgotPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF84XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF84XzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNkZjlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOF8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTx4bWwtZnJhZ21lbnQgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF84XzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF84XzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGExOTYzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOF8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPg0KLTx4bWwtZnJhZ21lbnQgYXR0cjE9ImExIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkY2RmOWYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF85XzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudCB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTE5NjMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF85XzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+DQotPHhtbC1mcmFnbWVudCBhdHRyMT0iYTEiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8yLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMDQ5MS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08eG1sLWZyYWdtZW50IGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF85XzMueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF85XzMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmYzQ5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgotICA8YSB0ZXN0PSJ0ZXN0Ii8+Ci0gIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KLSAgICA8YS8+Ci0gIDwvYj4KLTwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV80LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV80LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlODc5Ny4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4NCi08eG1sLWZyYWdtZW50PjwhLS0gLS0+PC94bWwtZnJhZ21lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9tdWNoX2Fkby54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL211Y2hfYWRvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwOGZhZC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3hwYXRoL211Y2hfYWRvLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4NTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08UExBWT4KLTxUSVRMRT5NdWNoIEFkbyBhYm91dCBOb3RoaW5nPC9USVRMRT4KLQotPEZNPgotPFA+VGV4dCBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgTW9ieSBMZXhpY2FsIFRvb2xzLCAxOTkyLjwvUD4KLTxQPlNHTUwgbWFya3VwIGJ5IEpvbiBCb3NhaywgMTk5Mi0xOTk0LjwvUD4KLTxQPlhNTCB2ZXJzaW9uIGJ5IEpvbiBCb3NhaywgMTk5Ni0xOTk4LjwvUD4KLTxQPlRoaXMgd29yayBtYXkgYmUgZnJlZWx5IGNvcGllZCBhbmQgZGlzdHJpYnV0ZWQgd29ybGR3aWRlLjwvUD4KLTwvRk0+Ci0KLQotPFBFUlNPTkFFPgotPFRJVExFPkRyYW1hdGlzIFBlcnNvbmFlPC9USVRMRT4KLQotPFBFUlNPTkE+RE9OIFBFRFJPLCBwcmluY2Ugb2YgQXJyYWdvbi48L1BFUlNPTkE+Ci08UEVSU09OQT5ET04gSk9ITiwgaGlzIGJhc3RhcmQgYnJvdGhlci48L1BFUlNPTkE+Ci08UEVSU09OQT5DTEFVRElPLCBhIHlvdW5nIGxvcmQgb2YgRmxvcmVuY2UuPC9QRVJTT05BPgotPFBFUlNPTkE+QkVORURJQ0ssIGEgeW91bmcgbG9yZCBvZiBQYWR1YS48L1BFUlNPTkE+Ci08UEVSU09OQT5MRU9OQVRPLCBnb3Zlcm5vciBvZiBNZXNzaW5hLjwvUEVSU09OQT4KLTxQRVJTT05BPkFOVE9OSU8sIGhpcyBicm90aGVyLjwvUEVSU09OQT4KLTxQRVJTT05BPkJBTFRIQVNBUiwgYXR0ZW5kYW50IG9uIERvbiBQZWRyby48L1BFUlNPTkE+Ci0KLTxQR1JPVVA+Ci08UEVSU09OQT5DT05SQURFPC9QRVJTT05BPgotPFBFUlNPTkE+Qk9SQUNISU88L1BFUlNPTkE+Ci08R1JQREVTQ1I+Zm9sbG93ZXJzIG9mIERvbiBKb2huLjwvR1JQREVTQ1I+Ci08L1BHUk9VUD4KLQotPFBFUlNPTkE+RlJJQVIgRlJBTkNJUzwvUEVSU09OQT4KLTxQRVJTT05BPkRPR0JFUlJZLCBhIGNvbnN0YWJsZS48L1BFUlNPTkE+Ci08UEVSU09OQT5WRVJHRVMsIGEgaGVhZGJvcm91Z2guPC9QRVJTT05BPgotPFBFUlNPTkE+QSBTZXh0b24uPC9QRVJTT05BPgotPFBFUlNPTkE+QSBCb3kuPC9QRVJTT05BPgotPFBFUlNPTkE+SEVSTywgZGF1Z2h0ZXIgdG8gTGVvbmF0by48L1BFUlNPTkE+Ci08UEVSU09OQT5CRUFUUklDRSwgbmllY2UgdG8gTGVvbmF0by48L1BFUlNPTkE+Ci0KLTxQR1JPVVA+Ci08UEVSU09OQT5NQVJHQVJFVDwvUEVSU09OQT4KLTxQRVJTT05BPlVSU1VMQTwvUEVSU09OQT4KLTxHUlBERVNDUj5nZW50bGV3b21lbiBhdHRlbmRpbmcgb24gSGVyby48L0dSUERFU0NSPgotPC9QR1JPVVA+Ci0KLTxQRVJTT05BPk1lc3NlbmdlcnMsIFdhdGNoLCBBdHRlbmRhbnRzLCAmYW1wO2MuIDwvUEVSU09OQT4KLTwvUEVSU09OQUU+Ci0KLTxTQ05ERVNDUj5TQ0VORSAgTWVzc2luYS48L1NDTkRFU0NSPgotCi08UExBWVNVQlQ+TVVDSCBBRE8gQUJPVVQgTk9USElORzwvUExBWVNVQlQ+Ci0KLTxBQ1Q+PFRJVExFPkFDVCBJPC9USVRMRT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJLiAgQmVmb3JlIExFT05BVE8nUyBob3VzZS48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIExFT05BVE8sIEhFUk8sIGFuZCBCRUFUUklDRSwgd2l0aCBhCi1NZXNzZW5nZXI8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkkgbGVhcm4gaW4gdGhpcyBsZXR0ZXIgdGhhdCBEb24gUGV0ZXIgb2YgQXJyYWdvbjwvTElORT4KLTxMSU5FPmNvbWVzIHRoaXMgbmlnaHQgdG8gTWVzc2luYS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPkhlIGlzIHZlcnkgbmVhciBieSB0aGlzOiBoZSB3YXMgbm90IHRocmVlIGxlYWd1ZXMgb2ZmPC9MSU5FPgotPExJTkU+d2hlbiBJIGxlZnQgaGltLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkhvdyBtYW55IGdlbnRsZW1lbiBoYXZlIHlvdSBsb3N0IGluIHRoaXMgYWN0aW9uPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgotPExJTkU+QnV0IGZldyBvZiBhbnkgc29ydCwgYW5kIG5vbmUgb2YgbmFtZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5BIHZpY3RvcnkgaXMgdHdpY2UgaXRzZWxmIHdoZW4gdGhlIGFjaGlldmVyIGJyaW5nczwvTElORT4KLTxMSU5FPmhvbWUgZnVsbCBudW1iZXJzLiBJIGZpbmQgaGVyZSB0aGF0IERvbiBQZXRlciBoYXRoPC9MSU5FPgotPExJTkU+YmVzdG93ZWQgbXVjaCBob25vdXIgb24gYSB5b3VuZyBGbG9yZW50aW5lIGNhbGxlZCBDbGF1ZGlvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgotPExJTkU+TXVjaCBkZXNlcnZlZCBvbiBoaXMgcGFydCBhbmQgZXF1YWxseSByZW1lbWJlcmVkIGJ5PC9MSU5FPgotPExJTkU+RG9uIFBlZHJvOiBoZSBoYXRoIGJvcm5lIGhpbXNlbGYgYmV5b25kIHRoZTwvTElORT4KLTxMSU5FPnByb21pc2Ugb2YgaGlzIGFnZSwgZG9pbmcsIGluIHRoZSBmaWd1cmUgb2YgYSBsYW1iLDwvTElORT4KLTxMSU5FPnRoZSBmZWF0cyBvZiBhIGxpb246IGhlIGhhdGggaW5kZWVkIGJldHRlcjwvTElORT4KLTxMSU5FPmJldHRlcmVkIGV4cGVjdGF0aW9uIHRoYW4geW91IG11c3QgZXhwZWN0IG9mIG1lIHRvPC9MSU5FPgotPExJTkU+dGVsbCB5b3UgaG93LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkhlIGhhdGggYW4gdW5jbGUgaGVyZSBpbiBNZXNzaW5hIHdpbGwgYmUgdmVyeSBtdWNoPC9MSU5FPgotPExJTkU+Z2xhZCBvZiBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPkkgaGF2ZSBhbHJlYWR5IGRlbGl2ZXJlZCBoaW0gbGV0dGVycywgYW5kIHRoZXJlPC9MSU5FPgotPExJTkU+YXBwZWFycyBtdWNoIGpveSBpbiBoaW07IGV2ZW4gc28gbXVjaCB0aGF0IGpveSBjb3VsZDwvTElORT4KLTxMSU5FPm5vdCBzaG93IGl0c2VsZiBtb2Rlc3QgZW5vdWdoIHdpdGhvdXQgYSBiYWRnZSBvZjwvTElORT4KLTxMSU5FPmJpdHRlcm5lc3MuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+RGlkIGhlIGJyZWFrIG91dCBpbnRvIHRlYXJzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgotPExJTkU+SW4gZ3JlYXQgbWVhc3VyZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5BIGtpbmQgb3ZlcmZsb3cgb2Yga2luZG5lc3M6IHRoZXJlIGFyZSBubyBmYWNlczwvTElORT4KLTxMSU5FPnRydWVyIHRoYW4gdGhvc2UgdGhhdCBhcmUgc28gd2FzaGVkLiBIb3cgbXVjaDwvTElORT4KLTxMSU5FPmJldHRlciBpcyBpdCB0byB3ZWVwIGF0IGpveSB0aGFuIHRvIGpveSBhdCB3ZWVwaW5nITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JIHByYXkgeW91LCBpcyBTaWduaW9yIE1vdW50YW50byByZXR1cm5lZCBmcm9tIHRoZTwvTElORT4KLTxMSU5FPndhcnMgb3Igbm8/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Ci08TElORT5JIGtub3cgbm9uZSBvZiB0aGF0IG5hbWUsIGxhZHk6IHRoZXJlIHdhcyBub25lIHN1Y2g8L0xJTkU+Ci08TElORT5pbiB0aGUgYXJteSBvZiBhbnkgc29ydC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XaGF0IGlzIGhlIHRoYXQgeW91IGFzayBmb3IsIG5pZWNlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPk15IGNvdXNpbiBtZWFucyBTaWduaW9yIEJlbmVkaWNrIG9mIFBhZHVhLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgotPExJTkU+TywgaGUncyByZXR1cm5lZDsgYW5kIGFzIHBsZWFzYW50IGFzIGV2ZXIgaGUgd2FzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5IZSBzZXQgdXAgaGlzIGJpbGxzIGhlcmUgaW4gTWVzc2luYSBhbmQgY2hhbGxlbmdlZDwvTElORT4KLTxMSU5FPkN1cGlkIGF0IHRoZSBmbGlnaHQ7IGFuZCBteSB1bmNsZSdzIGZvb2wsIHJlYWRpbmc8L0xJTkU+Ci08TElORT50aGUgY2hhbGxlbmdlLCBzdWJzY3JpYmVkIGZvciBDdXBpZCwgYW5kIGNoYWxsZW5nZWQ8L0xJTkU+Ci08TElORT5oaW0gYXQgdGhlIGJpcmQtYm9sdC4gSSBwcmF5IHlvdSwgaG93IG1hbnkgaGF0aCBoZTwvTElORT4KLTxMSU5FPmtpbGxlZCBhbmQgZWF0ZW4gaW4gdGhlc2Ugd2Fycz8gQnV0IGhvdyBtYW55IGhhdGg8L0xJTkU+Ci08TElORT5oZSBraWxsZWQ/IGZvciBpbmRlZWQgSSBwcm9taXNlZCB0byBlYXQgYWxsIG9mIGhpcyBraWxsaW5nLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkZhaXRoLCBuaWVjZSwgeW91IHRheCBTaWduaW9yIEJlbmVkaWNrIHRvbyBtdWNoOzwvTElORT4KLTxMSU5FPmJ1dCBoZSdsbCBiZSBtZWV0IHdpdGggeW91LCBJIGRvdWJ0IGl0IG5vdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPkhlIGhhdGggZG9uZSBnb29kIHNlcnZpY2UsIGxhZHksIGluIHRoZXNlIHdhcnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPllvdSBoYWQgbXVzdHkgdmljdHVhbCwgYW5kIGhlIGhhdGggaG9scCB0byBlYXQgaXQ6PC9MSU5FPgotPExJTkU+aGUgaXMgYSB2ZXJ5IHZhbGlhbnQgdHJlbmNoZXJtYW47IGhlIGhhdGggYW48L0xJTkU+Ci08TElORT5leGNlbGxlbnQgc3RvbWFjaC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPkFuZCBhIGdvb2Qgc29sZGllciB0b28sIGxhZHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkFuZCBhIGdvb2Qgc29sZGllciB0byBhIGxhZHk6IGJ1dCB3aGF0IGlzIGhlIHRvIGEgbG9yZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPkEgbG9yZCB0byBhIGxvcmQsIGEgbWFuIHRvIGEgbWFuOyBzdHVmZmVkIHdpdGggYWxsPC9MSU5FPgotPExJTkU+aG9ub3VyYWJsZSB2aXJ0dWVzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JdCBpcyBzbywgaW5kZWVkOyBoZSBpcyBubyBsZXNzIHRoYW4gYSBzdHVmZmVkIG1hbjo8L0xJTkU+Ci08TElORT5idXQgZm9yIHRoZSBzdHVmZmluZywtLXdlbGwsIHdlIGFyZSBhbGwgbW9ydGFsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPllvdSBtdXN0IG5vdCwgc2lyLCBtaXN0YWtlIG15IG5pZWNlLiBUaGVyZSBpcyBhPC9MSU5FPgotPExJTkU+a2luZCBvZiBtZXJyeSB3YXIgYmV0d2l4dCBTaWduaW9yIEJlbmVkaWNrIGFuZCBoZXI6PC9MSU5FPgotPExJTkU+dGhleSBuZXZlciBtZWV0IGJ1dCB0aGVyZSdzIGEgc2tpcm1pc2ggb2Ygd2l0PC9MSU5FPgotPExJTkU+YmV0d2VlbiB0aGVtLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5BbGFzISBoZSBnZXRzIG5vdGhpbmcgYnkgdGhhdC4gSW4gb3VyIGxhc3Q8L0xJTkU+Ci08TElORT5jb25mbGljdCBmb3VyIG9mIGhpcyBmaXZlIHdpdHMgd2VudCBoYWx0aW5nIG9mZiwgYW5kPC9MSU5FPgotPExJTkU+bm93IGlzIHRoZSB3aG9sZSBtYW4gZ292ZXJuZWQgd2l0aCBvbmU6IHNvIHRoYXQgaWY8L0xJTkU+Ci08TElORT5oZSBoYXZlIHdpdCBlbm91Z2ggdG8ga2VlcCBoaW1zZWxmIHdhcm0sIGxldCBoaW08L0xJTkU+Ci08TElORT5iZWFyIGl0IGZvciBhIGRpZmZlcmVuY2UgYmV0d2VlbiBoaW1zZWxmIGFuZCBoaXM8L0xJTkU+Ci08TElORT5ob3JzZTsgZm9yIGl0IGlzIGFsbCB0aGUgd2VhbHRoIHRoYXQgaGUgaGF0aCBsZWZ0LDwvTElORT4KLTxMSU5FPnRvIGJlIGtub3duIGEgcmVhc29uYWJsZSBjcmVhdHVyZS4gV2hvIGlzIGhpczwvTElORT4KLTxMSU5FPmNvbXBhbmlvbiBub3c/IEhlIGhhdGggZXZlcnkgbW9udGggYSBuZXcgc3dvcm4gYnJvdGhlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPklzJ3QgcG9zc2libGU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlZlcnkgZWFzaWx5IHBvc3NpYmxlOiBoZSB3ZWFycyBoaXMgZmFpdGggYnV0IGFzPC9MSU5FPgotPExJTkU+dGhlIGZhc2hpb24gb2YgaGlzIGhhdDsgaXQgZXZlciBjaGFuZ2VzIHdpdGggdGhlPC9MSU5FPgotPExJTkU+bmV4dCBibG9jay48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPkkgc2VlLCBsYWR5LCB0aGUgZ2VudGxlbWFuIGlzIG5vdCBpbiB5b3VyIGJvb2tzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5ObzsgYW4gaGUgd2VyZSwgSSB3b3VsZCBidXJuIG15IHN0dWR5LiBCdXQsIEkgcHJheTwvTElORT4KLTxMSU5FPnlvdSwgd2hvIGlzIGhpcyBjb21wYW5pb24/IElzIHRoZXJlIG5vIHlvdW5nPC9MSU5FPgotPExJTkU+c3F1YXJlciBub3cgdGhhdCB3aWxsIG1ha2UgYSB2b3lhZ2Ugd2l0aCBoaW0gdG8gdGhlIGRldmlsPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgotPExJTkU+SGUgaXMgbW9zdCBpbiB0aGUgY29tcGFueSBvZiB0aGUgcmlnaHQgbm9ibGUgQ2xhdWRpby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+TyBMb3JkLCBoZSB3aWxsIGhhbmcgdXBvbiBoaW0gbGlrZSBhIGRpc2Vhc2U6IGhlPC9MSU5FPgotPExJTkU+aXMgc29vbmVyIGNhdWdodCB0aGFuIHRoZSBwZXN0aWxlbmNlLCBhbmQgdGhlIHRha2VyPC9MSU5FPgotPExJTkU+cnVucyBwcmVzZW50bHkgbWFkLiBHb2QgaGVscCB0aGUgbm9ibGUgQ2xhdWRpbyEgaWY8L0xJTkU+Ci08TElORT5oZSBoYXZlIGNhdWdodCB0aGUgQmVuZWRpY2ssIGl0IHdpbGwgY29zdCBoaW0gYTwvTElORT4KLTxMSU5FPnRob3VzYW5kIHBvdW5kIGVyZSBhJyBiZSBjdXJlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPkkgd2lsbCBob2xkIGZyaWVuZHMgd2l0aCB5b3UsIGxhZHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkRvLCBnb29kIGZyaWVuZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5Zb3Ugd2lsbCBuZXZlciBydW4gbWFkLCBuaWVjZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+Tm8sIG5vdCB0aWxsIGEgaG90IEphbnVhcnkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Ci08TElORT5Eb24gUGVkcm8gaXMgYXBwcm9hY2hlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RW50ZXIgRE9OIFBFRFJPLCBET04gSk9ITiwgQ0xBVURJTywgQkVORURJQ0ssCi1hbmQgQkFMVEhBU0FSPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkdvb2QgU2lnbmlvciBMZW9uYXRvLCB5b3UgYXJlIGNvbWUgdG8gbWVldCB5b3VyPC9MSU5FPgotPExJTkU+dHJvdWJsZTogdGhlIGZhc2hpb24gb2YgdGhlIHdvcmxkIGlzIHRvIGF2b2lkPC9MSU5FPgotPExJTkU+Y29zdCwgYW5kIHlvdSBlbmNvdW50ZXIgaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+TmV2ZXIgY2FtZSB0cm91YmxlIHRvIG15IGhvdXNlIGluIHRoZSBsaWtlbmVzcyBvZjwvTElORT4KLTxMSU5FPnlvdXIgZ3JhY2U6IGZvciB0cm91YmxlIGJlaW5nIGdvbmUsIGNvbWZvcnQgc2hvdWxkPC9MSU5FPgotPExJTkU+cmVtYWluOyBidXQgd2hlbiB5b3UgZGVwYXJ0IGZyb20gbWUsIHNvcnJvdyBhYmlkZXM8L0xJTkU+Ci08TElORT5hbmQgaGFwcGluZXNzIHRha2VzIGhpcyBsZWF2ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPllvdSBlbWJyYWNlIHlvdXIgY2hhcmdlIHRvbyB3aWxsaW5nbHkuIEkgdGhpbmsgdGhpczwvTElORT4KLTxMSU5FPmlzIHlvdXIgZGF1Z2h0ZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+SGVyIG1vdGhlciBoYXRoIG1hbnkgdGltZXMgdG9sZCBtZSBzby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+V2VyZSB5b3UgaW4gZG91YnQsIHNpciwgdGhhdCB5b3UgYXNrZWQgaGVyPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlNpZ25pb3IgQmVuZWRpY2ssIG5vOyBmb3IgdGhlbiB3ZXJlIHlvdSBhIGNoaWxkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+WW91IGhhdmUgaXQgZnVsbCwgQmVuZWRpY2s6IHdlIG1heSBndWVzcyBieSB0aGlzPC9MSU5FPgotPExJTkU+d2hhdCB5b3UgYXJlLCBiZWluZyBhIG1hbi4gVHJ1bHksIHRoZSBsYWR5IGZhdGhlcnM8L0xJTkU+Ci08TElORT5oZXJzZWxmLiBCZSBoYXBweSwgbGFkeTsgZm9yIHlvdSBhcmUgbGlrZSBhbjwvTElORT4KLTxMSU5FPmhvbm91cmFibGUgZmF0aGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5JZiBTaWduaW9yIExlb25hdG8gYmUgaGVyIGZhdGhlciwgc2hlIHdvdWxkIG5vdDwvTElORT4KLTxMSU5FPmhhdmUgaGlzIGhlYWQgb24gaGVyIHNob3VsZGVycyBmb3IgYWxsIE1lc3NpbmEsIGFzPC9MSU5FPgotPExJTkU+bGlrZSBoaW0gYXMgc2hlIGlzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JIHdvbmRlciB0aGF0IHlvdSB3aWxsIHN0aWxsIGJlIHRhbGtpbmcsIFNpZ25pb3I8L0xJTkU+Ci08TElORT5CZW5lZGljazogbm9ib2R5IG1hcmtzIHlvdS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+V2hhdCwgbXkgZGVhciBMYWR5IERpc2RhaW4hIGFyZSB5b3UgeWV0IGxpdmluZz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+SXMgaXQgcG9zc2libGUgZGlzZGFpbiBzaG91bGQgZGllIHdoaWxlIHNoZSBoYXRoPC9MSU5FPgotPExJTkU+c3VjaCBtZWV0IGZvb2QgdG8gZmVlZCBpdCBhcyBTaWduaW9yIEJlbmVkaWNrPzwvTElORT4KLTxMSU5FPkNvdXJ0ZXN5IGl0c2VsZiBtdXN0IGNvbnZlcnQgdG8gZGlzZGFpbiwgaWYgeW91IGNvbWU8L0xJTkU+Ci08TElORT5pbiBoZXIgcHJlc2VuY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRoZW4gaXMgY291cnRlc3kgYSB0dXJuY29hdC4gQnV0IGl0IGlzIGNlcnRhaW4gSTwvTElORT4KLTxMSU5FPmFtIGxvdmVkIG9mIGFsbCBsYWRpZXMsIG9ubHkgeW91IGV4Y2VwdGVkOiBhbmQgSTwvTElORT4KLTxMSU5FPndvdWxkIEkgY291bGQgZmluZCBpbiBteSBoZWFydCB0aGF0IEkgaGFkIG5vdCBhIGhhcmQ8L0xJTkU+Ci08TElORT5oZWFydDsgZm9yLCB0cnVseSwgSSBsb3ZlIG5vbmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkEgZGVhciBoYXBwaW5lc3MgdG8gd29tZW46IHRoZXkgd291bGQgZWxzZSBoYXZlPC9MSU5FPgotPExJTkU+YmVlbiB0cm91YmxlZCB3aXRoIGEgcGVybmljaW91cyBzdWl0b3IuIEkgdGhhbmsgR29kPC9MSU5FPgotPExJTkU+YW5kIG15IGNvbGQgYmxvb2QsIEkgYW0gb2YgeW91ciBodW1vdXIgZm9yIHRoYXQ6IEk8L0xJTkU+Ci08TElORT5oYWQgcmF0aGVyIGhlYXIgbXkgZG9nIGJhcmsgYXQgYSBjcm93IHRoYW4gYSBtYW48L0xJTkU+Ci08TElORT5zd2VhciBoZSBsb3ZlcyBtZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+R29kIGtlZXAgeW91ciBsYWR5c2hpcCBzdGlsbCBpbiB0aGF0IG1pbmQhIHNvIHNvbWU8L0xJTkU+Ci08TElORT5nZW50bGVtYW4gb3Igb3RoZXIgc2hhbGwgJ3NjYXBlIGEgcHJlZGVzdGluYXRlPC9MSU5FPgotPExJTkU+c2NyYXRjaGVkIGZhY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlNjcmF0Y2hpbmcgY291bGQgbm90IG1ha2UgaXQgd29yc2UsIGFuICd0d2VyZSBzdWNoPC9MSU5FPgotPExJTkU+YSBmYWNlIGFzIHlvdXJzIHdlcmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIHlvdSBhcmUgYSByYXJlIHBhcnJvdC10ZWFjaGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5BIGJpcmQgb2YgbXkgdG9uZ3VlIGlzIGJldHRlciB0aGFuIGEgYmVhc3Qgb2YgeW91cnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkkgd291bGQgbXkgaG9yc2UgaGFkIHRoZSBzcGVlZCBvZiB5b3VyIHRvbmd1ZSwgYW5kPC9MSU5FPgotPExJTkU+c28gZ29vZCBhIGNvbnRpbnVlci4gQnV0IGtlZXAgeW91ciB3YXksIGknIEdvZCdzPC9MSU5FPgotPExJTkU+bmFtZTsgSSBoYXZlIGRvbmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPllvdSBhbHdheXMgZW5kIHdpdGggYSBqYWRlJ3MgdHJpY2s6IEkga25vdyB5b3Ugb2Ygb2xkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+VGhhdCBpcyB0aGUgc3VtIG9mIGFsbCwgTGVvbmF0by4gU2lnbmlvciBDbGF1ZGlvPC9MSU5FPgotPExJTkU+YW5kIFNpZ25pb3IgQmVuZWRpY2ssIG15IGRlYXIgZnJpZW5kIExlb25hdG8gaGF0aDwvTElORT4KLTxMSU5FPmludml0ZWQgeW91IGFsbC4gSSB0ZWxsIGhpbSB3ZSBzaGFsbCBzdGF5IGhlcmUgYXQ8L0xJTkU+Ci08TElORT50aGUgbGVhc3QgYSBtb250aDsgYW5kIGhlIGhlYXJ0aWx5IHByYXlzIHNvbWU8L0xJTkU+Ci08TElORT5vY2Nhc2lvbiBtYXkgZGV0YWluIHVzIGxvbmdlci4gSSBkYXJlIHN3ZWFyIGhlIGlzIG5vPC9MSU5FPgotPExJTkU+aHlwb2NyaXRlLCBidXQgcHJheXMgZnJvbSBoaXMgaGVhcnQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+SWYgeW91IHN3ZWFyLCBteSBsb3JkLCB5b3Ugc2hhbGwgbm90IGJlIGZvcnN3b3JuLjwvTElORT4KLTxTVEFHRURJUj5UbyBET04gSk9ITjwvU1RBR0VESVI+Ci08TElORT5MZXQgbWUgYmlkIHlvdSB3ZWxjb21lLCBteSBsb3JkOiBiZWluZyByZWNvbmNpbGVkIHRvPC9MSU5FPgotPExJTkU+dGhlIHByaW5jZSB5b3VyIGJyb3RoZXIsIEkgb3dlIHlvdSBhbGwgZHV0eS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+SSB0aGFuayB5b3U6IEkgYW0gbm90IG9mIG1hbnkgd29yZHMsIGJ1dCBJIHRoYW5rPC9MSU5FPgotPExJTkU+eW91LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlBsZWFzZSBpdCB5b3VyIGdyYWNlIGxlYWQgb24/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Zb3VyIGhhbmQsIExlb25hdG87IHdlIHdpbGwgZ28gdG9nZXRoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4ZXVudCBhbGwgZXhjZXB0IEJFTkVESUNLIGFuZCBDTEFVRElPPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5CZW5lZGljaywgZGlkc3QgdGhvdSBub3RlIHRoZSBkYXVnaHRlciBvZiBTaWduaW9yIExlb25hdG8/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkkgbm90ZWQgaGVyIG5vdDsgYnV0IEkgbG9va2VkIG9uIGhlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5JcyBzaGUgbm90IGEgbW9kZXN0IHlvdW5nIGxhZHk/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkRvIHlvdSBxdWVzdGlvbiBtZSwgYXMgYW4gaG9uZXN0IG1hbiBzaG91bGQgZG8sIGZvcjwvTElORT4KLTxMSU5FPm15IHNpbXBsZSB0cnVlIGp1ZGdtZW50OyBvciB3b3VsZCB5b3UgaGF2ZSBtZSBzcGVhazwvTElORT4KLTxMSU5FPmFmdGVyIG15IGN1c3RvbSwgYXMgYmVpbmcgYSBwcm9mZXNzZWQgdHlyYW50IHRvIHRoZWlyIHNleD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5ObzsgSSBwcmF5IHRoZWUgc3BlYWsgaW4gc29iZXIganVkZ21lbnQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPldoeSwgaScgZmFpdGgsIG1ldGhpbmtzIHNoZSdzIHRvbyBsb3cgZm9yIGEgaGlnaDwvTElORT4KLTxMSU5FPnByYWlzZSwgdG9vIGJyb3duIGZvciBhIGZhaXIgcHJhaXNlIGFuZCB0b28gbGl0dGxlPC9MSU5FPgotPExJTkU+Zm9yIGEgZ3JlYXQgcHJhaXNlOiBvbmx5IHRoaXMgY29tbWVuZGF0aW9uIEkgY2FuPC9MSU5FPgotPExJTkU+YWZmb3JkIGhlciwgdGhhdCB3ZXJlIHNoZSBvdGhlciB0aGFuIHNoZSBpcywgc2hlPC9MSU5FPgotPExJTkU+d2VyZSB1bmhhbmRzb21lOyBhbmQgYmVpbmcgbm8gb3RoZXIgYnV0IGFzIHNoZSBpcywgSTwvTElORT4KLTxMSU5FPmRvIG5vdCBsaWtlIGhlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5UaG91IHRoaW5rZXN0IEkgYW0gaW4gc3BvcnQ6IEkgcHJheSB0aGVlIHRlbGwgbWU8L0xJTkU+Ci08TElORT50cnVseSBob3cgdGhvdSBsaWtlc3QgaGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Xb3VsZCB5b3UgYnV5IGhlciwgdGhhdCB5b3UgaW5xdWlyZSBhZnRlciBoZXI/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+Q2FuIHRoZSB3b3JsZCBidXkgc3VjaCBhIGpld2VsPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5ZZWEsIGFuZCBhIGNhc2UgdG8gcHV0IGl0IGludG8uIEJ1dCBzcGVhayB5b3UgdGhpczwvTElORT4KLTxMSU5FPndpdGggYSBzYWQgYnJvdz8gb3IgZG8geW91IHBsYXkgdGhlIGZsb3V0aW5nIEphY2ssPC9MSU5FPgotPExJTkU+dG8gdGVsbCB1cyBDdXBpZCBpcyBhIGdvb2QgaGFyZS1maW5kZXIgYW5kIFZ1bGNhbiBhPC9MSU5FPgotPExJTkU+cmFyZSBjYXJwZW50ZXI/IENvbWUsIGluIHdoYXQga2V5IHNoYWxsIGEgbWFuIHRha2U8L0xJTkU+Ci08TElORT55b3UsIHRvIGdvIGluIHRoZSBzb25nPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkluIG1pbmUgZXllIHNoZSBpcyB0aGUgc3dlZXRlc3QgbGFkeSB0aGF0IGV2ZXIgSTwvTElORT4KLTxMSU5FPmxvb2tlZCBvbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SSBjYW4gc2VlIHlldCB3aXRob3V0IHNwZWN0YWNsZXMgYW5kIEkgc2VlIG5vIHN1Y2g8L0xJTkU+Ci08TElORT5tYXR0ZXI6IHRoZXJlJ3MgaGVyIGNvdXNpbiwgYW4gc2hlIHdlcmUgbm90PC9MSU5FPgotPExJTkU+cG9zc2Vzc2VkIHdpdGggYSBmdXJ5LCBleGNlZWRzIGhlciBhcyBtdWNoIGluIGJlYXV0eTwvTElORT4KLTxMSU5FPmFzIHRoZSBmaXJzdCBvZiBNYXkgZG90aCB0aGUgbGFzdCBvZiBEZWNlbWJlci4gQnV0IEk8L0xJTkU+Ci08TElORT5ob3BlIHlvdSBoYXZlIG5vIGludGVudCB0byB0dXJuIGh1c2JhbmQsIGhhdmUgeW91PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkkgd291bGQgc2NhcmNlIHRydXN0IG15c2VsZiwgdGhvdWdoIEkgaGFkIHN3b3JuIHRoZTwvTElORT4KLTxMSU5FPmNvbnRyYXJ5LCBpZiBIZXJvIHdvdWxkIGJlIG15IHdpZmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPklzJ3QgY29tZSB0byB0aGlzPyBJbiBmYWl0aCwgaGF0aCBub3QgdGhlIHdvcmxkPC9MSU5FPgotPExJTkU+b25lIG1hbiBidXQgaGUgd2lsbCB3ZWFyIGhpcyBjYXAgd2l0aCBzdXNwaWNpb24/PC9MSU5FPgotPExJTkU+U2hhbGwgSSBuZXZlciBzZWUgYSBiYWNoZWxvciBvZiB0aHJlZS1zY29yZSBhZ2Fpbj88L0xJTkU+Ci08TElORT5HbyB0bywgaScgZmFpdGg7IGFuIHRob3Ugd2lsdCBuZWVkcyB0aHJ1c3QgdGh5IG5lY2s8L0xJTkU+Ci08TElORT5pbnRvIGEgeW9rZSwgd2VhciB0aGUgcHJpbnQgb2YgaXQgYW5kIHNpZ2ggYXdheTwvTElORT4KLTxMSU5FPlN1bmRheXMuIExvb2sgRG9uIFBlZHJvIGlzIHJldHVybmVkIHRvIHNlZWsgeW91LjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5SZS1lbnRlciBET04gUEVEUk88L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+V2hhdCBzZWNyZXQgaGF0aCBoZWxkIHlvdSBoZXJlLCB0aGF0IHlvdSBmb2xsb3dlZDwvTElORT4KLTxMSU5FPm5vdCB0byBMZW9uYXRvJ3M/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkkgd291bGQgeW91ciBncmFjZSB3b3VsZCBjb25zdHJhaW4gbWUgdG8gdGVsbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkkgY2hhcmdlIHRoZWUgb24gdGh5IGFsbGVnaWFuY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPllvdSBoZWFyLCBDb3VudCBDbGF1ZGlvOiBJIGNhbiBiZSBzZWNyZXQgYXMgYSBkdW1iPC9MSU5FPgotPExJTkU+bWFuOyBJIHdvdWxkIGhhdmUgeW91IHRoaW5rIHNvOyBidXQsIG9uIG15PC9MSU5FPgotPExJTkU+YWxsZWdpYW5jZSwgbWFyayB5b3UgdGhpcywgb24gbXkgYWxsZWdpYW5jZS4gSGUgaXM8L0xJTkU+Ci08TElORT5pbiBsb3ZlLiBXaXRoIHdobz8gbm93IHRoYXQgaXMgeW91ciBncmFjZSdzIHBhcnQuPC9MSU5FPgotPExJTkU+TWFyayBob3cgc2hvcnQgaGlzIGFuc3dlciBpczstLVdpdGggSGVybywgTGVvbmF0bydzPC9MSU5FPgotPExJTkU+c2hvcnQgZGF1Z2h0ZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SWYgdGhpcyB3ZXJlIHNvLCBzbyB3ZXJlIGl0IHV0dGVyZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkxpa2UgdGhlIG9sZCB0YWxlLCBteSBsb3JkOiAnaXQgaXMgbm90IHNvLCBub3I8L0xJTkU+Ci08TElORT4ndHdhcyBub3Qgc28sIGJ1dCwgaW5kZWVkLCBHb2QgZm9yYmlkIGl0IHNob3VsZCBiZTwvTElORT4KLTxMSU5FPnNvLic8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5JZiBteSBwYXNzaW9uIGNoYW5nZSBub3Qgc2hvcnRseSwgR29kIGZvcmJpZCBpdDwvTElORT4KLTxMSU5FPnNob3VsZCBiZSBvdGhlcndpc2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5BbWVuLCBpZiB5b3UgbG92ZSBoZXI7IGZvciB0aGUgbGFkeSBpcyB2ZXJ5IHdlbGwgd29ydGh5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPllvdSBzcGVhayB0aGlzIHRvIGZldGNoIG1lIGluLCBteSBsb3JkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+QnkgbXkgdHJvdGgsIEkgc3BlYWsgbXkgdGhvdWdodC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5BbmQsIGluIGZhaXRoLCBteSBsb3JkLCBJIHNwb2tlIG1pbmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkFuZCwgYnkgbXkgdHdvIGZhaXRocyBhbmQgdHJvdGhzLCBteSBsb3JkLCBJIHNwb2tlIG1pbmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+VGhhdCBJIGxvdmUgaGVyLCBJIGZlZWwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5UaGF0IHNoZSBpcyB3b3J0aHksIEkga25vdy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+VGhhdCBJIG5laXRoZXIgZmVlbCBob3cgc2hlIHNob3VsZCBiZSBsb3ZlZCBub3I8L0xJTkU+Ci08TElORT5rbm93IGhvdyBzaGUgc2hvdWxkIGJlIHdvcnRoeSwgaXMgdGhlIG9waW5pb24gdGhhdDwvTElORT4KLTxMSU5FPmZpcmUgY2Fubm90IG1lbHQgb3V0IG9mIG1lOiBJIHdpbGwgZGllIGluIGl0IGF0IHRoZSBzdGFrZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlRob3Ugd2FzdCBldmVyIGFuIG9ic3RpbmF0ZSBoZXJldGljIGluIHRoZSBkZXNwaXRlPC9MSU5FPgotPExJTkU+b2YgYmVhdXR5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkFuZCBuZXZlciBjb3VsZCBtYWludGFpbiBoaXMgcGFydCBidXQgaW4gdGhlIGZvcmNlPC9MSU5FPgotPExJTkU+b2YgaGlzIHdpbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRoYXQgYSB3b21hbiBjb25jZWl2ZWQgbWUsIEkgdGhhbmsgaGVyOyB0aGF0IHNoZTwvTElORT4KLTxMSU5FPmJyb3VnaHQgbWUgdXAsIEkgbGlrZXdpc2UgZ2l2ZSBoZXIgbW9zdCBodW1ibGU8L0xJTkU+Ci08TElORT50aGFua3M6IGJ1dCB0aGF0IEkgd2lsbCBoYXZlIGEgcmVjaGVhdCB3aW5kZWQgaW4gbXk8L0xJTkU+Ci08TElORT5mb3JlaGVhZCwgb3IgaGFuZyBteSBidWdsZSBpbiBhbiBpbnZpc2libGUgYmFsZHJpY2ssPC9MSU5FPgotPExJTkU+YWxsIHdvbWVuIHNoYWxsIHBhcmRvbiBtZS4gQmVjYXVzZSBJIHdpbGwgbm90IGRvPC9MSU5FPgotPExJTkU+dGhlbSB0aGUgd3JvbmcgdG8gbWlzdHJ1c3QgYW55LCBJIHdpbGwgZG8gbXlzZWxmIHRoZTwvTElORT4KLTxMSU5FPnJpZ2h0IHRvIHRydXN0IG5vbmU7IGFuZCB0aGUgZmluZSBpcywgZm9yIHRoZSB3aGljaDwvTElORT4KLTxMSU5FPkkgbWF5IGdvIHRoZSBmaW5lciwgSSB3aWxsIGxpdmUgYSBiYWNoZWxvci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkkgc2hhbGwgc2VlIHRoZWUsIGVyZSBJIGRpZSwgbG9vayBwYWxlIHdpdGggbG92ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+V2l0aCBhbmdlciwgd2l0aCBzaWNrbmVzcywgb3Igd2l0aCBodW5nZXIsIG15IGxvcmQsPC9MSU5FPgotPExJTkU+bm90IHdpdGggbG92ZTogcHJvdmUgdGhhdCBldmVyIEkgbG9zZSBtb3JlIGJsb29kPC9MSU5FPgotPExJTkU+d2l0aCBsb3ZlIHRoYW4gSSB3aWxsIGdldCBhZ2FpbiB3aXRoIGRyaW5raW5nLCBwaWNrPC9MSU5FPgotPExJTkU+b3V0IG1pbmUgZXllcyB3aXRoIGEgYmFsbGFkLW1ha2VyJ3MgcGVuIGFuZCBoYW5nIG1lPC9MSU5FPgotPExJTkU+dXAgYXQgdGhlIGRvb3Igb2YgYSBicm90aGVsLWhvdXNlIGZvciB0aGUgc2lnbiBvZjwvTElORT4KLTxMSU5FPmJsaW5kIEN1cGlkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+V2VsbCwgaWYgZXZlciB0aG91IGRvc3QgZmFsbCBmcm9tIHRoaXMgZmFpdGgsIHRob3U8L0xJTkU+Ci08TElORT53aWx0IHByb3ZlIGEgbm90YWJsZSBhcmd1bWVudC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SWYgSSBkbywgaGFuZyBtZSBpbiBhIGJvdHRsZSBsaWtlIGEgY2F0IGFuZCBzaG9vdDwvTElORT4KLTxMSU5FPmF0IG1lOyBhbmQgaGUgdGhhdCBoaXRzIG1lLCBsZXQgaGltIGJlIGNsYXBwZWQgb248L0xJTkU+Ci08TElORT50aGUgc2hvdWxkZXIsIGFuZCBjYWxsZWQgQWRhbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIGFzIHRpbWUgc2hhbGwgdHJ5OiAnSW4gdGltZSB0aGUgc2F2YWdlIGJ1bGw8L0xJTkU+Ci08TElORT5kb3RoIGJlYXIgdGhlIHlva2UuJzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5UaGUgc2F2YWdlIGJ1bGwgbWF5OyBidXQgaWYgZXZlciB0aGUgc2Vuc2libGU8L0xJTkU+Ci08TElORT5CZW5lZGljayBiZWFyIGl0LCBwbHVjayBvZmYgdGhlIGJ1bGwncyBob3JucyBhbmQgc2V0PC9MSU5FPgotPExJTkU+dGhlbSBpbiBteSBmb3JlaGVhZDogYW5kIGxldCBtZSBiZSB2aWxlbHkgcGFpbnRlZCw8L0xJTkU+Ci08TElORT5hbmQgaW4gc3VjaCBncmVhdCBsZXR0ZXJzIGFzIHRoZXkgd3JpdGUgJ0hlcmUgaXM8L0xJTkU+Ci08TElORT5nb29kIGhvcnNlIHRvIGhpcmUsJyBsZXQgdGhlbSBzaWduaWZ5IHVuZGVyIG15IHNpZ248L0xJTkU+Ci08TElORT4nSGVyZSB5b3UgbWF5IHNlZSBCZW5lZGljayB0aGUgbWFycmllZCBtYW4uJzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPklmIHRoaXMgc2hvdWxkIGV2ZXIgaGFwcGVuLCB0aG91IHdvdWxkc3QgYmUgaG9ybi1tYWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5OYXksIGlmIEN1cGlkIGhhdmUgbm90IHNwZW50IGFsbCBoaXMgcXVpdmVyIGluPC9MSU5FPgotPExJTkU+VmVuaWNlLCB0aG91IHdpbHQgcXVha2UgZm9yIHRoaXMgc2hvcnRseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SSBsb29rIGZvciBhbiBlYXJ0aHF1YWtlIHRvbywgdGhlbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIHlvdSB0ZW1wb3JpemUgd2l0aCB0aGUgaG91cnMuIEluIHRoZTwvTElORT4KLTxMSU5FPm1lYW50aW1lLCBnb29kIFNpZ25pb3IgQmVuZWRpY2ssIHJlcGFpciB0bzwvTElORT4KLTxMSU5FPkxlb25hdG8nczogY29tbWVuZCBtZSB0byBoaW0gYW5kIHRlbGwgaGltIEkgd2lsbDwvTElORT4KLTxMSU5FPm5vdCBmYWlsIGhpbSBhdCBzdXBwZXI7IGZvciBpbmRlZWQgaGUgaGF0aCBtYWRlPC9MSU5FPgotPExJTkU+Z3JlYXQgcHJlcGFyYXRpb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkkgaGF2ZSBhbG1vc3QgbWF0dGVyIGVub3VnaCBpbiBtZSBmb3Igc3VjaCBhbjwvTElORT4KLTxMSU5FPmVtYmFzc2FnZTsgYW5kIHNvIEkgY29tbWl0IHlvdS0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+VG8gdGhlIHR1aXRpb24gb2YgR29kOiBGcm9tIG15IGhvdXNlLCBpZiBJIGhhZCBpdCwtLTwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+VGhlIHNpeHRoIG9mIEp1bHk6IFlvdXIgbG92aW5nIGZyaWVuZCwgQmVuZWRpY2suPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPk5heSwgbW9jayBub3QsIG1vY2sgbm90LiBUaGUgYm9keSBvZiB5b3VyPC9MSU5FPgotPExJTkU+ZGlzY291cnNlIGlzIHNvbWV0aW1lIGd1YXJkZWQgd2l0aCBmcmFnbWVudHMsIGFuZDwvTElORT4KLTxMSU5FPnRoZSBndWFyZHMgYXJlIGJ1dCBzbGlnaHRseSBiYXN0ZWQgb24gbmVpdGhlcjogZXJlPC9MSU5FPgotPExJTkU+eW91IGZsb3V0IG9sZCBlbmRzIGFueSBmdXJ0aGVyLCBleGFtaW5lIHlvdXI8L0xJTkU+Ci08TElORT5jb25zY2llbmNlOiBhbmQgc28gSSBsZWF2ZSB5b3UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4aXQ8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk15IGxpZWdlLCB5b3VyIGhpZ2huZXNzIG5vdyBtYXkgZG8gbWUgZ29vZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPk15IGxvdmUgaXMgdGhpbmUgdG8gdGVhY2g6IHRlYWNoIGl0IGJ1dCBob3csPC9MSU5FPgotPExJTkU+QW5kIHRob3Ugc2hhbHQgc2VlIGhvdyBhcHQgaXQgaXMgdG8gbGVhcm48L0xJTkU+Ci08TElORT5BbnkgaGFyZCBsZXNzb24gdGhhdCBtYXkgZG8gdGhlZSBnb29kLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkhhdGggTGVvbmF0byBhbnkgc29uLCBteSBsb3JkPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+Tm8gY2hpbGQgYnV0IEhlcm87IHNoZSdzIGhpcyBvbmx5IGhlaXIuPC9MSU5FPgotPExJTkU+RG9zdCB0aG91IGFmZmVjdCBoZXIsIENsYXVkaW8/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+TywgbXkgbG9yZCw8L0xJTkU+Ci08TElORT5XaGVuIHlvdSB3ZW50IG9ud2FyZCBvbiB0aGlzIGVuZGVkIGFjdGlvbiw8L0xJTkU+Ci08TElORT5JIGxvb2snZCB1cG9uIGhlciB3aXRoIGEgc29sZGllcidzIGV5ZSw8L0xJTkU+Ci08TElORT5UaGF0IGxpa2VkLCBidXQgaGFkIGEgcm91Z2hlciB0YXNrIGluIGhhbmQ8L0xJTkU+Ci08TElORT5UaGFuIHRvIGRyaXZlIGxpa2luZyB0byB0aGUgbmFtZSBvZiBsb3ZlOjwvTElORT4KLTxMSU5FPkJ1dCBub3cgSSBhbSByZXR1cm4nZCBhbmQgdGhhdCB3YXItdGhvdWdodHM8L0xJTkU+Ci08TElORT5IYXZlIGxlZnQgdGhlaXIgcGxhY2VzIHZhY2FudCwgaW4gdGhlaXIgcm9vbXM8L0xJTkU+Ci08TElORT5Db21lIHRocm9uZ2luZyBzb2Z0IGFuZCBkZWxpY2F0ZSBkZXNpcmVzLDwvTElORT4KLTxMSU5FPkFsbCBwcm9tcHRpbmcgbWUgaG93IGZhaXIgeW91bmcgSGVybyBpcyw8L0xJTkU+Ci08TElORT5TYXlpbmcsIEkgbGlrZWQgaGVyIGVyZSBJIHdlbnQgdG8gd2Fycy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlRob3Ugd2lsdCBiZSBsaWtlIGEgbG92ZXIgcHJlc2VudGx5PC9MSU5FPgotPExJTkU+QW5kIHRpcmUgdGhlIGhlYXJlciB3aXRoIGEgYm9vayBvZiB3b3Jkcy48L0xJTkU+Ci08TElORT5JZiB0aG91IGRvc3QgbG92ZSBmYWlyIEhlcm8sIGNoZXJpc2ggaXQsPC9MSU5FPgotPExJTkU+QW5kIEkgd2lsbCBicmVhayB3aXRoIGhlciBhbmQgd2l0aCBoZXIgZmF0aGVyLDwvTElORT4KLTxMSU5FPkFuZCB0aG91IHNoYWx0IGhhdmUgaGVyLiBXYXMndCBub3QgdG8gdGhpcyBlbmQ8L0xJTkU+Ci08TElORT5UaGF0IHRob3UgYmVnYW4nc3QgdG8gdHdpc3Qgc28gZmluZSBhIHN0b3J5PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkhvdyBzd2VldGx5IHlvdSBkbyBtaW5pc3RlciB0byBsb3ZlLDwvTElORT4KLTxMSU5FPlRoYXQga25vdyBsb3ZlJ3MgZ3JpZWYgYnkgaGlzIGNvbXBsZXhpb24hPC9MSU5FPgotPExJTkU+QnV0IGxlc3QgbXkgbGlraW5nIG1pZ2h0IHRvbyBzdWRkZW4gc2VlbSw8L0xJTkU+Ci08TElORT5JIHdvdWxkIGhhdmUgc2FsdmVkIGl0IHdpdGggYSBsb25nZXIgdHJlYXRpc2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5XaGF0IG5lZWQgdGhlIGJyaWRnZSBtdWNoIGJyb2FkZXIgdGhhbiB0aGUgZmxvb2Q/PC9MSU5FPgotPExJTkU+VGhlIGZhaXJlc3QgZ3JhbnQgaXMgdGhlIG5lY2Vzc2l0eS48L0xJTkU+Ci08TElORT5Mb29rLCB3aGF0IHdpbGwgc2VydmUgaXMgZml0OiAndGlzIG9uY2UsIHRob3UgbG92ZXN0LDwvTElORT4KLTxMSU5FPkFuZCBJIHdpbGwgZml0IHRoZWUgd2l0aCB0aGUgcmVtZWR5LjwvTElORT4KLTxMSU5FPkkga25vdyB3ZSBzaGFsbCBoYXZlIHJldmVsbGluZyB0by1uaWdodDo8L0xJTkU+Ci08TElORT5JIHdpbGwgYXNzdW1lIHRoeSBwYXJ0IGluIHNvbWUgZGlzZ3Vpc2U8L0xJTkU+Ci08TElORT5BbmQgdGVsbCBmYWlyIEhlcm8gSSBhbSBDbGF1ZGlvLDwvTElORT4KLTxMSU5FPkFuZCBpbiBoZXIgYm9zb20gSSdsbCB1bmNsYXNwIG15IGhlYXJ0PC9MSU5FPgotPExJTkU+QW5kIHRha2UgaGVyIGhlYXJpbmcgcHJpc29uZXIgd2l0aCB0aGUgZm9yY2U8L0xJTkU+Ci08TElORT5BbmQgc3Ryb25nIGVuY291bnRlciBvZiBteSBhbW9yb3VzIHRhbGU6PC9MSU5FPgotPExJTkU+VGhlbiBhZnRlciB0byBoZXIgZmF0aGVyIHdpbGwgSSBicmVhazs8L0xJTkU+Ci08TElORT5BbmQgdGhlIGNvbmNsdXNpb24gaXMsIHNoZSBzaGFsbCBiZSB0aGluZS48L0xJTkU+Ci08TElORT5JbiBwcmFjdGlzZSBsZXQgdXMgcHV0IGl0IHByZXNlbnRseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KLTwvU0NFTkU+Ci0KLTxTQ0VORT48VElUTEU+U0NFTkUgSUkuICBBIHJvb20gaW4gTEVPTkFUTydzIGhvdXNlLjwvVElUTEU+Ci08U1RBR0VESVI+RW50ZXIgTEVPTkFUTyBhbmQgQU5UT05JTywgbWVldGluZzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+SG93IG5vdywgYnJvdGhlciEgV2hlcmUgaXMgbXkgY291c2luLCB5b3VyIHNvbj88L0xJTkU+Ci08TElORT5oYXRoIGhlIHByb3ZpZGVkIHRoaXMgbXVzaWM/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+SGUgaXMgdmVyeSBidXN5IGFib3V0IGl0LiBCdXQsIGJyb3RoZXIsIEkgY2FuIHRlbGw8L0xJTkU+Ci08TElORT55b3Ugc3RyYW5nZSBuZXdzIHRoYXQgeW91IHlldCBkcmVhbXQgbm90IG9mLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkFyZSB0aGV5IGdvb2Q/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+QXMgdGhlIGV2ZW50IHN0YW1wcyB0aGVtOiBidXQgdGhleSBoYXZlIGEgZ29vZDwvTElORT4KLTxMSU5FPmNvdmVyOyB0aGV5IHNob3cgd2VsbCBvdXR3YXJkLiBUaGUgcHJpbmNlIGFuZCBDb3VudDwvTElORT4KLTxMSU5FPkNsYXVkaW8sIHdhbGtpbmcgaW4gYSB0aGljay1wbGVhY2hlZCBhbGxleSBpbiBtaW5lPC9MSU5FPgotPExJTkU+b3JjaGFyZCwgd2VyZSB0aHVzIG11Y2ggb3ZlcmhlYXJkIGJ5IGEgbWFuIG9mIG1pbmU6PC9MSU5FPgotPExJTkU+dGhlIHByaW5jZSBkaXNjb3ZlcmVkIHRvIENsYXVkaW8gdGhhdCBoZSBsb3ZlZCBteTwvTElORT4KLTxMSU5FPm5pZWNlIHlvdXIgZGF1Z2h0ZXIgYW5kIG1lYW50IHRvIGFja25vd2xlZGdlIGl0PC9MSU5FPgotPExJTkU+dGhpcyBuaWdodCBpbiBhIGRhbmNlOiBhbmQgaWYgaGUgZm91bmQgaGVyPC9MSU5FPgotPExJTkU+YWNjb3JkYW50LCBoZSBtZWFudCB0byB0YWtlIHRoZSBwcmVzZW50IHRpbWUgYnkgdGhlPC9MSU5FPgotPExJTkU+dG9wIGFuZCBpbnN0YW50bHkgYnJlYWsgd2l0aCB5b3Ugb2YgaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+SGF0aCB0aGUgZmVsbG93IGFueSB3aXQgdGhhdCB0b2xkIHlvdSB0aGlzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KLTxMSU5FPkEgZ29vZCBzaGFycCBmZWxsb3c6IEkgd2lsbCBzZW5kIGZvciBoaW07IGFuZDwvTElORT4KLTxMSU5FPnF1ZXN0aW9uIGhpbSB5b3Vyc2VsZi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5Obywgbm87IHdlIHdpbGwgaG9sZCBpdCBhcyBhIGRyZWFtIHRpbGwgaXQgYXBwZWFyPC9MSU5FPgotPExJTkU+aXRzZWxmOiBidXQgSSB3aWxsIGFjcXVhaW50IG15IGRhdWdodGVyIHdpdGhhbCw8L0xJTkU+Ci08TElORT50aGF0IHNoZSBtYXkgYmUgdGhlIGJldHRlciBwcmVwYXJlZCBmb3IgYW4gYW5zd2VyLDwvTElORT4KLTxMSU5FPmlmIHBlcmFkdmVudHVyZSB0aGlzIGJlIHRydWUuIEdvIHlvdSBhbmQgdGVsbCBoZXIgb2YgaXQuPC9MSU5FPgotPFNUQUdFRElSPkVudGVyIEF0dGVuZGFudHM8L1NUQUdFRElSPgotPExJTkU+Q291c2lucywgeW91IGtub3cgd2hhdCB5b3UgaGF2ZSB0byBkby4gTywgSSBjcnkgeW91PC9MSU5FPgotPExJTkU+bWVyY3ksIGZyaWVuZDsgZ28geW91IHdpdGggbWUsIGFuZCBJIHdpbGwgdXNlIHlvdXI8L0xJTkU+Ci08TElORT5za2lsbC4gR29vZCBjb3VzaW4sIGhhdmUgYSBjYXJlIHRoaXMgYnVzeSB0aW1lLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJSUkuICBUaGUgc2FtZS48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIERPTiBKT0hOIGFuZCBDT05SQURFPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5XaGF0IHRoZSBnb29kLXllYXIsIG15IGxvcmQhIHdoeSBhcmUgeW91IHRodXMgb3V0PC9MSU5FPgotPExJTkU+b2YgbWVhc3VyZSBzYWQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPlRoZXJlIGlzIG5vIG1lYXN1cmUgaW4gdGhlIG9jY2FzaW9uIHRoYXQgYnJlZWRzOzwvTElORT4KLTxMSU5FPnRoZXJlZm9yZSB0aGUgc2FkbmVzcyBpcyB3aXRob3V0IGxpbWl0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPllvdSBzaG91bGQgaGVhciByZWFzb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkFuZCB3aGVuIEkgaGF2ZSBoZWFyZCBpdCwgd2hhdCBibGVzc2luZyBicmluZ3MgaXQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgotPExJTkU+SWYgbm90IGEgcHJlc2VudCByZW1lZHksIGF0IGxlYXN0IGEgcGF0aWVudDwvTElORT4KLTxMSU5FPnN1ZmZlcmFuY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkkgd29uZGVyIHRoYXQgdGhvdSwgYmVpbmcsIGFzIHRob3Ugc2F5ZXN0IHRob3UgYXJ0LDwvTElORT4KLTxMSU5FPmJvcm4gdW5kZXIgU2F0dXJuLCBnb2VzdCBhYm91dCB0byBhcHBseSBhIG1vcmFsPC9MSU5FPgotPExJTkU+bWVkaWNpbmUgdG8gYSBtb3J0aWZ5aW5nIG1pc2NoaWVmLiBJIGNhbm5vdCBoaWRlPC9MSU5FPgotPExJTkU+d2hhdCBJIGFtOiBJIG11c3QgYmUgc2FkIHdoZW4gSSBoYXZlIGNhdXNlIGFuZCBzbWlsZTwvTElORT4KLTxMSU5FPmF0IG5vIG1hbidzIGplc3RzLCBlYXQgd2hlbiBJIGhhdmUgc3RvbWFjaCBhbmQgd2FpdDwvTElORT4KLTxMSU5FPmZvciBubyBtYW4ncyBsZWlzdXJlLCBzbGVlcCB3aGVuIEkgYW0gZHJvd3N5IGFuZDwvTElORT4KLTxMSU5FPnRlbmQgb24gbm8gbWFuJ3MgYnVzaW5lc3MsIGxhdWdoIHdoZW4gSSBhbSBtZXJyeSBhbmQ8L0xJTkU+Ci08TElORT5jbGF3IG5vIG1hbiBpbiBoaXMgaHVtb3VyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPlllYSwgYnV0IHlvdSBtdXN0IG5vdCBtYWtlIHRoZSBmdWxsIHNob3cgb2YgdGhpczwvTElORT4KLTxMSU5FPnRpbGwgeW91IG1heSBkbyBpdCB3aXRob3V0IGNvbnRyb2xtZW50LiBZb3UgaGF2ZSBvZjwvTElORT4KLTxMSU5FPmxhdGUgc3Rvb2Qgb3V0IGFnYWluc3QgeW91ciBicm90aGVyLCBhbmQgaGUgaGF0aDwvTElORT4KLTxMSU5FPnRhJ2VuIHlvdSBuZXdseSBpbnRvIGhpcyBncmFjZTsgd2hlcmUgaXQgaXM8L0xJTkU+Ci08TElORT5pbXBvc3NpYmxlIHlvdSBzaG91bGQgdGFrZSB0cnVlIHJvb3QgYnV0IGJ5IHRoZTwvTElORT4KLTxMSU5FPmZhaXIgd2VhdGhlciB0aGF0IHlvdSBtYWtlIHlvdXJzZWxmOiBpdCBpcyBuZWVkZnVsPC9MSU5FPgotPExJTkU+dGhhdCB5b3UgZnJhbWUgdGhlIHNlYXNvbiBmb3IgeW91ciBvd24gaGFydmVzdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+SSBoYWQgcmF0aGVyIGJlIGEgY2Fua2VyIGluIGEgaGVkZ2UgdGhhbiBhIHJvc2UgaW48L0xJTkU+Ci08TElORT5oaXMgZ3JhY2UsIGFuZCBpdCBiZXR0ZXIgZml0cyBteSBibG9vZCB0byBiZTwvTElORT4KLTxMSU5FPmRpc2RhaW5lZCBvZiBhbGwgdGhhbiB0byBmYXNoaW9uIGEgY2FycmlhZ2UgdG8gcm9iPC9MSU5FPgotPExJTkU+bG92ZSBmcm9tIGFueTogaW4gdGhpcywgdGhvdWdoIEkgY2Fubm90IGJlIHNhaWQgdG88L0xJTkU+Ci08TElORT5iZSBhIGZsYXR0ZXJpbmcgaG9uZXN0IG1hbiwgaXQgbXVzdCBub3QgYmUgZGVuaWVkPC9MSU5FPgotPExJTkU+YnV0IEkgYW0gYSBwbGFpbi1kZWFsaW5nIHZpbGxhaW4uIEkgYW0gdHJ1c3RlZCB3aXRoPC9MSU5FPgotPExJTkU+YSBtdXp6bGUgYW5kIGVuZnJhbmNoaXNlZCB3aXRoIGEgY2xvZzsgdGhlcmVmb3JlIEk8L0xJTkU+Ci08TElORT5oYXZlIGRlY3JlZWQgbm90IHRvIHNpbmcgaW4gbXkgY2FnZS4gSWYgSSBoYWQgbXk8L0xJTkU+Ci08TElORT5tb3V0aCwgSSB3b3VsZCBiaXRlOyBpZiBJIGhhZCBteSBsaWJlcnR5LCBJIHdvdWxkIGRvPC9MSU5FPgotPExJTkU+bXkgbGlraW5nOiBpbiB0aGUgbWVhbnRpbWUgbGV0IG1lIGJlIHRoYXQgSSBhbSBhbmQ8L0xJTkU+Ci08TElORT5zZWVrIG5vdCB0byBhbHRlciBtZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5DYW4geW91IG1ha2Ugbm8gdXNlIG9mIHlvdXIgZGlzY29udGVudD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+SSBtYWtlIGFsbCB1c2Ugb2YgaXQsIGZvciBJIHVzZSBpdCBvbmx5LjwvTElORT4KLTxMSU5FPldobyBjb21lcyBoZXJlPzwvTElORT4KLTxTVEFHRURJUj5FbnRlciBCT1JBQ0hJTzwvU1RBR0VESVI+Ci08TElORT5XaGF0IG5ld3MsIEJvcmFjaGlvPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5JIGNhbWUgeW9uZGVyIGZyb20gYSBncmVhdCBzdXBwZXI6IHRoZSBwcmluY2UgeW91cjwvTElORT4KLTxMSU5FPmJyb3RoZXIgaXMgcm95YWxseSBlbnRlcnRhaW5lZCBieSBMZW9uYXRvOiBhbmQgSTwvTElORT4KLTxMSU5FPmNhbiBnaXZlIHlvdSBpbnRlbGxpZ2VuY2Ugb2YgYW4gaW50ZW5kZWQgbWFycmlhZ2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPldpbGwgaXQgc2VydmUgZm9yIGFueSBtb2RlbCB0byBidWlsZCBtaXNjaGllZiBvbj88L0xJTkU+Ci08TElORT5XaGF0IGlzIGhlIGZvciBhIGZvb2wgdGhhdCBiZXRyb3RocyBoaW1zZWxmIHRvPC9MSU5FPgotPExJTkU+dW5xdWlldG5lc3M/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPk1hcnJ5LCBpdCBpcyB5b3VyIGJyb3RoZXIncyByaWdodCBoYW5kLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5XaG8/IHRoZSBtb3N0IGV4cXVpc2l0ZSBDbGF1ZGlvPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5FdmVuIGhlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5BIHByb3BlciBzcXVpcmUhIEFuZCB3aG8sIGFuZCB3aG8/IHdoaWNoIHdheSBsb29rczwvTElORT4KLTxMSU5FPmhlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5NYXJyeSwgb24gSGVybywgdGhlIGRhdWdodGVyIGFuZCBoZWlyIG9mIExlb25hdG8uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkEgdmVyeSBmb3J3YXJkIE1hcmNoLWNoaWNrISBIb3cgY2FtZSB5b3UgdG8gdGhpcz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+QmVpbmcgZW50ZXJ0YWluZWQgZm9yIGEgcGVyZnVtZXIsIGFzIEkgd2FzIHNtb2tpbmcgYTwvTElORT4KLTxMSU5FPm11c3R5IHJvb20sIGNvbWVzIG1lIHRoZSBwcmluY2UgYW5kIENsYXVkaW8sIGhhbmQ8L0xJTkU+Ci08TElORT5pbiBoYW5kIGluIHNhZCBjb25mZXJlbmNlOiBJIHdoaXB0IG1lIGJlaGluZCB0aGU8L0xJTkU+Ci08TElORT5hcnJhczsgYW5kIHRoZXJlIGhlYXJkIGl0IGFncmVlZCB1cG9uIHRoYXQgdGhlPC9MSU5FPgotPExJTkU+cHJpbmNlIHNob3VsZCB3b28gSGVybyBmb3IgaGltc2VsZiwgYW5kIGhhdmluZzwvTElORT4KLTxMSU5FPm9idGFpbmVkIGhlciwgZ2l2ZSBoZXIgdG8gQ291bnQgQ2xhdWRpby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+Q29tZSwgY29tZSwgbGV0IHVzIHRoaXRoZXI6IHRoaXMgbWF5IHByb3ZlIGZvb2QgdG88L0xJTkU+Ci08TElORT5teSBkaXNwbGVhc3VyZS4gVGhhdCB5b3VuZyBzdGFydC11cCBoYXRoIGFsbCB0aGU8L0xJTkU+Ci08TElORT5nbG9yeSBvZiBteSBvdmVydGhyb3c6IGlmIEkgY2FuIGNyb3NzIGhpbSBhbnkgd2F5LCBJPC9MSU5FPgotPExJTkU+Ymxlc3MgbXlzZWxmIGV2ZXJ5IHdheS4gWW91IGFyZSBib3RoIHN1cmUsIGFuZCB3aWxsIGFzc2lzdCBtZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5UbyB0aGUgZGVhdGgsIG15IGxvcmQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkxldCB1cyB0byB0aGUgZ3JlYXQgc3VwcGVyOiB0aGVpciBjaGVlciBpcyB0aGU8L0xJTkU+Ci08TElORT5ncmVhdGVyIHRoYXQgSSBhbSBzdWJkdWVkLiBXb3VsZCB0aGUgY29vayB3ZXJlIG9mPC9MSU5FPgotPExJTkU+bXkgbWluZCEgU2hhbGwgd2UgZ28gcHJvdmUgd2hhdCdzIHRvIGJlIGRvbmU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPldlJ2xsIHdhaXQgdXBvbiB5b3VyIGxvcmRzaGlwLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPC9BQ1Q+Ci0KLTxBQ1Q+PFRJVExFPkFDVCBJSTwvVElUTEU+Ci0KLTxTQ0VORT48VElUTEU+U0NFTkUgSS4gIEEgaGFsbCBpbiBMRU9OQVRPJ1MgaG91c2UuPC9USVRMRT4KLTxTVEFHRURJUj5FbnRlciBMRU9OQVRPLCBBTlRPTklPLCBIRVJPLCBCRUFUUklDRSwgYW5kIG90aGVyczwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+V2FzIG5vdCBDb3VudCBKb2huIGhlcmUgYXQgc3VwcGVyPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KLTxMSU5FPkkgc2F3IGhpbSBub3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkhvdyB0YXJ0bHkgdGhhdCBnZW50bGVtYW4gbG9va3MhIEkgbmV2ZXIgY2FuIHNlZTwvTElORT4KLTxMSU5FPmhpbSBidXQgSSBhbSBoZWFydC1idXJuZWQgYW4gaG91ciBhZnRlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5IZSBpcyBvZiBhIHZlcnkgbWVsYW5jaG9seSBkaXNwb3NpdGlvbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+SGUgd2VyZSBhbiBleGNlbGxlbnQgbWFuIHRoYXQgd2VyZSBtYWRlIGp1c3QgaW4gdGhlPC9MSU5FPgotPExJTkU+bWlkd2F5IGJldHdlZW4gaGltIGFuZCBCZW5lZGljazogdGhlIG9uZSBpcyB0b288L0xJTkU+Ci08TElORT5saWtlIGFuIGltYWdlIGFuZCBzYXlzIG5vdGhpbmcsIGFuZCB0aGUgb3RoZXIgdG9vPC9MSU5FPgotPExJTkU+bGlrZSBteSBsYWR5J3MgZWxkZXN0IHNvbiwgZXZlcm1vcmUgdGF0dGxpbmcuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+VGhlbiBoYWxmIFNpZ25pb3IgQmVuZWRpY2sncyB0b25ndWUgaW4gQ291bnQgSm9obidzPC9MSU5FPgotPExJTkU+bW91dGgsIGFuZCBoYWxmIENvdW50IEpvaG4ncyBtZWxhbmNob2x5IGluIFNpZ25pb3I8L0xJTkU+Ci08TElORT5CZW5lZGljaydzIGZhY2UsLS08L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+V2l0aCBhIGdvb2QgbGVnIGFuZCBhIGdvb2QgZm9vdCwgdW5jbGUsIGFuZCBtb25leTwvTElORT4KLTxMSU5FPmVub3VnaCBpbiBoaXMgcHVyc2UsIHN1Y2ggYSBtYW4gd291bGQgd2luIGFueSB3b21hbjwvTElORT4KLTxMSU5FPmluIHRoZSB3b3JsZCwgaWYgYScgY291bGQgZ2V0IGhlciBnb29kLXdpbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QnkgbXkgdHJvdGgsIG5pZWNlLCB0aG91IHdpbHQgbmV2ZXIgZ2V0IHRoZWUgYTwvTElORT4KLTxMSU5FPmh1c2JhbmQsIGlmIHRob3UgYmUgc28gc2hyZXdkIG9mIHRoeSB0b25ndWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+SW4gZmFpdGgsIHNoZSdzIHRvbyBjdXJzdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+VG9vIGN1cnN0IGlzIG1vcmUgdGhhbiBjdXJzdDogSSBzaGFsbCBsZXNzZW4gR29kJ3M8L0xJTkU+Ci08TElORT5zZW5kaW5nIHRoYXQgd2F5OyBmb3IgaXQgaXMgc2FpZCwgJ0dvZCBzZW5kcyBhIGN1cnN0PC9MSU5FPgotPExJTkU+Y293IHNob3J0IGhvcm5zOycgYnV0IHRvIGEgY293IHRvbyBjdXJzdCBoZSBzZW5kcyBub25lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlNvLCBieSBiZWluZyB0b28gY3Vyc3QsIEdvZCB3aWxsIHNlbmQgeW91IG5vIGhvcm5zLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5KdXN0LCBpZiBoZSBzZW5kIG1lIG5vIGh1c2JhbmQ7IGZvciB0aGUgd2hpY2g8L0xJTkU+Ci08TElORT5ibGVzc2luZyBJIGFtIGF0IGhpbSB1cG9uIG15IGtuZWVzIGV2ZXJ5IG1vcm5pbmcgYW5kPC9MSU5FPgotPExJTkU+ZXZlbmluZy4gTG9yZCwgSSBjb3VsZCBub3QgZW5kdXJlIGEgaHVzYmFuZCB3aXRoIGE8L0xJTkU+Ci08TElORT5iZWFyZCBvbiBoaXMgZmFjZTogSSBoYWQgcmF0aGVyIGxpZSBpbiB0aGUgd29vbGxlbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5Zb3UgbWF5IGxpZ2h0IG9uIGEgaHVzYmFuZCB0aGF0IGhhdGggbm8gYmVhcmQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPldoYXQgc2hvdWxkIEkgZG8gd2l0aCBoaW0/IGRyZXNzIGhpbSBpbiBteSBhcHBhcmVsPC9MSU5FPgotPExJTkU+YW5kIG1ha2UgaGltIG15IHdhaXRpbmctZ2VudGxld29tYW4/IEhlIHRoYXQgaGF0aCBhPC9MSU5FPgotPExJTkU+YmVhcmQgaXMgbW9yZSB0aGFuIGEgeW91dGgsIGFuZCBoZSB0aGF0IGhhdGggbm88L0xJTkU+Ci08TElORT5iZWFyZCBpcyBsZXNzIHRoYW4gYSBtYW46IGFuZCBoZSB0aGF0IGlzIG1vcmUgdGhhbjwvTElORT4KLTxMSU5FPmEgeW91dGggaXMgbm90IGZvciBtZSwgYW5kIGhlIHRoYXQgaXMgbGVzcyB0aGFuIGE8L0xJTkU+Ci08TElORT5tYW4sIEkgYW0gbm90IGZvciBoaW06IHRoZXJlZm9yZSwgSSB3aWxsIGV2ZW4gdGFrZTwvTElORT4KLTxMSU5FPnNpeHBlbmNlIGluIGVhcm5lc3Qgb2YgdGhlIGJlYXItd2FyZCwgYW5kIGxlYWQgaGlzPC9MSU5FPgotPExJTkU+YXBlcyBpbnRvIGhlbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+V2VsbCwgdGhlbiwgZ28geW91IGludG8gaGVsbD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+Tm8sIGJ1dCB0byB0aGUgZ2F0ZTsgYW5kIHRoZXJlIHdpbGwgdGhlIGRldmlsIG1lZXQ8L0xJTkU+Ci08TElORT5tZSwgbGlrZSBhbiBvbGQgY3Vja29sZCwgd2l0aCBob3JucyBvbiBoaXMgaGVhZCwgYW5kPC9MSU5FPgotPExJTkU+c2F5ICdHZXQgeW91IHRvIGhlYXZlbiwgQmVhdHJpY2UsIGdldCB5b3UgdG88L0xJTkU+Ci08TElORT5oZWF2ZW47IGhlcmUncyBubyBwbGFjZSBmb3IgeW91IG1haWRzOicgc28gZGVsaXZlcjwvTElORT4KLTxMSU5FPkkgdXAgbXkgYXBlcywgYW5kIGF3YXkgdG8gU2FpbnQgUGV0ZXIgZm9yIHRoZTwvTElORT4KLTxMSU5FPmhlYXZlbnM7IGhlIHNob3dzIG1lIHdoZXJlIHRoZSBiYWNoZWxvcnMgc2l0LCBhbmQ8L0xJTkU+Ci08TElORT50aGVyZSBsaXZlIHdlIGFzIG1lcnJ5IGFzIHRoZSBkYXkgaXMgbG9uZy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Ci08TElORT48U1RBR0VESVI+VG8gSEVSTzwvU1RBR0VESVI+ICBXZWxsLCBuaWVjZSwgSSB0cnVzdCB5b3Ugd2lsbCBiZSBydWxlZDwvTElORT4KLTxMSU5FPmJ5IHlvdXIgZmF0aGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5ZZXMsIGZhaXRoOyBpdCBpcyBteSBjb3VzaW4ncyBkdXR5IHRvIG1ha2UgY3VydHN5PC9MSU5FPgotPExJTkU+YW5kIHNheSAnRmF0aGVyLCBhcyBpdCBwbGVhc2UgeW91LicgQnV0IHlldCBmb3IgYWxsPC9MSU5FPgotPExJTkU+dGhhdCwgY291c2luLCBsZXQgaGltIGJlIGEgaGFuZHNvbWUgZmVsbG93LCBvciBlbHNlPC9MSU5FPgotPExJTkU+bWFrZSBhbm90aGVyIGN1cnRzeSBhbmQgc2F5ICdGYXRoZXIsIGFzIGl0IHBsZWFzZTwvTElORT4KLTxMSU5FPm1lLic8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XZWxsLCBuaWVjZSwgSSBob3BlIHRvIHNlZSB5b3Ugb25lIGRheSBmaXR0ZWQgd2l0aCBhIGh1c2JhbmQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPk5vdCB0aWxsIEdvZCBtYWtlIG1lbiBvZiBzb21lIG90aGVyIG1ldGFsIHRoYW48L0xJTkU+Ci08TElORT5lYXJ0aC4gV291bGQgaXQgbm90IGdyaWV2ZSBhIHdvbWFuIHRvIGJlPC9MSU5FPgotPExJTkU+b3Zlcm1hc3RlcmVkIHdpdGggYSBwaWVyY2Ugb2YgdmFsaWFudCBkdXN0PyB0byBtYWtlPC9MSU5FPgotPExJTkU+YW4gYWNjb3VudCBvZiBoZXIgbGlmZSB0byBhIGNsb2Qgb2Ygd2F5d2FyZCBtYXJsPzwvTElORT4KLTxMSU5FPk5vLCB1bmNsZSwgSSdsbCBub25lOiBBZGFtJ3Mgc29ucyBhcmUgbXkgYnJldGhyZW47PC9MSU5FPgotPExJTkU+YW5kLCB0cnVseSwgSSBob2xkIGl0IGEgc2luIHRvIG1hdGNoIGluIG15IGtpbmRyZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+RGF1Z2h0ZXIsIHJlbWVtYmVyIHdoYXQgSSB0b2xkIHlvdTogaWYgdGhlIHByaW5jZTwvTElORT4KLTxMSU5FPmRvIHNvbGljaXQgeW91IGluIHRoYXQga2luZCwgeW91IGtub3cgeW91ciBhbnN3ZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlRoZSBmYXVsdCB3aWxsIGJlIGluIHRoZSBtdXNpYywgY291c2luLCBpZiB5b3UgYmU8L0xJTkU+Ci08TElORT5ub3Qgd29vZWQgaW4gZ29vZCB0aW1lOiBpZiB0aGUgcHJpbmNlIGJlIHRvbzwvTElORT4KLTxMSU5FPmltcG9ydGFudCwgdGVsbCBoaW0gdGhlcmUgaXMgbWVhc3VyZSBpbiBldmVyeSB0aGluZzwvTElORT4KLTxMSU5FPmFuZCBzbyBkYW5jZSBvdXQgdGhlIGFuc3dlci4gRm9yLCBoZWFyIG1lLCBIZXJvOjwvTElORT4KLTxMSU5FPndvb2luZywgd2VkZGluZywgYW5kIHJlcGVudGluZywgaXMgYXMgYSBTY290Y2ggamlnLDwvTElORT4KLTxMSU5FPmEgbWVhc3VyZSwgYW5kIGEgY2lucXVlIHBhY2U6IHRoZSBmaXJzdCBzdWl0IGlzIGhvdDwvTElORT4KLTxMSU5FPmFuZCBoYXN0eSwgbGlrZSBhIFNjb3RjaCBqaWcsIGFuZCBmdWxsIGFzPC9MSU5FPgotPExJTkU+ZmFudGFzdGljYWw7IHRoZSB3ZWRkaW5nLCBtYW5uZXJseS1tb2Rlc3QsIGFzIGE8L0xJTkU+Ci08TElORT5tZWFzdXJlLCBmdWxsIG9mIHN0YXRlIGFuZCBhbmNpZW50cnk7IGFuZCB0aGVuIGNvbWVzPC9MSU5FPgotPExJTkU+cmVwZW50YW5jZSBhbmQsIHdpdGggaGlzIGJhZCBsZWdzLCBmYWxscyBpbnRvIHRoZTwvTElORT4KLTxMSU5FPmNpbnF1ZSBwYWNlIGZhc3RlciBhbmQgZmFzdGVyLCB0aWxsIGhlIHNpbmsgaW50byBoaXMgZ3JhdmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Q291c2luLCB5b3UgYXBwcmVoZW5kIHBhc3Npbmcgc2hyZXdkbHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkkgaGF2ZSBhIGdvb2QgZXllLCB1bmNsZTsgSSBjYW4gc2VlIGEgY2h1cmNoIGJ5IGRheWxpZ2h0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlRoZSByZXZlbGxlcnMgYXJlIGVudGVyaW5nLCBicm90aGVyOiBtYWtlIGdvb2Qgcm9vbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNUQUdFRElSPkFsbCBwdXQgb24gdGhlaXIgbWFza3M8L1NUQUdFRElSPgotPFNUQUdFRElSPkVudGVyIERPTiBQRURSTywgQ0xBVURJTywgQkVORURJQ0ssIEJBTFRIQVNBUiwKLURPTiBKT0hOLCBCT1JBQ0hJTywgTUFSR0FSRVQsIFVSU1VMQSBhbmQgb3RoZXJzLCBtYXNrZWQ8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+TGFkeSwgd2lsbCB5b3Ugd2FsayBhYm91dCB3aXRoIHlvdXIgZnJpZW5kPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPlNvIHlvdSB3YWxrIHNvZnRseSBhbmQgbG9vayBzd2VldGx5IGFuZCBzYXkgbm90aGluZyw8L0xJTkU+Ci08TElORT5JIGFtIHlvdXJzIGZvciB0aGUgd2FsazsgYW5kIGVzcGVjaWFsbHkgd2hlbiBJIHdhbGsgYXdheS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldpdGggbWUgaW4geW91ciBjb21wYW55PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPkkgbWF5IHNheSBzbywgd2hlbiBJIHBsZWFzZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkFuZCB3aGVuIHBsZWFzZSB5b3UgdG8gc2F5IHNvPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPldoZW4gSSBsaWtlIHlvdXIgZmF2b3VyOyBmb3IgR29kIGRlZmVuZCB0aGUgbHV0ZTwvTElORT4KLTxMSU5FPnNob3VsZCBiZSBsaWtlIHRoZSBjYXNlITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+TXkgdmlzb3IgaXMgUGhpbGVtb24ncyByb29mOyB3aXRoaW4gdGhlIGhvdXNlIGlzIEpvdmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+V2h5LCB0aGVuLCB5b3VyIHZpc29yIHNob3VsZCBiZSB0aGF0Y2hlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlNwZWFrIGxvdywgaWYgeW91IHNwZWFrIGxvdmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkRyYXdpbmcgaGVyIGFzaWRlPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJBTFRIQVNBUjwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIEkgd291bGQgeW91IGRpZCBsaWtlIG1lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5TbyB3b3VsZCBub3QgSSwgZm9yIHlvdXIgb3duIHNha2U7IGZvciBJIGhhdmUgbWFueTwvTElORT4KLTxMSU5FPmlsbC1xdWFsaXRpZXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Ci08TElORT5XaGljaCBpcyBvbmU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPkkgc2F5IG15IHByYXllcnMgYWxvdWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Ci08TElORT5JIGxvdmUgeW91IHRoZSBiZXR0ZXI6IHRoZSBoZWFyZXJzIG1heSBjcnksIEFtZW4uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPkdvZCBtYXRjaCBtZSB3aXRoIGEgZ29vZCBkYW5jZXIhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Ci08TElORT5BbWVuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5BbmQgR29kIGtlZXAgaGltIG91dCBvZiBteSBzaWdodCB3aGVuIHRoZSBkYW5jZSBpczwvTElORT4KLTxMSU5FPmRvbmUhIEFuc3dlciwgY2xlcmsuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Ci08TElORT5ObyBtb3JlIHdvcmRzOiB0aGUgY2xlcmsgaXMgYW5zd2VyZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Ci08TElORT5JIGtub3cgeW91IHdlbGwgZW5vdWdoOyB5b3UgYXJlIFNpZ25pb3IgQW50b25pby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Ci08TElORT5BdCBhIHdvcmQsIEkgYW0gbm90LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgotPExJTkU+SSBrbm93IHlvdSBieSB0aGUgd2FnZ2xpbmcgb2YgeW91ciBoZWFkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KLTxMSU5FPlRvIHRlbGwgeW91IHRydWUsIEkgY291bnRlcmZlaXQgaGltLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgotPExJTkU+WW91IGNvdWxkIG5ldmVyIGRvIGhpbSBzbyBpbGwtd2VsbCwgdW5sZXNzIHlvdSB3ZXJlPC9MSU5FPgotPExJTkU+dGhlIHZlcnkgbWFuLiBIZXJlJ3MgaGlzIGRyeSBoYW5kIHVwIGFuZCBkb3duOiB5b3U8L0xJTkU+Ci08TElORT5hcmUgaGUsIHlvdSBhcmUgaGUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+QXQgYSB3b3JkLCBJIGFtIG5vdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPkNvbWUsIGNvbWUsIGRvIHlvdSB0aGluayBJIGRvIG5vdCBrbm93IHlvdSBieSB5b3VyPC9MSU5FPgotPExJTkU+ZXhjZWxsZW50IHdpdD8gY2FuIHZpcnR1ZSBoaWRlIGl0c2VsZj8gR28gdG8sPC9MSU5FPgotPExJTkU+bXVtLCB5b3UgYXJlIGhlOiBncmFjZXMgd2lsbCBhcHBlYXIsIGFuZCB0aGVyZSdzIGFuPC9MSU5FPgotPExJTkU+ZW5kLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5XaWxsIHlvdSBub3QgdGVsbCBtZSB3aG8gdG9sZCB5b3Ugc28/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPk5vLCB5b3Ugc2hhbGwgcGFyZG9uIG1lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5Ob3Igd2lsbCB5b3Ugbm90IHRlbGwgbWUgd2hvIHlvdSBhcmU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPk5vdCBub3cuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlRoYXQgSSB3YXMgZGlzZGFpbmZ1bCwgYW5kIHRoYXQgSSBoYWQgbXkgZ29vZCB3aXQ8L0xJTkU+Ci08TElORT5vdXQgb2YgdGhlICdIdW5kcmVkIE1lcnJ5IFRhbGVzOictLXdlbGwgdGhpcyB3YXM8L0xJTkU+Ci08TElORT5TaWduaW9yIEJlbmVkaWNrIHRoYXQgc2FpZCBzby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+V2hhdCdzIGhlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JIGFtIHN1cmUgeW91IGtub3cgaGltIHdlbGwgZW5vdWdoLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Ob3QgSSwgYmVsaWV2ZSBtZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+RGlkIGhlIG5ldmVyIG1ha2UgeW91IGxhdWdoPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5JIHByYXkgeW91LCB3aGF0IGlzIGhlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5XaHksIGhlIGlzIHRoZSBwcmluY2UncyBqZXN0ZXI6IGEgdmVyeSBkdWxsIGZvb2w7PC9MSU5FPgotPExJTkU+b25seSBoaXMgZ2lmdCBpcyBpbiBkZXZpc2luZyBpbXBvc3NpYmxlIHNsYW5kZXJzOjwvTElORT4KLTxMSU5FPm5vbmUgYnV0IGxpYmVydGluZXMgZGVsaWdodCBpbiBoaW07IGFuZCB0aGU8L0xJTkU+Ci08TElORT5jb21tZW5kYXRpb24gaXMgbm90IGluIGhpcyB3aXQsIGJ1dCBpbiBoaXMgdmlsbGFueTs8L0xJTkU+Ci08TElORT5mb3IgaGUgYm90aCBwbGVhc2VzIG1lbiBhbmQgYW5nZXJzIHRoZW0sIGFuZCB0aGVuPC9MSU5FPgotPExJTkU+dGhleSBsYXVnaCBhdCBoaW0gYW5kIGJlYXQgaGltLiBJIGFtIHN1cmUgaGUgaXMgaW48L0xJTkU+Ci08TElORT50aGUgZmxlZXQ6IEkgd291bGQgaGUgaGFkIGJvYXJkZWQgbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPldoZW4gSSBrbm93IHRoZSBnZW50bGVtYW4sIEknbGwgdGVsbCBoaW0gd2hhdCB5b3Ugc2F5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5EbywgZG86IGhlJ2xsIGJ1dCBicmVhayBhIGNvbXBhcmlzb24gb3IgdHdvIG9uIG1lOzwvTElORT4KLTxMSU5FPndoaWNoLCBwZXJhZHZlbnR1cmUgbm90IG1hcmtlZCBvciBub3QgbGF1Z2hlZCBhdCw8L0xJTkU+Ci08TElORT5zdHJpa2VzIGhpbSBpbnRvIG1lbGFuY2hvbHk7IGFuZCB0aGVuIHRoZXJlJ3MgYTwvTElORT4KLTxMSU5FPnBhcnRyaWRnZSB3aW5nIHNhdmVkLCBmb3IgdGhlIGZvb2wgd2lsbCBlYXQgbm88L0xJTkU+Ci08TElORT5zdXBwZXIgdGhhdCBuaWdodC48L0xJTkU+Ci08U1RBR0VESVI+TXVzaWM8L1NUQUdFRElSPgotPExJTkU+V2UgbXVzdCBmb2xsb3cgdGhlIGxlYWRlcnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkluIGV2ZXJ5IGdvb2QgdGhpbmcuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPk5heSwgaWYgdGhleSBsZWFkIHRvIGFueSBpbGwsIEkgd2lsbCBsZWF2ZSB0aGVtIGF0PC9MSU5FPgotPExJTkU+dGhlIG5leHQgdHVybmluZy48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RGFuY2UuIFRoZW4gZXhldW50IGFsbCBleGNlcHQgRE9OIEpPSE4sIEJPUkFDSElPLAotYW5kIENMQVVESU88L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5TdXJlIG15IGJyb3RoZXIgaXMgYW1vcm91cyBvbiBIZXJvIGFuZCBoYXRoPC9MSU5FPgotPExJTkU+d2l0aGRyYXduIGhlciBmYXRoZXIgdG8gYnJlYWsgd2l0aCBoaW0gYWJvdXQgaXQuPC9MSU5FPgotPExJTkU+VGhlIGxhZGllcyBmb2xsb3cgaGVyIGFuZCBidXQgb25lIHZpc29yIHJlbWFpbnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPkFuZCB0aGF0IGlzIENsYXVkaW86IEkga25vdyBoaW0gYnkgaGlzIGJlYXJpbmcuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkFyZSBub3QgeW91IFNpZ25pb3IgQmVuZWRpY2s/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+WW91IGtub3cgbWUgd2VsbDsgSSBhbSBoZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+U2lnbmlvciwgeW91IGFyZSB2ZXJ5IG5lYXIgbXkgYnJvdGhlciBpbiBoaXMgbG92ZTo8L0xJTkU+Ci08TElORT5oZSBpcyBlbmFtb3VyZWQgb24gSGVybzsgSSBwcmF5IHlvdSwgZGlzc3VhZGUgaGltPC9MSU5FPgotPExJTkU+ZnJvbSBoZXI6IHNoZSBpcyBubyBlcXVhbCBmb3IgaGlzIGJpcnRoOiB5b3UgbWF5PC9MSU5FPgotPExJTkU+ZG8gdGhlIHBhcnQgb2YgYW4gaG9uZXN0IG1hbiBpbiBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Ib3cga25vdyB5b3UgaGUgbG92ZXMgaGVyPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5JIGhlYXJkIGhpbSBzd2VhciBoaXMgYWZmZWN0aW9uLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5TbyBkaWQgSSB0b287IGFuZCBoZSBzd29yZSBoZSB3b3VsZCBtYXJyeSBoZXIgdG8tbmlnaHQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkNvbWUsIGxldCB1cyB0byB0aGUgYmFucXVldC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50IERPTiBKT0hOIGFuZCBCT1JBQ0hJTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+VGh1cyBhbnN3ZXIgSSBpbiB0aGUgbmFtZSBvZiBCZW5lZGljayw8L0xJTkU+Ci08TElORT5CdXQgaGVhciB0aGVzZSBpbGwgbmV3cyB3aXRoIHRoZSBlYXJzIG9mIENsYXVkaW8uPC9MSU5FPgotPExJTkU+J1RpcyBjZXJ0YWluIHNvOyB0aGUgcHJpbmNlIHdvb2VzIGZvciBoaW1zZWxmLjwvTElORT4KLTxMSU5FPkZyaWVuZHNoaXAgaXMgY29uc3RhbnQgaW4gYWxsIG90aGVyIHRoaW5nczwvTElORT4KLTxMSU5FPlNhdmUgaW4gdGhlIG9mZmljZSBhbmQgYWZmYWlycyBvZiBsb3ZlOjwvTElORT4KLTxMSU5FPlRoZXJlZm9yZSwgYWxsIGhlYXJ0cyBpbiBsb3ZlIHVzZSB0aGVpciBvd24gdG9uZ3Vlczs8L0xJTkU+Ci08TElORT5MZXQgZXZlcnkgZXllIG5lZ290aWF0ZSBmb3IgaXRzZWxmPC9MSU5FPgotPExJTkU+QW5kIHRydXN0IG5vIGFnZW50OyBmb3IgYmVhdXR5IGlzIGEgd2l0Y2g8L0xJTkU+Ci08TElORT5BZ2FpbnN0IHdob3NlIGNoYXJtcyBmYWl0aCBtZWx0ZXRoIGludG8gYmxvb2QuPC9MSU5FPgotPExJTkU+VGhpcyBpcyBhbiBhY2NpZGVudCBvZiBob3VybHkgcHJvb2YsPC9MSU5FPgotPExJTkU+V2hpY2ggSSBtaXN0cnVzdGVkIG5vdC4gRmFyZXdlbGwsIHRoZXJlZm9yZSwgSGVybyE8L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+UmUtZW50ZXIgQkVORURJQ0s8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Db3VudCBDbGF1ZGlvPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPlllYSwgdGhlIHNhbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkNvbWUsIHdpbGwgeW91IGdvIHdpdGggbWU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+V2hpdGhlcj88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+RXZlbiB0byB0aGUgbmV4dCB3aWxsb3csIGFib3V0IHlvdXIgb3duIGJ1c2luZXNzLDwvTElORT4KLTxMSU5FPmNvdW50eS4gV2hhdCBmYXNoaW9uIHdpbGwgeW91IHdlYXIgdGhlIGdhcmxhbmQgb2Y/PC9MSU5FPgotPExJTkU+YWJvdXQgeW91ciBuZWNrLCBsaWtlIGFuIHVzdXJlcidzIGNoYWluPyBvciB1bmRlcjwvTElORT4KLTxMSU5FPnlvdXIgYXJtLCBsaWtlIGEgbGlldXRlbmFudCdzIHNjYXJmPyBZb3UgbXVzdCB3ZWFyPC9MSU5FPgotPExJTkU+aXQgb25lIHdheSwgZm9yIHRoZSBwcmluY2UgaGF0aCBnb3QgeW91ciBIZXJvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkkgd2lzaCBoaW0gam95IG9mIGhlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+V2h5LCB0aGF0J3Mgc3Bva2VuIGxpa2UgYW4gaG9uZXN0IGRyb3ZpZXI6IHNvIHRoZXk8L0xJTkU+Ci08TElORT5zZWxsIGJ1bGxvY2tzLiBCdXQgZGlkIHlvdSB0aGluayB0aGUgcHJpbmNlIHdvdWxkPC9MSU5FPgotPExJTkU+aGF2ZSBzZXJ2ZWQgeW91IHRodXM/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SSBwcmF5IHlvdSwgbGVhdmUgbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkhvISBub3cgeW91IHN0cmlrZSBsaWtlIHRoZSBibGluZCBtYW46ICd0d2FzIHRoZTwvTElORT4KLTxMSU5FPmJveSB0aGF0IHN0b2xlIHlvdXIgbWVhdCwgYW5kIHlvdSdsbCBiZWF0IHRoZSBwb3N0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPklmIGl0IHdpbGwgbm90IGJlLCBJJ2xsIGxlYXZlIHlvdS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhpdDwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkFsYXMsIHBvb3IgaHVydCBmb3dsISBub3cgd2lsbCBoZSBjcmVlcCBpbnRvIHNlZGdlcy48L0xJTkU+Ci08TElORT5CdXQgdGhhdCBteSBMYWR5IEJlYXRyaWNlIHNob3VsZCBrbm93IG1lLCBhbmQgbm90PC9MSU5FPgotPExJTkU+a25vdyBtZSEgVGhlIHByaW5jZSdzIGZvb2whIEhhPyBJdCBtYXkgYmUgSSBnbzwvTElORT4KLTxMSU5FPnVuZGVyIHRoYXQgdGl0bGUgYmVjYXVzZSBJIGFtIG1lcnJ5LiBZZWEsIGJ1dCBzbyBJPC9MSU5FPgotPExJTkU+YW0gYXB0IHRvIGRvIG15c2VsZiB3cm9uZzsgSSBhbSBub3Qgc28gcmVwdXRlZDogaXQ8L0xJTkU+Ci08TElORT5pcyB0aGUgYmFzZSwgdGhvdWdoIGJpdHRlciwgZGlzcG9zaXRpb24gb2YgQmVhdHJpY2U8L0xJTkU+Ci08TElORT50aGF0IHB1dHMgdGhlIHdvcmxkIGludG8gaGVyIHBlcnNvbiBhbmQgc28gZ2l2ZXMgbWU8L0xJTkU+Ci08TElORT5vdXQuIFdlbGwsIEknbGwgYmUgcmV2ZW5nZWQgYXMgSSBtYXkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPlJlLWVudGVyIERPTiBQRURSTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Ob3csIHNpZ25pb3IsIHdoZXJlJ3MgdGhlIGNvdW50PyBkaWQgeW91IHNlZSBoaW0/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRyb3RoLCBteSBsb3JkLCBJIGhhdmUgcGxheWVkIHRoZSBwYXJ0IG9mIExhZHkgRmFtZS48L0xJTkU+Ci08TElORT5JIGZvdW5kIGhpbSBoZXJlIGFzIG1lbGFuY2hvbHkgYXMgYSBsb2RnZSBpbiBhPC9MSU5FPgotPExJTkU+d2FycmVuOiBJIHRvbGQgaGltLCBhbmQgSSB0aGluayBJIHRvbGQgaGltIHRydWUsPC9MSU5FPgotPExJTkU+dGhhdCB5b3VyIGdyYWNlIGhhZCBnb3QgdGhlIGdvb2Qgd2lsbCBvZiB0aGlzIHlvdW5nPC9MSU5FPgotPExJTkU+bGFkeTsgYW5kIEkgb2ZmZXJlZCBoaW0gbXkgY29tcGFueSB0byBhIHdpbGxvdy10cmVlLDwvTElORT4KLTxMSU5FPmVpdGhlciB0byBtYWtlIGhpbSBhIGdhcmxhbmQsIGFzIGJlaW5nIGZvcnNha2VuLCBvcjwvTElORT4KLTxMSU5FPnRvIGJpbmQgaGltIHVwIGEgcm9kLCBhcyBiZWluZyB3b3J0aHkgdG8gYmUgd2hpcHBlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlRvIGJlIHdoaXBwZWQhIFdoYXQncyBoaXMgZmF1bHQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRoZSBmbGF0IHRyYW5zZ3Jlc3Npb24gb2YgYSBzY2hvb2xib3ksIHdobywgYmVpbmc8L0xJTkU+Ci08TElORT5vdmVyam95ZWQgd2l0aCBmaW5kaW5nIGEgYmlyZHMnIG5lc3QsIHNob3dzIGl0IGhpczwvTElORT4KLTxMSU5FPmNvbXBhbmlvbiwgYW5kIGhlIHN0ZWFscyBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldpbHQgdGhvdSBtYWtlIGEgdHJ1c3QgYSB0cmFuc2dyZXNzaW9uPyBUaGU8L0xJTkU+Ci08TElORT50cmFuc2dyZXNzaW9uIGlzIGluIHRoZSBzdGVhbGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5ZZXQgaXQgaGFkIG5vdCBiZWVuIGFtaXNzIHRoZSByb2QgaGFkIGJlZW4gbWFkZSw8L0xJTkU+Ci08TElORT5hbmQgdGhlIGdhcmxhbmQgdG9vOyBmb3IgdGhlIGdhcmxhbmQgaGUgbWlnaHQgaGF2ZTwvTElORT4KLTxMSU5FPndvcm4gaGltc2VsZiwgYW5kIHRoZSByb2QgaGUgbWlnaHQgaGF2ZSBiZXN0b3dlZCBvbjwvTElORT4KLTxMSU5FPnlvdSwgd2hvLCBhcyBJIHRha2UgaXQsIGhhdmUgc3RvbGVuIGhpcyBiaXJkcycgbmVzdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkkgd2lsbCBidXQgdGVhY2ggdGhlbSB0byBzaW5nLCBhbmQgcmVzdG9yZSB0aGVtIHRvPC9MSU5FPgotPExJTkU+dGhlIG93bmVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5JZiB0aGVpciBzaW5naW5nIGFuc3dlciB5b3VyIHNheWluZywgYnkgbXkgZmFpdGgsPC9MSU5FPgotPExJTkU+eW91IHNheSBob25lc3RseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlRoZSBMYWR5IEJlYXRyaWNlIGhhdGggYSBxdWFycmVsIHRvIHlvdTogdGhlPC9MSU5FPgotPExJTkU+Z2VudGxlbWFuIHRoYXQgZGFuY2VkIHdpdGggaGVyIHRvbGQgaGVyIHNoZSBpcyBtdWNoPC9MSU5FPgotPExJTkU+d3JvbmdlZCBieSB5b3UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPk8sIHNoZSBtaXN1c2VkIG1lIHBhc3QgdGhlIGVuZHVyYW5jZSBvZiBhIGJsb2NrITwvTElORT4KLTxMSU5FPmFuIG9hayBidXQgd2l0aCBvbmUgZ3JlZW4gbGVhZiBvbiBpdCB3b3VsZCBoYXZlPC9MSU5FPgotPExJTkU+YW5zd2VyZWQgaGVyOyBteSB2ZXJ5IHZpc29yIGJlZ2FuIHRvIGFzc3VtZSBsaWZlIGFuZDwvTElORT4KLTxMSU5FPnNjb2xkIHdpdGggaGVyLiBTaGUgdG9sZCBtZSwgbm90IHRoaW5raW5nIEkgaGFkIGJlZW48L0xJTkU+Ci08TElORT5teXNlbGYsIHRoYXQgSSB3YXMgdGhlIHByaW5jZSdzIGplc3RlciwgdGhhdCBJIHdhczwvTElORT4KLTxMSU5FPmR1bGxlciB0aGFuIGEgZ3JlYXQgdGhhdzsgaHVkZGxpbmcgamVzdCB1cG9uIGplc3Q8L0xJTkU+Ci08TElORT53aXRoIHN1Y2ggaW1wb3NzaWJsZSBjb252ZXlhbmNlIHVwb24gbWUgdGhhdCBJIHN0b29kPC9MSU5FPgotPExJTkU+bGlrZSBhIG1hbiBhdCBhIG1hcmssIHdpdGggYSB3aG9sZSBhcm15IHNob290aW5nIGF0PC9MSU5FPgotPExJTkU+bWUuIFNoZSBzcGVha3MgcG9uaWFyZHMsIGFuZCBldmVyeSB3b3JkIHN0YWJzOjwvTElORT4KLTxMSU5FPmlmIGhlciBicmVhdGggd2VyZSBhcyB0ZXJyaWJsZSBhcyBoZXIgdGVybWluYXRpb25zLDwvTElORT4KLTxMSU5FPnRoZXJlIHdlcmUgbm8gbGl2aW5nIG5lYXIgaGVyOyBzaGUgd291bGQgaW5mZWN0IHRvPC9MSU5FPgotPExJTkU+dGhlIG5vcnRoIHN0YXIuIEkgd291bGQgbm90IG1hcnJ5IGhlciwgdGhvdWdoIHNoZTwvTElORT4KLTxMSU5FPndlcmUgZW5kb3dlZCB3aXRoIGFsbCB0aGF0IEFkYW0gYmFkIGxlZnQgaGltIGJlZm9yZTwvTElORT4KLTxMSU5FPmhlIHRyYW5zZ3Jlc3NlZDogc2hlIHdvdWxkIGhhdmUgbWFkZSBIZXJjdWxlcyBoYXZlPC9MSU5FPgotPExJTkU+dHVybmVkIHNwaXQsIHllYSwgYW5kIGhhdmUgY2xlZnQgaGlzIGNsdWIgdG8gbWFrZTwvTElORT4KLTxMSU5FPnRoZSBmaXJlIHRvby4gQ29tZSwgdGFsayBub3Qgb2YgaGVyOiB5b3Ugc2hhbGwgZmluZDwvTElORT4KLTxMSU5FPmhlciB0aGUgaW5mZXJuYWwgQXRlIGluIGdvb2QgYXBwYXJlbC4gSSB3b3VsZCB0byBHb2Q8L0xJTkU+Ci08TElORT5zb21lIHNjaG9sYXIgd291bGQgY29uanVyZSBoZXI7IGZvciBjZXJ0YWlubHksIHdoaWxlPC9MSU5FPgotPExJTkU+c2hlIGlzIGhlcmUsIGEgbWFuIG1heSBsaXZlIGFzIHF1aWV0IGluIGhlbGwgYXMgaW4gYTwvTElORT4KLTxMSU5FPnNhbmN0dWFyeTsgYW5kIHBlb3BsZSBzaW4gdXBvbiBwdXJwb3NlLCBiZWNhdXNlIHRoZXk8L0xJTkU+Ci08TElORT53b3VsZCBnbyB0aGl0aGVyOyBzbywgaW5kZWVkLCBhbGwgZGlzcXVpZXQsIGhvcnJvcjwvTElORT4KLTxMSU5FPmFuZCBwZXJ0dXJiYXRpb24gZm9sbG93cyBoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Mb29rLCBoZXJlIHNoZSBjb21lcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RW50ZXIgQ0xBVURJTywgQkVBVFJJQ0UsIEhFUk8sIGFuZCBMRU9OQVRPPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+V2lsbCB5b3VyIGdyYWNlIGNvbW1hbmQgbWUgYW55IHNlcnZpY2UgdG8gdGhlPC9MSU5FPgotPExJTkU+d29ybGQncyBlbmQ/IEkgd2lsbCBnbyBvbiB0aGUgc2xpZ2h0ZXN0IGVycmFuZCBub3c8L0xJTkU+Ci08TElORT50byB0aGUgQW50aXBvZGVzIHRoYXQgeW91IGNhbiBkZXZpc2UgdG8gc2VuZCBtZSBvbjs8L0xJTkU+Ci08TElORT5JIHdpbGwgZmV0Y2ggeW91IGEgdG9vdGgtcGlja2VyIG5vdyBmcm9tIHRoZTwvTElORT4KLTxMSU5FPmZ1cnRoZXN0IGluY2ggb2YgQXNpYSwgYnJpbmcgeW91IHRoZSBsZW5ndGggb2Y8L0xJTkU+Ci08TElORT5QcmVzdGVyIEpvaG4ncyBmb290LCBmZXRjaCB5b3UgYSBoYWlyIG9mZiB0aGUgZ3JlYXQ8L0xJTkU+Ci08TElORT5DaGFtJ3MgYmVhcmQsIGRvIHlvdSBhbnkgZW1iYXNzYWdlIHRvIHRoZSBQaWdtaWVzLDwvTElORT4KLTxMSU5FPnJhdGhlciB0aGFuIGhvbGQgdGhyZWUgd29yZHMnIGNvbmZlcmVuY2Ugd2l0aCB0aGlzPC9MSU5FPgotPExJTkU+aGFycHkuIFlvdSBoYXZlIG5vIGVtcGxveW1lbnQgZm9yIG1lPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+Tm9uZSwgYnV0IHRvIGRlc2lyZSB5b3VyIGdvb2QgY29tcGFueS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+TyBHb2QsIHNpciwgaGVyZSdzIGEgZGlzaCBJIGxvdmUgbm90OiBJIGNhbm5vdDwvTElORT4KLTxMSU5FPmVuZHVyZSBteSBMYWR5IFRvbmd1ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhpdDwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Db21lLCBsYWR5LCBjb21lOyB5b3UgaGF2ZSBsb3N0IHRoZSBoZWFydCBvZjwvTElORT4KLTxMSU5FPlNpZ25pb3IgQmVuZWRpY2suPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkluZGVlZCwgbXkgbG9yZCwgaGUgbGVudCBpdCBtZSBhd2hpbGU7IGFuZCBJIGdhdmU8L0xJTkU+Ci08TElORT5oaW0gdXNlIGZvciBpdCwgYSBkb3VibGUgaGVhcnQgZm9yIGhpcyBzaW5nbGUgb25lOjwvTElORT4KLTxMSU5FPm1hcnJ5LCBvbmNlIGJlZm9yZSBoZSB3b24gaXQgb2YgbWUgd2l0aCBmYWxzZSBkaWNlLDwvTElORT4KLTxMSU5FPnRoZXJlZm9yZSB5b3VyIGdyYWNlIG1heSB3ZWxsIHNheSBJIGhhdmUgbG9zdCBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPllvdSBoYXZlIHB1dCBoaW0gZG93biwgbGFkeSwgeW91IGhhdmUgcHV0IGhpbSBkb3duLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5TbyBJIHdvdWxkIG5vdCBoZSBzaG91bGQgZG8gbWUsIG15IGxvcmQsIGxlc3QgSTwvTElORT4KLTxMSU5FPnNob3VsZCBwcm92ZSB0aGUgbW90aGVyIG9mIGZvb2xzLiBJIGhhdmUgYnJvdWdodDwvTElORT4KLTxMSU5FPkNvdW50IENsYXVkaW8sIHdob20geW91IHNlbnQgbWUgdG8gc2Vlay48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldoeSwgaG93IG5vdywgY291bnQhIHdoZXJlZm9yZSBhcmUgeW91IHNhZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Ob3Qgc2FkLCBteSBsb3JkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SG93IHRoZW4/IHNpY2s/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+TmVpdGhlciwgbXkgbG9yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+VGhlIGNvdW50IGlzIG5laXRoZXIgc2FkLCBub3Igc2ljaywgbm9yIG1lcnJ5LCBub3I8L0xJTkU+Ci08TElORT53ZWxsOyBidXQgY2l2aWwgY291bnQsIGNpdmlsIGFzIGFuIG9yYW5nZSwgYW5kPC9MSU5FPgotPExJTkU+c29tZXRoaW5nIG9mIHRoYXQgamVhbG91cyBjb21wbGV4aW9uLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SScgZmFpdGgsIGxhZHksIEkgdGhpbmsgeW91ciBibGF6b24gdG8gYmUgdHJ1ZTs8L0xJTkU+Ci08TElORT50aG91Z2gsIEknbGwgYmUgc3dvcm4sIGlmIGhlIGJlIHNvLCBoaXMgY29uY2VpdCBpczwvTElORT4KLTxMSU5FPmZhbHNlLiBIZXJlLCBDbGF1ZGlvLCBJIGhhdmUgd29vZWQgaW4gdGh5IG5hbWUsIGFuZDwvTElORT4KLTxMSU5FPmZhaXIgSGVybyBpcyB3b246IEkgaGF2ZSBicm9rZSB3aXRoIGhlciBmYXRoZXIsPC9MSU5FPgotPExJTkU+YW5kIGhpcyBnb29kIHdpbGwgb2J0YWluZWQ6IG5hbWUgdGhlIGRheSBvZjwvTElORT4KLTxMSU5FPm1hcnJpYWdlLCBhbmQgR29kIGdpdmUgdGhlZSBqb3khPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Q291bnQsIHRha2Ugb2YgbWUgbXkgZGF1Z2h0ZXIsIGFuZCB3aXRoIGhlciBteTwvTElORT4KLTxMSU5FPmZvcnR1bmVzOiBoaXMgZ3JhY2UgaGF0aCBtYWRlIHRoZSBtYXRjaCwgYW5kIGFuPC9MSU5FPgotPExJTkU+Z3JhY2Ugc2F5IEFtZW4gdG8gaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlNwZWFrLCBjb3VudCwgJ3RpcyB5b3VyIGN1ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5TaWxlbmNlIGlzIHRoZSBwZXJmZWN0ZXN0IGhlcmFsZCBvZiBqb3k6IEkgd2VyZTwvTElORT4KLTxMSU5FPmJ1dCBsaXR0bGUgaGFwcHksIGlmIEkgY291bGQgc2F5IGhvdyBtdWNoLiBMYWR5LCBhczwvTElORT4KLTxMSU5FPnlvdSBhcmUgbWluZSwgSSBhbSB5b3VyczogSSBnaXZlIGF3YXkgbXlzZWxmIGZvcjwvTElORT4KLTxMSU5FPnlvdSBhbmQgZG90ZSB1cG9uIHRoZSBleGNoYW5nZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+U3BlYWssIGNvdXNpbjsgb3IsIGlmIHlvdSBjYW5ub3QsIHN0b3AgaGlzIG1vdXRoPC9MSU5FPgotPExJTkU+d2l0aCBhIGtpc3MsIGFuZCBsZXQgbm90IGhpbSBzcGVhayBuZWl0aGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SW4gZmFpdGgsIGxhZHksIHlvdSBoYXZlIGEgbWVycnkgaGVhcnQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlllYSwgbXkgbG9yZDsgSSB0aGFuayBpdCwgcG9vciBmb29sLCBpdCBrZWVwcyBvbjwvTElORT4KLTxMSU5FPnRoZSB3aW5keSBzaWRlIG9mIGNhcmUuIE15IGNvdXNpbiB0ZWxscyBoaW0gaW4gaGlzPC9MSU5FPgotPExJTkU+ZWFyIHRoYXQgaGUgaXMgaW4gaGVyIGhlYXJ0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkFuZCBzbyBzaGUgZG90aCwgY291c2luLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5Hb29kIExvcmQsIGZvciBhbGxpYW5jZSEgVGh1cyBnb2VzIGV2ZXJ5IG9uZSB0byB0aGU8L0xJTkU+Ci08TElORT53b3JsZCBidXQgSSwgYW5kIEkgYW0gc3VuYnVybnQ7IEkgbWF5IHNpdCBpbiBhPC9MSU5FPgotPExJTkU+Y29ybmVyIGFuZCBjcnkgaGVpZ2gtaG8gZm9yIGEgaHVzYmFuZCE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkxhZHkgQmVhdHJpY2UsIEkgd2lsbCBnZXQgeW91IG9uZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+SSB3b3VsZCByYXRoZXIgaGF2ZSBvbmUgb2YgeW91ciBmYXRoZXIncyBnZXR0aW5nLjwvTElORT4KLTxMSU5FPkhhdGggeW91ciBncmFjZSBuZSdlciBhIGJyb3RoZXIgbGlrZSB5b3U/IFlvdXI8L0xJTkU+Ci08TElORT5mYXRoZXIgZ290IGV4Y2VsbGVudCBodXNiYW5kcywgaWYgYSBtYWlkIGNvdWxkIGNvbWUgYnkgdGhlbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldpbGwgeW91IGhhdmUgbWUsIGxhZHk/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPk5vLCBteSBsb3JkLCB1bmxlc3MgSSBtaWdodCBoYXZlIGFub3RoZXIgZm9yPC9MSU5FPgotPExJTkU+d29ya2luZy1kYXlzOiB5b3VyIGdyYWNlIGlzIHRvbyBjb3N0bHkgdG8gd2VhcjwvTElORT4KLTxMSU5FPmV2ZXJ5IGRheS4gQnV0LCBJIGJlc2VlY2ggeW91ciBncmFjZSwgcGFyZG9uIG1lOiBJPC9MSU5FPgotPExJTkU+d2FzIGJvcm4gdG8gc3BlYWsgYWxsIG1pcnRoIGFuZCBubyBtYXR0ZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Zb3VyIHNpbGVuY2UgbW9zdCBvZmZlbmRzIG1lLCBhbmQgdG8gYmUgbWVycnkgYmVzdDwvTElORT4KLTxMSU5FPmJlY29tZXMgeW91OyBmb3IsIG91dCBvZiBxdWVzdGlvbiwgeW91IHdlcmUgYm9ybiBpbjwvTElORT4KLTxMSU5FPmEgbWVycnkgaG91ci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+Tm8sIHN1cmUsIG15IGxvcmQsIG15IG1vdGhlciBjcmllZDsgYnV0IHRoZW4gdGhlcmU8L0xJTkU+Ci08TElORT53YXMgYSBzdGFyIGRhbmNlZCwgYW5kIHVuZGVyIHRoYXQgd2FzIEkgYm9ybi48L0xJTkU+Ci08TElORT5Db3VzaW5zLCBHb2QgZ2l2ZSB5b3Ugam95ITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPk5pZWNlLCB3aWxsIHlvdSBsb29rIHRvIHRob3NlIHRoaW5ncyBJIHRvbGQgeW91IG9mPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JIGNyeSB5b3UgbWVyY3ksIHVuY2xlLiBCeSB5b3VyIGdyYWNlJ3MgcGFyZG9uLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkJ5IG15IHRyb3RoLCBhIHBsZWFzYW50LXNwaXJpdGVkIGxhZHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+VGhlcmUncyBsaXR0bGUgb2YgdGhlIG1lbGFuY2hvbHkgZWxlbWVudCBpbiBoZXIsIG15PC9MSU5FPgotPExJTkU+bG9yZDogc2hlIGlzIG5ldmVyIHNhZCBidXQgd2hlbiBzaGUgc2xlZXBzLCBhbmQ8L0xJTkU+Ci08TElORT5ub3QgZXZlciBzYWQgdGhlbjsgZm9yIEkgaGF2ZSBoZWFyZCBteSBkYXVnaHRlciBzYXksPC9MSU5FPgotPExJTkU+c2hlIGhhdGggb2Z0ZW4gZHJlYW1lZCBvZiB1bmhhcHBpbmVzcyBhbmQgd2FrZWQ8L0xJTkU+Ci08TElORT5oZXJzZWxmIHdpdGggbGF1Z2hpbmcuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5TaGUgY2Fubm90IGVuZHVyZSB0byBoZWFyIHRlbGwgb2YgYSBodXNiYW5kLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPk8sIGJ5IG5vIG1lYW5zOiBzaGUgbW9ja3MgYWxsIGhlciB3b29lcnMgb3V0IG9mIHN1aXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5TaGUgd2VyZSBhbiBleGNlbGxlbnQgd2lmZSBmb3IgQmVuZWRpY3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+TyBMb3JkLCBteSBsb3JkLCBpZiB0aGV5IHdlcmUgYnV0IGEgd2VlayBtYXJyaWVkLDwvTElORT4KLTxMSU5FPnRoZXkgd291bGQgdGFsayB0aGVtc2VsdmVzIG1hZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkNvdW50eSBDbGF1ZGlvLCB3aGVuIG1lYW4geW91IHRvIGdvIHRvIGNodXJjaD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Uby1tb3Jyb3csIG15IGxvcmQ6IHRpbWUgZ29lcyBvbiBjcnV0Y2hlcyB0aWxsIGxvdmU8L0xJTkU+Ci08TElORT5oYXZlIGFsbCBoaXMgcml0ZXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Tm90IHRpbGwgTW9uZGF5LCBteSBkZWFyIHNvbiwgd2hpY2ggaXMgaGVuY2UgYSBqdXN0PC9MSU5FPgotPExJTkU+c2V2ZW4tbmlnaHQ7IGFuZCBhIHRpbWUgdG9vIGJyaWVmLCB0b28sIHRvIGhhdmUgYWxsPC9MSU5FPgotPExJTkU+dGhpbmdzIGFuc3dlciBteSBtaW5kLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+Q29tZSwgeW91IHNoYWtlIHRoZSBoZWFkIGF0IHNvIGxvbmcgYSBicmVhdGhpbmc6PC9MSU5FPgotPExJTkU+YnV0LCBJIHdhcnJhbnQgdGhlZSwgQ2xhdWRpbywgdGhlIHRpbWUgc2hhbGwgbm90IGdvPC9MSU5FPgotPExJTkU+ZHVsbHkgYnkgdXMuIEkgd2lsbCBpbiB0aGUgaW50ZXJpbSB1bmRlcnRha2Ugb25lIG9mPC9MSU5FPgotPExJTkU+SGVyY3VsZXMnIGxhYm91cnM7IHdoaWNoIGlzLCB0byBicmluZyBTaWduaW9yPC9MSU5FPgotPExJTkU+QmVuZWRpY2sgYW5kIHRoZSBMYWR5IEJlYXRyaWNlIGludG8gYSBtb3VudGFpbiBvZjwvTElORT4KLTxMSU5FPmFmZmVjdGlvbiB0aGUgb25lIHdpdGggdGhlIG90aGVyLiBJIHdvdWxkIGZhaW4gaGF2ZTwvTElORT4KLTxMSU5FPml0IGEgbWF0Y2gsIGFuZCBJIGRvdWJ0IG5vdCBidXQgdG8gZmFzaGlvbiBpdCwgaWY8L0xJTkU+Ci08TElORT55b3UgdGhyZWUgd2lsbCBidXQgbWluaXN0ZXIgc3VjaCBhc3Npc3RhbmNlIGFzIEk8L0xJTkU+Ci08TElORT5zaGFsbCBnaXZlIHlvdSBkaXJlY3Rpb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+TXkgbG9yZCwgSSBhbSBmb3IgeW91LCB0aG91Z2ggaXQgY29zdCBtZSB0ZW48L0xJTkU+Ci08TElORT5uaWdodHMnIHdhdGNoaW5ncy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5BbmQgSSwgbXkgbG9yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkFuZCB5b3UgdG9vLCBnZW50bGUgSGVybz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5JIHdpbGwgZG8gYW55IG1vZGVzdCBvZmZpY2UsIG15IGxvcmQsIHRvIGhlbHAgbXk8L0xJTkU+Ci08TElORT5jb3VzaW4gdG8gYSBnb29kIGh1c2JhbmQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5BbmQgQmVuZWRpY2sgaXMgbm90IHRoZSB1bmhvcGVmdWxsZXN0IGh1c2JhbmQgdGhhdDwvTElORT4KLTxMSU5FPkkga25vdy4gVGh1cyBmYXIgY2FuIEkgcHJhaXNlIGhpbTsgaGUgaXMgb2YgYSBub2JsZTwvTElORT4KLTxMSU5FPnN0cmFpbiwgb2YgYXBwcm92ZWQgdmFsb3VyIGFuZCBjb25maXJtZWQgaG9uZXN0eS4gSTwvTElORT4KLTxMSU5FPndpbGwgdGVhY2ggeW91IGhvdyB0byBodW1vdXIgeW91ciBjb3VzaW4sIHRoYXQgc2hlPC9MSU5FPgotPExJTkU+c2hhbGwgZmFsbCBpbiBsb3ZlIHdpdGggQmVuZWRpY2s7IGFuZCBJLCB3aXRoIHlvdXI8L0xJTkU+Ci08TElORT50d28gaGVscHMsIHdpbGwgc28gcHJhY3Rpc2Ugb24gQmVuZWRpY2sgdGhhdCwgaW48L0xJTkU+Ci08TElORT5kZXNwaXRlIG9mIGhpcyBxdWljayB3aXQgYW5kIGhpcyBxdWVhc3kgc3RvbWFjaCwgaGU8L0xJTkU+Ci08TElORT5zaGFsbCBmYWxsIGluIGxvdmUgd2l0aCBCZWF0cmljZS4gSWYgd2UgY2FuIGRvIHRoaXMsPC9MSU5FPgotPExJTkU+Q3VwaWQgaXMgbm8gbG9uZ2VyIGFuIGFyY2hlcjogaGlzIGdsb3J5IHNoYWxsIGJlPC9MSU5FPgotPExJTkU+b3VycywgZm9yIHdlIGFyZSB0aGUgb25seSBsb3ZlLWdvZHMuIEdvIGluIHdpdGggbWUsPC9MSU5FPgotPExJTkU+YW5kIEkgd2lsbCB0ZWxsIHlvdSBteSBkcmlmdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KLTwvU0NFTkU+Ci0KLTxTQ0VORT48VElUTEU+U0NFTkUgSUkuICBUaGUgc2FtZS48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIERPTiBKT0hOIGFuZCBCT1JBQ0hJTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkl0IGlzIHNvOyB0aGUgQ291bnQgQ2xhdWRpbyBzaGFsbCBtYXJyeSB0aGU8L0xJTkU+Ci08TElORT5kYXVnaHRlciBvZiBMZW9uYXRvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5ZZWEsIG15IGxvcmQ7IGJ1dCBJIGNhbiBjcm9zcyBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+QW55IGJhciwgYW55IGNyb3NzLCBhbnkgaW1wZWRpbWVudCB3aWxsIGJlPC9MSU5FPgotPExJTkU+bWVkaWNpbmFibGUgdG8gbWU6IEkgYW0gc2ljayBpbiBkaXNwbGVhc3VyZSB0byBoaW0sPC9MSU5FPgotPExJTkU+YW5kIHdoYXRzb2V2ZXIgY29tZXMgYXRod2FydCBoaXMgYWZmZWN0aW9uIHJhbmdlczwvTElORT4KLTxMSU5FPmV2ZW5seSB3aXRoIG1pbmUuIEhvdyBjYW5zdCB0aG91IGNyb3NzIHRoaXMgbWFycmlhZ2U/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPk5vdCBob25lc3RseSwgbXkgbG9yZDsgYnV0IHNvIGNvdmVydGx5IHRoYXQgbm88L0xJTkU+Ci08TElORT5kaXNob25lc3R5IHNoYWxsIGFwcGVhciBpbiBtZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+U2hvdyBtZSBicmllZmx5IGhvdy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+SSB0aGluayBJIHRvbGQgeW91ciBsb3Jkc2hpcCBhIHllYXIgc2luY2UsIGhvdyBtdWNoPC9MSU5FPgotPExJTkU+SSBhbSBpbiB0aGUgZmF2b3VyIG9mIE1hcmdhcmV0LCB0aGUgd2FpdGluZzwvTElORT4KLTxMSU5FPmdlbnRsZXdvbWFuIHRvIEhlcm8uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkkgcmVtZW1iZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPkkgY2FuLCBhdCBhbnkgdW5zZWFzb25hYmxlIGluc3RhbnQgb2YgdGhlIG5pZ2h0LDwvTElORT4KLTxMSU5FPmFwcG9pbnQgaGVyIHRvIGxvb2sgb3V0IGF0IGhlciBsYWR5J3MgY2hhbWJlciB3aW5kb3cuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPldoYXQgbGlmZSBpcyBpbiB0aGF0LCB0byBiZSB0aGUgZGVhdGggb2YgdGhpcyBtYXJyaWFnZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+VGhlIHBvaXNvbiBvZiB0aGF0IGxpZXMgaW4geW91IHRvIHRlbXBlci4gR28geW91IHRvPC9MSU5FPgotPExJTkU+dGhlIHByaW5jZSB5b3VyIGJyb3RoZXI7IHNwYXJlIG5vdCB0byB0ZWxsIGhpbSB0aGF0PC9MSU5FPgotPExJTkU+aGUgaGF0aCB3cm9uZ2VkIGhpcyBob25vdXIgaW4gbWFycnlpbmcgdGhlIHJlbm93bmVkPC9MSU5FPgotPExJTkU+Q2xhdWRpby0td2hvc2UgZXN0aW1hdGlvbiBkbyB5b3UgbWlnaHRpbHkgaG9sZDwvTElORT4KLTxMSU5FPnVwLS10byBhIGNvbnRhbWluYXRlZCBzdGFsZSwgc3VjaCBhIG9uZSBhcyBIZXJvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5XaGF0IHByb29mIHNoYWxsIEkgbWFrZSBvZiB0aGF0PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5Qcm9vZiBlbm91Z2ggdG8gbWlzdXNlIHRoZSBwcmluY2UsIHRvIHZleCBDbGF1ZGlvLDwvTElORT4KLTxMSU5FPnRvIHVuZG8gSGVybyBhbmQga2lsbCBMZW9uYXRvLiBMb29rIHlvdSBmb3IgYW55PC9MSU5FPgotPExJTkU+b3RoZXIgaXNzdWU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPk9ubHkgdG8gZGVzcGl0ZSB0aGVtLCBJIHdpbGwgZW5kZWF2b3VyIGFueSB0aGluZy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+R28sIHRoZW47IGZpbmQgbWUgYSBtZWV0IGhvdXIgdG8gZHJhdyBEb24gUGVkcm8gYW5kPC9MSU5FPgotPExJTkU+dGhlIENvdW50IENsYXVkaW8gYWxvbmU6IHRlbGwgdGhlbSB0aGF0IHlvdSBrbm93PC9MSU5FPgotPExJTkU+dGhhdCBIZXJvIGxvdmVzIG1lOyBpbnRlbmQgYSBraW5kIG9mIHplYWwgYm90aCB0byB0aGU8L0xJTkU+Ci08TElORT5wcmluY2UgYW5kIENsYXVkaW8sIGFzLC0taW4gbG92ZSBvZiB5b3VyIGJyb3RoZXInczwvTElORT4KLTxMSU5FPmhvbm91ciwgd2hvIGhhdGggbWFkZSB0aGlzIG1hdGNoLCBhbmQgaGlzIGZyaWVuZCdzPC9MSU5FPgotPExJTkU+cmVwdXRhdGlvbiwgd2hvIGlzIHRodXMgbGlrZSB0byBiZSBjb3plbmVkIHdpdGggdGhlPC9MSU5FPgotPExJTkU+c2VtYmxhbmNlIG9mIGEgbWFpZCwtLXRoYXQgeW91IGhhdmUgZGlzY292ZXJlZDwvTElORT4KLTxMSU5FPnRodXMuIFRoZXkgd2lsbCBzY2FyY2VseSBiZWxpZXZlIHRoaXMgd2l0aG91dCB0cmlhbDo8L0xJTkU+Ci08TElORT5vZmZlciB0aGVtIGluc3RhbmNlczsgd2hpY2ggc2hhbGwgYmVhciBubyBsZXNzPC9MSU5FPgotPExJTkU+bGlrZWxpaG9vZCB0aGFuIHRvIHNlZSBtZSBhdCBoZXIgY2hhbWJlci13aW5kb3csPC9MSU5FPgotPExJTkU+aGVhciBtZSBjYWxsIE1hcmdhcmV0IEhlcm8sIGhlYXIgTWFyZ2FyZXQgdGVybSBtZTwvTElORT4KLTxMSU5FPkNsYXVkaW87IGFuZCBicmluZyB0aGVtIHRvIHNlZSB0aGlzIHRoZSB2ZXJ5IG5pZ2h0PC9MSU5FPgotPExJTkU+YmVmb3JlIHRoZSBpbnRlbmRlZCB3ZWRkaW5nLC0tZm9yIGluIHRoZSBtZWFudGltZSBJPC9MSU5FPgotPExJTkU+d2lsbCBzbyBmYXNoaW9uIHRoZSBtYXR0ZXIgdGhhdCBIZXJvIHNoYWxsIGJlPC9MSU5FPgotPExJTkU+YWJzZW50LC0tYW5kIHRoZXJlIHNoYWxsIGFwcGVhciBzdWNoIHNlZW1pbmcgdHJ1dGg8L0xJTkU+Ci08TElORT5vZiBIZXJvJ3MgZGlzbG95YWx0eSB0aGF0IGplYWxvdXN5IHNoYWxsIGJlIGNhbGxlZDwvTElORT4KLTxMSU5FPmFzc3VyYW5jZSBhbmQgYWxsIHRoZSBwcmVwYXJhdGlvbiBvdmVydGhyb3duLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5Hcm93IHRoaXMgdG8gd2hhdCBhZHZlcnNlIGlzc3VlIGl0IGNhbiwgSSB3aWxsIHB1dDwvTElORT4KLTxMSU5FPml0IGluIHByYWN0aXNlLiBCZSBjdW5uaW5nIGluIHRoZSB3b3JraW5nIHRoaXMsIGFuZDwvTElORT4KLTxMSU5FPnRoeSBmZWUgaXMgYSB0aG91c2FuZCBkdWNhdHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPkJlIHlvdSBjb25zdGFudCBpbiB0aGUgYWNjdXNhdGlvbiwgYW5kIG15IGN1bm5pbmc8L0xJTkU+Ci08TElORT5zaGFsbCBub3Qgc2hhbWUgbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkkgd2lsbCBwcmVzZW50bHkgZ28gbGVhcm4gdGhlaXIgZGF5IG9mIG1hcnJpYWdlLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJSUkuICBMRU9OQVRPJ1Mgb3JjaGFyZC48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIEJFTkVESUNLPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+Qm95ITwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FbnRlciBCb3k8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qm95PC9TUEVBS0VSPgotPExJTkU+U2lnbmlvcj88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SW4gbXkgY2hhbWJlci13aW5kb3cgbGllcyBhIGJvb2s6IGJyaW5nIGl0IGhpdGhlcjwvTElORT4KLTxMSU5FPnRvIG1lIGluIHRoZSBvcmNoYXJkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qm95PC9TUEVBS0VSPgotPExJTkU+SSBhbSBoZXJlIGFscmVhZHksIHNpci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SSBrbm93IHRoYXQ7IGJ1dCBJIHdvdWxkIGhhdmUgdGhlZSBoZW5jZSwgYW5kIGhlcmUgYWdhaW4uPC9MSU5FPgotPFNUQUdFRElSPkV4aXQgQm95PC9TVEFHRURJUj4KLTxMSU5FPkkgZG8gbXVjaCB3b25kZXIgdGhhdCBvbmUgbWFuLCBzZWVpbmcgaG93IG11Y2g8L0xJTkU+Ci08TElORT5hbm90aGVyIG1hbiBpcyBhIGZvb2wgd2hlbiBoZSBkZWRpY2F0ZXMgaGlzPC9MSU5FPgotPExJTkU+YmVoYXZpb3JzIHRvIGxvdmUsIHdpbGwsIGFmdGVyIGhlIGhhdGggbGF1Z2hlZCBhdDwvTElORT4KLTxMSU5FPnN1Y2ggc2hhbGxvdyBmb2xsaWVzIGluIG90aGVycywgYmVjb21lIHRoZSBhcmd1bWVudDwvTElORT4KLTxMSU5FPm9mIGhpcyBvd24gc2Nvcm4gYnkgZmFpbGluZyBpbiBsb3ZlOiBhbmQgc3VjaCBhIG1hbjwvTElORT4KLTxMSU5FPmlzIENsYXVkaW8uIEkgaGF2ZSBrbm93biB3aGVuIHRoZXJlIHdhcyBubyBtdXNpYzwvTElORT4KLTxMSU5FPndpdGggaGltIGJ1dCB0aGUgZHJ1bSBhbmQgdGhlIGZpZmU7IGFuZCBub3cgaGFkIGhlPC9MSU5FPgotPExJTkU+cmF0aGVyIGhlYXIgdGhlIHRhYm91ciBhbmQgdGhlIHBpcGU6IEkgaGF2ZSBrbm93bjwvTElORT4KLTxMSU5FPndoZW4gaGUgd291bGQgaGF2ZSB3YWxrZWQgdGVuIG1pbGUgYS1mb290IHRvIHNlZSBhPC9MSU5FPgotPExJTkU+Z29vZCBhcm1vdXI7IGFuZCBub3cgd2lsbCBoZSBsaWUgdGVuIG5pZ2h0cyBhd2FrZSw8L0xJTkU+Ci08TElORT5jYXJ2aW5nIHRoZSBmYXNoaW9uIG9mIGEgbmV3IGRvdWJsZXQuIEhlIHdhcyB3b250IHRvPC9MSU5FPgotPExJTkU+c3BlYWsgcGxhaW4gYW5kIHRvIHRoZSBwdXJwb3NlLCBsaWtlIGFuIGhvbmVzdCBtYW48L0xJTkU+Ci08TElORT5hbmQgYSBzb2xkaWVyOyBhbmQgbm93IGlzIGhlIHR1cm5lZCBvcnRob2dyYXBoeTsgaGlzPC9MSU5FPgotPExJTkU+d29yZHMgYXJlIGEgdmVyeSBmYW50YXN0aWNhbCBiYW5xdWV0LCBqdXN0IHNvIG1hbnk8L0xJTkU+Ci08TElORT5zdHJhbmdlIGRpc2hlcy4gTWF5IEkgYmUgc28gY29udmVydGVkIGFuZCBzZWUgd2l0aDwvTElORT4KLTxMSU5FPnRoZXNlIGV5ZXM/IEkgY2Fubm90IHRlbGw7IEkgdGhpbmsgbm90OiBJIHdpbGwgbm90PC9MSU5FPgotPExJTkU+YmUgc3dvcm4sIGJ1dCBsb3ZlIG1heSB0cmFuc2Zvcm0gbWUgdG8gYW4gb3lzdGVyOyBidXQ8L0xJTkU+Ci08TElORT5JJ2xsIHRha2UgbXkgb2F0aCBvbiBpdCwgdGlsbCBoZSBoYXZlIG1hZGUgYW4gb3lzdGVyPC9MSU5FPgotPExJTkU+b2YgbWUsIGhlIHNoYWxsIG5ldmVyIG1ha2UgbWUgc3VjaCBhIGZvb2wuIE9uZSB3b21hbjwvTElORT4KLTxMSU5FPmlzIGZhaXIsIHlldCBJIGFtIHdlbGw7IGFub3RoZXIgaXMgd2lzZSwgeWV0IEkgYW08L0xJTkU+Ci08TElORT53ZWxsOyBhbm90aGVyIHZpcnR1b3VzLCB5ZXQgSSBhbSB3ZWxsOyBidXQgdGlsbCBhbGw8L0xJTkU+Ci08TElORT5ncmFjZXMgYmUgaW4gb25lIHdvbWFuLCBvbmUgd29tYW4gc2hhbGwgbm90IGNvbWUgaW48L0xJTkU+Ci08TElORT5teSBncmFjZS4gUmljaCBzaGUgc2hhbGwgYmUsIHRoYXQncyBjZXJ0YWluOyB3aXNlLDwvTElORT4KLTxMSU5FPm9yIEknbGwgbm9uZTsgdmlydHVvdXMsIG9yIEknbGwgbmV2ZXIgY2hlYXBlbiBoZXI7PC9MSU5FPgotPExJTkU+ZmFpciwgb3IgSSdsbCAgIG5ldmVyIGxvb2sgb24gaGVyOyBtaWxkLCBvciBjb21lIG5vdDwvTElORT4KLTxMSU5FPm5lYXIgbWU7IG5vYmxlLCBvciBub3QgSSBmb3IgYW4gYW5nZWw7IG9mIGdvb2Q8L0xJTkU+Ci08TElORT5kaXNjb3Vyc2UsIGFuIGV4Y2VsbGVudCBtdXNpY2lhbiwgYW5kIGhlciBoYWlyIHNoYWxsPC9MSU5FPgotPExJTkU+YmUgb2Ygd2hhdCBjb2xvdXIgaXQgcGxlYXNlIEdvZC4gSGEhIHRoZSBwcmluY2UgYW5kPC9MSU5FPgotPExJTkU+TW9uc2lldXIgTG92ZSEgSSB3aWxsIGhpZGUgbWUgaW4gdGhlIGFyYm91ci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNUQUdFRElSPldpdGhkcmF3czwvU1RBR0VESVI+Ci08U1RBR0VESVI+RW50ZXIgRE9OIFBFRFJPLCBDTEFVRElPLCBhbmQgTEVPTkFUTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Db21lLCBzaGFsbCB3ZSBoZWFyIHRoaXMgbXVzaWM/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+WWVhLCBteSBnb29kIGxvcmQuIEhvdyBzdGlsbCB0aGUgZXZlbmluZyBpcyw8L0xJTkU+Ci08TElORT5BcyBodXNoJ2Qgb24gcHVycG9zZSB0byBncmFjZSBoYXJtb255ITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+U2VlIHlvdSB3aGVyZSBCZW5lZGljayBoYXRoIGhpZCBoaW1zZWxmPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk8sIHZlcnkgd2VsbCwgbXkgbG9yZDogdGhlIG11c2ljIGVuZGVkLDwvTElORT4KLTxMSU5FPldlJ2xsIGZpdCB0aGUga2lkLWZveCB3aXRoIGEgcGVubnl3b3J0aC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RW50ZXIgQkFMVEhBU0FSIHdpdGggTXVzaWM8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+Q29tZSwgQmFsdGhhc2FyLCB3ZSdsbCBoZWFyIHRoYXQgc29uZyBhZ2Fpbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJBTFRIQVNBUjwvU1BFQUtFUj4KLTxMSU5FPk8sIGdvb2QgbXkgbG9yZCwgdGF4IG5vdCBzbyBiYWQgYSB2b2ljZTwvTElORT4KLTxMSU5FPlRvIHNsYW5kZXIgbXVzaWMgYW55IG1vcmUgdGhhbiBvbmNlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SXQgaXMgdGhlIHdpdG5lc3Mgc3RpbGwgb2YgZXhjZWxsZW5jeTwvTElORT4KLTxMSU5FPlRvIHB1dCBhIHN0cmFuZ2UgZmFjZSBvbiBoaXMgb3duIHBlcmZlY3Rpb24uPC9MSU5FPgotPExJTkU+SSBwcmF5IHRoZWUsIHNpbmcsIGFuZCBsZXQgbWUgd29vIG5vIG1vcmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Ci08TElORT5CZWNhdXNlIHlvdSB0YWxrIG9mIHdvb2luZywgSSB3aWxsIHNpbmc7PC9MSU5FPgotPExJTkU+U2luY2UgbWFueSBhIHdvb2VyIGRvdGggY29tbWVuY2UgaGlzIHN1aXQ8L0xJTkU+Ci08TElORT5UbyBoZXIgaGUgdGhpbmtzIG5vdCB3b3J0aHksIHlldCBoZSB3b29lcyw8L0xJTkU+Ci08TElORT5ZZXQgd2lsbCBoZSBzd2VhciBoZSBsb3Zlcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPk5vdywgcHJheSB0aGVlLCBjb21lOzwvTElORT4KLTxMSU5FPk9yLCBpZiB0aG91IHdpbHQgaG9sZCBsb25nZXIgYXJndW1lbnQsPC9MSU5FPgotPExJTkU+RG8gaXQgaW4gbm90ZXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Ci08TElORT5Ob3RlIHRoaXMgYmVmb3JlIG15IG5vdGVzOzwvTElORT4KLTxMSU5FPlRoZXJlJ3Mgbm90IGEgbm90ZSBvZiBtaW5lIHRoYXQncyB3b3J0aCB0aGUgbm90aW5nLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+V2h5LCB0aGVzZSBhcmUgdmVyeSBjcm90Y2hldHMgdGhhdCBoZSBzcGVha3M7PC9MSU5FPgotPExJTkU+Tm90ZSwgbm90ZXMsIGZvcnNvb3RoLCBhbmQgbm90aGluZy48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+QWlyPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+Tm93LCBkaXZpbmUgYWlyISBub3cgaXMgaGlzIHNvdWwgcmF2aXNoZWQhIElzIGl0PC9MSU5FPgotPExJTkU+bm90IHN0cmFuZ2UgdGhhdCBzaGVlcHMnIGd1dHMgc2hvdWxkIGhhbGUgc291bHMgb3V0PC9MSU5FPgotPExJTkU+b2YgbWVuJ3MgYm9kaWVzPyBXZWxsLCBhIGhvcm4gZm9yIG15IG1vbmV5LCB3aGVuPC9MSU5FPgotPExJTkU+YWxsJ3MgZG9uZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+VGhlIFNvbmc8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgotPExJTkU+U2lnaCBubyBtb3JlLCBsYWRpZXMsIHNpZ2ggbm8gbW9yZSw8L0xJTkU+Ci08TElORT5NZW4gd2VyZSBkZWNlaXZlcnMgZXZlciw8L0xJTkU+Ci08TElORT5PbmUgZm9vdCBpbiBzZWEgYW5kIG9uZSBvbiBzaG9yZSw8L0xJTkU+Ci08TElORT5UbyBvbmUgdGhpbmcgY29uc3RhbnQgbmV2ZXI6PC9MSU5FPgotPExJTkU+VGhlbiBzaWdoIG5vdCBzbywgYnV0IGxldCB0aGVtIGdvLDwvTElORT4KLTxMSU5FPkFuZCBiZSB5b3UgYmxpdGhlIGFuZCBib25ueSw8L0xJTkU+Ci08TElORT5Db252ZXJ0aW5nIGFsbCB5b3VyIHNvdW5kcyBvZiB3b2U8L0xJTkU+Ci08TElORT5JbnRvIEhleSBub25ueSwgbm9ubnkuPC9MSU5FPgotPExJTkU+U2luZyBubyBtb3JlIGRpdHRpZXMsIHNpbmcgbm8gbW9lLDwvTElORT4KLTxMSU5FPk9mIGR1bXBzIHNvIGR1bGwgYW5kIGhlYXZ5OzwvTElORT4KLTxMSU5FPlRoZSBmcmF1ZCBvZiBtZW4gd2FzIGV2ZXIgc28sPC9MSU5FPgotPExJTkU+U2luY2Ugc3VtbWVyIGZpcnN0IHdhcyBsZWFmeTo8L0xJTkU+Ci08TElORT5UaGVuIHNpZ2ggbm90IHNvLCAmYW1wO2MuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5CeSBteSB0cm90aCwgYSBnb29kIHNvbmcuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Ci08TElORT5BbmQgYW4gaWxsIHNpbmdlciwgbXkgbG9yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkhhLCBubywgbm8sIGZhaXRoOyB0aG91IHNpbmdlc3Qgd2VsbCBlbm91Z2ggZm9yIGEgc2hpZnQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkFuIGhlIGhhZCBiZWVuIGEgZG9nIHRoYXQgc2hvdWxkIGhhdmUgaG93bGVkIHRodXMsPC9MSU5FPgotPExJTkU+dGhleSB3b3VsZCBoYXZlIGhhbmdlZCBoaW06IGFuZCBJIHByYXkgR29kIGhpcyBiYWQ8L0xJTkU+Ci08TElORT52b2ljZSBib2RlIG5vIG1pc2NoaWVmLiBJIGhhZCBhcyBsaWVmIGhhdmUgaGVhcmQgdGhlPC9MSU5FPgotPExJTkU+bmlnaHQtcmF2ZW4sIGNvbWUgd2hhdCBwbGFndWUgY291bGQgaGF2ZSBjb21lIGFmdGVyPC9MSU5FPgotPExJTkU+aXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5ZZWEsIG1hcnJ5LCBkb3N0IHRob3UgaGVhciwgQmFsdGhhc2FyPyBJIHByYXkgdGhlZSw8L0xJTkU+Ci08TElORT5nZXQgdXMgc29tZSBleGNlbGxlbnQgbXVzaWM7IGZvciB0by1tb3Jyb3cgbmlnaHQgd2U8L0xJTkU+Ci08TElORT53b3VsZCBoYXZlIGl0IGF0IHRoZSBMYWR5IEhlcm8ncyBjaGFtYmVyLXdpbmRvdy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJBTFRIQVNBUjwvU1BFQUtFUj4KLTxMSU5FPlRoZSBiZXN0IEkgY2FuLCBteSBsb3JkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+RG8gc286IGZhcmV3ZWxsLjwvTElORT4KLTxTVEFHRURJUj5FeGl0IEJBTFRIQVNBUjwvU1RBR0VESVI+Ci08TElORT5Db21lIGhpdGhlciwgTGVvbmF0by4gV2hhdCB3YXMgaXQgeW91IHRvbGQgbWUgb2Y8L0xJTkU+Ci08TElORT50by1kYXksIHRoYXQgeW91ciBuaWVjZSBCZWF0cmljZSB3YXMgaW4gbG92ZSB3aXRoPC9MSU5FPgotPExJTkU+U2lnbmlvciBCZW5lZGljaz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5PLCBheTogc3RhbGsgb24uIHN0YWxrIG9uOyB0aGUgZm93bCBzaXRzLiBJIGRpZDwvTElORT4KLTxMSU5FPm5ldmVyIHRoaW5rIHRoYXQgbGFkeSB3b3VsZCBoYXZlIGxvdmVkIGFueSBtYW4uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Tm8sIG5vciBJIG5laXRoZXI7IGJ1dCBtb3N0IHdvbmRlcmZ1bCB0aGF0IHNoZTwvTElORT4KLTxMSU5FPnNob3VsZCBzbyBkb3RlIG9uIFNpZ25pb3IgQmVuZWRpY2ssIHdob20gc2hlIGhhdGggaW48L0xJTkU+Ci08TElORT5hbGwgb3V0d2FyZCBiZWhhdmlvcnMgc2VlbWVkIGV2ZXIgdG8gYWJob3IuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPklzJ3QgcG9zc2libGU/IFNpdHMgdGhlIHdpbmQgaW4gdGhhdCBjb3JuZXI/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QnkgbXkgdHJvdGgsIG15IGxvcmQsIEkgY2Fubm90IHRlbGwgd2hhdCB0byB0aGluazwvTElORT4KLTxMSU5FPm9mIGl0IGJ1dCB0aGF0IHNoZSBsb3ZlcyBoaW0gd2l0aCBhbiBlbnJhZ2VkPC9MSU5FPgotPExJTkU+YWZmZWN0aW9uOiBpdCBpcyBwYXN0IHRoZSBpbmZpbml0ZSBvZiB0aG91Z2h0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+TWF5IGJlIHNoZSBkb3RoIGJ1dCBjb3VudGVyZmVpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5GYWl0aCwgbGlrZSBlbm91Z2guPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+TyBHb2QsIGNvdW50ZXJmZWl0ISBUaGVyZSB3YXMgbmV2ZXIgY291bnRlcmZlaXQgb2Y8L0xJTkU+Ci08TElORT5wYXNzaW9uIGNhbWUgc28gbmVhciB0aGUgbGlmZSBvZiBwYXNzaW9uIGFzIHNoZTwvTElORT4KLTxMSU5FPmRpc2NvdmVycyBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldoeSwgd2hhdCBlZmZlY3RzIG9mIHBhc3Npb24gc2hvd3Mgc2hlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkJhaXQgdGhlIGhvb2sgd2VsbDsgdGhpcyBmaXNoIHdpbGwgYml0ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XaGF0IGVmZmVjdHMsIG15IGxvcmQ/IFNoZSB3aWxsIHNpdCB5b3UsIHlvdSBoZWFyZDwvTElORT4KLTxMSU5FPm15IGRhdWdodGVyIHRlbGwgeW91IGhvdy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5TaGUgZGlkLCBpbmRlZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Ib3csIGhvdywgcHJheSB5b3U/IFlvdSBhbWF6ZSBtZTogSSB3b3VsZCBoYXZlIEk8L0xJTkU+Ci08TElORT50aG91Z2h0IGhlciBzcGlyaXQgaGFkIGJlZW4gaW52aW5jaWJsZSBhZ2FpbnN0IGFsbDwvTElORT4KLTxMSU5FPmFzc2F1bHRzIG9mIGFmZmVjdGlvbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5JIHdvdWxkIGhhdmUgc3dvcm4gaXQgaGFkLCBteSBsb3JkOyBlc3BlY2lhbGx5PC9MSU5FPgotPExJTkU+YWdhaW5zdCBCZW5lZGljay48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SSBzaG91bGQgdGhpbmsgdGhpcyBhIGd1bGwsIGJ1dCB0aGF0IHRoZTwvTElORT4KLTxMSU5FPndoaXRlLWJlYXJkZWQgZmVsbG93IHNwZWFrcyBpdDoga25hdmVyeSBjYW5ub3QsPC9MSU5FPgotPExJTkU+c3VyZSwgaGlkZSBoaW1zZWxmIGluIHN1Y2ggcmV2ZXJlbmNlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkhlIGhhdGggdGEnZW4gdGhlIGluZmVjdGlvbjogaG9sZCBpdCB1cC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkhhdGggc2hlIG1hZGUgaGVyIGFmZmVjdGlvbiBrbm93biB0byBCZW5lZGljaz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5ObzsgYW5kIHN3ZWFycyBzaGUgbmV2ZXIgd2lsbDogdGhhdCdzIGhlciB0b3JtZW50LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPidUaXMgdHJ1ZSwgaW5kZWVkOyBzbyB5b3VyIGRhdWdodGVyIHNheXM6ICdTaGFsbDwvTElORT4KLTxMSU5FPkksJyBzYXlzIHNoZSwgJ3RoYXQgaGF2ZSBzbyBvZnQgZW5jb3VudGVyZWQgaGltPC9MSU5FPgotPExJTkU+d2l0aCBzY29ybiwgd3JpdGUgdG8gaGltIHRoYXQgSSBsb3ZlIGhpbT8nPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+VGhpcyBzYXlzIHNoZSBub3cgd2hlbiBzaGUgaXMgYmVnaW5uaW5nIHRvIHdyaXRlIHRvPC9MSU5FPgotPExJTkU+aGltOyBmb3Igc2hlJ2xsIGJlIHVwIHR3ZW50eSB0aW1lcyBhIG5pZ2h0LCBhbmQ8L0xJTkU+Ci08TElORT50aGVyZSB3aWxsIHNoZSBzaXQgaW4gaGVyIHNtb2NrIHRpbGwgc2hlIGhhdmUgd3JpdCBhPC9MSU5FPgotPExJTkU+c2hlZXQgb2YgcGFwZXI6IG15IGRhdWdodGVyIHRlbGxzIHVzIGFsbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Ob3cgeW91IHRhbGsgb2YgYSBzaGVldCBvZiBwYXBlciwgSSByZW1lbWJlciBhPC9MSU5FPgotPExJTkU+cHJldHR5IGplc3QgeW91ciBkYXVnaHRlciB0b2xkIHVzIG9mLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPk8sIHdoZW4gc2hlIGhhZCB3cml0IGl0IGFuZCB3YXMgcmVhZGluZyBpdCBvdmVyLCBzaGU8L0xJTkU+Ci08TElORT5mb3VuZCBCZW5lZGljayBhbmQgQmVhdHJpY2UgYmV0d2VlbiB0aGUgc2hlZXQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+VGhhdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5PLCBzaGUgdG9yZSB0aGUgbGV0dGVyIGludG8gYSB0aG91c2FuZCBoYWxmcGVuY2U7PC9MSU5FPgotPExJTkU+cmFpbGVkIGF0IGhlcnNlbGYsIHRoYXQgc2hlIHNob3VsZCBiZSBzbyBpbW1vZGVzdDwvTElORT4KLTxMSU5FPnRvIHdyaXRlIHRvIG9uZSB0aGF0IHNoZSBrbmV3IHdvdWxkIGZsb3V0IGhlcjsgJ0k8L0xJTkU+Ci08TElORT5tZWFzdXJlIGhpbSwnIHNheXMgc2hlLCAnYnkgbXkgb3duIHNwaXJpdDsgZm9yIEk8L0xJTkU+Ci08TElORT5zaG91bGQgZmxvdXQgaGltLCBpZiBoZSB3cml0IHRvIG1lOyB5ZWEsIHRob3VnaCBJPC9MSU5FPgotPExJTkU+bG92ZSBoaW0sIEkgc2hvdWxkLic8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5UaGVuIGRvd24gdXBvbiBoZXIga25lZXMgc2hlIGZhbGxzLCB3ZWVwcywgc29icyw8L0xJTkU+Ci08TElORT5iZWF0cyBoZXIgaGVhcnQsIHRlYXJzIGhlciBoYWlyLCBwcmF5cywgY3Vyc2VzOyAnTzwvTElORT4KLTxMSU5FPnN3ZWV0IEJlbmVkaWNrISBHb2QgZ2l2ZSBtZSBwYXRpZW5jZSEnPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+U2hlIGRvdGggaW5kZWVkOyBteSBkYXVnaHRlciBzYXlzIHNvOiBhbmQgdGhlPC9MSU5FPgotPExJTkU+ZWNzdGFzeSBoYXRoIHNvIG11Y2ggb3ZlcmJvcm5lIGhlciB0aGF0IG15IGRhdWdodGVyPC9MSU5FPgotPExJTkU+aXMgc29tZXRpbWUgYWZlYXJlZCBzaGUgd2lsbCBkbyBhIGRlc3BlcmF0ZSBvdXRyYWdlPC9MSU5FPgotPExJTkU+dG8gaGVyc2VsZjogaXQgaXMgdmVyeSB0cnVlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SXQgd2VyZSBnb29kIHRoYXQgQmVuZWRpY2sga25ldyBvZiBpdCBieSBzb21lPC9MSU5FPgotPExJTkU+b3RoZXIsIGlmIHNoZSB3aWxsIG5vdCBkaXNjb3ZlciBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5UbyB3aGF0IGVuZD8gSGUgd291bGQgbWFrZSBidXQgYSBzcG9ydCBvZiBpdCBhbmQ8L0xJTkU+Ci08TElORT50b3JtZW50IHRoZSBwb29yIGxhZHkgd29yc2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5BbiBoZSBzaG91bGQsIGl0IHdlcmUgYW4gYWxtcyB0byBoYW5nIGhpbS4gU2hlJ3MgYW48L0xJTkU+Ci08TElORT5leGNlbGxlbnQgc3dlZXQgbGFkeTsgYW5kLCBvdXQgb2YgYWxsIHN1c3BpY2lvbiw8L0xJTkU+Ci08TElORT5zaGUgaXMgdmlydHVvdXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+QW5kIHNoZSBpcyBleGNlZWRpbmcgd2lzZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkluIGV2ZXJ5IHRoaW5nIGJ1dCBpbiBsb3ZpbmcgQmVuZWRpY2suPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+TywgbXkgbG9yZCwgd2lzZG9tIGFuZCBibG9vZCBjb21iYXRpbmcgaW4gc28gdGVuZGVyPC9MSU5FPgotPExJTkU+YSBib2R5LCB3ZSBoYXZlIHRlbiBwcm9vZnMgdG8gb25lIHRoYXQgYmxvb2QgaGF0aDwvTElORT4KLTxMSU5FPnRoZSB2aWN0b3J5LiBJIGFtIHNvcnJ5IGZvciBoZXIsIGFzIEkgaGF2ZSBqdXN0PC9MSU5FPgotPExJTkU+Y2F1c2UsIGJlaW5nIGhlciB1bmNsZSBhbmQgaGVyIGd1YXJkaWFuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SSB3b3VsZCBzaGUgaGFkIGJlc3Rvd2VkIHRoaXMgZG90YWdlIG9uIG1lOiBJIHdvdWxkPC9MSU5FPgotPExJTkU+aGF2ZSBkYWZmZWQgYWxsIG90aGVyIHJlc3BlY3RzIGFuZCBtYWRlIGhlciBoYWxmPC9MSU5FPgotPExJTkU+bXlzZWxmLiBJIHByYXkgeW91LCB0ZWxsIEJlbmVkaWNrIG9mIGl0LCBhbmQgaGVhcjwvTElORT4KLTxMSU5FPndoYXQgYScgd2lsbCBzYXkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+V2VyZSBpdCBnb29kLCB0aGluayB5b3U/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SGVybyB0aGlua3Mgc3VyZWx5IHNoZSB3aWxsIGRpZTsgZm9yIHNoZSBzYXlzIHNoZTwvTElORT4KLTxMSU5FPndpbGwgZGllLCBpZiBoZSBsb3ZlIGhlciBub3QsIGFuZCBzaGUgd2lsbCBkaWUsIGVyZTwvTElORT4KLTxMSU5FPnNoZSBtYWtlIGhlciBsb3ZlIGtub3duLCBhbmQgc2hlIHdpbGwgZGllLCBpZiBoZSB3b288L0xJTkU+Ci08TElORT5oZXIsIHJhdGhlciB0aGFuIHNoZSB3aWxsIGJhdGUgb25lIGJyZWF0aCBvZiBoZXI8L0xJTkU+Ci08TElORT5hY2N1c3RvbWVkIGNyb3NzbmVzcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlNoZSBkb3RoIHdlbGw6IGlmIHNoZSBzaG91bGQgbWFrZSB0ZW5kZXIgb2YgaGVyPC9MSU5FPgotPExJTkU+bG92ZSwgJ3RpcyB2ZXJ5IHBvc3NpYmxlIGhlJ2xsIHNjb3JuIGl0OyBmb3IgdGhlPC9MSU5FPgotPExJTkU+bWFuLCBhcyB5b3Uga25vdyBhbGwsIGhhdGggYSBjb250ZW1wdGlibGUgc3Bpcml0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkhlIGlzIGEgdmVyeSBwcm9wZXIgbWFuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SGUgaGF0aCBpbmRlZWQgYSBnb29kIG91dHdhcmQgaGFwcGluZXNzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkJlZm9yZSBHb2QhIGFuZCwgaW4gbXkgbWluZCwgdmVyeSB3aXNlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SGUgZG90aCBpbmRlZWQgc2hvdyBzb21lIHNwYXJrcyB0aGF0IGFyZSBsaWtlIHdpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5BbmQgSSB0YWtlIGhpbSB0byBiZSB2YWxpYW50LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+QXMgSGVjdG9yLCBJIGFzc3VyZSB5b3U6IGFuZCBpbiB0aGUgbWFuYWdpbmcgb2Y8L0xJTkU+Ci08TElORT5xdWFycmVscyB5b3UgbWF5IHNheSBoZSBpcyB3aXNlOyBmb3IgZWl0aGVyIGhlPC9MSU5FPgotPExJTkU+YXZvaWRzIHRoZW0gd2l0aCBncmVhdCBkaXNjcmV0aW9uLCBvciB1bmRlcnRha2VzPC9MSU5FPgotPExJTkU+dGhlbSB3aXRoIGEgbW9zdCBDaHJpc3RpYW4tbGlrZSBmZWFyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPklmIGhlIGRvIGZlYXIgR29kLCBhJyBtdXN0IG5lY2Vzc2FyaWx5IGtlZXAgcGVhY2U6PC9MSU5FPgotPExJTkU+aWYgaGUgYnJlYWsgdGhlIHBlYWNlLCBoZSBvdWdodCB0byBlbnRlciBpbnRvIGE8L0xJTkU+Ci08TElORT5xdWFycmVsIHdpdGggZmVhciBhbmQgdHJlbWJsaW5nLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+QW5kIHNvIHdpbGwgaGUgZG87IGZvciB0aGUgbWFuIGRvdGggZmVhciBHb2QsPC9MSU5FPgotPExJTkU+aG93c29ldmVyIGl0IHNlZW1zIG5vdCBpbiBoaW0gYnkgc29tZSBsYXJnZSBqZXN0czwvTElORT4KLTxMSU5FPmhlIHdpbGwgbWFrZS4gV2VsbCBJIGFtIHNvcnJ5IGZvciB5b3VyIG5pZWNlLiBTaGFsbDwvTElORT4KLTxMSU5FPndlIGdvIHNlZWsgQmVuZWRpY2ssIGFuZCB0ZWxsIGhpbSBvZiBoZXIgbG92ZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5OZXZlciB0ZWxsIGhpbSwgbXkgbG9yZDogbGV0IGhlciB3ZWFyIGl0IG91dCB3aXRoPC9MSU5FPgotPExJTkU+Z29vZCBjb3Vuc2VsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPk5heSwgdGhhdCdzIGltcG9zc2libGU6IHNoZSBtYXkgd2VhciBoZXIgaGVhcnQgb3V0IGZpcnN0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+V2VsbCwgd2Ugd2lsbCBoZWFyIGZ1cnRoZXIgb2YgaXQgYnkgeW91ciBkYXVnaHRlcjo8L0xJTkU+Ci08TElORT5sZXQgaXQgY29vbCB0aGUgd2hpbGUuIEkgbG92ZSBCZW5lZGljayB3ZWxsOyBhbmQgSTwvTElORT4KLTxMSU5FPmNvdWxkIHdpc2ggaGUgd291bGQgbW9kZXN0bHkgZXhhbWluZSBoaW1zZWxmLCB0byBzZWU8L0xJTkU+Ci08TElORT5ob3cgbXVjaCBoZSBpcyB1bndvcnRoeSBzbyBnb29kIGEgbGFkeS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5NeSBsb3JkLCB3aWxsIHlvdSB3YWxrPyBkaW5uZXIgaXMgcmVhZHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SWYgaGUgZG8gbm90IGRvdGUgb24gaGVyIHVwb24gdGhpcywgSSB3aWxsIG5ldmVyPC9MSU5FPgotPExJTkU+dHJ1c3QgbXkgZXhwZWN0YXRpb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5MZXQgdGhlcmUgYmUgdGhlIHNhbWUgbmV0IHNwcmVhZCBmb3IgaGVyOyBhbmQgdGhhdDwvTElORT4KLTxMSU5FPm11c3QgeW91ciBkYXVnaHRlciBhbmQgaGVyIGdlbnRsZXdvbWVuIGNhcnJ5LiBUaGU8L0xJTkU+Ci08TElORT5zcG9ydCB3aWxsIGJlLCB3aGVuIHRoZXkgaG9sZCBvbmUgYW4gb3BpbmlvbiBvZjwvTElORT4KLTxMSU5FPmFub3RoZXIncyBkb3RhZ2UsIGFuZCBubyBzdWNoIG1hdHRlcjogdGhhdCdzIHRoZTwvTElORT4KLTxMSU5FPnNjZW5lIHRoYXQgSSB3b3VsZCBzZWUsIHdoaWNoIHdpbGwgYmUgbWVyZWx5IGE8L0xJTkU+Ci08TElORT5kdW1iLXNob3cuIExldCB1cyBzZW5kIGhlciB0byBjYWxsIGhpbSBpbiB0byBkaW5uZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4ZXVudCBET04gUEVEUk8sIENMQVVESU8sIGFuZCBMRU9OQVRPPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+PFNUQUdFRElSPkNvbWluZyBmb3J3YXJkPC9TVEFHRURJUj4gIFRoaXMgY2FuIGJlIG5vIHRyaWNrOiB0aGU8L0xJTkU+Ci08TElORT5jb25mZXJlbmNlIHdhcyBzYWRseSBib3JuZS4gVGhleSBoYXZlIHRoZSB0cnV0aCBvZjwvTElORT4KLTxMSU5FPnRoaXMgZnJvbSBIZXJvLiBUaGV5IHNlZW0gdG8gcGl0eSB0aGUgbGFkeTogaXQ8L0xJTkU+Ci08TElORT5zZWVtcyBoZXIgYWZmZWN0aW9ucyBoYXZlIHRoZWlyIGZ1bGwgYmVudC4gTG92ZSBtZSE8L0xJTkU+Ci08TElORT53aHksIGl0IG11c3QgYmUgcmVxdWl0ZWQuIEkgaGVhciBob3cgSSBhbSBjZW5zdXJlZDo8L0xJTkU+Ci08TElORT50aGV5IHNheSBJIHdpbGwgYmVhciBteXNlbGYgcHJvdWRseSwgaWYgSSBwZXJjZWl2ZTwvTElORT4KLTxMSU5FPnRoZSBsb3ZlIGNvbWUgZnJvbSBoZXI7IHRoZXkgc2F5IHRvbyB0aGF0IHNoZSB3aWxsPC9MSU5FPgotPExJTkU+cmF0aGVyIGRpZSB0aGFuIGdpdmUgYW55IHNpZ24gb2YgYWZmZWN0aW9uLiBJIGRpZDwvTElORT4KLTxMSU5FPm5ldmVyIHRoaW5rIHRvIG1hcnJ5OiBJIG11c3Qgbm90IHNlZW0gcHJvdWQ6IGhhcHB5PC9MSU5FPgotPExJTkU+YXJlIHRoZXkgdGhhdCBoZWFyIHRoZWlyIGRldHJhY3Rpb25zIGFuZCBjYW4gcHV0PC9MSU5FPgotPExJTkU+dGhlbSB0byBtZW5kaW5nLiBUaGV5IHNheSB0aGUgbGFkeSBpcyBmYWlyOyAndGlzIGE8L0xJTkU+Ci08TElORT50cnV0aCwgSSBjYW4gYmVhciB0aGVtIHdpdG5lc3M7IGFuZCB2aXJ0dW91czsgJ3RpczwvTElORT4KLTxMSU5FPnNvLCBJIGNhbm5vdCByZXByb3ZlIGl0OyBhbmQgd2lzZSwgYnV0IGZvciBsb3Zpbmc8L0xJTkU+Ci08TElORT5tZTsgYnkgbXkgdHJvdGgsIGl0IGlzIG5vIGFkZGl0aW9uIHRvIGhlciB3aXQsIG5vcjwvTElORT4KLTxMSU5FPm5vIGdyZWF0IGFyZ3VtZW50IG9mIGhlciBmb2xseSwgZm9yIEkgd2lsbCBiZTwvTElORT4KLTxMSU5FPmhvcnJpYmx5IGluIGxvdmUgd2l0aCBoZXIuIEkgbWF5IGNoYW5jZSBoYXZlIHNvbWU8L0xJTkU+Ci08TElORT5vZGQgcXVpcmtzIGFuZCByZW1uYW50cyBvZiB3aXQgYnJva2VuIG9uIG1lLDwvTElORT4KLTxMSU5FPmJlY2F1c2UgSSBoYXZlIHJhaWxlZCBzbyBsb25nIGFnYWluc3QgbWFycmlhZ2U6IGJ1dDwvTElORT4KLTxMSU5FPmRvdGggbm90IHRoZSBhcHBldGl0ZSBhbHRlcj8gYSBtYW4gbG92ZXMgdGhlIG1lYXQ8L0xJTkU+Ci08TElORT5pbiBoaXMgeW91dGggdGhhdCBoZSBjYW5ub3QgZW5kdXJlIGluIGhpcyBhZ2UuPC9MSU5FPgotPExJTkU+U2hhbGwgcXVpcHMgYW5kIHNlbnRlbmNlcyBhbmQgdGhlc2UgcGFwZXIgYnVsbGV0cyBvZjwvTElORT4KLTxMSU5FPnRoZSBicmFpbiBhd2UgYSBtYW4gZnJvbSB0aGUgY2FyZWVyIG9mIGhpcyBodW1vdXI/PC9MSU5FPgotPExJTkU+Tm8sIHRoZSB3b3JsZCBtdXN0IGJlIHBlb3BsZWQuIFdoZW4gSSBzYWlkIEkgd291bGQ8L0xJTkU+Ci08TElORT5kaWUgYSBiYWNoZWxvciwgSSBkaWQgbm90IHRoaW5rIEkgc2hvdWxkIGxpdmUgdGlsbCBJPC9MSU5FPgotPExJTkU+d2VyZSBtYXJyaWVkLiBIZXJlIGNvbWVzIEJlYXRyaWNlLiBCeSB0aGlzIGRheSE8L0xJTkU+Ci08TElORT5zaGUncyBhIGZhaXIgbGFkeTogSSBkbyBzcHkgc29tZSBtYXJrcyBvZiBsb3ZlIGluPC9MSU5FPgotPExJTkU+aGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FbnRlciBCRUFUUklDRTwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkFnYWluc3QgbXkgd2lsbCBJIGFtIHNlbnQgdG8gYmlkIHlvdSBjb21lIGluIHRvIGRpbm5lci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+RmFpciBCZWF0cmljZSwgSSB0aGFuayB5b3UgZm9yIHlvdXIgcGFpbnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkkgdG9vayBubyBtb3JlIHBhaW5zIGZvciB0aG9zZSB0aGFua3MgdGhhbiB5b3UgdGFrZTwvTElORT4KLTxMSU5FPnBhaW5zIHRvIHRoYW5rIG1lOiBpZiBpdCBoYWQgYmVlbiBwYWluZnVsLCBJIHdvdWxkPC9MSU5FPgotPExJTkU+bm90IGhhdmUgY29tZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+WW91IHRha2UgcGxlYXN1cmUgdGhlbiBpbiB0aGUgbWVzc2FnZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+WWVhLCBqdXN0IHNvIG11Y2ggYXMgeW91IG1heSB0YWtlIHVwb24gYSBrbmlmZSdzPC9MSU5FPgotPExJTkU+cG9pbnQgYW5kIGNob2tlIGEgZGF3IHdpdGhhbC4gWW91IGhhdmUgbm8gc3RvbWFjaCw8L0xJTkU+Ci08TElORT5zaWduaW9yOiBmYXJlIHlvdSB3ZWxsLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SGEhICdBZ2FpbnN0IG15IHdpbGwgSSBhbSBzZW50IHRvIGJpZCB5b3UgY29tZSBpbjwvTElORT4KLTxMSU5FPnRvIGRpbm5lcjsnIHRoZXJlJ3MgYSBkb3VibGUgbWVhbmluZyBpbiB0aGF0ICdJIHRvb2s8L0xJTkU+Ci08TElORT5ubyBtb3JlIHBhaW5zIGZvciB0aG9zZSB0aGFua3MgdGhhbiB5b3UgdG9vayBwYWluczwvTElORT4KLTxMSU5FPnRvIHRoYW5rIG1lLicgdGhhdCdzIGFzIG11Y2ggYXMgdG8gc2F5LCBBbnkgcGFpbnM8L0xJTkU+Ci08TElORT50aGF0IEkgdGFrZSBmb3IgeW91IGlzIGFzIGVhc3kgYXMgdGhhbmtzLiBJZiBJIGRvPC9MSU5FPgotPExJTkU+bm90IHRha2UgcGl0eSBvZiBoZXIsIEkgYW0gYSB2aWxsYWluOyBpZiBJIGRvIG5vdDwvTElORT4KLTxMSU5FPmxvdmUgaGVyLCBJIGFtIGEgSmV3LiBJIHdpbGwgZ28gZ2V0IGhlciBwaWN0dXJlLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KLTwvU0NFTkU+Ci0KLTwvQUNUPgotCi08QUNUPjxUSVRMRT5BQ1QgSUlJPC9USVRMRT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJLiAgTEVPTkFUTydTIGdhcmRlbi48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIEhFUk8sIE1BUkdBUkVULCBhbmQgVVJTVUxBPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5Hb29kIE1hcmdhcmV0LCBydW4gdGhlZSB0byB0aGUgcGFybG9yOzwvTElORT4KLTxMSU5FPlRoZXJlIHNoYWx0IHRob3UgZmluZCBteSBjb3VzaW4gQmVhdHJpY2U8L0xJTkU+Ci08TElORT5Qcm9wb3Npbmcgd2l0aCB0aGUgcHJpbmNlIGFuZCBDbGF1ZGlvOjwvTElORT4KLTxMSU5FPldoaXNwZXIgaGVyIGVhciBhbmQgdGVsbCBoZXIsIEkgYW5kIFVyc3VsYTwvTElORT4KLTxMSU5FPldhbGsgaW4gdGhlIG9yY2hhcmQgYW5kIG91ciB3aG9sZSBkaXNjb3Vyc2U8L0xJTkU+Ci08TElORT5JcyBhbGwgb2YgaGVyOyBzYXkgdGhhdCB0aG91IG92ZXJoZWFyZCdzdCB1czs8L0xJTkU+Ci08TElORT5BbmQgYmlkIGhlciBzdGVhbCBpbnRvIHRoZSBwbGVhY2hlZCBib3dlciw8L0xJTkU+Ci08TElORT5XaGVyZSBob25leXN1Y2tsZXMsIHJpcGVuJ2QgYnkgdGhlIHN1biw8L0xJTkU+Ci08TElORT5Gb3JiaWQgdGhlIHN1biB0byBlbnRlciwgbGlrZSBmYXZvdXJpdGVzLDwvTElORT4KLTxMSU5FPk1hZGUgcHJvdWQgYnkgcHJpbmNlcywgdGhhdCBhZHZhbmNlIHRoZWlyIHByaWRlPC9MSU5FPgotPExJTkU+QWdhaW5zdCB0aGF0IHBvd2VyIHRoYXQgYnJlZCBpdDogdGhlcmUgd2lsbCBzaGUgaGlkZSBoZXIsPC9MSU5FPgotPExJTkU+VG8gbGlzdGVuIG91ciBwdXJwb3NlLiAgVGhpcyBpcyB0aHkgb2ZmaWNlOzwvTElORT4KLTxMSU5FPkJlYXIgdGhlZSB3ZWxsIGluIGl0IGFuZCBsZWF2ZSB1cyBhbG9uZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+SSdsbCBtYWtlIGhlciBjb21lLCBJIHdhcnJhbnQgeW91LCBwcmVzZW50bHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4aXQ8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPk5vdywgVXJzdWxhLCB3aGVuIEJlYXRyaWNlIGRvdGggY29tZSw8L0xJTkU+Ci08TElORT5BcyB3ZSBkbyB0cmFjZSB0aGlzIGFsbGV5IHVwIGFuZCBkb3duLDwvTElORT4KLTxMSU5FPk91ciB0YWxrIG11c3Qgb25seSBiZSBvZiBCZW5lZGljay48L0xJTkU+Ci08TElORT5XaGVuIEkgZG8gbmFtZSBoaW0sIGxldCBpdCBiZSB0aHkgcGFydDwvTElORT4KLTxMSU5FPlRvIHByYWlzZSBoaW0gbW9yZSB0aGFuIGV2ZXIgbWFuIGRpZCBtZXJpdDo8L0xJTkU+Ci08TElORT5NeSB0YWxrIHRvIHRoZWUgbXVzdCBiZSBob3cgQmVuZWRpY2s8L0xJTkU+Ci08TElORT5JcyBzaWNrIGluIGxvdmUgd2l0aCBCZWF0cmljZS4gT2YgdGhpcyBtYXR0ZXI8L0xJTkU+Ci08TElORT5JcyBsaXR0bGUgQ3VwaWQncyBjcmFmdHkgYXJyb3cgbWFkZSw8L0xJTkU+Ci08TElORT5UaGF0IG9ubHkgd291bmRzIGJ5IGhlYXJzYXkuPC9MSU5FPgotPFNUQUdFRElSPkVudGVyIEJFQVRSSUNFLCBiZWhpbmQ8L1NUQUdFRElSPgotPExJTkU+Tm93IGJlZ2luOzwvTElORT4KLTxMSU5FPkZvciBsb29rIHdoZXJlIEJlYXRyaWNlLCBsaWtlIGEgbGFwd2luZywgcnVuczwvTElORT4KLTxMSU5FPkNsb3NlIGJ5IHRoZSBncm91bmQsIHRvIGhlYXIgb3VyIGNvbmZlcmVuY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Ci08TElORT5UaGUgcGxlYXNhbnQnc3QgYW5nbGluZyBpcyB0byBzZWUgdGhlIGZpc2g8L0xJTkU+Ci08TElORT5DdXQgd2l0aCBoZXIgZ29sZGVuIG9hcnMgdGhlIHNpbHZlciBzdHJlYW0sPC9MSU5FPgotPExJTkU+QW5kIGdyZWVkaWx5IGRldm91ciB0aGUgdHJlYWNoZXJvdXMgYmFpdDo8L0xJTkU+Ci08TElORT5TbyBhbmdsZSB3ZSBmb3IgQmVhdHJpY2U7IHdobyBldmVuIG5vdzwvTElORT4KLTxMSU5FPklzIGNvdWNoZWQgaW4gdGhlIHdvb2RiaW5lIGNvdmVydHVyZS48L0xJTkU+Ci08TElORT5GZWFyIHlvdSBub3QgbXkgcGFydCBvZiB0aGUgZGlhbG9ndWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+VGhlbiBnbyB3ZSBuZWFyIGhlciwgdGhhdCBoZXIgZWFyIGxvc2Ugbm90aGluZzwvTElORT4KLTxMSU5FPk9mIHRoZSBmYWxzZSBzd2VldCBiYWl0IHRoYXQgd2UgbGF5IGZvciBpdC48L0xJTkU+Ci08U1RBR0VESVI+QXBwcm9hY2hpbmcgdGhlIGJvd2VyPC9TVEFHRURJUj4KLTxMSU5FPk5vLCB0cnVseSwgVXJzdWxhLCBzaGUgaXMgdG9vIGRpc2RhaW5mdWw7PC9MSU5FPgotPExJTkU+SSBrbm93IGhlciBzcGlyaXRzIGFyZSBhcyBjb3kgYW5kIHdpbGQ8L0xJTkU+Ci08TElORT5BcyBoYWdnZXJkcyBvZiB0aGUgcm9jay48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPkJ1dCBhcmUgeW91IHN1cmU8L0xJTkU+Ci08TElORT5UaGF0IEJlbmVkaWNrIGxvdmVzIEJlYXRyaWNlIHNvIGVudGlyZWx5PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPlNvIHNheXMgdGhlIHByaW5jZSBhbmQgbXkgbmV3LXRyb3RoZWQgbG9yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPkFuZCBkaWQgdGhleSBiaWQgeW91IHRlbGwgaGVyIG9mIGl0LCBtYWRhbT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5UaGV5IGRpZCBlbnRyZWF0IG1lIHRvIGFjcXVhaW50IGhlciBvZiBpdDs8L0xJTkU+Ci08TElORT5CdXQgSSBwZXJzdWFkZWQgdGhlbSwgaWYgdGhleSBsb3ZlZCBCZW5lZGljayw8L0xJTkU+Ci08TElORT5UbyB3aXNoIGhpbSB3cmVzdGxlIHdpdGggYWZmZWN0aW9uLDwvTElORT4KLTxMSU5FPkFuZCBuZXZlciB0byBsZXQgQmVhdHJpY2Uga25vdyBvZiBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPldoeSBkaWQgeW91IHNvPyBEb3RoIG5vdCB0aGUgZ2VudGxlbWFuPC9MSU5FPgotPExJTkU+RGVzZXJ2ZSBhcyBmdWxsIGFzIGZvcnR1bmF0ZSBhIGJlZDwvTElORT4KLTxMSU5FPkFzIGV2ZXIgQmVhdHJpY2Ugc2hhbGwgY291Y2ggdXBvbj88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5PIGdvZCBvZiBsb3ZlISBJIGtub3cgaGUgZG90aCBkZXNlcnZlPC9MSU5FPgotPExJTkU+QXMgbXVjaCBhcyBtYXkgYmUgeWllbGRlZCB0byBhIG1hbjo8L0xJTkU+Ci08TElORT5CdXQgTmF0dXJlIG5ldmVyIGZyYW1lZCBhIHdvbWFuJ3MgaGVhcnQ8L0xJTkU+Ci08TElORT5PZiBwcm91ZGVyIHN0dWZmIHRoYW4gdGhhdCBvZiBCZWF0cmljZTs8L0xJTkU+Ci08TElORT5EaXNkYWluIGFuZCBzY29ybiByaWRlIHNwYXJrbGluZyBpbiBoZXIgZXllcyw8L0xJTkU+Ci08TElORT5NaXNwcmlzaW5nIHdoYXQgdGhleSBsb29rIG9uLCBhbmQgaGVyIHdpdDwvTElORT4KLTxMSU5FPlZhbHVlcyBpdHNlbGYgc28gaGlnaGx5IHRoYXQgdG8gaGVyPC9MSU5FPgotPExJTkU+QWxsIG1hdHRlciBlbHNlIHNlZW1zIHdlYWs6IHNoZSBjYW5ub3QgbG92ZSw8L0xJTkU+Ci08TElORT5Ob3IgdGFrZSBubyBzaGFwZSBub3IgcHJvamVjdCBvZiBhZmZlY3Rpb24sPC9MSU5FPgotPExJTkU+U2hlIGlzIHNvIHNlbGYtZW5kZWFyZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Ci08TElORT5TdXJlLCBJIHRoaW5rIHNvOzwvTElORT4KLTxMSU5FPkFuZCB0aGVyZWZvcmUgY2VydGFpbmx5IGl0IHdlcmUgbm90IGdvb2Q8L0xJTkU+Ci08TElORT5TaGUga25ldyBoaXMgbG92ZSwgbGVzdCBzaGUgbWFrZSBzcG9ydCBhdCBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5XaHksIHlvdSBzcGVhayB0cnV0aC4gSSBuZXZlciB5ZXQgc2F3IG1hbiw8L0xJTkU+Ci08TElORT5Ib3cgd2lzZSwgaG93IG5vYmxlLCB5b3VuZywgaG93IHJhcmVseSBmZWF0dXJlZCw8L0xJTkU+Ci08TElORT5CdXQgc2hlIHdvdWxkIHNwZWxsIGhpbSBiYWNrd2FyZDogaWYgZmFpci1mYWNlZCw8L0xJTkU+Ci08TElORT5TaGUgd291bGQgc3dlYXIgdGhlIGdlbnRsZW1hbiBzaG91bGQgYmUgaGVyIHNpc3Rlcjs8L0xJTkU+Ci08TElORT5JZiBibGFjaywgd2h5LCBOYXR1cmUsIGRyYXdpbmcgb2YgYW4gYW50aXF1ZSw8L0xJTkU+Ci08TElORT5NYWRlIGEgZm91bCBibG90OyBpZiB0YWxsLCBhIGxhbmNlIGlsbC1oZWFkZWQ7PC9MSU5FPgotPExJTkU+SWYgbG93LCBhbiBhZ2F0ZSB2ZXJ5IHZpbGVseSBjdXQ7PC9MSU5FPgotPExJTkU+SWYgc3BlYWtpbmcsIHdoeSwgYSB2YW5lIGJsb3duIHdpdGggYWxsIHdpbmRzOzwvTElORT4KLTxMSU5FPklmIHNpbGVudCwgd2h5LCBhIGJsb2NrIG1vdmVkIHdpdGggbm9uZS48L0xJTkU+Ci08TElORT5TbyB0dXJucyBzaGUgZXZlcnkgbWFuIHRoZSB3cm9uZyBzaWRlIG91dDwvTElORT4KLTxMSU5FPkFuZCBuZXZlciBnaXZlcyB0byB0cnV0aCBhbmQgdmlydHVlIHRoYXQ8L0xJTkU+Ci08TElORT5XaGljaCBzaW1wbGVuZXNzIGFuZCBtZXJpdCBwdXJjaGFzZXRoLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgotPExJTkU+U3VyZSwgc3VyZSwgc3VjaCBjYXJwaW5nIGlzIG5vdCBjb21tZW5kYWJsZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5Obywgbm90IHRvIGJlIHNvIG9kZCBhbmQgZnJvbSBhbGwgZmFzaGlvbnM8L0xJTkU+Ci08TElORT5BcyBCZWF0cmljZSBpcywgY2Fubm90IGJlIGNvbW1lbmRhYmxlOjwvTElORT4KLTxMSU5FPkJ1dCB3aG8gZGFyZSB0ZWxsIGhlciBzbz8gSWYgSSBzaG91bGQgc3BlYWssPC9MSU5FPgotPExJTkU+U2hlIHdvdWxkIG1vY2sgbWUgaW50byBhaXI7IE8sIHNoZSB3b3VsZCBsYXVnaCBtZTwvTElORT4KLTxMSU5FPk91dCBvZiBteXNlbGYsIHByZXNzIG1lIHRvIGRlYXRoIHdpdGggd2l0LjwvTElORT4KLTxMSU5FPlRoZXJlZm9yZSBsZXQgQmVuZWRpY2ssIGxpa2UgY292ZXInZCBmaXJlLDwvTElORT4KLTxMSU5FPkNvbnN1bWUgYXdheSBpbiBzaWdocywgd2FzdGUgaW53YXJkbHk6PC9MSU5FPgotPExJTkU+SXQgd2VyZSBhIGJldHRlciBkZWF0aCB0aGFuIGRpZSB3aXRoIG1vY2tzLDwvTElORT4KLTxMSU5FPldoaWNoIGlzIGFzIGJhZCBhcyBkaWUgd2l0aCB0aWNrbGluZy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPllldCB0ZWxsIGhlciBvZiBpdDogaGVhciB3aGF0IHNoZSB3aWxsIHNheS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5ObzsgcmF0aGVyIEkgd2lsbCBnbyB0byBCZW5lZGljazwvTElORT4KLTxMSU5FPkFuZCBjb3Vuc2VsIGhpbSB0byBmaWdodCBhZ2FpbnN0IGhpcyBwYXNzaW9uLjwvTElORT4KLTxMSU5FPkFuZCwgdHJ1bHksIEknbGwgZGV2aXNlIHNvbWUgaG9uZXN0IHNsYW5kZXJzPC9MSU5FPgotPExJTkU+VG8gc3RhaW4gbXkgY291c2luIHdpdGg6IG9uZSBkb3RoIG5vdCBrbm93PC9MSU5FPgotPExJTkU+SG93IG11Y2ggYW4gaWxsIHdvcmQgbWF5IGVtcG9pc29uIGxpa2luZy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPk8sIGRvIG5vdCBkbyB5b3VyIGNvdXNpbiBzdWNoIGEgd3JvbmcuPC9MSU5FPgotPExJTkU+U2hlIGNhbm5vdCBiZSBzbyBtdWNoIHdpdGhvdXQgdHJ1ZSBqdWRnbWVudC0tPC9MSU5FPgotPExJTkU+SGF2aW5nIHNvIHN3aWZ0IGFuZCBleGNlbGxlbnQgYSB3aXQ8L0xJTkU+Ci08TElORT5BcyBzaGUgaXMgcHJpemVkIHRvIGhhdmUtLWFzIHRvIHJlZnVzZTwvTElORT4KLTxMSU5FPlNvIHJhcmUgYSBnZW50bGVtYW4gYXMgU2lnbmlvciBCZW5lZGljay48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5IZSBpcyB0aGUgb25seSBtYW4gb2YgSXRhbHkuPC9MSU5FPgotPExJTkU+QWx3YXlzIGV4Y2VwdGVkIG15IGRlYXIgQ2xhdWRpby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPkkgcHJheSB5b3UsIGJlIG5vdCBhbmdyeSB3aXRoIG1lLCBtYWRhbSw8L0xJTkU+Ci08TElORT5TcGVha2luZyBteSBmYW5jeTogU2lnbmlvciBCZW5lZGljayw8L0xJTkU+Ci08TElORT5Gb3Igc2hhcGUsIGZvciBiZWFyaW5nLCBhcmd1bWVudCBhbmQgdmFsb3VyLDwvTElORT4KLTxMSU5FPkdvZXMgZm9yZW1vc3QgaW4gcmVwb3J0IHRocm91Z2ggSXRhbHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+SW5kZWVkLCBoZSBoYXRoIGFuIGV4Y2VsbGVudCBnb29kIG5hbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Ci08TElORT5IaXMgZXhjZWxsZW5jZSBkaWQgZWFybiBpdCwgZXJlIGhlIGhhZCBpdC48L0xJTkU+Ci08TElORT5XaGVuIGFyZSB5b3UgbWFycmllZCwgbWFkYW0/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+V2h5LCBldmVyeSBkYXksIHRvLW1vcnJvdy4gQ29tZSwgZ28gaW46PC9MSU5FPgotPExJTkU+SSdsbCBzaG93IHRoZWUgc29tZSBhdHRpcmVzLCBhbmQgaGF2ZSB0aHkgY291bnNlbDwvTElORT4KLTxMSU5FPldoaWNoIGlzIHRoZSBiZXN0IHRvIGZ1cm5pc2ggbWUgdG8tbW9ycm93LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgotPExJTkU+U2hlJ3MgbGltZWQsIEkgd2FycmFudCB5b3U6IHdlIGhhdmUgY2F1Z2h0IGhlciwgbWFkYW0uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+SWYgaXQgcHJvdmVzIHNvLCB0aGVuIGxvdmluZyBnb2VzIGJ5IGhhcHM6PC9MSU5FPgotPExJTkU+U29tZSBDdXBpZCBraWxscyB3aXRoIGFycm93cywgc29tZSB3aXRoIHRyYXBzLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQgSEVSTyBhbmQgVVJTVUxBPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+PFNUQUdFRElSPkNvbWluZyBmb3J3YXJkPC9TVEFHRURJUj48L0xJTkU+Ci08TElORT5XaGF0IGZpcmUgaXMgaW4gbWluZSBlYXJzPyBDYW4gdGhpcyBiZSB0cnVlPzwvTElORT4KLTxMSU5FPlN0YW5kIEkgY29uZGVtbidkIGZvciBwcmlkZSBhbmQgc2Nvcm4gc28gbXVjaD88L0xJTkU+Ci08TElORT5Db250ZW1wdCwgZmFyZXdlbGwhIGFuZCBtYWlkZW4gcHJpZGUsIGFkaWV1ITwvTElORT4KLTxMSU5FPk5vIGdsb3J5IGxpdmVzIGJlaGluZCB0aGUgYmFjayBvZiBzdWNoLjwvTElORT4KLTxMSU5FPkFuZCwgQmVuZWRpY2ssIGxvdmUgb247IEkgd2lsbCByZXF1aXRlIHRoZWUsPC9MSU5FPgotPExJTkU+VGFtaW5nIG15IHdpbGQgaGVhcnQgdG8gdGh5IGxvdmluZyBoYW5kOjwvTElORT4KLTxMSU5FPklmIHRob3UgZG9zdCBsb3ZlLCBteSBraW5kbmVzcyBzaGFsbCBpbmNpdGUgdGhlZTwvTElORT4KLTxMSU5FPlRvIGJpbmQgb3VyIGxvdmVzIHVwIGluIGEgaG9seSBiYW5kOzwvTElORT4KLTxMSU5FPkZvciBvdGhlcnMgc2F5IHRob3UgZG9zdCBkZXNlcnZlLCBhbmQgSTwvTElORT4KLTxMSU5FPkJlbGlldmUgaXQgYmV0dGVyIHRoYW4gcmVwb3J0aW5nbHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4aXQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJSS4gIEEgcm9vbSBpbiBMRU9OQVRPJ1MgaG91c2U8L1RJVExFPgotPFNUQUdFRElSPkVudGVyIERPTiBQRURSTywgQ0xBVURJTywgQkVORURJQ0ssIGFuZCBMRU9OQVRPPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkkgZG8gYnV0IHN0YXkgdGlsbCB5b3VyIG1hcnJpYWdlIGJlIGNvbnN1bW1hdGUsIGFuZDwvTElORT4KLTxMSU5FPnRoZW4gZ28gSSB0b3dhcmQgQXJyYWdvbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5JJ2xsIGJyaW5nIHlvdSB0aGl0aGVyLCBteSBsb3JkLCBpZiB5b3UnbGw8L0xJTkU+Ci08TElORT52b3VjaHNhZmUgbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5OYXksIHRoYXQgd291bGQgYmUgYXMgZ3JlYXQgYSBzb2lsIGluIHRoZSBuZXcgZ2xvc3M8L0xJTkU+Ci08TElORT5vZiB5b3VyIG1hcnJpYWdlIGFzIHRvIHNob3cgYSBjaGlsZCBoaXMgbmV3IGNvYXQ8L0xJTkU+Ci08TElORT5hbmQgZm9yYmlkIGhpbSB0byB3ZWFyIGl0LiBJIHdpbGwgb25seSBiZSBib2xkPC9MSU5FPgotPExJTkU+d2l0aCBCZW5lZGljayBmb3IgaGlzIGNvbXBhbnk7IGZvciwgZnJvbSB0aGUgY3Jvd248L0xJTkU+Ci08TElORT5vZiBoaXMgaGVhZCB0byB0aGUgc29sZSBvZiBoaXMgZm9vdCwgaGUgaXMgYWxsPC9MSU5FPgotPExJTkU+bWlydGg6IGhlIGhhdGggdHdpY2Ugb3IgdGhyaWNlIGN1dCBDdXBpZCdzPC9MSU5FPgotPExJTkU+Ym93LXN0cmluZyBhbmQgdGhlIGxpdHRsZSBoYW5nbWFuIGRhcmUgbm90IHNob290IGF0PC9MSU5FPgotPExJTkU+aGltOyBoZSBoYXRoIGEgaGVhcnQgYXMgc291bmQgYXMgYSBiZWxsIGFuZCBoaXM8L0xJTkU+Ci08TElORT50b25ndWUgaXMgdGhlIGNsYXBwZXIsIGZvciB3aGF0IGhpcyBoZWFydCB0aGlua3MgaGlzPC9MSU5FPgotPExJTkU+dG9uZ3VlIHNwZWFrcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+R2FsbGFudHMsIEkgYW0gbm90IGFzIEkgaGF2ZSBiZWVuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlNvIHNheSBJIG1ldGhpbmtzIHlvdSBhcmUgc2FkZGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkkgaG9wZSBoZSBiZSBpbiBsb3ZlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SGFuZyBoaW0sIHRydWFudCEgdGhlcmUncyBubyB0cnVlIGRyb3Agb2YgYmxvb2QgaW48L0xJTkU+Ci08TElORT5oaW0sIHRvIGJlIHRydWx5IHRvdWNoZWQgd2l0aCBsb3ZlOiBpZiBoZSBiZSBzYWQsPC9MSU5FPgotPExJTkU+aGUgd2FudHMgbW9uZXkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkkgaGF2ZSB0aGUgdG9vdGhhY2hlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+RHJhdyBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SGFuZyBpdCE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Zb3UgbXVzdCBoYW5nIGl0IGZpcnN0LCBhbmQgZHJhdyBpdCBhZnRlcndhcmRzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+V2hhdCEgc2lnaCBmb3IgdGhlIHRvb3RoYWNoZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XaGVyZSBpcyBidXQgYSBodW1vdXIgb3IgYSB3b3JtLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5XZWxsLCBldmVyeSBvbmUgY2FuIG1hc3RlciBhIGdyaWVmIGJ1dCBoZSB0aGF0IGhhczwvTElORT4KLTxMSU5FPml0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPllldCBzYXkgSSwgaGUgaXMgaW4gbG92ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlRoZXJlIGlzIG5vIGFwcGVhcmFuY2Ugb2YgZmFuY3kgaW4gaGltLCB1bmxlc3MgaXQgYmU8L0xJTkU+Ci08TElORT5hIGZhbmN5IHRoYXQgaGUgaGF0aCB0byBzdHJhbmdlIGRpc2d1aXNlczsgYXMsIHRvIGJlPC9MSU5FPgotPExJTkU+YSBEdXRjaG1hbiB0b2RheSwgYSBGcmVuY2htYW4gdG8tbW9ycm93LCBvciBpbiB0aGU8L0xJTkU+Ci08TElORT5zaGFwZSBvZiB0d28gY291bnRyaWVzIGF0IG9uY2UsIGFzLCBhIEdlcm1hbiBmcm9tPC9MSU5FPgotPExJTkU+dGhlIHdhaXN0IGRvd253YXJkLCBhbGwgc2xvcHMsIGFuZCBhIFNwYW5pYXJkIGZyb208L0xJTkU+Ci08TElORT50aGUgaGlwIHVwd2FyZCwgbm8gZG91YmxldC4gVW5sZXNzIGhlIGhhdmUgYSBmYW5jeTwvTElORT4KLTxMSU5FPnRvIHRoaXMgZm9vbGVyeSwgYXMgaXQgYXBwZWFycyBoZSBoYXRoLCBoZSBpcyBubzwvTElORT4KLTxMSU5FPmZvb2wgZm9yIGZhbmN5LCBhcyB5b3Ugd291bGQgaGF2ZSBpdCBhcHBlYXIgaGUgaXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SWYgaGUgYmUgbm90IGluIGxvdmUgd2l0aCBzb21lIHdvbWFuLCB0aGVyZSBpcyBubzwvTElORT4KLTxMSU5FPmJlbGlldmluZyBvbGQgc2lnbnM6IGEnIGJydXNoZXMgaGlzIGhhdCBvJzwvTElORT4KLTxMSU5FPm1vcm5pbmdzOyB3aGF0IHNob3VsZCB0aGF0IGJvZGU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5IYXRoIGFueSBtYW4gc2VlbiBoaW0gYXQgdGhlIGJhcmJlcidzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk5vLCBidXQgdGhlIGJhcmJlcidzIG1hbiBoYXRoIGJlZW4gc2VlbiB3aXRoIGhpbSw8L0xJTkU+Ci08TElORT5hbmQgdGhlIG9sZCBvcm5hbWVudCBvZiBoaXMgY2hlZWsgaGF0aCBhbHJlYWR5PC9MSU5FPgotPExJTkU+c3R1ZmZlZCB0ZW5uaXMtYmFsbHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+SW5kZWVkLCBoZSBsb29rcyB5b3VuZ2VyIHRoYW4gaGUgZGlkLCBieSB0aGUgbG9zcyBvZiBhIGJlYXJkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+TmF5LCBhJyBydWJzIGhpbXNlbGYgd2l0aCBjaXZldDogY2FuIHlvdSBzbWVsbCBoaW08L0xJTkU+Ci08TElORT5vdXQgYnkgdGhhdD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5UaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHRoZSBzd2VldCB5b3V0aCdzIGluIGxvdmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5UaGUgZ3JlYXRlc3Qgbm90ZSBvZiBpdCBpcyBoaXMgbWVsYW5jaG9seS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5BbmQgd2hlbiB3YXMgaGUgd29udCB0byB3YXNoIGhpcyBmYWNlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+WWVhLCBvciB0byBwYWludCBoaW1zZWxmPyBmb3IgdGhlIHdoaWNoLCBJIGhlYXI8L0xJTkU+Ci08TElORT53aGF0IHRoZXkgc2F5IG9mIGhpbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5OYXksIGJ1dCBoaXMgamVzdGluZyBzcGlyaXQ7IHdoaWNoIGlzIG5vdyBjcmVwdCBpbnRvPC9MSU5FPgotPExJTkU+YSBsdXRlLXN0cmluZyBhbmQgbm93IGdvdmVybmVkIGJ5IHN0b3BzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SW5kZWVkLCB0aGF0IHRlbGxzIGEgaGVhdnkgdGFsZSBmb3IgaGltOiBjb25jbHVkZSw8L0xJTkU+Ci08TElORT5jb25jbHVkZSBoZSBpcyBpbiBsb3ZlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk5heSwgYnV0IEkga25vdyB3aG8gbG92ZXMgaGltLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+VGhhdCB3b3VsZCBJIGtub3cgdG9vOiBJIHdhcnJhbnQsIG9uZSB0aGF0IGtub3dzIGhpbSBub3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+WWVzLCBhbmQgaGlzIGlsbCBjb25kaXRpb25zOyBhbmQsIGluIGRlc3BpdGUgb2Y8L0xJTkU+Ci08TElORT5hbGwsIGRpZXMgZm9yIGhpbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlNoZSBzaGFsbCBiZSBidXJpZWQgd2l0aCBoZXIgZmFjZSB1cHdhcmRzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5ZZXQgaXMgdGhpcyBubyBjaGFybSBmb3IgdGhlIHRvb3RoYWNoZS4gT2xkPC9MSU5FPgotPExJTkU+c2lnbmlvciwgd2FsayBhc2lkZSB3aXRoIG1lOiBJIGhhdmUgc3R1ZGllZCBlaWdodDwvTElORT4KLTxMSU5FPm9yIG5pbmUgd2lzZSB3b3JkcyB0byBzcGVhayB0byB5b3UsIHdoaWNoIHRoZXNlPC9MSU5FPgotPExJTkU+aG9iYnktaG9yc2VzIG11c3Qgbm90IGhlYXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4ZXVudCBCRU5FRElDSyBhbmQgTEVPTkFUTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Gb3IgbXkgbGlmZSwgdG8gYnJlYWsgd2l0aCBoaW0gYWJvdXQgQmVhdHJpY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+J1RpcyBldmVuIHNvLiBIZXJvIGFuZCBNYXJnYXJldCBoYXZlIGJ5IHRoaXM8L0xJTkU+Ci08TElORT5wbGF5ZWQgdGhlaXIgcGFydHMgd2l0aCBCZWF0cmljZTsgYW5kIHRoZW4gdGhlIHR3bzwvTElORT4KLTxMSU5FPmJlYXJzIHdpbGwgbm90IGJpdGUgb25lIGFub3RoZXIgd2hlbiB0aGV5IG1lZXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkVudGVyIERPTiBKT0hOPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+TXkgbG9yZCBhbmQgYnJvdGhlciwgR29kIHNhdmUgeW91ITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+R29vZCBkZW4sIGJyb3RoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPklmIHlvdXIgbGVpc3VyZSBzZXJ2ZWQsIEkgd291bGQgc3BlYWsgd2l0aCB5b3UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5JbiBwcml2YXRlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5JZiBpdCBwbGVhc2UgeW91OiB5ZXQgQ291bnQgQ2xhdWRpbyBtYXkgaGVhcjsgZm9yPC9MSU5FPgotPExJTkU+d2hhdCBJIHdvdWxkIHNwZWFrIG9mIGNvbmNlcm5zIGhpbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldoYXQncyB0aGUgbWF0dGVyPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT48U1RBR0VESVI+VG8gQ0xBVURJTzwvU1RBR0VESVI+ICBNZWFucyB5b3VyIGxvcmRzaGlwIHRvIGJlIG1hcnJpZWQ8L0xJTkU+Ci08TElORT50by1tb3Jyb3c/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Zb3Uga25vdyBoZSBkb2VzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5JIGtub3cgbm90IHRoYXQsIHdoZW4gaGUga25vd3Mgd2hhdCBJIGtub3cuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SWYgdGhlcmUgYmUgYW55IGltcGVkaW1lbnQsIEkgcHJheSB5b3UgZGlzY292ZXIgaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPllvdSBtYXkgdGhpbmsgSSBsb3ZlIHlvdSBub3Q6IGxldCB0aGF0IGFwcGVhcjwvTElORT4KLTxMSU5FPmhlcmVhZnRlciwgYW5kIGFpbSBiZXR0ZXIgYXQgbWUgYnkgdGhhdCBJIG5vdyB3aWxsPC9MSU5FPgotPExJTkU+bWFuaWZlc3QuIEZvciBteSBicm90aGVyLCBJIHRoaW5rIGhlIGhvbGRzIHlvdTwvTElORT4KLTxMSU5FPndlbGwsIGFuZCBpbiBkZWFybmVzcyBvZiBoZWFydCBoYXRoIGhvbHAgdG8gZWZmZWN0PC9MSU5FPgotPExJTkU+eW91ciBlbnN1aW5nIG1hcnJpYWdlOy0tc3VyZWx5IHN1aXQgaWxsIHNwZW50IGFuZDwvTElORT4KLTxMSU5FPmxhYm91ciBpbGwgYmVzdG93ZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5XaHksIHdoYXQncyB0aGUgbWF0dGVyPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5JIGNhbWUgaGl0aGVyIHRvIHRlbGwgeW91OyBhbmQsIGNpcmN1bXN0YW5jZXM8L0xJTkU+Ci08TElORT5zaG9ydGVuZWQsIGZvciBzaGUgaGFzIGJlZW4gdG9vIGxvbmcgYSB0YWxraW5nIG9mLDwvTElORT4KLTxMSU5FPnRoZSBsYWR5IGlzIGRpc2xveWFsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPldobywgSGVybz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkV2ZW4gc2hlOyBMZW9uYXRvJ3MgSGVybywgeW91ciBIZXJvLCBldmVyeSBtYW4ncyBIZXJvOjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkRpc2xveWFsPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5UaGUgd29yZCBpcyB0b28gZ29vZCB0byBwYWludCBvdXQgaGVyIHdpY2tlZG5lc3M7IEk8L0xJTkU+Ci08TElORT5jb3VsZCBzYXkgc2hlIHdlcmUgd29yc2U6IHRoaW5rIHlvdSBvZiBhIHdvcnNlPC9MSU5FPgotPExJTkU+dGl0bGUsIGFuZCBJIHdpbGwgZml0IGhlciB0byBpdC4gV29uZGVyIG5vdCB0aWxsPC9MSU5FPgotPExJTkU+ZnVydGhlciB3YXJyYW50OiBnbyBidXQgd2l0aCBtZSB0by1uaWdodCwgeW91IHNoYWxsPC9MSU5FPgotPExJTkU+c2VlIGhlciBjaGFtYmVyLXdpbmRvdyBlbnRlcmVkLCBldmVuIHRoZSBuaWdodDwvTElORT4KLTxMSU5FPmJlZm9yZSBoZXIgd2VkZGluZy1kYXk6IGlmIHlvdSBsb3ZlIGhlciB0aGVuLDwvTElORT4KLTxMSU5FPnRvLW1vcnJvdyB3ZWQgaGVyOyBidXQgaXQgd291bGQgYmV0dGVyIGZpdCB5b3VyIGhvbm91cjwvTElORT4KLTxMSU5FPnRvIGNoYW5nZSB5b3VyIG1pbmQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+TWF5IHRoaXMgYmUgc28/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5JIHdpbGwgbm90IHRoaW5rIGl0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5JZiB5b3UgZGFyZSBub3QgdHJ1c3QgdGhhdCB5b3Ugc2VlLCBjb25mZXNzIG5vdDwvTElORT4KLTxMSU5FPnRoYXQgeW91IGtub3c6IGlmIHlvdSB3aWxsIGZvbGxvdyBtZSwgSSB3aWxsIHNob3c8L0xJTkU+Ci08TElORT55b3UgZW5vdWdoOyBhbmQgd2hlbiB5b3UgaGF2ZSBzZWVuIG1vcmUgYW5kIGhlYXJkPC9MSU5FPgotPExJTkU+bW9yZSwgcHJvY2VlZCBhY2NvcmRpbmdseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5JZiBJIHNlZSBhbnkgdGhpbmcgdG8tbmlnaHQgd2h5IEkgc2hvdWxkIG5vdCBtYXJyeTwvTElORT4KLTxMSU5FPmhlciB0by1tb3Jyb3cgaW4gdGhlIGNvbmdyZWdhdGlvbiwgd2hlcmUgSSBzaG91bGQ8L0xJTkU+Ci08TElORT53ZWQsIHRoZXJlIHdpbGwgSSBzaGFtZSBoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5BbmQsIGFzIEkgd29vZWQgZm9yIHRoZWUgdG8gb2J0YWluIGhlciwgSSB3aWxsIGpvaW48L0xJTkU+Ci08TElORT53aXRoIHRoZWUgdG8gZGlzZ3JhY2UgaGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5JIHdpbGwgZGlzcGFyYWdlIGhlciBubyBmYXJ0aGVyIHRpbGwgeW91IGFyZSBteTwvTElORT4KLTxMSU5FPndpdG5lc3NlczogYmVhciBpdCBjb2xkbHkgYnV0IHRpbGwgbWlkbmlnaHQsIGFuZDwvTElORT4KLTxMSU5FPmxldCB0aGUgaXNzdWUgc2hvdyBpdHNlbGYuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5PIGRheSB1bnRvd2FyZGx5IHR1cm5lZCE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5PIG1pc2NoaWVmIHN0cmFuZ2VseSB0aHdhcnRpbmchPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPk8gcGxhZ3VlIHJpZ2h0IHdlbGwgcHJldmVudGVkISBzbyB3aWxsIHlvdSBzYXkgd2hlbjwvTElORT4KLTxMSU5FPnlvdSBoYXZlIHNlZW4gdGhlIHNlcXVlbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KLTwvU0NFTkU+Ci0KLTxTQ0VORT48VElUTEU+U0NFTkUgSUlJLiAgQSBzdHJlZXQuPC9USVRMRT4KLTxTVEFHRURJUj5FbnRlciBET0dCRVJSWSBhbmQgVkVSR0VTIHdpdGggdGhlIFdhdGNoPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+QXJlIHlvdSBnb29kIG1lbiBhbmQgdHJ1ZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KLTxMSU5FPlllYSwgb3IgZWxzZSBpdCB3ZXJlIHBpdHkgYnV0IHRoZXkgc2hvdWxkIHN1ZmZlcjwvTElORT4KLTxMSU5FPnNhbHZhdGlvbiwgYm9keSBhbmQgc291bC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+TmF5LCB0aGF0IHdlcmUgYSBwdW5pc2htZW50IHRvbyBnb29kIGZvciB0aGVtLCBpZjwvTElORT4KLTxMSU5FPnRoZXkgc2hvdWxkIGhhdmUgYW55IGFsbGVnaWFuY2UgaW4gdGhlbSwgYmVpbmc8L0xJTkU+Ci08TElORT5jaG9zZW4gZm9yIHRoZSBwcmluY2UncyB3YXRjaC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIGdpdmUgdGhlbSB0aGVpciBjaGFyZ2UsIG5laWdoYm91ciBEb2diZXJyeS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+Rmlyc3QsIHdobyB0aGluayB5b3UgdGhlIG1vc3QgZGVzZXJ0bGVzcyBtYW4gdG8gYmU8L0xJTkU+Ci08TElORT5jb25zdGFibGU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GaXJzdCBXYXRjaG1hbjwvU1BFQUtFUj4KLTxMSU5FPkh1Z2ggT3RlY2FrZSwgc2lyLCBvciBHZW9yZ2UgU2VhY29sZTsgZm9yIHRoZXkgY2FuPC9MSU5FPgotPExJTkU+d3JpdGUgYW5kIHJlYWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkNvbWUgaGl0aGVyLCBuZWlnaGJvdXIgU2VhY29sZS4gR29kIGhhdGggYmxlc3NlZDwvTElORT4KLTxMSU5FPnlvdSB3aXRoIGEgZ29vZCBuYW1lOiB0byBiZSBhIHdlbGwtZmF2b3VyZWQgbWFuIGlzPC9MSU5FPgotPExJTkU+dGhlIGdpZnQgb2YgZm9ydHVuZTsgYnV0IHRvIHdyaXRlIGFuZCByZWFkIGNvbWVzIGJ5IG5hdHVyZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlNlY29uZCBXYXRjaG1hbjwvU1BFQUtFUj4KLTxMSU5FPkJvdGggd2hpY2gsIG1hc3RlciBjb25zdGFibGUsLS08L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+WW91IGhhdmU6IEkga25ldyBpdCB3b3VsZCBiZSB5b3VyIGFuc3dlci4gV2VsbCw8L0xJTkU+Ci08TElORT5mb3IgeW91ciBmYXZvdXIsIHNpciwgd2h5LCBnaXZlIEdvZCB0aGFua3MsIGFuZCBtYWtlPC9MSU5FPgotPExJTkU+bm8gYm9hc3Qgb2YgaXQ7IGFuZCBmb3IgeW91ciB3cml0aW5nIGFuZCByZWFkaW5nLDwvTElORT4KLTxMSU5FPmxldCB0aGF0IGFwcGVhciB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgb2Ygc3VjaDwvTElORT4KLTxMSU5FPnZhbml0eS4gWW91IGFyZSB0aG91Z2h0IGhlcmUgdG8gYmUgdGhlIG1vc3Q8L0xJTkU+Ci08TElORT5zZW5zZWxlc3MgYW5kIGZpdCBtYW4gZm9yIHRoZSBjb25zdGFibGUgb2YgdGhlPC9MSU5FPgotPExJTkU+d2F0Y2g7IHRoZXJlZm9yZSBiZWFyIHlvdSB0aGUgbGFudGVybi4gVGhpcyBpcyB5b3VyPC9MSU5FPgotPExJTkU+Y2hhcmdlOiB5b3Ugc2hhbGwgY29tcHJlaGVuZCBhbGwgdmFncm9tIG1lbjsgeW91IGFyZTwvTElORT4KLTxMSU5FPnRvIGJpZCBhbnkgbWFuIHN0YW5kLCBpbiB0aGUgcHJpbmNlJ3MgbmFtZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlNlY29uZCBXYXRjaG1hbjwvU1BFQUtFUj4KLTxMSU5FPkhvdyBpZiBhJyB3aWxsIG5vdCBzdGFuZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+V2h5LCB0aGVuLCB0YWtlIG5vIG5vdGUgb2YgaGltLCBidXQgbGV0IGhpbSBnbzsgYW5kPC9MSU5FPgotPExJTkU+cHJlc2VudGx5IGNhbGwgdGhlIHJlc3Qgb2YgdGhlIHdhdGNoIHRvZ2V0aGVyIGFuZDwvTElORT4KLTxMSU5FPnRoYW5rIEdvZCB5b3UgYXJlIHJpZCBvZiBhIGtuYXZlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgotPExJTkU+SWYgaGUgd2lsbCBub3Qgc3RhbmQgd2hlbiBoZSBpcyBiaWRkZW4sIGhlIGlzIG5vbmU8L0xJTkU+Ci08TElORT5vZiB0aGUgcHJpbmNlJ3Mgc3ViamVjdHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPlRydWUsIGFuZCB0aGV5IGFyZSB0byBtZWRkbGUgd2l0aCBub25lIGJ1dCB0aGU8L0xJTkU+Ci08TElORT5wcmluY2UncyBzdWJqZWN0cy4gWW91IHNoYWxsIGFsc28gbWFrZSBubyBub2lzZSBpbjwvTElORT4KLTxMSU5FPnRoZSBzdHJlZXRzOyBmb3IsIGZvciB0aGUgd2F0Y2ggdG8gYmFiYmxlIGFuZCB0bzwvTElORT4KLTxMSU5FPnRhbGsgaXMgbW9zdCB0b2xlcmFibGUgYW5kIG5vdCB0byBiZSBlbmR1cmVkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+V2F0Y2htYW48L1NQRUFLRVI+Ci08TElORT5XZSB3aWxsIHJhdGhlciBzbGVlcCB0aGFuIHRhbGs6IHdlIGtub3cgd2hhdDwvTElORT4KLTxMSU5FPmJlbG9uZ3MgdG8gYSB3YXRjaC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+V2h5LCB5b3Ugc3BlYWsgbGlrZSBhbiBhbmNpZW50IGFuZCBtb3N0IHF1aWV0PC9MSU5FPgotPExJTkU+d2F0Y2htYW47IGZvciBJIGNhbm5vdCBzZWUgaG93IHNsZWVwaW5nIHNob3VsZDwvTElORT4KLTxMSU5FPm9mZmVuZDogb25seSwgaGF2ZSBhIGNhcmUgdGhhdCB5b3VyIGJpbGxzIGJlIG5vdDwvTElORT4KLTxMSU5FPnN0b2xlbi4gV2VsbCwgeW91IGFyZSB0byBjYWxsIGF0IGFsbCB0aGU8L0xJTkU+Ci08TElORT5hbGUtaG91c2VzLCBhbmQgYmlkIHRob3NlIHRoYXQgYXJlIGRydW5rIGdldCB0aGVtIHRvIGJlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgotPExJTkU+SG93IGlmIHRoZXkgd2lsbCBub3Q/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPldoeSwgdGhlbiwgbGV0IHRoZW0gYWxvbmUgdGlsbCB0aGV5IGFyZSBzb2JlcjogaWY8L0xJTkU+Ci08TElORT50aGV5IG1ha2UgeW91IG5vdCB0aGVuIHRoZSBiZXR0ZXIgYW5zd2VyLCB5b3UgbWF5PC9MSU5FPgotPExJTkU+c2F5IHRoZXkgYXJlIG5vdCB0aGUgbWVuIHlvdSB0b29rIHRoZW0gZm9yLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+V2F0Y2htYW48L1NQRUFLRVI+Ci08TElORT5XZWxsLCBzaXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPklmIHlvdSBtZWV0IGEgdGhpZWYsIHlvdSBtYXkgc3VzcGVjdCBoaW0sIGJ5IHZpcnR1ZTwvTElORT4KLTxMSU5FPm9mIHlvdXIgb2ZmaWNlLCB0byBiZSBubyB0cnVlIG1hbjsgYW5kLCBmb3Igc3VjaDwvTElORT4KLTxMSU5FPmtpbmQgb2YgbWVuLCB0aGUgbGVzcyB5b3UgbWVkZGxlIG9yIG1ha2Ugd2l0aCB0aGVtLDwvTElORT4KLTxMSU5FPndoeSB0aGUgbW9yZSBpcyBmb3IgeW91ciBob25lc3R5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+V2F0Y2htYW48L1NQRUFLRVI+Ci08TElORT5JZiB3ZSBrbm93IGhpbSB0byBiZSBhIHRoaWVmLCBzaGFsbCB3ZSBub3QgbGF5PC9MSU5FPgotPExJTkU+aGFuZHMgb24gaGltPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5UcnVseSwgYnkgeW91ciBvZmZpY2UsIHlvdSBtYXk7IGJ1dCBJIHRoaW5rIHRoZXk8L0xJTkU+Ci08TElORT50aGF0IHRvdWNoIHBpdGNoIHdpbGwgYmUgZGVmaWxlZDogdGhlIG1vc3QgcGVhY2VhYmxlPC9MSU5FPgotPExJTkU+d2F5IGZvciB5b3UsIGlmIHlvdSBkbyB0YWtlIGEgdGhpZWYsIGlzIHRvIGxldCBoaW08L0xJTkU+Ci08TElORT5zaG93IGhpbXNlbGYgd2hhdCBoZSBpcyBhbmQgc3RlYWwgb3V0IG9mIHlvdXIgY29tcGFueS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KLTxMSU5FPllvdSBoYXZlIGJlZW4gYWx3YXlzIGNhbGxlZCBhIG1lcmNpZnVsIG1hbiwgcGFydG5lci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+VHJ1bHksIEkgd291bGQgbm90IGhhbmcgYSBkb2cgYnkgbXkgd2lsbCwgbXVjaCBtb3JlPC9MSU5FPgotPExJTkU+YSBtYW4gd2hvIGhhdGggYW55IGhvbmVzdHkgaW4gaGltLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgotPExJTkU+SWYgeW91IGhlYXIgYSBjaGlsZCBjcnkgaW4gdGhlIG5pZ2h0LCB5b3UgbXVzdCBjYWxsPC9MSU5FPgotPExJTkU+dG8gdGhlIG51cnNlIGFuZCBiaWQgaGVyIHN0aWxsIGl0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+V2F0Y2htYW48L1NQRUFLRVI+Ci08TElORT5Ib3cgaWYgdGhlIG51cnNlIGJlIGFzbGVlcCBhbmQgd2lsbCBub3QgaGVhciB1cz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+V2h5LCB0aGVuLCBkZXBhcnQgaW4gcGVhY2UsIGFuZCBsZXQgdGhlIGNoaWxkIHdha2U8L0xJTkU+Ci08TElORT5oZXIgd2l0aCBjcnlpbmc7IGZvciB0aGUgZXdlIHRoYXQgd2lsbCBub3QgaGVhciBoZXI8L0xJTkU+Ci08TElORT5sYW1iIHdoZW4gaXQgYmFlcyB3aWxsIG5ldmVyIGFuc3dlciBhIGNhbGYgd2hlbiBoZSBibGVhdHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Ci08TElORT4nVGlzIHZlcnkgdHJ1ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+VGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBjaGFyZ2U6LS15b3UsIGNvbnN0YWJsZSwgYXJlPC9MSU5FPgotPExJTkU+dG8gcHJlc2VudCB0aGUgcHJpbmNlJ3Mgb3duIHBlcnNvbjogaWYgeW91IG1lZXQgdGhlPC9MSU5FPgotPExJTkU+cHJpbmNlIGluIHRoZSBuaWdodCwgeW91IG1heSBzdGF5IGhpbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KLTxMSU5FPk5heSwgYnknciBvdXIgbGFkeSwgdGhhdCBJIHRoaW5rIGEnIGNhbm5vdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+Rml2ZSBzaGlsbGluZ3MgdG8gb25lIG9uJ3QsIHdpdGggYW55IG1hbiB0aGF0IGtub3dzPC9MSU5FPgotPExJTkU+dGhlIHN0YXR1dGVzLCBoZSBtYXkgc3RheSBoaW06IG1hcnJ5LCBub3Qgd2l0aG91dDwvTElORT4KLTxMSU5FPnRoZSBwcmluY2UgYmUgd2lsbGluZzsgZm9yLCBpbmRlZWQsIHRoZSB3YXRjaCBvdWdodDwvTElORT4KLTxMSU5FPnRvIG9mZmVuZCBubyBtYW47IGFuZCBpdCBpcyBhbiBvZmZlbmNlIHRvIHN0YXkgYTwvTElORT4KLTxMSU5FPm1hbiBhZ2FpbnN0IGhpcyB3aWxsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgotPExJTkU+QnknciBsYWR5LCBJIHRoaW5rIGl0IGJlIHNvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5IYSwgaGEsIGhhISBXZWxsLCBtYXN0ZXJzLCBnb29kIG5pZ2h0OiBhbiB0aGVyZSBiZTwvTElORT4KLTxMSU5FPmFueSBtYXR0ZXIgb2Ygd2VpZ2h0IGNoYW5jZXMsIGNhbGwgdXAgbWU6IGtlZXAgeW91cjwvTElORT4KLTxMSU5FPmZlbGxvd3MnIGNvdW5zZWxzIGFuZCB5b3VyIG93bjsgYW5kIGdvb2QgbmlnaHQuPC9MSU5FPgotPExJTkU+Q29tZSwgbmVpZ2hib3VyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+V2F0Y2htYW48L1NQRUFLRVI+Ci08TElORT5XZWxsLCBtYXN0ZXJzLCB3ZSBoZWFyIG91ciBjaGFyZ2U6IGxldCB1cyBnbyBzaXQgaGVyZTwvTElORT4KLTxMSU5FPnVwb24gdGhlIGNodXJjaC1iZW5jaCB0aWxsIHR3bywgYW5kIHRoZW4gYWxsIHRvIGJlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+T25lIHdvcmQgbW9yZSwgaG9uZXN0IG5laWdoYm91cnMuIEkgcHJheSB5b3Ugd2F0Y2g8L0xJTkU+Ci08TElORT5hYm91dCBTaWduaW9yIExlb25hdG8ncyBkb29yOyBmb3IgdGhlIHdlZGRpbmcgYmVpbmc8L0xJTkU+Ci08TElORT50aGVyZSB0by1tb3Jyb3csIHRoZXJlIGlzIGEgZ3JlYXQgY29pbCB0by1uaWdodC48L0xJTkU+Ci08TElORT5BZGlldTogYmUgdmlnaXRhbnQsIEkgYmVzZWVjaCB5b3UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTVEFHRURJUj5FeGV1bnQgRE9HQkVSUlkgYW5kIFZFUkdFUzwvU1RBR0VESVI+Ci08U1RBR0VESVI+RW50ZXIgQk9SQUNISU8gYW5kIENPTlJBREU8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5XaGF0IENvbnJhZGUhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5XYXRjaG1hbjwvU1BFQUtFUj4KLTxMSU5FPjxTVEFHRURJUj5Bc2lkZTwvU1RBR0VESVI+ICBQZWFjZSEgc3RpciBub3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPkNvbnJhZGUsIEkgc2F5ITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPkhlcmUsIG1hbjsgSSBhbSBhdCB0aHkgZWxib3cuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPk1hc3MsIGFuZCBteSBlbGJvdyBpdGNoZWQ7IEkgdGhvdWdodCB0aGVyZSB3b3VsZCBhPC9MSU5FPgotPExJTkU+c2NhYiBmb2xsb3cuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgotPExJTkU+SSB3aWxsIG93ZSB0aGVlIGFuIGFuc3dlciBmb3IgdGhhdDogYW5kIG5vdyBmb3J3YXJkPC9MSU5FPgotPExJTkU+d2l0aCB0aHkgdGFsZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+U3RhbmQgdGhlZSBjbG9zZSwgdGhlbiwgdW5kZXIgdGhpcyBwZW50LWhvdXNlLCBmb3I8L0xJTkU+Ci08TElORT5pdCBkcml6emxlcyByYWluOyBhbmQgSSB3aWxsLCBsaWtlIGEgdHJ1ZSBkcnVua2FyZCw8L0xJTkU+Ci08TElORT51dHRlciBhbGwgdG8gdGhlZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgotPExJTkU+PFNUQUdFRElSPkFzaWRlPC9TVEFHRURJUj4gIFNvbWUgdHJlYXNvbiwgbWFzdGVyczogeWV0IHN0YW5kIGNsb3NlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5UaGVyZWZvcmUga25vdyBJIGhhdmUgZWFybmVkIG9mIERvbiBKb2huIGEgdGhvdXNhbmQgZHVjYXRzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPklzIGl0IHBvc3NpYmxlIHRoYXQgYW55IHZpbGxhbnkgc2hvdWxkIGJlIHNvIGRlYXI/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPlRob3Ugc2hvdWxkc3QgcmF0aGVyIGFzayBpZiBpdCB3ZXJlIHBvc3NpYmxlIGFueTwvTElORT4KLTxMSU5FPnZpbGxhbnkgc2hvdWxkIGJlIHNvIHJpY2g7IGZvciB3aGVuIHJpY2ggdmlsbGFpbnM8L0xJTkU+Ci08TElORT5oYXZlIG5lZWQgb2YgcG9vciBvbmVzLCBwb29yIG9uZXMgbWF5IG1ha2Ugd2hhdDwvTElORT4KLTxMSU5FPnByaWNlIHRoZXkgd2lsbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5JIHdvbmRlciBhdCBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+VGhhdCBzaG93cyB0aG91IGFydCB1bmNvbmZpcm1lZC4gVGhvdSBrbm93ZXN0IHRoYXQ8L0xJTkU+Ci08TElORT50aGUgZmFzaGlvbiBvZiBhIGRvdWJsZXQsIG9yIGEgaGF0LCBvciBhIGNsb2FrLCBpczwvTElORT4KLTxMSU5FPm5vdGhpbmcgdG8gYSBtYW4uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgotPExJTkU+WWVzLCBpdCBpcyBhcHBhcmVsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5JIG1lYW4sIHRoZSBmYXNoaW9uLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPlllcywgdGhlIGZhc2hpb24gaXMgdGhlIGZhc2hpb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPlR1c2ghIEkgbWF5IGFzIHdlbGwgc2F5IHRoZSBmb29sJ3MgdGhlIGZvb2wuIEJ1dDwvTElORT4KLTxMSU5FPnNlZXN0IHRob3Ugbm90IHdoYXQgYSBkZWZvcm1lZCB0aGllZiB0aGlzIGZhc2hpb248L0xJTkU+Ci08TElORT5pcz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgotPExJTkU+PFNUQUdFRElSPkFzaWRlPC9TVEFHRURJUj4gIEkga25vdyB0aGF0IERlZm9ybWVkOyBhJyBoYXMgYmVlbiBhIHZpbGU8L0xJTkU+Ci08TElORT50aGllZiB0aGlzIHNldmVuIHllYXI7IGEnIGdvZXMgdXAgYW5kIGRvd24gbGlrZSBhPC9MSU5FPgotPExJTkU+Z2VudGxlbWFuOiBJIHJlbWVtYmVyIGhpcyBuYW1lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5EaWRzdCB0aG91IG5vdCBoZWFyIHNvbWVib2R5PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPk5vOyAndHdhcyB0aGUgdmFuZSBvbiB0aGUgaG91c2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPlNlZXN0IHRob3Ugbm90LCBJIHNheSwgd2hhdCBhIGRlZm9ybWVkIHRoaWVmIHRoaXM8L0xJTkU+Ci08TElORT5mYXNoaW9uIGlzPyBob3cgZ2lkZGlseSBhJyB0dXJucyBhYm91dCBhbGwgdGhlIGhvdDwvTElORT4KLTxMSU5FPmJsb29kcyBiZXR3ZWVuIGZvdXJ0ZWVuIGFuZCBmaXZlLWFuZC10aGlydHk/PC9MSU5FPgotPExJTkU+c29tZXRpbWVzIGZhc2hpb25pbmcgdGhlbSBsaWtlIFBoYXJhb2gncyBzb2xkaWVyczwvTElORT4KLTxMSU5FPmluIHRoZSByZWVreSBwYWludGluZywgc29tZXRpbWUgbGlrZSBnb2QgQmVsJ3M8L0xJTkU+Ci08TElORT5wcmllc3RzIGluIHRoZSBvbGQgY2h1cmNoLXdpbmRvdywgc29tZXRpbWUgbGlrZSB0aGU8L0xJTkU+Ci08TElORT5zaGF2ZW4gSGVyY3VsZXMgaW4gdGhlIHNtaXJjaGVkIHdvcm0tZWF0ZW4gdGFwZXN0cnksPC9MSU5FPgotPExJTkU+d2hlcmUgaGlzIGNvZHBpZWNlIHNlZW1zIGFzIG1hc3N5IGFzIGhpcyBjbHViPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPkFsbCB0aGlzIEkgc2VlOyBhbmQgSSBzZWUgdGhhdCB0aGUgZmFzaGlvbiB3ZWFyczwvTElORT4KLTxMSU5FPm91dCBtb3JlIGFwcGFyZWwgdGhhbiB0aGUgbWFuLiBCdXQgYXJ0IG5vdCB0aG91PC9MSU5FPgotPExJTkU+dGh5c2VsZiBnaWRkeSB3aXRoIHRoZSBmYXNoaW9uIHRvbywgdGhhdCB0aG91IGhhc3Q8L0xJTkU+Ci08TElORT5zaGlmdGVkIG91dCBvZiB0aHkgdGFsZSBpbnRvIHRlbGxpbmcgbWUgb2YgdGhlIGZhc2hpb24/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPk5vdCBzbywgbmVpdGhlcjogYnV0IGtub3cgdGhhdCBJIGhhdmUgdG8tbmlnaHQ8L0xJTkU+Ci08TElORT53b29lZCBNYXJnYXJldCwgdGhlIExhZHkgSGVybydzIGdlbnRsZXdvbWFuLCBieSB0aGU8L0xJTkU+Ci08TElORT5uYW1lIG9mIEhlcm86IHNoZSBsZWFucyBtZSBvdXQgYXQgaGVyIG1pc3RyZXNzJzwvTElORT4KLTxMSU5FPmNoYW1iZXItd2luZG93LCBiaWRzIG1lIGEgdGhvdXNhbmQgdGltZXMgZ29vZDwvTElORT4KLTxMSU5FPm5pZ2h0LC0tSSB0ZWxsIHRoaXMgdGFsZSB2aWxlbHk6LS1JIHNob3VsZCBmaXJzdDwvTElORT4KLTxMSU5FPnRlbGwgdGhlZSBob3cgdGhlIHByaW5jZSwgQ2xhdWRpbyBhbmQgbXkgbWFzdGVyLDwvTElORT4KLTxMSU5FPnBsYW50ZWQgYW5kIHBsYWNlZCBhbmQgcG9zc2Vzc2VkIGJ5IG15IG1hc3RlciBEb248L0xJTkU+Ci08TElORT5Kb2huLCBzYXcgYWZhciBvZmYgaW4gdGhlIG9yY2hhcmQgdGhpcyBhbWlhYmxlIGVuY291bnRlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5BbmQgdGhvdWdodCB0aGV5IE1hcmdhcmV0IHdhcyBIZXJvPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5Ud28gb2YgdGhlbSBkaWQsIHRoZSBwcmluY2UgYW5kIENsYXVkaW87IGJ1dCB0aGU8L0xJTkU+Ci08TElORT5kZXZpbCBteSBtYXN0ZXIga25ldyBzaGUgd2FzIE1hcmdhcmV0OyBhbmQgcGFydGx5PC9MSU5FPgotPExJTkU+YnkgaGlzIG9hdGhzLCB3aGljaCBmaXJzdCBwb3NzZXNzZWQgdGhlbSwgcGFydGx5IGJ5PC9MSU5FPgotPExJTkU+dGhlIGRhcmsgbmlnaHQsIHdoaWNoIGRpZCBkZWNlaXZlIHRoZW0sIGJ1dCBjaGllZmx5PC9MSU5FPgotPExJTkU+YnkgbXkgdmlsbGFueSwgd2hpY2ggZGlkIGNvbmZpcm0gYW55IHNsYW5kZXIgdGhhdDwvTElORT4KLTxMSU5FPkRvbiBKb2huIGhhZCBtYWRlLCBhd2F5IHdlbnQgQ2xhdWRpbyBlbnJhZ2VkOyBzd29yZTwvTElORT4KLTxMSU5FPmhlIHdvdWxkIG1lZXQgaGVyLCBhcyBoZSB3YXMgYXBwb2ludGVkLCBuZXh0IG1vcm5pbmc8L0xJTkU+Ci08TElORT5hdCB0aGUgdGVtcGxlLCBhbmQgdGhlcmUsIGJlZm9yZSB0aGUgd2hvbGU8L0xJTkU+Ci08TElORT5jb25ncmVnYXRpb24sIHNoYW1lIGhlciB3aXRoIHdoYXQgaGUgc2F3IG8nZXIgbmlnaHQ8L0xJTkU+Ci08TElORT5hbmQgc2VuZCBoZXIgaG9tZSBhZ2FpbiB3aXRob3V0IGEgaHVzYmFuZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkZpcnN0IFdhdGNobWFuPC9TUEVBS0VSPgotPExJTkU+V2UgY2hhcmdlIHlvdSwgaW4gdGhlIHByaW5jZSdzIG5hbWUsIHN0YW5kITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+U2Vjb25kIFdhdGNobWFuPC9TUEVBS0VSPgotPExJTkU+Q2FsbCB1cCB0aGUgcmlnaHQgbWFzdGVyIGNvbnN0YWJsZS4gV2UgaGF2ZSBoZXJlPC9MSU5FPgotPExJTkU+cmVjb3ZlcmVkIHRoZSBtb3N0IGRhbmdlcm91cyBwaWVjZSBvZiBsZWNoZXJ5IHRoYXQ8L0xJTkU+Ci08TElORT5ldmVyIHdhcyBrbm93biBpbiB0aGUgY29tbW9ud2VhbHRoLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Rmlyc3QgV2F0Y2htYW48L1NQRUFLRVI+Ci08TElORT5BbmQgb25lIERlZm9ybWVkIGlzIG9uZSBvZiB0aGVtOiBJIGtub3cgaGltOyBhJzwvTElORT4KLTxMSU5FPndlYXJzIGEgbG9jay48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5NYXN0ZXJzLCBtYXN0ZXJzLC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5TZWNvbmQgV2F0Y2htYW48L1NQRUFLRVI+Ci08TElORT5Zb3UnbGwgYmUgbWFkZSBicmluZyBEZWZvcm1lZCBmb3J0aCwgSSB3YXJyYW50IHlvdS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5NYXN0ZXJzLC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GaXJzdCBXYXRjaG1hbjwvU1BFQUtFUj4KLTxMSU5FPk5ldmVyIHNwZWFrOiB3ZSBjaGFyZ2UgeW91IGxldCB1cyBvYmV5IHlvdSB0byBnbyB3aXRoIHVzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5XZSBhcmUgbGlrZSB0byBwcm92ZSBhIGdvb2RseSBjb21tb2RpdHksIGJlaW5nIHRha2VuPC9MSU5FPgotPExJTkU+dXAgb2YgdGhlc2UgbWVuJ3MgYmlsbHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgotPExJTkU+QSBjb21tb2RpdHkgaW4gcXVlc3Rpb24sIEkgd2FycmFudCB5b3UuIENvbWUsIHdlJ2xsIG9iZXkgeW91LjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJVi4gIEhFUk8ncyBhcGFydG1lbnQuPC9USVRMRT4KLTxTVEFHRURJUj5FbnRlciBIRVJPLCBNQVJHQVJFVCwgYW5kIFVSU1VMQTwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+R29vZCBVcnN1bGEsIHdha2UgbXkgY291c2luIEJlYXRyaWNlLCBhbmQgZGVzaXJlPC9MSU5FPgotPExJTkU+aGVyIHRvIHJpc2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Ci08TElORT5JIHdpbGwsIGxhZHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+QW5kIGJpZCBoZXIgY29tZSBoaXRoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Ci08TElORT5XZWxsLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+VHJvdGgsIEkgdGhpbmsgeW91ciBvdGhlciByYWJhdG8gd2VyZSBiZXR0ZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+Tm8sIHByYXkgdGhlZSwgZ29vZCBNZWcsIEknbGwgd2VhciB0aGlzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5CeSBteSB0cm90aCwgJ3Mgbm90IHNvIGdvb2Q7IGFuZCBJIHdhcnJhbnQgeW91cjwvTElORT4KLTxMSU5FPmNvdXNpbiB3aWxsIHNheSBzby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5NeSBjb3VzaW4ncyBhIGZvb2wsIGFuZCB0aG91IGFydCBhbm90aGVyOiBJJ2xsIHdlYXI8L0xJTkU+Ci08TElORT5ub25lIGJ1dCB0aGlzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5JIGxpa2UgdGhlIG5ldyB0aXJlIHdpdGhpbiBleGNlbGxlbnRseSwgaWYgdGhlIGhhaXI8L0xJTkU+Ci08TElORT53ZXJlIGEgdGhvdWdodCBicm93bmVyOyBhbmQgeW91ciBnb3duJ3MgYSBtb3N0IHJhcmU8L0xJTkU+Ci08TElORT5mYXNoaW9uLCBpJyBmYWl0aC4gSSBzYXcgdGhlIER1Y2hlc3Mgb2YgTWlsYW4nczwvTElORT4KLTxMSU5FPmdvd24gdGhhdCB0aGV5IHByYWlzZSBzby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5PLCB0aGF0IGV4Y2VlZHMsIHRoZXkgc2F5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5CeSBteSB0cm90aCwgJ3MgYnV0IGEgbmlnaHQtZ293biBpbiByZXNwZWN0IG9mPC9MSU5FPgotPExJTkU+eW91cnM6IGNsb3RoIG8nIGdvbGQsIGFuZCBjdXRzLCBhbmQgbGFjZWQgd2l0aDwvTElORT4KLTxMSU5FPnNpbHZlciwgc2V0IHdpdGggcGVhcmxzLCBkb3duIHNsZWV2ZXMsIHNpZGUgc2xlZXZlcyw8L0xJTkU+Ci08TElORT5hbmQgc2tpcnRzLCByb3VuZCB1bmRlcmJvcm5lIHdpdGggYSBibHVpc2ggdGluc2VsOjwvTElORT4KLTxMSU5FPmJ1dCBmb3IgYSBmaW5lLCBxdWFpbnQsIGdyYWNlZnVsIGFuZCBleGNlbGxlbnQ8L0xJTkU+Ci08TElORT5mYXNoaW9uLCB5b3VycyBpcyB3b3J0aCB0ZW4gb24gJ3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+R29kIGdpdmUgbWUgam95IHRvIHdlYXIgaXQhIGZvciBteSBoZWFydCBpczwvTElORT4KLTxMSU5FPmV4Y2VlZGluZyBoZWF2eS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+J1R3aWxsIGJlIGhlYXZpZXIgc29vbiBieSB0aGUgd2VpZ2h0IG9mIGEgbWFuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPkZpZSB1cG9uIHRoZWUhIGFydCBub3QgYXNoYW1lZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+T2Ygd2hhdCwgbGFkeT8gb2Ygc3BlYWtpbmcgaG9ub3VyYWJseT8gSXMgbm90PC9MSU5FPgotPExJTkU+bWFycmlhZ2UgaG9ub3VyYWJsZSBpbiBhIGJlZ2dhcj8gSXMgbm90IHlvdXIgbG9yZDwvTElORT4KLTxMSU5FPmhvbm91cmFibGUgd2l0aG91dCBtYXJyaWFnZT8gSSB0aGluayB5b3Ugd291bGQgaGF2ZTwvTElORT4KLTxMSU5FPm1lIHNheSwgJ3NhdmluZyB5b3VyIHJldmVyZW5jZSwgYSBodXNiYW5kOicgYW5kIGJhZDwvTElORT4KLTxMSU5FPnRoaW5raW5nIGRvIG5vdCB3cmVzdCB0cnVlIHNwZWFraW5nLCBJJ2xsIG9mZmVuZDwvTElORT4KLTxMSU5FPm5vYm9keTogaXMgdGhlcmUgYW55IGhhcm0gaW4gJ3RoZSBoZWF2aWVyIGZvciBhPC9MSU5FPgotPExJTkU+aHVzYmFuZCc/IE5vbmUsIEkgdGhpbmssIGFuZCBpdCBiZSB0aGUgcmlnaHQgaHVzYmFuZDwvTElORT4KLTxMSU5FPmFuZCB0aGUgcmlnaHQgd2lmZTsgb3RoZXJ3aXNlICd0aXMgbGlnaHQsIGFuZCBub3Q8L0xJTkU+Ci08TElORT5oZWF2eTogYXNrIG15IExhZHkgQmVhdHJpY2UgZWxzZTsgaGVyZSBzaGUgY29tZXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkVudGVyIEJFQVRSSUNFPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5Hb29kIG1vcnJvdywgY296LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5Hb29kIG1vcnJvdywgc3dlZXQgSGVyby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5XaHkgaG93IG5vdz8gZG8geW91IHNwZWFrIGluIHRoZSBzaWNrIHR1bmU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkkgYW0gb3V0IG9mIGFsbCBvdGhlciB0dW5lLCBtZXRoaW5rcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+Q2xhcCdzIGludG8gJ0xpZ2h0IG8nIGxvdmU7JyB0aGF0IGdvZXMgd2l0aG91dCBhPC9MSU5FPgotPExJTkU+YnVyZGVuOiBkbyB5b3Ugc2luZyBpdCwgYW5kIEknbGwgZGFuY2UgaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlllIGxpZ2h0IG8nIGxvdmUsIHdpdGggeW91ciBoZWVscyEgdGhlbiwgaWYgeW91cjwvTElORT4KLTxMSU5FPmh1c2JhbmQgaGF2ZSBzdGFibGVzIGVub3VnaCwgeW91J2xsIHNlZSBoZSBzaGFsbDwvTElORT4KLTxMSU5FPmxhY2sgbm8gYmFybnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPk8gaWxsZWdpdGltYXRlIGNvbnN0cnVjdGlvbiEgSSBzY29ybiB0aGF0IHdpdGggbXkgaGVlbHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPidUaXMgYWxtb3N0IGZpdmUgbydjbG9jaywgY291c2luOyB0aXMgdGltZSB5b3Ugd2VyZTwvTElORT4KLTxMSU5FPnJlYWR5LiBCeSBteSB0cm90aCwgSSBhbSBleGNlZWRpbmcgaWxsOiBoZWlnaC1obyE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+Rm9yIGEgaGF3aywgYSBob3JzZSwgb3IgYSBodXNiYW5kPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5Gb3IgdGhlIGxldHRlciB0aGF0IGJlZ2lucyB0aGVtIGFsbCwgSC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+V2VsbCwgYW5kIHlvdSBiZSBub3QgdHVybmVkIFR1cmssIHRoZXJlJ3Mgbm8gbW9yZTwvTElORT4KLTxMSU5FPnNhaWxpbmcgYnkgdGhlIHN0YXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPldoYXQgbWVhbnMgdGhlIGZvb2wsIHRyb3c/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPk5vdGhpbmcgSTsgYnV0IEdvZCBzZW5kIGV2ZXJ5IG9uZSB0aGVpciBoZWFydCdzIGRlc2lyZSE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5UaGVzZSBnbG92ZXMgdGhlIGNvdW50IHNlbnQgbWU7IHRoZXkgYXJlIGFuPC9MSU5FPgotPExJTkU+ZXhjZWxsZW50IHBlcmZ1bWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkkgYW0gc3R1ZmZlZCwgY291c2luOyBJIGNhbm5vdCBzbWVsbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgotPExJTkU+QSBtYWlkLCBhbmQgc3R1ZmZlZCEgdGhlcmUncyBnb29kbHkgY2F0Y2hpbmcgb2YgY29sZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+TywgR29kIGhlbHAgbWUhIEdvZCBoZWxwIG1lISBob3cgbG9uZyBoYXZlIHlvdTwvTElORT4KLTxMSU5FPnByb2Zlc3NlZCBhcHByZWhlbnNpb24/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPkV2ZW4gc2luY2UgeW91IGxlZnQgaXQuIERvdGggbm90IG15IHdpdCBiZWNvbWUgbWUgcmFyZWx5PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JdCBpcyBub3Qgc2VlbiBlbm91Z2gsIHlvdSBzaG91bGQgd2VhciBpdCBpbiB5b3VyPC9MSU5FPgotPExJTkU+Y2FwLiBCeSBteSB0cm90aCwgSSBhbSBzaWNrLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5HZXQgeW91IHNvbWUgb2YgdGhpcyBkaXN0aWxsZWQgQ2FyZHV1cyBCZW5lZGljdHVzLDwvTElORT4KLTxMSU5FPmFuZCBsYXkgaXQgdG8geW91ciBoZWFydDogaXQgaXMgdGhlIG9ubHkgdGhpbmcgZm9yIGEgcXVhbG0uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+VGhlcmUgdGhvdSBwcmlja2VzdCBoZXIgd2l0aCBhIHRoaXN0bGUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkJlbmVkaWN0dXMhIHdoeSBCZW5lZGljdHVzPyB5b3UgaGF2ZSBzb21lIG1vcmFsIGluPC9MSU5FPgotPExJTkU+dGhpcyBCZW5lZGljdHVzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5Nb3JhbCEgbm8sIGJ5IG15IHRyb3RoLCBJIGhhdmUgbm8gbW9yYWwgbWVhbmluZzsgSTwvTElORT4KLTxMSU5FPm1lYW50LCBwbGFpbiBob2x5LXRoaXN0bGUuIFlvdSBtYXkgdGhpbmsgcGVyY2hhbmNlPC9MSU5FPgotPExJTkU+dGhhdCBJIHRoaW5rIHlvdSBhcmUgaW4gbG92ZTogbmF5LCBieSdyIGxhZHksIEkgYW08L0xJTkU+Ci08TElORT5ub3Qgc3VjaCBhIGZvb2wgdG8gdGhpbmsgd2hhdCBJIGxpc3QsIG5vciBJIGxpc3Q8L0xJTkU+Ci08TElORT5ub3QgdG8gdGhpbmsgd2hhdCBJIGNhbiwgbm9yIGluZGVlZCBJIGNhbm5vdCB0aGluayw8L0xJTkU+Ci08TElORT5pZiBJIHdvdWxkIHRoaW5rIG15IGhlYXJ0IG91dCBvZiB0aGlua2luZywgdGhhdCB5b3U8L0xJTkU+Ci08TElORT5hcmUgaW4gbG92ZSBvciB0aGF0IHlvdSB3aWxsIGJlIGluIGxvdmUgb3IgdGhhdCB5b3U8L0xJTkU+Ci08TElORT5jYW4gYmUgaW4gbG92ZS4gWWV0IEJlbmVkaWNrIHdhcyBzdWNoIGFub3RoZXIsIGFuZDwvTElORT4KLTxMSU5FPm5vdyBpcyBoZSBiZWNvbWUgYSBtYW46IGhlIHN3b3JlIGhlIHdvdWxkIG5ldmVyPC9MSU5FPgotPExJTkU+bWFycnksIGFuZCB5ZXQgbm93LCBpbiBkZXNwaXRlIG9mIGhpcyBoZWFydCwgaGUgZWF0czwvTElORT4KLTxMSU5FPmhpcyBtZWF0IHdpdGhvdXQgZ3J1ZGdpbmc6IGFuZCBob3cgeW91IG1heSBiZTwvTElORT4KLTxMSU5FPmNvbnZlcnRlZCBJIGtub3cgbm90LCBidXQgbWV0aGlua3MgeW91IGxvb2sgd2l0aDwvTElORT4KLTxMSU5FPnlvdXIgZXllcyBhcyBvdGhlciB3b21lbiBkby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+V2hhdCBwYWNlIGlzIHRoaXMgdGhhdCB0aHkgdG9uZ3VlIGtlZXBzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5Ob3QgYSBmYWxzZSBnYWxsb3AuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPlJlLWVudGVyIFVSU1VMQTwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Ci08TElORT5NYWRhbSwgd2l0aGRyYXc6IHRoZSBwcmluY2UsIHRoZSBjb3VudCwgU2lnbmlvcjwvTElORT4KLTxMSU5FPkJlbmVkaWNrLCBEb24gSm9obiwgYW5kIGFsbCB0aGUgZ2FsbGFudHMgb2YgdGhlPC9MSU5FPgotPExJTkU+dG93biwgYXJlIGNvbWUgdG8gZmV0Y2ggeW91IHRvIGNodXJjaC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5IZWxwIHRvIGRyZXNzIG1lLCBnb29kIGNveiwgZ29vZCBNZWcsIGdvb2QgVXJzdWxhLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBWLiAgQW5vdGhlciByb29tIGluIExFT05BVE8nUyBob3VzZS48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIExFT05BVE8sIHdpdGggRE9HQkVSUlkgYW5kIFZFUkdFUzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+V2hhdCB3b3VsZCB5b3Ugd2l0aCBtZSwgaG9uZXN0IG5laWdoYm91cj88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+TWFycnksIHNpciwgSSB3b3VsZCBoYXZlIHNvbWUgY29uZmlkZW5jZSB3aXRoIHlvdTwvTElORT4KLTxMSU5FPnRoYXQgZGVjZXJucyB5b3UgbmVhcmx5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkJyaWVmLCBJIHByYXkgeW91OyBmb3IgeW91IHNlZSBpdCBpcyBhIGJ1c3kgdGltZSB3aXRoIG1lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5NYXJyeSwgdGhpcyBpdCBpcywgc2lyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgotPExJTkU+WWVzLCBpbiB0cnV0aCBpdCBpcywgc2lyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPldoYXQgaXMgaXQsIG15IGdvb2QgZnJpZW5kcz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+R29vZG1hbiBWZXJnZXMsIHNpciwgc3BlYWtzIGEgbGl0dGxlIG9mZiB0aGU8L0xJTkU+Ci08TElORT5tYXR0ZXI6IGFuIG9sZCBtYW4sIHNpciwgYW5kIGhpcyB3aXRzIGFyZSBub3Qgc288L0xJTkU+Ci08TElORT5ibHVudCBhcywgR29kIGhlbHAsIEkgd291bGQgZGVzaXJlIHRoZXkgd2VyZTsgYnV0LDwvTElORT4KLTxMSU5FPmluIGZhaXRoLCBob25lc3QgYXMgdGhlIHNraW4gYmV0d2VlbiBoaXMgYnJvd3MuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Ci08TElORT5ZZXMsIEkgdGhhbmsgR29kIEkgYW0gYXMgaG9uZXN0IGFzIGFueSBtYW4gbGl2aW5nPC9MSU5FPgotPExJTkU+dGhhdCBpcyBhbiBvbGQgbWFuIGFuZCBubyBob25lc3RlciB0aGFuIEkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkNvbXBhcmlzb25zIGFyZSBvZG9yb3VzOiBwYWxhYnJhcywgbmVpZ2hib3VyIFZlcmdlcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5OZWlnaGJvdXJzLCB5b3UgYXJlIHRlZGlvdXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkl0IHBsZWFzZXMgeW91ciB3b3JzaGlwIHRvIHNheSBzbywgYnV0IHdlIGFyZSB0aGU8L0xJTkU+Ci08TElORT5wb29yIGR1a2UncyBvZmZpY2VyczsgYnV0IHRydWx5LCBmb3IgbWluZSBvd24gcGFydCw8L0xJTkU+Ci08TElORT5pZiBJIHdlcmUgYXMgdGVkaW91cyBhcyBhIGtpbmcsIEkgY291bGQgZmluZCBpdCBpbjwvTElORT4KLTxMSU5FPm15IGhlYXJ0IHRvIGJlc3RvdyBpdCBhbGwgb2YgeW91ciB3b3JzaGlwLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkFsbCB0aHkgdGVkaW91c25lc3Mgb24gbWUsIGFoPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5ZZWEsIGFuICd0d2VyZSBhIHRob3VzYW5kIHBvdW5kIG1vcmUgdGhhbiAndGlzOyBmb3I8L0xJTkU+Ci08TElORT5JIGhlYXIgYXMgZ29vZCBleGNsYW1hdGlvbiBvbiB5b3VyIHdvcnNoaXAgYXMgb2YgYW55PC9MSU5FPgotPExJTkU+bWFuIGluIHRoZSBjaXR5OyBhbmQgdGhvdWdoIEkgYmUgYnV0IGEgcG9vciBtYW4sIEk8L0xJTkU+Ci08TElORT5hbSBnbGFkIHRvIGhlYXIgaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Ci08TElORT5BbmQgc28gYW0gSS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5JIHdvdWxkIGZhaW4ga25vdyB3aGF0IHlvdSBoYXZlIHRvIHNheS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KLTxMSU5FPk1hcnJ5LCBzaXIsIG91ciB3YXRjaCB0by1uaWdodCwgZXhjZXB0aW5nIHlvdXI8L0xJTkU+Ci08TElORT53b3JzaGlwJ3MgcHJlc2VuY2UsIGhhJyB0YSdlbiBhIGNvdXBsZSBvZiBhcyBhcnJhbnQ8L0xJTkU+Ci08TElORT5rbmF2ZXMgYXMgYW55IGluIE1lc3NpbmEuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkEgZ29vZCBvbGQgbWFuLCBzaXI7IGhlIHdpbGwgYmUgdGFsa2luZzogYXMgdGhleTwvTElORT4KLTxMSU5FPnNheSwgd2hlbiB0aGUgYWdlIGlzIGluLCB0aGUgd2l0IGlzIG91dDogR29kIGhlbHA8L0xJTkU+Ci08TElORT51cyEgaXQgaXMgYSB3b3JsZCB0byBzZWUuIFdlbGwgc2FpZCwgaScgZmFpdGgsPC9MSU5FPgotPExJTkU+bmVpZ2hib3VyIFZlcmdlczogd2VsbCwgR29kJ3MgYSBnb29kIG1hbjsgYW4gdHdvIG1lbjwvTElORT4KLTxMSU5FPnJpZGUgb2YgYSBob3JzZSwgb25lIG11c3QgcmlkZSBiZWhpbmQuIEFuIGhvbmVzdDwvTElORT4KLTxMSU5FPnNvdWwsIGknIGZhaXRoLCBzaXI7IGJ5IG15IHRyb3RoIGhlIGlzLCBhcyBldmVyPC9MSU5FPgotPExJTkU+YnJva2UgYnJlYWQ7IGJ1dCBHb2QgaXMgdG8gYmUgd29yc2hpcHBlZDsgYWxsIG1lbjwvTElORT4KLTxMSU5FPmFyZSBub3QgYWxpa2U7IGFsYXMsIGdvb2QgbmVpZ2hib3VyITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkluZGVlZCwgbmVpZ2hib3VyLCBoZSBjb21lcyB0b28gc2hvcnQgb2YgeW91LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5HaWZ0cyB0aGF0IEdvZCBnaXZlcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5JIG11c3QgbGVhdmUgeW91LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5PbmUgd29yZCwgc2lyOiBvdXIgd2F0Y2gsIHNpciwgaGF2ZSBpbmRlZWQ8L0xJTkU+Ci08TElORT5jb21wcmVoZW5kZWQgdHdvIGFzcGljaW91cyBwZXJzb25zLCBhbmQgd2Ugd291bGQ8L0xJTkU+Ci08TElORT5oYXZlIHRoZW0gdGhpcyBtb3JuaW5nIGV4YW1pbmVkIGJlZm9yZSB5b3VyIHdvcnNoaXAuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+VGFrZSB0aGVpciBleGFtaW5hdGlvbiB5b3Vyc2VsZiBhbmQgYnJpbmcgaXQgbWU6IEk8L0xJTkU+Ci08TElORT5hbSBub3cgaW4gZ3JlYXQgaGFzdGUsIGFzIGl0IG1heSBhcHBlYXIgdW50byB5b3UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkl0IHNoYWxsIGJlIHN1ZmZpZ2FuY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+RHJpbmsgc29tZSB3aW5lIGVyZSB5b3UgZ286IGZhcmUgeW91IHdlbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkVudGVyIGEgTWVzc2VuZ2VyPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KLTxMSU5FPk15IGxvcmQsIHRoZXkgc3RheSBmb3IgeW91IHRvIGdpdmUgeW91ciBkYXVnaHRlciB0bzwvTElORT4KLTxMSU5FPmhlciBodXNiYW5kLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkknbGwgd2FpdCB1cG9uIHRoZW06IEkgYW0gcmVhZHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4ZXVudCBMRU9OQVRPIGFuZCBNZXNzZW5nZXI8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5HbywgZ29vZCBwYXJ0bmVyLCBnbywgZ2V0IHlvdSB0byBGcmFuY2lzIFNlYWNvbGU7PC9MSU5FPgotPExJTkU+YmlkIGhpbSBicmluZyBoaXMgcGVuIGFuZCBpbmtob3JuIHRvIHRoZSBnYW9sOiB3ZTwvTElORT4KLTxMSU5FPmFyZSBub3cgdG8gZXhhbWluYXRpb24gdGhlc2UgbWVuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgotPExJTkU+QW5kIHdlIG11c3QgZG8gaXQgd2lzZWx5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5XZSB3aWxsIHNwYXJlIGZvciBubyB3aXQsIEkgd2FycmFudCB5b3U7IGhlcmUnczwvTElORT4KLTxMSU5FPnRoYXQgc2hhbGwgZHJpdmUgc29tZSBvZiB0aGVtIHRvIGEgbm9uLWNvbWU6IG9ubHk8L0xJTkU+Ci08TElORT5nZXQgdGhlIGxlYXJuZWQgd3JpdGVyIHRvIHNldCBkb3duIG91cjwvTElORT4KLTxMSU5FPmV4Y29tbXVuaWNhdGlvbiBhbmQgbWVldCBtZSBhdCB0aGUgZ2FvbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KLTwvU0NFTkU+Ci0KLTwvQUNUPgotCi08QUNUPjxUSVRMRT5BQ1QgSVY8L1RJVExFPgotCi08U0NFTkU+PFRJVExFPlNDRU5FIEkuICBBIGNodXJjaC48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIERPTiBQRURSTywgRE9OIEpPSE4sIExFT05BVE8sIEZSSUFSIEZSQU5DSVMsCi1DTEFVRElPLCBCRU5FRElDSywgSEVSTywgQkVBVFJJQ0UsIGFuZCBBdHRlbmRhbnRzPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5Db21lLCBGcmlhciBGcmFuY2lzLCBiZSBicmllZjsgb25seSB0byB0aGUgcGxhaW48L0xJTkU+Ci08TElORT5mb3JtIG9mIG1hcnJpYWdlLCBhbmQgeW91IHNoYWxsIHJlY291bnQgdGhlaXI8L0xJTkU+Ci08TElORT5wYXJ0aWN1bGFyIGR1dGllcyBhZnRlcndhcmRzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KLTxMSU5FPllvdSBjb21lIGhpdGhlciwgbXkgbG9yZCwgdG8gbWFycnkgdGhpcyBsYWR5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk5vLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlRvIGJlIG1hcnJpZWQgdG8gaGVyOiBmcmlhciwgeW91IGNvbWUgdG8gbWFycnkgaGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KLTxMSU5FPkxhZHksIHlvdSBjb21lIGhpdGhlciB0byBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+SSBkby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Ci08TElORT5JZiBlaXRoZXIgb2YgeW91IGtub3cgYW55IGlud2FyZCBpbXBlZGltZW50IHdoeSB5b3U8L0xJTkU+Ci08TElORT5zaG91bGQgbm90IGJlIGNvbmpvaW5lZCwgY2hhcmdlIHlvdSwgb24geW91ciBzb3Vscyw8L0xJTkU+Ci08TElORT50byB1dHRlciBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Lbm93IHlvdSBhbnksIEhlcm8/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+Tm9uZSwgbXkgbG9yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Ci08TElORT5Lbm93IHlvdSBhbnksIGNvdW50PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkkgZGFyZSBtYWtlIGhpcyBhbnN3ZXIsIG5vbmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+Tywgd2hhdCBtZW4gZGFyZSBkbyEgd2hhdCBtZW4gbWF5IGRvISB3aGF0IG1lbiBkYWlseTwvTElORT4KLTxMSU5FPmRvLCBub3Qga25vd2luZyB3aGF0IHRoZXkgZG8hPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkhvdyBub3chIGludGVyamVjdGlvbnM/IFdoeSwgdGhlbiwgc29tZSBiZSBvZjwvTElORT4KLTxMSU5FPmxhdWdoaW5nLCBhcywgYWgsIGhhLCBoZSE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5TdGFuZCB0aGVlIGJ5LCBmcmlhci4gRmF0aGVyLCBieSB5b3VyIGxlYXZlOjwvTElORT4KLTxMSU5FPldpbGwgeW91IHdpdGggZnJlZSBhbmQgdW5jb25zdHJhaW5lZCBzb3VsPC9MSU5FPgotPExJTkU+R2l2ZSBtZSB0aGlzIG1haWQsIHlvdXIgZGF1Z2h0ZXI/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QXMgZnJlZWx5LCBzb24sIGFzIEdvZCBkaWQgZ2l2ZSBoZXIgbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+QW5kIHdoYXQgaGF2ZSBJIHRvIGdpdmUgeW91IGJhY2ssIHdob3NlIHdvcnRoPC9MSU5FPgotPExJTkU+TWF5IGNvdW50ZXJwb2lzZSB0aGlzIHJpY2ggYW5kIHByZWNpb3VzIGdpZnQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Ob3RoaW5nLCB1bmxlc3MgeW91IHJlbmRlciBoZXIgYWdhaW4uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+U3dlZXQgcHJpbmNlLCB5b3UgbGVhcm4gbWUgbm9ibGUgdGhhbmtmdWxuZXNzLjwvTElORT4KLTxMSU5FPlRoZXJlLCBMZW9uYXRvLCB0YWtlIGhlciBiYWNrIGFnYWluOjwvTElORT4KLTxMSU5FPkdpdmUgbm90IHRoaXMgcm90dGVuIG9yYW5nZSB0byB5b3VyIGZyaWVuZDs8L0xJTkU+Ci08TElORT5TaGUncyBidXQgdGhlIHNpZ24gYW5kIHNlbWJsYW5jZSBvZiBoZXIgaG9ub3VyLjwvTElORT4KLTxMSU5FPkJlaG9sZCBob3cgbGlrZSBhIG1haWQgc2hlIGJsdXNoZXMgaGVyZSE8L0xJTkU+Ci08TElORT5PLCB3aGF0IGF1dGhvcml0eSBhbmQgc2hvdyBvZiB0cnV0aDwvTElORT4KLTxMSU5FPkNhbiBjdW5uaW5nIHNpbiBjb3ZlciBpdHNlbGYgd2l0aGFsITwvTElORT4KLTxMSU5FPkNvbWVzIG5vdCB0aGF0IGJsb29kIGFzIG1vZGVzdCBldmlkZW5jZTwvTElORT4KLTxMSU5FPlRvIHdpdG5lc3Mgc2ltcGxlIHZpcnR1ZT8gV291bGQgeW91IG5vdCBzd2Vhciw8L0xJTkU+Ci08TElORT5BbGwgeW91IHRoYXQgc2VlIGhlciwgdGhhdCBzaGUgd2VyZSBhIG1haWQsPC9MSU5FPgotPExJTkU+QnkgdGhlc2UgZXh0ZXJpb3Igc2hvd3M/IEJ1dCBzaGUgaXMgbm9uZTo8L0xJTkU+Ci08TElORT5TaGUga25vd3MgdGhlIGhlYXQgb2YgYSBsdXh1cmlvdXMgYmVkOzwvTElORT4KLTxMSU5FPkhlciBibHVzaCBpcyBndWlsdGluZXNzLCBub3QgbW9kZXN0eS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XaGF0IGRvIHlvdSBtZWFuLCBteSBsb3JkPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk5vdCB0byBiZSBtYXJyaWVkLDwvTElORT4KLTxMSU5FPk5vdCB0byBrbml0IG15IHNvdWwgdG8gYW4gYXBwcm92ZWQgd2FudG9uLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkRlYXIgbXkgbG9yZCwgaWYgeW91LCBpbiB5b3VyIG93biBwcm9vZiw8L0xJTkU+Ci08TElORT5IYXZlIHZhbnF1aXNoJ2QgdGhlIHJlc2lzdGFuY2Ugb2YgaGVyIHlvdXRoLDwvTElORT4KLTxMSU5FPkFuZCBtYWRlIGRlZmVhdCBvZiBoZXIgdmlyZ2luaXR5LC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SSBrbm93IHdoYXQgeW91IHdvdWxkIHNheTogaWYgSSBoYXZlIGtub3duIGhlciw8L0xJTkU+Ci08TElORT5Zb3Ugd2lsbCBzYXkgc2hlIGRpZCBlbWJyYWNlIG1lIGFzIGEgaHVzYmFuZCw8L0xJTkU+Ci08TElORT5BbmQgc28gZXh0ZW51YXRlIHRoZSAnZm9yZWhhbmQgc2luOjwvTElORT4KLTxMSU5FPk5vLCBMZW9uYXRvLDwvTElORT4KLTxMSU5FPkkgbmV2ZXIgdGVtcHRlZCBoZXIgd2l0aCB3b3JkIHRvbyBsYXJnZTs8L0xJTkU+Ci08TElORT5CdXQsIGFzIGEgYnJvdGhlciB0byBoaXMgc2lzdGVyLCBzaG93J2Q8L0xJTkU+Ci08TElORT5CYXNoZnVsIHNpbmNlcml0eSBhbmQgY29tZWx5IGxvdmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+QW5kIHNlZW0nZCBJIGV2ZXIgb3RoZXJ3aXNlIHRvIHlvdT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5PdXQgb24gdGhlZSEgU2VlbWluZyEgSSB3aWxsIHdyaXRlIGFnYWluc3QgaXQ6PC9MSU5FPgotPExJTkU+WW91IHNlZW0gdG8gbWUgYXMgRGlhbiBpbiBoZXIgb3JiLDwvTElORT4KLTxMSU5FPkFzIGNoYXN0ZSBhcyBpcyB0aGUgYnVkIGVyZSBpdCBiZSBibG93bjs8L0xJTkU+Ci08TElORT5CdXQgeW91IGFyZSBtb3JlIGludGVtcGVyYXRlIGluIHlvdXIgYmxvb2Q8L0xJTkU+Ci08TElORT5UaGFuIFZlbnVzLCBvciB0aG9zZSBwYW1wZXInZCBhbmltYWxzPC9MSU5FPgotPExJTkU+VGhhdCByYWdlIGluIHNhdmFnZSBzZW5zdWFsaXR5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPklzIG15IGxvcmQgd2VsbCwgdGhhdCBoZSBkb3RoIHNwZWFrIHNvIHdpZGU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+U3dlZXQgcHJpbmNlLCB3aHkgc3BlYWsgbm90IHlvdT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldoYXQgc2hvdWxkIEkgc3BlYWs/PC9MSU5FPgotPExJTkU+SSBzdGFuZCBkaXNob25vdXInZCwgdGhhdCBoYXZlIGdvbmUgYWJvdXQ8L0xJTkU+Ci08TElORT5UbyBsaW5rIG15IGRlYXIgZnJpZW5kIHRvIGEgY29tbW9uIHN0YWxlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkFyZSB0aGVzZSB0aGluZ3Mgc3Bva2VuLCBvciBkbyBJIGJ1dCBkcmVhbT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgotPExJTkU+U2lyLCB0aGV5IGFyZSBzcG9rZW4sIGFuZCB0aGVzZSB0aGluZ3MgYXJlIHRydWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRoaXMgbG9va3Mgbm90IGxpa2UgYSBudXB0aWFsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPlRydWUhIE8gR29kITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkxlb25hdG8sIHN0YW5kIEkgaGVyZT88L0xJTkU+Ci08TElORT5JcyB0aGlzIHRoZSBwcmluY2U/IGlzIHRoaXMgdGhlIHByaW5jZSdzIGJyb3RoZXI/PC9MSU5FPgotPExJTkU+SXMgdGhpcyBmYWNlIEhlcm8ncz8gYXJlIG91ciBleWVzIG91ciBvd24/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QWxsIHRoaXMgaXMgc286IGJ1dCB3aGF0IG9mIHRoaXMsIG15IGxvcmQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+TGV0IG1lIGJ1dCBtb3ZlIG9uZSBxdWVzdGlvbiB0byB5b3VyIGRhdWdodGVyOzwvTElORT4KLTxMSU5FPkFuZCwgYnkgdGhhdCBmYXRoZXJseSBhbmQga2luZGx5IHBvd2VyPC9MSU5FPgotPExJTkU+VGhhdCB5b3UgaGF2ZSBpbiBoZXIsIGJpZCBoZXIgYW5zd2VyIHRydWx5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkkgY2hhcmdlIHRoZWUgZG8gc28sIGFzIHRob3UgYXJ0IG15IGNoaWxkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPk8sIEdvZCBkZWZlbmQgbWUhIGhvdyBhbSBJIGJlc2V0ITwvTElORT4KLTxMSU5FPldoYXQga2luZCBvZiBjYXRlY2hpc2luZyBjYWxsIHlvdSB0aGlzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPlRvIG1ha2UgeW91IGFuc3dlciB0cnVseSB0byB5b3VyIG5hbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+SXMgaXQgbm90IEhlcm8/IFdobyBjYW4gYmxvdCB0aGF0IG5hbWU8L0xJTkU+Ci08TElORT5XaXRoIGFueSBqdXN0IHJlcHJvYWNoPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk1hcnJ5LCB0aGF0IGNhbiBIZXJvOzwvTElORT4KLTxMSU5FPkhlcm8gaXRzZWxmIGNhbiBibG90IG91dCBIZXJvJ3MgdmlydHVlLjwvTElORT4KLTxMSU5FPldoYXQgbWFuIHdhcyBoZSB0YWxrJ2Qgd2l0aCB5b3UgeWVzdGVybmlnaHQ8L0xJTkU+Ci08TElORT5PdXQgYXQgeW91ciB3aW5kb3cgYmV0d2l4dCB0d2VsdmUgYW5kIG9uZT88L0xJTkU+Ci08TElORT5Ob3csIGlmIHlvdSBhcmUgYSBtYWlkLCBhbnN3ZXIgdG8gdGhpcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5JIHRhbGsnZCB3aXRoIG5vIG1hbiBhdCB0aGF0IGhvdXIsIG15IGxvcmQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5XaHksIHRoZW4gYXJlIHlvdSBubyBtYWlkZW4uIExlb25hdG8sPC9MSU5FPgotPExJTkU+SSBhbSBzb3JyeSB5b3UgbXVzdCBoZWFyOiB1cG9uIG1pbmUgaG9ub3VyLDwvTElORT4KLTxMSU5FPk15c2VsZiwgbXkgYnJvdGhlciBhbmQgdGhpcyBncmlldmVkIGNvdW50PC9MSU5FPgotPExJTkU+RGlkIHNlZSBoZXIsIGhlYXIgaGVyLCBhdCB0aGF0IGhvdXIgbGFzdCBuaWdodDwvTElORT4KLTxMSU5FPlRhbGsgd2l0aCBhIHJ1ZmZpYW4gYXQgaGVyIGNoYW1iZXItd2luZG93PC9MSU5FPgotPExJTkU+V2hvIGhhdGggaW5kZWVkLCBtb3N0IGxpa2UgYSBsaWJlcmFsIHZpbGxhaW4sPC9MSU5FPgotPExJTkU+Q29uZmVzcydkIHRoZSB2aWxlIGVuY291bnRlcnMgdGhleSBoYXZlIGhhZDwvTElORT4KLTxMSU5FPkEgdGhvdXNhbmQgdGltZXMgaW4gc2VjcmV0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Ci08TElORT5GaWUsIGZpZSEgdGhleSBhcmUgbm90IHRvIGJlIG5hbWVkLCBteSBsb3JkLDwvTElORT4KLTxMSU5FPk5vdCB0byBiZSBzcG9rZSBvZjs8L0xJTkU+Ci08TElORT5UaGVyZSBpcyBub3QgY2hhc3RpdHkgZW5vdWdoIGluIGxhbmd1YWdlPC9MSU5FPgotPExJTkU+V2l0aG91dCBvZmZlbmNlIHRvIHV0dGVyIHRoZW0uIFRodXMsIHByZXR0eSBsYWR5LDwvTElORT4KLTxMSU5FPkkgYW0gc29ycnkgZm9yIHRoeSBtdWNoIG1pc2dvdmVybm1lbnQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+TyBIZXJvLCB3aGF0IGEgSGVybyBoYWRzdCB0aG91IGJlZW4sPC9MSU5FPgotPExJTkU+SWYgaGFsZiB0aHkgb3V0d2FyZCBncmFjZXMgaGFkIGJlZW4gcGxhY2VkPC9MSU5FPgotPExJTkU+QWJvdXQgdGh5IHRob3VnaHRzIGFuZCBjb3Vuc2VscyBvZiB0aHkgaGVhcnQhPC9MSU5FPgotPExJTkU+QnV0IGZhcmUgdGhlZSB3ZWxsLCBtb3N0IGZvdWwsIG1vc3QgZmFpciEgZmFyZXdlbGwsPC9MSU5FPgotPExJTkU+VGhvdSBwdXJlIGltcGlldHkgYW5kIGltcGlvdXMgcHVyaXR5ITwvTElORT4KLTxMSU5FPkZvciB0aGVlIEknbGwgbG9jayB1cCBhbGwgdGhlIGdhdGVzIG9mIGxvdmUsPC9MSU5FPgotPExJTkU+QW5kIG9uIG15IGV5ZWxpZHMgc2hhbGwgY29uamVjdHVyZSBoYW5nLDwvTElORT4KLTxMSU5FPlRvIHR1cm4gYWxsIGJlYXV0eSBpbnRvIHRob3VnaHRzIG9mIGhhcm0sPC9MSU5FPgotPExJTkU+QW5kIG5ldmVyIHNoYWxsIGl0IG1vcmUgYmUgZ3JhY2lvdXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+SGF0aCBubyBtYW4ncyBkYWdnZXIgaGVyZSBhIHBvaW50IGZvciBtZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+SEVSTyBzd29vbnM8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5XaHksIGhvdyBub3csIGNvdXNpbiEgd2hlcmVmb3JlIHNpbmsgeW91IGRvd24/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KLTxMSU5FPkNvbWUsIGxldCB1cyBnby4gVGhlc2UgdGhpbmdzLCBjb21lIHRodXMgdG8gbGlnaHQsPC9MSU5FPgotPExJTkU+U21vdGhlciBoZXIgc3Bpcml0cyB1cC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50IERPTiBQRURSTywgRE9OIEpPSE4sIGFuZCBDTEFVRElPPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SG93IGRvdGggdGhlIGxhZHk/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkRlYWQsIEkgdGhpbmsuIEhlbHAsIHVuY2xlITwvTElORT4KLTxMSU5FPkhlcm8hIHdoeSwgSGVybyEgVW5jbGUhIFNpZ25pb3IgQmVuZWRpY2shIEZyaWFyITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPk8gRmF0ZSEgdGFrZSBub3QgYXdheSB0aHkgaGVhdnkgaGFuZC48L0xJTkU+Ci08TElORT5EZWF0aCBpcyB0aGUgZmFpcmVzdCBjb3ZlciBmb3IgaGVyIHNoYW1lPC9MSU5FPgotPExJTkU+VGhhdCBtYXkgYmUgd2lzaCdkIGZvci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+SG93IG5vdywgY291c2luIEhlcm8hPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgotPExJTkU+SGF2ZSBjb21mb3J0LCBsYWR5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkRvc3QgdGhvdSBsb29rIHVwPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KLTxMSU5FPlllYSwgd2hlcmVmb3JlIHNob3VsZCBzaGUgbm90PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPldoZXJlZm9yZSEgV2h5LCBkb3RoIG5vdCBldmVyeSBlYXJ0aGx5IHRoaW5nPC9MSU5FPgotPExJTkU+Q3J5IHNoYW1lIHVwb24gaGVyPyBDb3VsZCBzaGUgaGVyZSBkZW55PC9MSU5FPgotPExJTkU+VGhlIHN0b3J5IHRoYXQgaXMgcHJpbnRlZCBpbiBoZXIgYmxvb2Q/PC9MSU5FPgotPExJTkU+RG8gbm90IGxpdmUsIEhlcm87IGRvIG5vdCBvcGUgdGhpbmUgZXllczo8L0xJTkU+Ci08TElORT5Gb3IsIGRpZCBJIHRoaW5rIHRob3Ugd291bGRzdCBub3QgcXVpY2tseSBkaWUsPC9MSU5FPgotPExJTkU+VGhvdWdodCBJIHRoeSBzcGlyaXRzIHdlcmUgc3Ryb25nZXIgdGhhbiB0aHkgc2hhbWVzLDwvTElORT4KLTxMSU5FPk15c2VsZiB3b3VsZCwgb24gdGhlIHJlYXJ3YXJkIG9mIHJlcHJvYWNoZXMsPC9MSU5FPgotPExJTkU+U3RyaWtlIGF0IHRoeSBsaWZlLiBHcmlldmVkIEksIEkgaGFkIGJ1dCBvbmU/PC9MSU5FPgotPExJTkU+Q2hpZCBJIGZvciB0aGF0IGF0IGZydWdhbCBuYXR1cmUncyBmcmFtZT88L0xJTkU+Ci08TElORT5PLCBvbmUgdG9vIG11Y2ggYnkgdGhlZSEgV2h5IGhhZCBJIG9uZT88L0xJTkU+Ci08TElORT5XaHkgZXZlciB3YXN0IHRob3UgbG92ZWx5IGluIG15IGV5ZXM/PC9MSU5FPgotPExJTkU+V2h5IGhhZCBJIG5vdCB3aXRoIGNoYXJpdGFibGUgaGFuZDwvTElORT4KLTxMSU5FPlRvb2sgdXAgYSBiZWdnYXIncyBpc3N1ZSBhdCBteSBnYXRlcyw8L0xJTkU+Ci08TElORT5XaG8gc21pcmNoJ2QgdGh1cyBhbmQgbWlyZWQgd2l0aCBpbmZhbXksPC9MSU5FPgotPExJTkU+SSBtaWdodCBoYXZlIHNhaWQgJ05vIHBhcnQgb2YgaXQgaXMgbWluZTs8L0xJTkU+Ci08TElORT5UaGlzIHNoYW1lIGRlcml2ZXMgaXRzZWxmIGZyb20gdW5rbm93biBsb2lucyc/PC9MSU5FPgotPExJTkU+QnV0IG1pbmUgYW5kIG1pbmUgSSBsb3ZlZCBhbmQgbWluZSBJIHByYWlzZWQ8L0xJTkU+Ci08TElORT5BbmQgbWluZSB0aGF0IEkgd2FzIHByb3VkIG9uLCBtaW5lIHNvIG11Y2g8L0xJTkU+Ci08TElORT5UaGF0IEkgbXlzZWxmIHdhcyB0byBteXNlbGYgbm90IG1pbmUsPC9MSU5FPgotPExJTkU+VmFsdWluZyBvZiBoZXIsLS13aHksIHNoZSwgTywgc2hlIGlzIGZhbGxlbjwvTElORT4KLTxMSU5FPkludG8gYSBwaXQgb2YgaW5rLCB0aGF0IHRoZSB3aWRlIHNlYTwvTElORT4KLTxMSU5FPkhhdGggZHJvcHMgdG9vIGZldyB0byB3YXNoIGhlciBjbGVhbiBhZ2FpbjwvTElORT4KLTxMSU5FPkFuZCBzYWx0IHRvbyBsaXR0bGUgd2hpY2ggbWF5IHNlYXNvbiBnaXZlPC9MSU5FPgotPExJTkU+VG8gaGVyIGZvdWwtdGFpbnRlZCBmbGVzaCE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+U2lyLCBzaXIsIGJlIHBhdGllbnQuPC9MSU5FPgotPExJTkU+Rm9yIG15IHBhcnQsIEkgYW0gc28gYXR0aXJlZCBpbiB3b25kZXIsPC9MSU5FPgotPExJTkU+SSBrbm93IG5vdCB3aGF0IHRvIHNheS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+Tywgb24gbXkgc291bCwgbXkgY291c2luIGlzIGJlbGllZCE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+TGFkeSwgd2VyZSB5b3UgaGVyIGJlZGZlbGxvdyBsYXN0IG5pZ2h0PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5ObywgdHJ1bHkgbm90OyBhbHRob3VnaCwgdW50aWwgbGFzdCBuaWdodCw8L0xJTkU+Ci08TElORT5JIGhhdmUgdGhpcyB0d2VsdmVtb250aCBiZWVuIGhlciBiZWRmZWxsb3cuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Q29uZmlybSdkLCBjb25maXJtJ2QhIE8sIHRoYXQgaXMgc3Ryb25nZXIgbWFkZTwvTElORT4KLTxMSU5FPldoaWNoIHdhcyBiZWZvcmUgYmFycidkIHVwIHdpdGggcmlicyBvZiBpcm9uITwvTElORT4KLTxMSU5FPldvdWxkIHRoZSB0d28gcHJpbmNlcyBsaWUsIGFuZCBDbGF1ZGlvIGxpZSw8L0xJTkU+Ci08TElORT5XaG8gbG92ZWQgaGVyIHNvLCB0aGF0LCBzcGVha2luZyBvZiBoZXIgZm91bG5lc3MsPC9MSU5FPgotPExJTkU+V2FzaCdkIGl0IHdpdGggdGVhcnM/IEhlbmNlIGZyb20gaGVyISBsZXQgaGVyIGRpZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Ci08TElORT5IZWFyIG1lIGEgbGl0dGxlOyBmb3IgSSBoYXZlIG9ubHkgYmVlbjwvTElORT4KLTxMSU5FPlNpbGVudCBzbyBsb25nIGFuZCBnaXZlbiB3YXkgdW50bzwvTElORT4KLTxMSU5FPlRoaXMgY291cnNlIG9mIGZvcnR1bmU8L0xJTkU+Ci08TElORT5CeSBub3Rpbmcgb2YgdGhlIGxhZHkuIEkgaGF2ZSBtYXJrJ2Q8L0xJTkU+Ci08TElORT5BIHRob3VzYW5kIGJsdXNoaW5nIGFwcGFyaXRpb25zPC9MSU5FPgotPExJTkU+VG8gc3RhcnQgaW50byBoZXIgZmFjZSwgYSB0aG91c2FuZCBpbm5vY2VudCBzaGFtZXM8L0xJTkU+Ci08TElORT5JbiBhbmdlbCB3aGl0ZW5lc3MgYmVhdCBhd2F5IHRob3NlIGJsdXNoZXM7PC9MSU5FPgotPExJTkU+QW5kIGluIGhlciBleWUgdGhlcmUgaGF0aCBhcHBlYXInZCBhIGZpcmUsPC9MSU5FPgotPExJTkU+VG8gYnVybiB0aGUgZXJyb3JzIHRoYXQgdGhlc2UgcHJpbmNlcyBob2xkPC9MSU5FPgotPExJTkU+QWdhaW5zdCBoZXIgbWFpZGVuIHRydXRoLiBDYWxsIG1lIGEgZm9vbDs8L0xJTkU+Ci08TElORT5UcnVzdCBub3QgbXkgcmVhZGluZyBub3IgbXkgb2JzZXJ2YXRpb25zLDwvTElORT4KLTxMSU5FPldoaWNoIHdpdGggZXhwZXJpbWVudGFsIHNlYWwgZG90aCB3YXJyYW50PC9MSU5FPgotPExJTkU+VGhlIHRlbm9yIG9mIG15IGJvb2s7IHRydXN0IG5vdCBteSBhZ2UsPC9MSU5FPgotPExJTkU+TXkgcmV2ZXJlbmNlLCBjYWxsaW5nLCBub3IgZGl2aW5pdHksPC9MSU5FPgotPExJTkU+SWYgdGhpcyBzd2VldCBsYWR5IGxpZSBub3QgZ3VpbHRsZXNzIGhlcmU8L0xJTkU+Ci08TElORT5VbmRlciBzb21lIGJpdGluZyBlcnJvci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5GcmlhciwgaXQgY2Fubm90IGJlLjwvTElORT4KLTxMSU5FPlRob3Ugc2Vlc3QgdGhhdCBhbGwgdGhlIGdyYWNlIHRoYXQgc2hlIGhhdGggbGVmdDwvTElORT4KLTxMSU5FPklzIHRoYXQgc2hlIHdpbGwgbm90IGFkZCB0byBoZXIgZGFtbmF0aW9uPC9MSU5FPgotPExJTkU+QSBzaW4gb2YgcGVyanVyeTsgc2hlIG5vdCBkZW5pZXMgaXQ6PC9MSU5FPgotPExJTkU+V2h5IHNlZWsnc3QgdGhvdSB0aGVuIHRvIGNvdmVyIHdpdGggZXhjdXNlPC9MSU5FPgotPExJTkU+VGhhdCB3aGljaCBhcHBlYXJzIGluIHByb3BlciBuYWtlZG5lc3M/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgotPExJTkU+TGFkeSwgd2hhdCBtYW4gaXMgaGUgeW91IGFyZSBhY2N1c2VkIG9mPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPlRoZXkga25vdyB0aGF0IGRvIGFjY3VzZSBtZTsgSSBrbm93IG5vbmU6PC9MSU5FPgotPExJTkU+SWYgSSBrbm93IG1vcmUgb2YgYW55IG1hbiBhbGl2ZTwvTElORT4KLTxMSU5FPlRoYW4gdGhhdCB3aGljaCBtYWlkZW4gbW9kZXN0eSBkb3RoIHdhcnJhbnQsPC9MSU5FPgotPExJTkU+TGV0IGFsbCBteSBzaW5zIGxhY2sgbWVyY3khIE8gbXkgZmF0aGVyLDwvTElORT4KLTxMSU5FPlByb3ZlIHlvdSB0aGF0IGFueSBtYW4gd2l0aCBtZSBjb252ZXJzZWQ8L0xJTkU+Ci08TElORT5BdCBob3VycyB1bm1lZXQsIG9yIHRoYXQgSSB5ZXN0ZXJuaWdodDwvTElORT4KLTxMSU5FPk1haW50YWluJ2QgdGhlIGNoYW5nZSBvZiB3b3JkcyB3aXRoIGFueSBjcmVhdHVyZSw8L0xJTkU+Ci08TElORT5SZWZ1c2UgbWUsIGhhdGUgbWUsIHRvcnR1cmUgbWUgdG8gZGVhdGghPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgotPExJTkU+VGhlcmUgaXMgc29tZSBzdHJhbmdlIG1pc3ByaXNpb24gaW4gdGhlIHByaW5jZXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlR3byBvZiB0aGVtIGhhdmUgdGhlIHZlcnkgYmVudCBvZiBob25vdXI7PC9MSU5FPgotPExJTkU+QW5kIGlmIHRoZWlyIHdpc2RvbXMgYmUgbWlzbGVkIGluIHRoaXMsPC9MSU5FPgotPExJTkU+VGhlIHByYWN0aXNlIG9mIGl0IGxpdmVzIGluIEpvaG4gdGhlIGJhc3RhcmQsPC9MSU5FPgotPExJTkU+V2hvc2Ugc3Bpcml0cyB0b2lsIGluIGZyYW1lIG9mIHZpbGxhbmllcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5JIGtub3cgbm90LiBJZiB0aGV5IHNwZWFrIGJ1dCB0cnV0aCBvZiBoZXIsPC9MSU5FPgotPExJTkU+VGhlc2UgaGFuZHMgc2hhbGwgdGVhciBoZXI7IGlmIHRoZXkgd3JvbmcgaGVyIGhvbm91ciw8L0xJTkU+Ci08TElORT5UaGUgcHJvdWRlc3Qgb2YgdGhlbSBzaGFsbCB3ZWxsIGhlYXIgb2YgaXQuPC9MSU5FPgotPExJTkU+VGltZSBoYXRoIG5vdCB5ZXQgc28gZHJpZWQgdGhpcyBibG9vZCBvZiBtaW5lLDwvTElORT4KLTxMSU5FPk5vciBhZ2Ugc28gZWF0IHVwIG15IGludmVudGlvbiw8L0xJTkU+Ci08TElORT5Ob3IgZm9ydHVuZSBtYWRlIHN1Y2ggaGF2b2Mgb2YgbXkgbWVhbnMsPC9MSU5FPgotPExJTkU+Tm9yIG15IGJhZCBsaWZlIHJlZnQgbWUgc28gbXVjaCBvZiBmcmllbmRzLDwvTElORT4KLTxMSU5FPkJ1dCB0aGV5IHNoYWxsIGZpbmQsIGF3YWtlZCBpbiBzdWNoIGEga2luZCw8L0xJTkU+Ci08TElORT5Cb3RoIHN0cmVuZ3RoIG9mIGxpbWIgYW5kIHBvbGljeSBvZiBtaW5kLDwvTElORT4KLTxMSU5FPkFiaWxpdHkgaW4gbWVhbnMgYW5kIGNob2ljZSBvZiBmcmllbmRzLDwvTElORT4KLTxMSU5FPlRvIHF1aXQgbWUgb2YgdGhlbSB0aHJvdWdobHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgotPExJTkU+UGF1c2UgYXdoaWxlLDwvTElORT4KLTxMSU5FPkFuZCBsZXQgbXkgY291bnNlbCBzd2F5IHlvdSBpbiB0aGlzIGNhc2UuPC9MSU5FPgotPExJTkU+WW91ciBkYXVnaHRlciBoZXJlIHRoZSBwcmluY2VzIGxlZnQgZm9yIGRlYWQ6PC9MSU5FPgotPExJTkU+TGV0IGhlciBhd2hpbGUgYmUgc2VjcmV0bHkga2VwdCBpbiw8L0xJTkU+Ci08TElORT5BbmQgcHVibGlzaCBpdCB0aGF0IHNoZSBpcyBkZWFkIGluZGVlZDs8L0xJTkU+Ci08TElORT5NYWludGFpbiBhIG1vdXJuaW5nIG9zdGVudGF0aW9uPC9MSU5FPgotPExJTkU+QW5kIG9uIHlvdXIgZmFtaWx5J3Mgb2xkIG1vbnVtZW50PC9MSU5FPgotPExJTkU+SGFuZyBtb3VybmZ1bCBlcGl0YXBocyBhbmQgZG8gYWxsIHJpdGVzPC9MSU5FPgotPExJTkU+VGhhdCBhcHBlcnRhaW4gdW50byBhIGJ1cmlhbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XaGF0IHNoYWxsIGJlY29tZSBvZiB0aGlzPyB3aGF0IHdpbGwgdGhpcyBkbz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Ci08TElORT5NYXJyeSwgdGhpcyB3ZWxsIGNhcnJpZWQgc2hhbGwgb24gaGVyIGJlaGFsZjwvTElORT4KLTxMSU5FPkNoYW5nZSBzbGFuZGVyIHRvIHJlbW9yc2U7IHRoYXQgaXMgc29tZSBnb29kOjwvTElORT4KLTxMSU5FPkJ1dCBub3QgZm9yIHRoYXQgZHJlYW0gSSBvbiB0aGlzIHN0cmFuZ2UgY291cnNlLDwvTElORT4KLTxMSU5FPkJ1dCBvbiB0aGlzIHRyYXZhaWwgbG9vayBmb3IgZ3JlYXRlciBiaXJ0aC48L0xJTkU+Ci08TElORT5TaGUgZHlpbmcsIGFzIGl0IG11c3Qgc28gYmUgbWFpbnRhaW4nZCw8L0xJTkU+Ci08TElORT5VcG9uIHRoZSBpbnN0YW50IHRoYXQgc2hlIHdhcyBhY2N1c2VkLDwvTElORT4KLTxMSU5FPlNoYWxsIGJlIGxhbWVudGVkLCBwaXRpZWQgYW5kIGV4Y3VzZWQ8L0xJTkU+Ci08TElORT5PZiBldmVyeSBoZWFyZXI6IGZvciBpdCBzbyBmYWxscyBvdXQ8L0xJTkU+Ci08TElORT5UaGF0IHdoYXQgd2UgaGF2ZSB3ZSBwcml6ZSBub3QgdG8gdGhlIHdvcnRoPC9MSU5FPgotPExJTkU+V2hpbGVzIHdlIGVuam95IGl0LCBidXQgYmVpbmcgbGFjaydkIGFuZCBsb3N0LDwvTElORT4KLTxMSU5FPldoeSwgdGhlbiB3ZSByYWNrIHRoZSB2YWx1ZSwgdGhlbiB3ZSBmaW5kPC9MSU5FPgotPExJTkU+VGhlIHZpcnR1ZSB0aGF0IHBvc3Nlc3Npb24gd291bGQgbm90IHNob3cgdXM8L0xJTkU+Ci08TElORT5XaGlsZXMgaXQgd2FzIG91cnMuIFNvIHdpbGwgaXQgZmFyZSB3aXRoIENsYXVkaW86PC9MSU5FPgotPExJTkU+V2hlbiBoZSBzaGFsbCBoZWFyIHNoZSBkaWVkIHVwb24gaGlzIHdvcmRzLDwvTElORT4KLTxMSU5FPlRoZSBpZGVhIG9mIGhlciBsaWZlIHNoYWxsIHN3ZWV0bHkgY3JlZXA8L0xJTkU+Ci08TElORT5JbnRvIGhpcyBzdHVkeSBvZiBpbWFnaW5hdGlvbiw8L0xJTkU+Ci08TElORT5BbmQgZXZlcnkgbG92ZWx5IG9yZ2FuIG9mIGhlciBsaWZlPC9MSU5FPgotPExJTkU+U2hhbGwgY29tZSBhcHBhcmVsbCdkIGluIG1vcmUgcHJlY2lvdXMgaGFiaXQsPC9MSU5FPgotPExJTkU+TW9yZSBtb3ZpbmctZGVsaWNhdGUgYW5kIGZ1bGwgb2YgbGlmZSw8L0xJTkU+Ci08TElORT5JbnRvIHRoZSBleWUgYW5kIHByb3NwZWN0IG9mIGhpcyBzb3VsLDwvTElORT4KLTxMSU5FPlRoYW4gd2hlbiBzaGUgbGl2ZWQgaW5kZWVkOyB0aGVuIHNoYWxsIGhlIG1vdXJuLDwvTElORT4KLTxMSU5FPklmIGV2ZXIgbG92ZSBoYWQgaW50ZXJlc3QgaW4gaGlzIGxpdmVyLDwvTElORT4KLTxMSU5FPkFuZCB3aXNoIGhlIGhhZCBub3Qgc28gYWNjdXNlZCBoZXIsPC9MSU5FPgotPExJTkU+Tm8sIHRob3VnaCBoZSB0aG91Z2h0IGhpcyBhY2N1c2F0aW9uIHRydWUuPC9MSU5FPgotPExJTkU+TGV0IHRoaXMgYmUgc28sIGFuZCBkb3VidCBub3QgYnV0IHN1Y2Nlc3M8L0xJTkU+Ci08TElORT5XaWxsIGZhc2hpb24gdGhlIGV2ZW50IGluIGJldHRlciBzaGFwZTwvTElORT4KLTxMSU5FPlRoYW4gSSBjYW4gbGF5IGl0IGRvd24gaW4gbGlrZWxpaG9vZC48L0xJTkU+Ci08TElORT5CdXQgaWYgYWxsIGFpbSBidXQgdGhpcyBiZSBsZXZlbGwnZCBmYWxzZSw8L0xJTkU+Ci08TElORT5UaGUgc3VwcG9zaXRpb24gb2YgdGhlIGxhZHkncyBkZWF0aDwvTElORT4KLTxMSU5FPldpbGwgcXVlbmNoIHRoZSB3b25kZXIgb2YgaGVyIGluZmFteTo8L0xJTkU+Ci08TElORT5BbmQgaWYgaXQgc29ydCBub3Qgd2VsbCwgeW91IG1heSBjb25jZWFsIGhlciw8L0xJTkU+Ci08TElORT5BcyBiZXN0IGJlZml0cyBoZXIgd291bmRlZCByZXB1dGF0aW9uLDwvTElORT4KLTxMSU5FPkluIHNvbWUgcmVjbHVzaXZlIGFuZCByZWxpZ2lvdXMgbGlmZSw8L0xJTkU+Ci08TElORT5PdXQgb2YgYWxsIGV5ZXMsIHRvbmd1ZXMsIG1pbmRzIGFuZCBpbmp1cmllcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+U2lnbmlvciBMZW9uYXRvLCBsZXQgdGhlIGZyaWFyIGFkdmlzZSB5b3U6PC9MSU5FPgotPExJTkU+QW5kIHRob3VnaCB5b3Uga25vdyBteSBpbndhcmRuZXNzIGFuZCBsb3ZlPC9MSU5FPgotPExJTkU+SXMgdmVyeSBtdWNoIHVudG8gdGhlIHByaW5jZSBhbmQgQ2xhdWRpbyw8L0xJTkU+Ci08TElORT5ZZXQsIGJ5IG1pbmUgaG9ub3VyLCBJIHdpbGwgZGVhbCBpbiB0aGlzPC9MSU5FPgotPExJTkU+QXMgc2VjcmV0bHkgYW5kIGp1c3RseSBhcyB5b3VyIHNvdWw8L0xJTkU+Ci08TElORT5TaG91bGQgd2l0aCB5b3VyIGJvZHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QmVpbmcgdGhhdCBJIGZsb3cgaW4gZ3JpZWYsPC9MSU5FPgotPExJTkU+VGhlIHNtYWxsZXN0IHR3aW5lIG1heSBsZWFkIG1lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KLTxMSU5FPidUaXMgd2VsbCBjb25zZW50ZWQ6IHByZXNlbnRseSBhd2F5OzwvTElORT4KLTxMSU5FPkZvciB0byBzdHJhbmdlIHNvcmVzIHN0cmFuZ2VseSB0aGV5IHN0cmFpbiB0aGUgY3VyZS48L0xJTkU+Ci08TElORT5Db21lLCBsYWR5LCBkaWUgdG8gbGl2ZTogdGhpcyB3ZWRkaW5nLWRheTwvTElORT4KLTxMSU5FPlBlcmhhcHMgaXMgYnV0IHByb2xvbmcnZDogaGF2ZSBwYXRpZW5jZSBhbmQgZW5kdXJlLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQgYWxsIGJ1dCBCRU5FRElDSyBhbmQgQkVBVFJJQ0U8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5MYWR5IEJlYXRyaWNlLCBoYXZlIHlvdSB3ZXB0IGFsbCB0aGlzIHdoaWxlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5ZZWEsIGFuZCBJIHdpbGwgd2VlcCBhIHdoaWxlIGxvbmdlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SSB3aWxsIG5vdCBkZXNpcmUgdGhhdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+WW91IGhhdmUgbm8gcmVhc29uOyBJIGRvIGl0IGZyZWVseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+U3VyZWx5IEkgZG8gYmVsaWV2ZSB5b3VyIGZhaXIgY291c2luIGlzIHdyb25nZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkFoLCBob3cgbXVjaCBtaWdodCB0aGUgbWFuIGRlc2VydmUgb2YgbWUgdGhhdCB3b3VsZCByaWdodCBoZXIhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPklzIHRoZXJlIGFueSB3YXkgdG8gc2hvdyBzdWNoIGZyaWVuZHNoaXA/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkEgdmVyeSBldmVuIHdheSwgYnV0IG5vIHN1Y2ggZnJpZW5kLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5NYXkgYSBtYW4gZG8gaXQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkl0IGlzIGEgbWFuJ3Mgb2ZmaWNlLCBidXQgbm90IHlvdXJzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5JIGRvIGxvdmUgbm90aGluZyBpbiB0aGUgd29ybGQgc28gd2VsbCBhcyB5b3U6IGlzPC9MSU5FPgotPExJTkU+bm90IHRoYXQgc3RyYW5nZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+QXMgc3RyYW5nZSBhcyB0aGUgdGhpbmcgSSBrbm93IG5vdC4gSXQgd2VyZSBhczwvTElORT4KLTxMSU5FPnBvc3NpYmxlIGZvciBtZSB0byBzYXkgSSBsb3ZlZCBub3RoaW5nIHNvIHdlbGwgYXM8L0xJTkU+Ci08TElORT55b3U6IGJ1dCBiZWxpZXZlIG1lIG5vdDsgYW5kIHlldCBJIGxpZSBub3Q7IEk8L0xJTkU+Ci08TElORT5jb25mZXNzIG5vdGhpbmcsIG5vciBJIGRlbnkgbm90aGluZy4gSSBhbSBzb3JyeSBmb3IgbXkgY291c2luLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5CeSBteSBzd29yZCwgQmVhdHJpY2UsIHRob3UgbG92ZXN0IG1lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5EbyBub3Qgc3dlYXIsIGFuZCBlYXQgaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkkgd2lsbCBzd2VhciBieSBpdCB0aGF0IHlvdSBsb3ZlIG1lOyBhbmQgSSB3aWxsIG1ha2U8L0xJTkU+Ci08TElORT5oaW0gZWF0IGl0IHRoYXQgc2F5cyBJIGxvdmUgbm90IHlvdS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+V2lsbCB5b3Ugbm90IGVhdCB5b3VyIHdvcmQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPldpdGggbm8gc2F1Y2UgdGhhdCBjYW4gYmUgZGV2aXNlZCB0byBpdC4gSSBwcm90ZXN0PC9MSU5FPgotPExJTkU+SSBsb3ZlIHRoZWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPldoeSwgdGhlbiwgR29kIGZvcmdpdmUgbWUhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPldoYXQgb2ZmZW5jZSwgc3dlZXQgQmVhdHJpY2U/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPllvdSBoYXZlIHN0YXllZCBtZSBpbiBhIGhhcHB5IGhvdXI6IEkgd2FzIGFib3V0IHRvPC9MSU5FPgotPExJTkU+cHJvdGVzdCBJIGxvdmVkIHlvdS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+QW5kIGRvIGl0IHdpdGggYWxsIHRoeSBoZWFydC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+SSBsb3ZlIHlvdSB3aXRoIHNvIG11Y2ggb2YgbXkgaGVhcnQgdGhhdCBub25lIGlzPC9MSU5FPgotPExJTkU+bGVmdCB0byBwcm90ZXN0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Db21lLCBiaWQgbWUgZG8gYW55IHRoaW5nIGZvciB0aGVlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5LaWxsIENsYXVkaW8uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkhhISBub3QgZm9yIHRoZSB3aWRlIHdvcmxkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5Zb3Uga2lsbCBtZSB0byBkZW55IGl0LiBGYXJld2VsbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+VGFycnksIHN3ZWV0IEJlYXRyaWNlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JIGFtIGdvbmUsIHRob3VnaCBJIGFtIGhlcmU6IHRoZXJlIGlzIG5vIGxvdmUgaW48L0xJTkU+Ci08TElORT55b3U6IG5heSwgSSBwcmF5IHlvdSwgbGV0IG1lIGdvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5CZWF0cmljZSwtLTwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JbiBmYWl0aCwgSSB3aWxsIGdvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5XZSdsbCBiZSBmcmllbmRzIGZpcnN0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5Zb3UgZGFyZSBlYXNpZXIgYmUgZnJpZW5kcyB3aXRoIG1lIHRoYW4gZmlnaHQgd2l0aCBtaW5lIGVuZW15LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5JcyBDbGF1ZGlvIHRoaW5lIGVuZW15PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5JcyBoZSBub3QgYXBwcm92ZWQgaW4gdGhlIGhlaWdodCBhIHZpbGxhaW4sIHRoYXQ8L0xJTkU+Ci08TElORT5oYXRoIHNsYW5kZXJlZCwgc2Nvcm5lZCwgZGlzaG9ub3VyZWQgbXkga2luc3dvbWFuPyBPPC9MSU5FPgotPExJTkU+dGhhdCBJIHdlcmUgYSBtYW4hIFdoYXQsIGJlYXIgaGVyIGluIGhhbmQgdW50aWwgdGhleTwvTElORT4KLTxMSU5FPmNvbWUgdG8gdGFrZSBoYW5kczsgYW5kIHRoZW4sIHdpdGggcHVibGljPC9MSU5FPgotPExJTkU+YWNjdXNhdGlvbiwgdW5jb3ZlcmVkIHNsYW5kZXIsIHVubWl0aWdhdGVkIHJhbmNvdXIsPC9MSU5FPgotPExJTkU+LS1PIEdvZCwgdGhhdCBJIHdlcmUgYSBtYW4hIEkgd291bGQgZWF0IGhpcyBoZWFydDwvTElORT4KLTxMSU5FPmluIHRoZSBtYXJrZXQtcGxhY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkhlYXIgbWUsIEJlYXRyaWNlLC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlRhbGsgd2l0aCBhIG1hbiBvdXQgYXQgYSB3aW5kb3chIEEgcHJvcGVyIHNheWluZyE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+TmF5LCBidXQsIEJlYXRyaWNlLC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlN3ZWV0IEhlcm8hIFNoZSBpcyB3cm9uZ2VkLCBzaGUgaXMgc2xhbmRlcmVkLCBzaGUgaXMgdW5kb25lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5CZWF0LS08L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+UHJpbmNlcyBhbmQgY291bnRpZXMhIFN1cmVseSwgYSBwcmluY2VseSB0ZXN0aW1vbnksPC9MSU5FPgotPExJTkU+YSBnb29kbHkgY291bnQsIENvdW50IENvbWZlY3Q7IGEgc3dlZXQgZ2FsbGFudCw8L0xJTkU+Ci08TElORT5zdXJlbHkhIE8gdGhhdCBJIHdlcmUgYSBtYW4gZm9yIGhpcyBzYWtlISBvciB0aGF0IEk8L0xJTkU+Ci08TElORT5oYWQgYW55IGZyaWVuZCB3b3VsZCBiZSBhIG1hbiBmb3IgbXkgc2FrZSEgQnV0PC9MSU5FPgotPExJTkU+bWFuaG9vZCBpcyBtZWx0ZWQgaW50byBjb3VydGVzaWVzLCB2YWxvdXIgaW50bzwvTElORT4KLTxMSU5FPmNvbXBsaW1lbnQsIGFuZCBtZW4gYXJlIG9ubHkgdHVybmVkIGludG8gdG9uZ3VlLCBhbmQ8L0xJTkU+Ci08TElORT50cmltIG9uZXMgdG9vOiBoZSBpcyBub3cgYXMgdmFsaWFudCBhcyBIZXJjdWxlczwvTElORT4KLTxMSU5FPnRoYXQgb25seSB0ZWxscyBhIGxpZSBhbmQgc3dlYXJzIGl0LiBJIGNhbm5vdCBiZSBhPC9MSU5FPgotPExJTkU+bWFuIHdpdGggd2lzaGluZywgdGhlcmVmb3JlIEkgd2lsbCBkaWUgYSB3b21hbiB3aXRoIGdyaWV2aW5nLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5UYXJyeSwgZ29vZCBCZWF0cmljZS4gQnkgdGhpcyBoYW5kLCBJIGxvdmUgdGhlZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+VXNlIGl0IGZvciBteSBsb3ZlIHNvbWUgb3RoZXIgd2F5IHRoYW4gc3dlYXJpbmcgYnkgaXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRoaW5rIHlvdSBpbiB5b3VyIHNvdWwgdGhlIENvdW50IENsYXVkaW8gaGF0aCB3cm9uZ2VkIEhlcm8/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlllYSwgYXMgc3VyZSBhcyBJIGhhdmUgYSB0aG91Z2h0IG9yIGEgc291bC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+RW5vdWdoLCBJIGFtIGVuZ2FnZWQ7IEkgd2lsbCBjaGFsbGVuZ2UgaGltLiBJIHdpbGw8L0xJTkU+Ci08TElORT5raXNzIHlvdXIgaGFuZCwgYW5kIHNvIEkgbGVhdmUgeW91LiBCeSB0aGlzIGhhbmQsPC9MSU5FPgotPExJTkU+Q2xhdWRpbyBzaGFsbCByZW5kZXIgbWUgYSBkZWFyIGFjY291bnQuIEFzIHlvdTwvTElORT4KLTxMSU5FPmhlYXIgb2YgbWUsIHNvIHRoaW5rIG9mIG1lLiBHbywgY29tZm9ydCB5b3VyPC9MSU5FPgotPExJTkU+Y291c2luOiBJIG11c3Qgc2F5IHNoZSBpcyBkZWFkOiBhbmQgc28sIGZhcmV3ZWxsLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJSS4gIEEgcHJpc29uLjwvVElUTEU+Ci08U1RBR0VESVI+RW50ZXIgRE9HQkVSUlksIFZFUkdFUywgYW5kIFNleHRvbiwgaW4gZ293bnM7IGFuZAotdGhlIFdhdGNoLCB3aXRoIENPTlJBREUgYW5kIEJPUkFDSElPPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+SXMgb3VyIHdob2xlIGRpc3NlbWJseSBhcHBlYXJlZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KLTxMSU5FPk8sIGEgc3Rvb2wgYW5kIGEgY3VzaGlvbiBmb3IgdGhlIHNleHRvbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlNleHRvbjwvU1BFQUtFUj4KLTxMSU5FPldoaWNoIGJlIHRoZSBtYWxlZmFjdG9ycz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+TWFycnksIHRoYXQgYW0gSSBhbmQgbXkgcGFydG5lci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KLTxMSU5FPk5heSwgdGhhdCdzIGNlcnRhaW47IHdlIGhhdmUgdGhlIGV4aGliaXRpb24gdG8gZXhhbWluZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlNleHRvbjwvU1BFQUtFUj4KLTxMSU5FPkJ1dCB3aGljaCBhcmUgdGhlIG9mZmVuZGVycyB0aGF0IGFyZSB0byBiZTwvTElORT4KLTxMSU5FPmV4YW1pbmVkPyBsZXQgdGhlbSBjb21lIGJlZm9yZSBtYXN0ZXIgY29uc3RhYmxlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5ZZWEsIG1hcnJ5LCBsZXQgdGhlbSBjb21lIGJlZm9yZSBtZS4gV2hhdCBpcyB5b3VyPC9MSU5FPgotPExJTkU+bmFtZSwgZnJpZW5kPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5Cb3JhY2hpby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+UHJheSwgd3JpdGUgZG93biwgQm9yYWNoaW8uIFlvdXJzLCBzaXJyYWg/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgotPExJTkU+SSBhbSBhIGdlbnRsZW1hbiwgc2lyLCBhbmQgbXkgbmFtZSBpcyBDb25yYWRlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5Xcml0ZSBkb3duLCBtYXN0ZXIgZ2VudGxlbWFuIENvbnJhZGUuIE1hc3RlcnMsIGRvPC9MSU5FPgotPExJTkU+eW91IHNlcnZlIEdvZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPlllYSwgc2lyLCB3ZSBob3BlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5Xcml0ZSBkb3duLCB0aGF0IHRoZXkgaG9wZSB0aGV5IHNlcnZlIEdvZDogYW5kPC9MSU5FPgotPExJTkU+d3JpdGUgR29kIGZpcnN0OyBmb3IgR29kIGRlZmVuZCBidXQgR29kIHNob3VsZCBnbzwvTElORT4KLTxMSU5FPmJlZm9yZSBzdWNoIHZpbGxhaW5zISBNYXN0ZXJzLCBpdCBpcyBwcm92ZWQgYWxyZWFkeTwvTElORT4KLTxMSU5FPnRoYXQgeW91IGFyZSBsaXR0bGUgYmV0dGVyIHRoYW4gZmFsc2Uga25hdmVzOyBhbmQgaXQ8L0xJTkU+Ci08TElORT53aWxsIGdvIG5lYXIgdG8gYmUgdGhvdWdodCBzbyBzaG9ydGx5LiBIb3cgYW5zd2VyPC9MSU5FPgotPExJTkU+eW91IGZvciB5b3Vyc2VsdmVzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPk1hcnJ5LCBzaXIsIHdlIHNheSB3ZSBhcmUgbm9uZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+QSBtYXJ2ZWxsb3VzIHdpdHR5IGZlbGxvdywgSSBhc3N1cmUgeW91OiBidXQgSTwvTElORT4KLTxMSU5FPndpbGwgZ28gYWJvdXQgd2l0aCBoaW0uIENvbWUgeW91IGhpdGhlciwgc2lycmFoOyBhPC9MSU5FPgotPExJTkU+d29yZCBpbiB5b3VyIGVhcjogc2lyLCBJIHNheSB0byB5b3UsIGl0IGlzIHRob3VnaHQ8L0xJTkU+Ci08TElORT55b3UgYXJlIGZhbHNlIGtuYXZlcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+U2lyLCBJIHNheSB0byB5b3Ugd2UgYXJlIG5vbmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIHN0YW5kIGFzaWRlLiAnRm9yZSBHb2QsIHRoZXkgYXJlIGJvdGggaW4gYTwvTElORT4KLTxMSU5FPnRhbGUuIEhhdmUgeW91IHdyaXQgZG93biwgdGhhdCB0aGV5IGFyZSBub25lPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+U2V4dG9uPC9TUEVBS0VSPgotPExJTkU+TWFzdGVyIGNvbnN0YWJsZSwgeW91IGdvIG5vdCB0aGUgd2F5IHRvIGV4YW1pbmU6PC9MSU5FPgotPExJTkU+eW91IG11c3QgY2FsbCBmb3J0aCB0aGUgd2F0Y2ggdGhhdCBhcmUgdGhlaXIgYWNjdXNlcnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPlllYSwgbWFycnksIHRoYXQncyB0aGUgZWZ0ZXN0IHdheS4gTGV0IHRoZSB3YXRjaDwvTElORT4KLTxMSU5FPmNvbWUgZm9ydGguIE1hc3RlcnMsIEkgY2hhcmdlIHlvdSwgaW4gdGhlIHByaW5jZSdzPC9MSU5FPgotPExJTkU+bmFtZSwgYWNjdXNlIHRoZXNlIG1lbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkZpcnN0IFdhdGNobWFuPC9TUEVBS0VSPgotPExJTkU+VGhpcyBtYW4gc2FpZCwgc2lyLCB0aGF0IERvbiBKb2huLCB0aGUgcHJpbmNlJ3M8L0xJTkU+Ci08TElORT5icm90aGVyLCB3YXMgYSB2aWxsYWluLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5Xcml0ZSBkb3duIFByaW5jZSBKb2huIGEgdmlsbGFpbi4gV2h5LCB0aGlzIGlzIGZsYXQ8L0xJTkU+Ci08TElORT5wZXJqdXJ5LCB0byBjYWxsIGEgcHJpbmNlJ3MgYnJvdGhlciB2aWxsYWluLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5NYXN0ZXIgY29uc3RhYmxlLC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPlByYXkgdGhlZSwgZmVsbG93LCBwZWFjZTogSSBkbyBub3QgbGlrZSB0aHkgbG9vayw8L0xJTkU+Ci08TElORT5JIHByb21pc2UgdGhlZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlNleHRvbjwvU1BFQUtFUj4KLTxMSU5FPldoYXQgaGVhcmQgeW91IGhpbSBzYXkgZWxzZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlNlY29uZCBXYXRjaG1hbjwvU1BFQUtFUj4KLTxMSU5FPk1hcnJ5LCB0aGF0IGhlIGhhZCByZWNlaXZlZCBhIHRob3VzYW5kIGR1Y2F0cyBvZjwvTElORT4KLTxMSU5FPkRvbiBKb2huIGZvciBhY2N1c2luZyB0aGUgTGFkeSBIZXJvIHdyb25nZnVsbHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkZsYXQgYnVyZ2xhcnkgYXMgZXZlciB3YXMgY29tbWl0dGVkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgotPExJTkU+WWVhLCBieSBtYXNzLCB0aGF0IGl0IGlzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+U2V4dG9uPC9TUEVBS0VSPgotPExJTkU+V2hhdCBlbHNlLCBmZWxsb3c/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GaXJzdCBXYXRjaG1hbjwvU1BFQUtFUj4KLTxMSU5FPkFuZCB0aGF0IENvdW50IENsYXVkaW8gZGlkIG1lYW4sIHVwb24gaGlzIHdvcmRzLCB0bzwvTElORT4KLTxMSU5FPmRpc2dyYWNlIEhlcm8gYmVmb3JlIHRoZSB3aG9sZSBhc3NlbWJseS4gYW5kIG5vdCBtYXJyeSBoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPk8gdmlsbGFpbiEgdGhvdSB3aWx0IGJlIGNvbmRlbW5lZCBpbnRvIGV2ZXJsYXN0aW5nPC9MSU5FPgotPExJTkU+cmVkZW1wdGlvbiBmb3IgdGhpcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlNleHRvbjwvU1BFQUtFUj4KLTxMSU5FPldoYXQgZWxzZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgotPExJTkU+VGhpcyBpcyBhbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5TZXh0b248L1NQRUFLRVI+Ci08TElORT5BbmQgdGhpcyBpcyBtb3JlLCBtYXN0ZXJzLCB0aGFuIHlvdSBjYW4gZGVueS48L0xJTkU+Ci08TElORT5QcmluY2UgSm9obiBpcyB0aGlzIG1vcm5pbmcgc2VjcmV0bHkgc3RvbGVuIGF3YXk7PC9MSU5FPgotPExJTkU+SGVybyB3YXMgaW4gdGhpcyBtYW5uZXIgYWNjdXNlZCwgaW4gdGhpcyB2ZXJ5IG1hbm5lcjwvTElORT4KLTxMSU5FPnJlZnVzZWQsIGFuZCB1cG9uIHRoZSBncmllZiBvZiB0aGlzIHN1ZGRlbmx5IGRpZWQuPC9MSU5FPgotPExJTkU+TWFzdGVyIGNvbnN0YWJsZSwgbGV0IHRoZXNlIG1lbiBiZSBib3VuZCwgYW5kPC9MSU5FPgotPExJTkU+YnJvdWdodCB0byBMZW9uYXRvJ3M6IEkgd2lsbCBnbyBiZWZvcmUgYW5kIHNob3c8L0xJTkU+Ci08TElORT5oaW0gdGhlaXIgZXhhbWluYXRpb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkV4aXQ8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5Db21lLCBsZXQgdGhlbSBiZSBvcGluaW9uZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Ci08TElORT5MZXQgdGhlbSBiZSBpbiB0aGUgaGFuZHMtLTwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KLTxMSU5FPk9mZiwgY294Y29tYiE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+R29kJ3MgbXkgbGlmZSwgd2hlcmUncyB0aGUgc2V4dG9uPyBsZXQgaGltIHdyaXRlPC9MSU5FPgotPExJTkU+ZG93biB0aGUgcHJpbmNlJ3Mgb2ZmaWNlciBjb3hjb21iLiBDb21lLCBiaW5kIHRoZW0uPC9MSU5FPgotPExJTkU+VGhvdSBuYXVnaHR5IHZhcmxldCE8L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Ci08TElORT5Bd2F5ISB5b3UgYXJlIGFuIGFzcywgeW91IGFyZSBhbiBhc3MuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkRvc3QgdGhvdSBub3Qgc3VzcGVjdCBteSBwbGFjZT8gZG9zdCB0aG91IG5vdDwvTElORT4KLTxMSU5FPnN1c3BlY3QgbXkgeWVhcnM/IE8gdGhhdCBoZSB3ZXJlIGhlcmUgdG8gd3JpdGUgbWU8L0xJTkU+Ci08TElORT5kb3duIGFuIGFzcyEgQnV0LCBtYXN0ZXJzLCByZW1lbWJlciB0aGF0IEkgYW0gYW48L0xJTkU+Ci08TElORT5hc3M7IHRob3VnaCBpdCBiZSBub3Qgd3JpdHRlbiBkb3duLCB5ZXQgZm9yZ2V0IG5vdDwvTElORT4KLTxMSU5FPnRoYXQgSSBhbSBhbiBhc3MuIE5vLCB0aG91IHZpbGxhaW4sIHRob3UgYXJ0IGZ1bGwgb2Y8L0xJTkU+Ci08TElORT5waWV0eSwgYXMgc2hhbGwgYmUgcHJvdmVkIHVwb24gdGhlZSBieSBnb29kIHdpdG5lc3MuPC9MSU5FPgotPExJTkU+SSBhbSBhIHdpc2UgZmVsbG93LCBhbmQsIHdoaWNoIGlzIG1vcmUsIGFuIG9mZmljZXIsPC9MSU5FPgotPExJTkU+YW5kLCB3aGljaCBpcyBtb3JlLCBhIGhvdXNlaG9sZGVyLCBhbmQsIHdoaWNoIGlzPC9MSU5FPgotPExJTkU+bW9yZSwgYXMgcHJldHR5IGEgcGllY2Ugb2YgZmxlc2ggYXMgYW55IGlzIGluPC9MSU5FPgotPExJTkU+TWVzc2luYSwgYW5kIG9uZSB0aGF0IGtub3dzIHRoZSBsYXcsIGdvIHRvOyBhbmQgYTwvTElORT4KLTxMSU5FPnJpY2ggZmVsbG93IGVub3VnaCwgZ28gdG87IGFuZCBhIGZlbGxvdyB0aGF0IGhhdGg8L0xJTkU+Ci08TElORT5oYWQgbG9zc2VzLCBhbmQgb25lIHRoYXQgaGF0aCB0d28gZ293bnMgYW5kIGV2ZXJ5PC9MSU5FPgotPExJTkU+dGhpbmcgaGFuZHNvbWUgYWJvdXQgaGltLiBCcmluZyBoaW0gYXdheS4gTyB0aGF0PC9MSU5FPgotPExJTkU+SSBoYWQgYmVlbiB3cml0IGRvd24gYW4gYXNzITwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPC9BQ1Q+Ci0KLTxBQ1Q+PFRJVExFPkFDVCBWPC9USVRMRT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJLiAgQmVmb3JlIExFT05BVE8nUyBob3VzZS48L1RJVExFPgotPFNUQUdFRElSPkVudGVyIExFT05BVE8gYW5kIEFOVE9OSU88L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KLTxMSU5FPklmIHlvdSBnbyBvbiB0aHVzLCB5b3Ugd2lsbCBraWxsIHlvdXJzZWxmOjwvTElORT4KLTxMSU5FPkFuZCAndGlzIG5vdCB3aXNkb20gdGh1cyB0byBzZWNvbmQgZ3JpZWY8L0xJTkU+Ci08TElORT5BZ2FpbnN0IHlvdXJzZWxmLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkkgcHJheSB0aGVlLCBjZWFzZSB0aHkgY291bnNlbCw8L0xJTkU+Ci08TElORT5XaGljaCBmYWxscyBpbnRvIG1pbmUgZWFycyBhcyBwcm9maXRsZXNzPC9MSU5FPgotPExJTkU+QXMgd2F0ZXIgaW4gYSBzaWV2ZTogZ2l2ZSBub3QgbWUgY291bnNlbDs8L0xJTkU+Ci08TElORT5Ob3IgbGV0IG5vIGNvbWZvcnRlciBkZWxpZ2h0IG1pbmUgZWFyPC9MSU5FPgotPExJTkU+QnV0IHN1Y2ggYSBvbmUgd2hvc2Ugd3JvbmdzIGRvIHN1aXQgd2l0aCBtaW5lLjwvTElORT4KLTxMSU5FPkJyaW5nIG1lIGEgZmF0aGVyIHRoYXQgc28gbG92ZWQgaGlzIGNoaWxkLDwvTElORT4KLTxMSU5FPldob3NlIGpveSBvZiBoZXIgaXMgb3ZlcndoZWxtJ2QgbGlrZSBtaW5lLDwvTElORT4KLTxMSU5FPkFuZCBiaWQgaGltIHNwZWFrIG9mIHBhdGllbmNlOzwvTElORT4KLTxMSU5FPk1lYXN1cmUgaGlzIHdvZSB0aGUgbGVuZ3RoIGFuZCBicmVhZHRoIG9mIG1pbmU8L0xJTkU+Ci08TElORT5BbmQgbGV0IGl0IGFuc3dlciBldmVyeSBzdHJhaW4gZm9yIHN0cmFpbiw8L0xJTkU+Ci08TElORT5BcyB0aHVzIGZvciB0aHVzIGFuZCBzdWNoIGEgZ3JpZWYgZm9yIHN1Y2gsPC9MSU5FPgotPExJTkU+SW4gZXZlcnkgbGluZWFtZW50LCBicmFuY2gsIHNoYXBlLCBhbmQgZm9ybTo8L0xJTkU+Ci08TElORT5JZiBzdWNoIGEgb25lIHdpbGwgc21pbGUgYW5kIHN0cm9rZSBoaXMgYmVhcmQsPC9MSU5FPgotPExJTkU+QmlkIHNvcnJvdyB3YWcsIGNyeSAnaGVtIScgd2hlbiBoZSBzaG91bGQgZ3JvYW4sPC9MSU5FPgotPExJTkU+UGF0Y2ggZ3JpZWYgd2l0aCBwcm92ZXJicywgbWFrZSBtaXNmb3J0dW5lIGRydW5rPC9MSU5FPgotPExJTkU+V2l0aCBjYW5kbGUtd2FzdGVyczsgYnJpbmcgaGltIHlldCB0byBtZSw8L0xJTkU+Ci08TElORT5BbmQgSSBvZiBoaW0gd2lsbCBnYXRoZXIgcGF0aWVuY2UuPC9MSU5FPgotPExJTkU+QnV0IHRoZXJlIGlzIG5vIHN1Y2ggbWFuOiBmb3IsIGJyb3RoZXIsIG1lbjwvTElORT4KLTxMSU5FPkNhbiBjb3Vuc2VsIGFuZCBzcGVhayBjb21mb3J0IHRvIHRoYXQgZ3JpZWY8L0xJTkU+Ci08TElORT5XaGljaCB0aGV5IHRoZW1zZWx2ZXMgbm90IGZlZWw7IGJ1dCwgdGFzdGluZyBpdCw8L0xJTkU+Ci08TElORT5UaGVpciBjb3Vuc2VsIHR1cm5zIHRvIHBhc3Npb24sIHdoaWNoIGJlZm9yZTwvTElORT4KLTxMSU5FPldvdWxkIGdpdmUgcHJlY2VwdGlhbCBtZWRpY2luZSB0byByYWdlLDwvTElORT4KLTxMSU5FPkZldHRlciBzdHJvbmcgbWFkbmVzcyBpbiBhIHNpbGtlbiB0aHJlYWQsPC9MSU5FPgotPExJTkU+Q2hhcm0gYWNoZSB3aXRoIGFpciBhbmQgYWdvbnkgd2l0aCB3b3Jkczo8L0xJTkU+Ci08TElORT5Obywgbm87ICd0aXMgYWxsIG1lbidzIG9mZmljZSB0byBzcGVhayBwYXRpZW5jZTwvTElORT4KLTxMSU5FPlRvIHRob3NlIHRoYXQgd3JpbmcgdW5kZXIgdGhlIGxvYWQgb2Ygc29ycm93LDwvTElORT4KLTxMSU5FPkJ1dCBubyBtYW4ncyB2aXJ0dWUgbm9yIHN1ZmZpY2llbmN5PC9MSU5FPgotPExJTkU+VG8gYmUgc28gbW9yYWwgd2hlbiBoZSBzaGFsbCBlbmR1cmU8L0xJTkU+Ci08TElORT5UaGUgbGlrZSBoaW1zZWxmLiBUaGVyZWZvcmUgZ2l2ZSBtZSBubyBjb3Vuc2VsOjwvTElORT4KLTxMSU5FPk15IGdyaWVmcyBjcnkgbG91ZGVyIHRoYW4gYWR2ZXJ0aXNlbWVudC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Ci08TElORT5UaGVyZWluIGRvIG1lbiBmcm9tIGNoaWxkcmVuIG5vdGhpbmcgZGlmZmVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkkgcHJheSB0aGVlLCBwZWFjZS4gSSB3aWxsIGJlIGZsZXNoIGFuZCBibG9vZDs8L0xJTkU+Ci08TElORT5Gb3IgdGhlcmUgd2FzIG5ldmVyIHlldCBwaGlsb3NvcGhlcjwvTElORT4KLTxMSU5FPlRoYXQgY291bGQgZW5kdXJlIHRoZSB0b290aGFjaGUgcGF0aWVudGx5LDwvTElORT4KLTxMSU5FPkhvd2V2ZXIgdGhleSBoYXZlIHdyaXQgdGhlIHN0eWxlIG9mIGdvZHM8L0xJTkU+Ci08TElORT5BbmQgbWFkZSBhIHB1c2ggYXQgY2hhbmNlIGFuZCBzdWZmZXJhbmNlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KLTxMSU5FPllldCBiZW5kIG5vdCBhbGwgdGhlIGhhcm0gdXBvbiB5b3Vyc2VsZjs8L0xJTkU+Ci08TElORT5NYWtlIHRob3NlIHRoYXQgZG8gb2ZmZW5kIHlvdSBzdWZmZXIgdG9vLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlRoZXJlIHRob3Ugc3BlYWsnc3QgcmVhc29uOiBuYXksIEkgd2lsbCBkbyBzby48L0xJTkU+Ci08TElORT5NeSBzb3VsIGRvdGggdGVsbCBtZSBIZXJvIGlzIGJlbGllZDs8L0xJTkU+Ci08TElORT5BbmQgdGhhdCBzaGFsbCBDbGF1ZGlvIGtub3c7IHNvIHNoYWxsIHRoZSBwcmluY2U8L0xJTkU+Ci08TElORT5BbmQgYWxsIG9mIHRoZW0gdGhhdCB0aHVzIGRpc2hvbm91ciBoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+SGVyZSBjb21lcyB0aGUgcHJpbmNlIGFuZCBDbGF1ZGlvIGhhc3RpbHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLQotPFNUQUdFRElSPkVudGVyIERPTiBQRURSTyBhbmQgQ0xBVURJTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Hb29kIGRlbiwgZ29vZCBkZW4uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+R29vZCBkYXkgdG8gYm90aCBvZiB5b3UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+SGVhciB5b3UuIG15IGxvcmRzLC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5XZSBoYXZlIHNvbWUgaGFzdGUsIExlb25hdG8uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+U29tZSBoYXN0ZSwgbXkgbG9yZCEgd2VsbCwgZmFyZSB5b3Ugd2VsbCwgbXkgbG9yZDo8L0xJTkU+Ci08TElORT5BcmUgeW91IHNvIGhhc3R5IG5vdz8gd2VsbCwgYWxsIGlzIG9uZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPk5heSwgZG8gbm90IHF1YXJyZWwgd2l0aCB1cywgZ29vZCBvbGQgbWFuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KLTxMSU5FPklmIGhlIGNvdWxkIHJpZ2h0IGhpbXNlbGYgd2l0aCBxdWFycmVsaW5nLDwvTElORT4KLTxMSU5FPlNvbWUgb2YgdXMgd291bGQgbGllIGxvdy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5XaG8gd3JvbmdzIGhpbT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5NYXJyeSwgdGhvdSBkb3N0IHdyb25nIG1lOyB0aG91IGRpc3NlbWJsZXIsIHRob3U6LS08L0xJTkU+Ci08TElORT5OYXksIG5ldmVyIGxheSB0aHkgaGFuZCB1cG9uIHRoeSBzd29yZDs8L0xJTkU+Ci08TElORT5JIGZlYXIgdGhlZSBub3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+TWFycnksIGJlc2hyZXcgbXkgaGFuZCw8L0xJTkU+Ci08TElORT5JZiBpdCBzaG91bGQgZ2l2ZSB5b3VyIGFnZSBzdWNoIGNhdXNlIG9mIGZlYXI6PC9MSU5FPgotPExJTkU+SW4gZmFpdGgsIG15IGhhbmQgbWVhbnQgbm90aGluZyB0byBteSBzd29yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5UdXNoLCB0dXNoLCBtYW47IG5ldmVyIGZsZWVyIGFuZCBqZXN0IGF0IG1lOjwvTElORT4KLTxMSU5FPkkgc3BlYWsgbm90IGxpa2UgYSBkb3RhcmQgbm9yIGEgZm9vbCw8L0xJTkU+Ci08TElORT5BcyB1bmRlciBwcml2aWxlZ2Ugb2YgYWdlIHRvIGJyYWc8L0xJTkU+Ci08TElORT5XaGF0IEkgaGF2ZSBkb25lIGJlaW5nIHlvdW5nLCBvciB3aGF0IHdvdWxkIGRvPC9MSU5FPgotPExJTkU+V2VyZSBJIG5vdCBvbGQuIEtub3csIENsYXVkaW8sIHRvIHRoeSBoZWFkLDwvTElORT4KLTxMSU5FPlRob3UgaGFzdCBzbyB3cm9uZydkIG1pbmUgaW5ub2NlbnQgY2hpbGQgYW5kIG1lPC9MSU5FPgotPExJTkU+VGhhdCBJIGFtIGZvcmNlZCB0byBsYXkgbXkgcmV2ZXJlbmNlIGJ5PC9MSU5FPgotPExJTkU+QW5kLCB3aXRoIGdyZXkgaGFpcnMgYW5kIGJydWlzZSBvZiBtYW55IGRheXMsPC9MSU5FPgotPExJTkU+RG8gY2hhbGxlbmdlIHRoZWUgdG8gdHJpYWwgb2YgYSBtYW4uPC9MSU5FPgotPExJTkU+SSBzYXkgdGhvdSBoYXN0IGJlbGllZCBtaW5lIGlubm9jZW50IGNoaWxkOzwvTElORT4KLTxMSU5FPlRoeSBzbGFuZGVyIGhhdGggZ29uZSB0aHJvdWdoIGFuZCB0aHJvdWdoIGhlciBoZWFydCw8L0xJTkU+Ci08TElORT5BbmQgc2hlIGxpZXMgYnVyaWVkIHdpdGggaGVyIGFuY2VzdG9yczs8L0xJTkU+Ci08TElORT5PLCBpbiBhIHRvbWIgd2hlcmUgbmV2ZXIgc2NhbmRhbCBzbGVwdCw8L0xJTkU+Ci08TElORT5TYXZlIHRoaXMgb2YgaGVycywgZnJhbWVkIGJ5IHRoeSB2aWxsYW55ITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk15IHZpbGxhbnk/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+VGhpbmUsIENsYXVkaW87IHRoaW5lLCBJIHNheS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPllvdSBzYXkgbm90IHJpZ2h0LCBvbGQgbWFuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPk15IGxvcmQsIG15IGxvcmQsPC9MSU5FPgotPExJTkU+SSdsbCBwcm92ZSBpdCBvbiBoaXMgYm9keSwgaWYgaGUgZGFyZSw8L0xJTkU+Ci08TElORT5EZXNwaXRlIGhpcyBuaWNlIGZlbmNlIGFuZCBoaXMgYWN0aXZlIHByYWN0aXNlLDwvTElORT4KLTxMSU5FPkhpcyBNYXkgb2YgeW91dGggYW5kIGJsb29tIG9mIGx1c3RpaG9vZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Bd2F5ISBJIHdpbGwgbm90IGhhdmUgdG8gZG8gd2l0aCB5b3UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Q2Fuc3QgdGhvdSBzbyBkYWZmIG1lPyBUaG91IGhhc3Qga2lsbCdkIG15IGNoaWxkOjwvTElORT4KLTxMSU5FPklmIHRob3Uga2lsbCdzdCBtZSwgYm95LCB0aG91IHNoYWx0IGtpbGwgYSBtYW4uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+SGUgc2hhbGwga2lsbCB0d28gb2YgdXMsIGFuZCBtZW4gaW5kZWVkOjwvTElORT4KLTxMSU5FPkJ1dCB0aGF0J3Mgbm8gbWF0dGVyOyBsZXQgaGltIGtpbGwgb25lIGZpcnN0OzwvTElORT4KLTxMSU5FPldpbiBtZSBhbmQgd2VhciBtZTsgbGV0IGhpbSBhbnN3ZXIgbWUuPC9MSU5FPgotPExJTkU+Q29tZSwgZm9sbG93IG1lLCBib3k7IGNvbWUsIHNpciBib3ksIGNvbWUsIGZvbGxvdyBtZTo8L0xJTkU+Ci08TElORT5TaXIgYm95LCBJJ2xsIHdoaXAgeW91IGZyb20geW91ciBmb2luaW5nIGZlbmNlOzwvTElORT4KLTxMSU5FPk5heSwgYXMgSSBhbSBhIGdlbnRsZW1hbiwgSSB3aWxsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkJyb3RoZXIsLS08L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Ci08TElORT5Db250ZW50IHlvdXJzZWxmLiBHb2Qga25vd3MgSSBsb3ZlZCBteSBuaWVjZTs8L0xJTkU+Ci08TElORT5BbmQgc2hlIGlzIGRlYWQsIHNsYW5kZXInZCB0byBkZWF0aCBieSB2aWxsYWlucyw8L0xJTkU+Ci08TElORT5UaGF0IGRhcmUgYXMgd2VsbCBhbnN3ZXIgYSBtYW4gaW5kZWVkPC9MSU5FPgotPExJTkU+QXMgSSBkYXJlIHRha2UgYSBzZXJwZW50IGJ5IHRoZSB0b25ndWU6PC9MSU5FPgotPExJTkU+Qm95cywgYXBlcywgYnJhZ2dhcnRzLCBKYWNrcywgbWlsa3NvcHMhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QnJvdGhlciBBbnRvbnksLS08L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Ci08TElORT5Ib2xkIHlvdSBjb250ZW50LiBXaGF0LCBtYW4hIEkga25vdyB0aGVtLCB5ZWEsPC9MSU5FPgotPExJTkU+QW5kIHdoYXQgdGhleSB3ZWlnaCwgZXZlbiB0byB0aGUgdXRtb3N0IHNjcnVwbGUsLS08L0xJTkU+Ci08TElORT5TY3JhbWJsaW5nLCBvdXQtZmFjaW5nLCBmYXNoaW9uLW1vbmdpbmcgYm95cyw8L0xJTkU+Ci08TElORT5UaGF0IGxpZSBhbmQgY29nIGFuZCBmbG91dCwgZGVwcmF2ZSBhbmQgc2xhbmRlciw8L0xJTkU+Ci08TElORT5HbyBhbnRpY2x5LCBzaG93IG91dHdhcmQgaGlkZW91c25lc3MsPC9MSU5FPgotPExJTkU+QW5kIHNwZWFrIG9mZiBoYWxmIGEgZG96ZW4gZGFuZ2Vyb3VzIHdvcmRzLDwvTElORT4KLTxMSU5FPkhvdyB0aGV5IG1pZ2h0IGh1cnQgdGhlaXIgZW5lbWllcywgaWYgdGhleSBkdXJzdDs8L0xJTkU+Ci08TElORT5BbmQgdGhpcyBpcyBhbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QnV0LCBicm90aGVyIEFudG9ueSwtLTwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KLTxMSU5FPkNvbWUsICd0aXMgbm8gbWF0dGVyOjwvTElORT4KLTxMSU5FPkRvIG5vdCB5b3UgbWVkZGxlOyBsZXQgbWUgZGVhbCBpbiB0aGlzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+R2VudGxlbWVuIGJvdGgsIHdlIHdpbGwgbm90IHdha2UgeW91ciBwYXRpZW5jZS48L0xJTkU+Ci08TElORT5NeSBoZWFydCBpcyBzb3JyeSBmb3IgeW91ciBkYXVnaHRlcidzIGRlYXRoOjwvTElORT4KLTxMSU5FPkJ1dCwgb24gbXkgaG9ub3VyLCBzaGUgd2FzIGNoYXJnZWQgd2l0aCBub3RoaW5nPC9MSU5FPgotPExJTkU+QnV0IHdoYXQgd2FzIHRydWUgYW5kIHZlcnkgZnVsbCBvZiBwcm9vZi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5NeSBsb3JkLCBteSBsb3JkLC0tPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5JIHdpbGwgbm90IGhlYXIgeW91LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPk5vPyBDb21lLCBicm90aGVyOyBhd2F5ISBJIHdpbGwgYmUgaGVhcmQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+QW5kIHNoYWxsLCBvciBzb21lIG9mIHVzIHdpbGwgc21hcnQgZm9yIGl0LjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FeGV1bnQgTEVPTkFUTyBhbmQgQU5UT05JTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5TZWUsIHNlZTsgaGVyZSBjb21lcyB0aGUgbWFuIHdlIHdlbnQgdG8gc2Vlay48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RW50ZXIgQkVORURJQ0s8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk5vdywgc2lnbmlvciwgd2hhdCBuZXdzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Hb29kIGRheSwgbXkgbG9yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldlbGNvbWUsIHNpZ25pb3I6IHlvdSBhcmUgYWxtb3N0IGNvbWUgdG8gcGFydDwvTElORT4KLTxMSU5FPmFsbW9zdCBhIGZyYXkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+V2UgaGFkIGxpa2UgdG8gaGF2ZSBoYWQgb3VyIHR3byBub3NlcyBzbmFwcGVkIG9mZjwvTElORT4KLTxMSU5FPndpdGggdHdvIG9sZCBtZW4gd2l0aG91dCB0ZWV0aC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkxlb25hdG8gYW5kIGhpcyBicm90aGVyLiBXaGF0IHRoaW5rZXN0IHRob3U/IEhhZDwvTElORT4KLTxMSU5FPndlIGZvdWdodCwgSSBkb3VidCB3ZSBzaG91bGQgaGF2ZSBiZWVuIHRvbyB5b3VuZyBmb3IgdGhlbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SW4gYSBmYWxzZSBxdWFycmVsIHRoZXJlIGlzIG5vIHRydWUgdmFsb3VyLiBJIGNhbWU8L0xJTkU+Ci08TElORT50byBzZWVrIHlvdSBib3RoLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPldlIGhhdmUgYmVlbiB1cCBhbmQgZG93biB0byBzZWVrIHRoZWU7IGZvciB3ZSBhcmU8L0xJTkU+Ci08TElORT5oaWdoLXByb29mIG1lbGFuY2hvbHkgYW5kIHdvdWxkIGZhaW4gaGF2ZSBpdCBiZWF0ZW48L0xJTkU+Ci08TElORT5hd2F5LiBXaWx0IHRob3UgdXNlIHRoeSB3aXQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkl0IGlzIGluIG15IHNjYWJiYXJkOiBzaGFsbCBJIGRyYXcgaXQ/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Eb3N0IHRob3Ugd2VhciB0aHkgd2l0IGJ5IHRoeSBzaWRlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk5ldmVyIGFueSBkaWQgc28sIHRob3VnaCB2ZXJ5IG1hbnkgaGF2ZSBiZWVuIGJlc2lkZTwvTElORT4KLTxMSU5FPnRoZWlyIHdpdC4gSSB3aWxsIGJpZCB0aGVlIGRyYXcsIGFzIHdlIGRvIHRoZTwvTElORT4KLTxMSU5FPm1pbnN0cmVsczsgZHJhdywgdG8gcGxlYXN1cmUgdXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5BcyBJIGFtIGFuIGhvbmVzdCBtYW4sIGhlIGxvb2tzIHBhbGUuIEFydCB0aG91PC9MSU5FPgotPExJTkU+c2ljaywgb3IgYW5ncnk/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+V2hhdCwgY291cmFnZSwgbWFuISBXaGF0IHRob3VnaCBjYXJlIGtpbGxlZCBhIGNhdCw8L0xJTkU+Ci08TElORT50aG91IGhhc3QgbWV0dGxlIGVub3VnaCBpbiB0aGVlIHRvIGtpbGwgY2FyZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+U2lyLCBJIHNoYWxsIG1lZXQgeW91ciB3aXQgaW4gdGhlIGNhcmVlciwgYW5kIHlvdTwvTElORT4KLTxMSU5FPmNoYXJnZSBpdCBhZ2FpbnN0IG1lLiBJIHByYXkgeW91IGNob29zZSBhbm90aGVyIHN1YmplY3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+TmF5LCB0aGVuLCBnaXZlIGhpbSBhbm90aGVyIHN0YWZmOiB0aGlzIGxhc3Qgd2FzPC9MSU5FPgotPExJTkU+YnJva2UgY3Jvc3MuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5CeSB0aGlzIGxpZ2h0LCBoZSBjaGFuZ2VzIG1vcmUgYW5kIG1vcmU6IEkgdGhpbms8L0xJTkU+Ci08TElORT5oZSBiZSBhbmdyeSBpbmRlZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SWYgaGUgYmUsIGhlIGtub3dzIGhvdyB0byB0dXJuIGhpcyBnaXJkbGUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlNoYWxsIEkgc3BlYWsgYSB3b3JkIGluIHlvdXIgZWFyPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkdvZCBibGVzcyBtZSBmcm9tIGEgY2hhbGxlbmdlITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT48U1RBR0VESVI+QXNpZGUgdG8gQ0xBVURJTzwvU1RBR0VESVI+ICBZb3UgYXJlIGEgdmlsbGFpbjsgSSBqZXN0IG5vdDo8L0xJTkU+Ci08TElORT5JIHdpbGwgbWFrZSBpdCBnb29kIGhvdyB5b3UgZGFyZSwgd2l0aCB3aGF0IHlvdTwvTElORT4KLTxMSU5FPmRhcmUsIGFuZCB3aGVuIHlvdSBkYXJlLiBEbyBtZSByaWdodCwgb3IgSSB3aWxsPC9MSU5FPgotPExJTkU+cHJvdGVzdCB5b3VyIGNvd2FyZGljZS4gWW91IGhhdmUga2lsbGVkIGEgc3dlZXQ8L0xJTkU+Ci08TElORT5sYWR5LCBhbmQgaGVyIGRlYXRoIHNoYWxsIGZhbGwgaGVhdnkgb24geW91LiBMZXQgbWU8L0xJTkU+Ci08TElORT5oZWFyIGZyb20geW91LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIEkgd2lsbCBtZWV0IHlvdSwgc28gSSBtYXkgaGF2ZSBnb29kIGNoZWVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+V2hhdCwgYSBmZWFzdCwgYSBmZWFzdD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5JJyBmYWl0aCwgSSB0aGFuayBoaW07IGhlIGhhdGggYmlkIG1lIHRvIGEgY2FsZidzPC9MSU5FPgotPExJTkU+aGVhZCBhbmQgYSBjYXBvbjsgdGhlIHdoaWNoIGlmIEkgZG8gbm90IGNhcnZlIG1vc3Q8L0xJTkU+Ci08TElORT5jdXJpb3VzbHksIHNheSBteSBrbmlmZSdzIG5hdWdodC4gU2hhbGwgSSBub3QgZmluZDwvTElORT4KLTxMSU5FPmEgd29vZGNvY2sgdG9vPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5TaXIsIHlvdXIgd2l0IGFtYmxlcyB3ZWxsOyBpdCBnb2VzIGVhc2lseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkknbGwgdGVsbCB0aGVlIGhvdyBCZWF0cmljZSBwcmFpc2VkIHRoeSB3aXQgdGhlPC9MSU5FPgotPExJTkU+b3RoZXIgZGF5LiBJIHNhaWQsIHRob3UgaGFkc3QgYSBmaW5lIHdpdDogJ1RydWUsJzwvTElORT4KLTxMSU5FPnNhaWQgc2hlLCAnYSBmaW5lIGxpdHRsZSBvbmUuJyAnTm8sJyBzYWlkIEksICdhPC9MSU5FPgotPExJTkU+Z3JlYXQgd2l0OicgJ1JpZ2h0LCcgc2F5cyBzaGUsICdhIGdyZWF0IGdyb3NzIG9uZS4nPC9MSU5FPgotPExJTkU+J05heSwnIHNhaWQgSSwgJ2EgZ29vZCB3aXQ6JyAnSnVzdCwnIHNhaWQgc2hlLCAnaXQ8L0xJTkU+Ci08TElORT5odXJ0cyBub2JvZHkuJyAnTmF5LCcgc2FpZCBJLCAndGhlIGdlbnRsZW1hbjwvTElORT4KLTxMSU5FPmlzIHdpc2U6JyAnQ2VydGFpbiwnIHNhaWQgc2hlLCAnYSB3aXNlIGdlbnRsZW1hbi4nPC9MSU5FPgotPExJTkU+J05heSwnIHNhaWQgSSwgJ2hlIGhhdGggdGhlIHRvbmd1ZXM6JyAnVGhhdCBJPC9MSU5FPgotPExJTkU+YmVsaWV2ZSwnIHNhaWQgc2hlLCAnZm9yIGhlIHN3b3JlIGEgdGhpbmcgdG8gbWUgb248L0xJTkU+Ci08TElORT5Nb25kYXkgbmlnaHQsIHdoaWNoIGhlIGZvcnN3b3JlIG9uIFR1ZXNkYXkgbW9ybmluZzs8L0xJTkU+Ci08TElORT50aGVyZSdzIGEgZG91YmxlIHRvbmd1ZTsgdGhlcmUncyB0d28gdG9uZ3Vlcy4nIFRodXM8L0xJTkU+Ci08TElORT5kaWQgc2hlLCBhbiBob3VyIHRvZ2V0aGVyLCB0cmFuc3NoYXBlIHRoeSBwYXJ0aWN1bGFyPC9MSU5FPgotPExJTkU+dmlydHVlczogeWV0IGF0IGxhc3Qgc2hlIGNvbmNsdWRlZCB3aXRoIGEgc2lnaCwgdGhvdTwvTElORT4KLTxMSU5FPndhc3QgdGhlIHByb3BlcmVzdCBtYW4gaW4gSXRhbHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+Rm9yIHRoZSB3aGljaCBzaGUgd2VwdCBoZWFydGlseSBhbmQgc2FpZCBzaGUgY2FyZWQ8L0xJTkU+Ci08TElORT5ub3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5ZZWEsIHRoYXQgc2hlIGRpZDogYnV0IHlldCwgZm9yIGFsbCB0aGF0LCBhbiBpZiBzaGU8L0xJTkU+Ci08TElORT5kaWQgbm90IGhhdGUgaGltIGRlYWRseSwgc2hlIHdvdWxkIGxvdmUgaGltIGRlYXJseTo8L0xJTkU+Ci08TElORT50aGUgb2xkIG1hbidzIGRhdWdodGVyIHRvbGQgdXMgYWxsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkFsbCwgYWxsOyBhbmQsIG1vcmVvdmVyLCBHb2Qgc2F3IGhpbSB3aGVuIGhlIHdhczwvTElORT4KLTxMSU5FPmhpZCBpbiB0aGUgZ2FyZGVuLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+QnV0IHdoZW4gc2hhbGwgd2Ugc2V0IHRoZSBzYXZhZ2UgYnVsbCdzIGhvcm5zIG9uPC9MSU5FPgotPExJTkU+dGhlIHNlbnNpYmxlIEJlbmVkaWNrJ3MgaGVhZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5ZZWEsIGFuZCB0ZXh0IHVuZGVybmVhdGgsICdIZXJlIGR3ZWxscyBCZW5lZGljayB0aGU8L0xJTkU+Ci08TElORT5tYXJyaWVkIG1hbic/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkZhcmUgeW91IHdlbGwsIGJveTogeW91IGtub3cgbXkgbWluZC4gSSB3aWxsIGxlYXZlPC9MSU5FPgotPExJTkU+eW91IG5vdyB0byB5b3VyIGdvc3NpcC1saWtlIGh1bW91cjogeW91IGJyZWFrIGplc3RzPC9MSU5FPgotPExJTkU+YXMgYnJhZ2dhcnRzIGRvIHRoZWlyIGJsYWRlcywgd2hpY2ggR29kIGJlIHRoYW5rZWQsPC9MSU5FPgotPExJTkU+aHVydCBub3QuIE15IGxvcmQsIGZvciB5b3VyIG1hbnkgY291cnRlc2llcyBJIHRoYW5rPC9MSU5FPgotPExJTkU+eW91OiBJIG11c3QgZGlzY29udGludWUgeW91ciBjb21wYW55OiB5b3VyIGJyb3RoZXI8L0xJTkU+Ci08TElORT50aGUgYmFzdGFyZCBpcyBmbGVkIGZyb20gTWVzc2luYTogeW91IGhhdmUgYW1vbmc8L0xJTkU+Ci08TElORT55b3Uga2lsbGVkIGEgc3dlZXQgYW5kIGlubm9jZW50IGxhZHkuIEZvciBteSBMb3JkPC9MSU5FPgotPExJTkU+TGFja2JlYXJkIHRoZXJlLCBoZSBhbmQgSSBzaGFsbCBtZWV0OiBhbmQsIHRpbGw8L0xJTkU+Ci08TElORT50aGVuLCBwZWFjZSBiZSB3aXRoIGhpbS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhpdDwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5IZSBpcyBpbiBlYXJuZXN0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkluIG1vc3QgcHJvZm91bmQgZWFybmVzdDsgYW5kLCBJJ2xsIHdhcnJhbnQgeW91LCBmb3I8L0xJTkU+Ci08TElORT50aGUgbG92ZSBvZiBCZWF0cmljZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkFuZCBoYXRoIGNoYWxsZW5nZWQgdGhlZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Nb3N0IHNpbmNlcmVseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldoYXQgYSBwcmV0dHkgdGhpbmcgbWFuIGlzIHdoZW4gaGUgZ29lcyBpbiBoaXM8L0xJTkU+Ci08TElORT5kb3VibGV0IGFuZCBob3NlIGFuZCBsZWF2ZXMgb2ZmIGhpcyB3aXQhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SGUgaXMgdGhlbiBhIGdpYW50IHRvIGFuIGFwZTsgYnV0IHRoZW4gaXMgYW4gYXBlIGE8L0xJTkU+Ci08TElORT5kb2N0b3IgdG8gc3VjaCBhIG1hbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkJ1dCwgc29mdCB5b3UsIGxldCBtZSBiZTogcGx1Y2sgdXAsIG15IGhlYXJ0LCBhbmQ8L0xJTkU+Ci08TElORT5iZSBzYWQuIERpZCBoZSBub3Qgc2F5LCBteSBicm90aGVyIHdhcyBmbGVkPzwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FbnRlciBET0dCRVJSWSwgVkVSR0VTLCBhbmQgdGhlIFdhdGNoLCB3aXRoIENPTlJBREUKLWFuZCBCT1JBQ0hJTzwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkNvbWUgeW91LCBzaXI6IGlmIGp1c3RpY2UgY2Fubm90IHRhbWUgeW91LCBzaGU8L0xJTkU+Ci08TElORT5zaGFsbCBuZSdlciB3ZWlnaCBtb3JlIHJlYXNvbnMgaW4gaGVyIGJhbGFuY2U6IG5heSw8L0xJTkU+Ci08TElORT5hbiB5b3UgYmUgYSBjdXJzaW5nIGh5cG9jcml0ZSBvbmNlLCB5b3UgbXVzdCBiZSBsb29rZWQgdG8uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Ib3cgbm93PyB0d28gb2YgbXkgYnJvdGhlcidzIG1lbiBib3VuZCEgQm9yYWNoaW88L0xJTkU+Ci08TElORT5vbmUhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SGVhcmtlbiBhZnRlciB0aGVpciBvZmZlbmNlLCBteSBsb3JkLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+T2ZmaWNlcnMsIHdoYXQgb2ZmZW5jZSBoYXZlIHRoZXNlIG1lbiBkb25lPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5NYXJyeSwgc2lyLCB0aGV5IGhhdmUgY29tbWl0dGVkIGZhbHNlIHJlcG9ydDs8L0xJTkU+Ci08TElORT5tb3Jlb3ZlciwgdGhleSBoYXZlIHNwb2tlbiB1bnRydXRoczsgc2Vjb25kYXJpbHksPC9MSU5FPgotPExJTkU+dGhleSBhcmUgc2xhbmRlcnM7IHNpeHRoIGFuZCBsYXN0bHksIHRoZXkgaGF2ZTwvTElORT4KLTxMSU5FPmJlbGllZCBhIGxhZHk7IHRoaXJkbHksIHRoZXkgaGF2ZSB2ZXJpZmllZCB1bmp1c3Q8L0xJTkU+Ci08TElORT50aGluZ3M7IGFuZCwgdG8gY29uY2x1ZGUsIHRoZXkgYXJlIGx5aW5nIGtuYXZlcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkZpcnN0LCBJIGFzayB0aGVlIHdoYXQgdGhleSBoYXZlIGRvbmU7IHRoaXJkbHksIEk8L0xJTkU+Ci08TElORT5hc2sgdGhlZSB3aGF0J3MgdGhlaXIgb2ZmZW5jZTsgc2l4dGggYW5kIGxhc3RseSwgd2h5PC9MSU5FPgotPExJTkU+dGhleSBhcmUgY29tbWl0dGVkOyBhbmQsIHRvIGNvbmNsdWRlLCB3aGF0IHlvdSBsYXk8L0xJTkU+Ci08TElORT50byB0aGVpciBjaGFyZ2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+UmlnaHRseSByZWFzb25lZCwgYW5kIGluIGhpcyBvd24gZGl2aXNpb246IGFuZCwgYnk8L0xJTkU+Ci08TElORT5teSB0cm90aCwgdGhlcmUncyBvbmUgbWVhbmluZyB3ZWxsIHN1aXRlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPldobyBoYXZlIHlvdSBvZmZlbmRlZCwgbWFzdGVycywgdGhhdCB5b3UgYXJlIHRodXM8L0xJTkU+Ci08TElORT5ib3VuZCB0byB5b3VyIGFuc3dlcj8gdGhpcyBsZWFybmVkIGNvbnN0YWJsZSBpczwvTElORT4KLTxMSU5FPnRvbyBjdW5uaW5nIHRvIGJlIHVuZGVyc3Rvb2Q6IHdoYXQncyB5b3VyIG9mZmVuY2U/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPlN3ZWV0IHByaW5jZSwgbGV0IG1lIGdvIG5vIGZhcnRoZXIgdG8gbWluZSBhbnN3ZXI6PC9MSU5FPgotPExJTkU+ZG8geW91IGhlYXIgbWUsIGFuZCBsZXQgdGhpcyBjb3VudCBraWxsIG1lLiBJIGhhdmU8L0xJTkU+Ci08TElORT5kZWNlaXZlZCBldmVuIHlvdXIgdmVyeSBleWVzOiB3aGF0IHlvdXIgd2lzZG9tczwvTElORT4KLTxMSU5FPmNvdWxkIG5vdCBkaXNjb3ZlciwgdGhlc2Ugc2hhbGxvdyBmb29scyBoYXZlIGJyb3VnaHQ8L0xJTkU+Ci08TElORT50byBsaWdodDogd2hvIGluIHRoZSBuaWdodCBvdmVyaGVhcmQgbWUgY29uZmVzc2luZzwvTElORT4KLTxMSU5FPnRvIHRoaXMgbWFuIGhvdyBEb24gSm9obiB5b3VyIGJyb3RoZXIgaW5jZW5zZWQgbWU8L0xJTkU+Ci08TElORT50byBzbGFuZGVyIHRoZSBMYWR5IEhlcm8sIGhvdyB5b3Ugd2VyZSBicm91Z2h0IGludG88L0xJTkU+Ci08TElORT50aGUgb3JjaGFyZCBhbmQgc2F3IG1lIGNvdXJ0IE1hcmdhcmV0IGluIEhlcm8nczwvTElORT4KLTxMSU5FPmdhcm1lbnRzLCBob3cgeW91IGRpc2dyYWNlZCBoZXIsIHdoZW4geW91IHNob3VsZDwvTElORT4KLTxMSU5FPm1hcnJ5IGhlcjogbXkgdmlsbGFueSB0aGV5IGhhdmUgdXBvbiByZWNvcmQ7IHdoaWNoPC9MSU5FPgotPExJTkU+SSBoYWQgcmF0aGVyIHNlYWwgd2l0aCBteSBkZWF0aCB0aGFuIHJlcGVhdCBvdmVyPC9MSU5FPgotPExJTkU+dG8gbXkgc2hhbWUuIFRoZSBsYWR5IGlzIGRlYWQgdXBvbiBtaW5lIGFuZCBteTwvTElORT4KLTxMSU5FPm1hc3RlcidzIGZhbHNlIGFjY3VzYXRpb247IGFuZCwgYnJpZWZseSwgSSBkZXNpcmU8L0xJTkU+Ci08TElORT5ub3RoaW5nIGJ1dCB0aGUgcmV3YXJkIG9mIGEgdmlsbGFpbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlJ1bnMgbm90IHRoaXMgc3BlZWNoIGxpa2UgaXJvbiB0aHJvdWdoIHlvdXIgYmxvb2Q/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SSBoYXZlIGRydW5rIHBvaXNvbiB3aGlsZXMgaGUgdXR0ZXInZCBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkJ1dCBkaWQgbXkgYnJvdGhlciBzZXQgdGhlZSBvbiB0byB0aGlzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5ZZWEsIGFuZCBwYWlkIG1lIHJpY2hseSBmb3IgdGhlIHByYWN0aXNlIG9mIGl0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SGUgaXMgY29tcG9zZWQgYW5kIGZyYW1lZCBvZiB0cmVhY2hlcnk6PC9MSU5FPgotPExJTkU+QW5kIGZsZWQgaGUgaXMgdXBvbiB0aGlzIHZpbGxhbnkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+U3dlZXQgSGVybyEgbm93IHRoeSBpbWFnZSBkb3RoIGFwcGVhcjwvTElORT4KLTxMSU5FPkluIHRoZSByYXJlIHNlbWJsYW5jZSB0aGF0IEkgbG92ZWQgaXQgZmlyc3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KLTxMSU5FPkNvbWUsIGJyaW5nIGF3YXkgdGhlIHBsYWludGlmZnM6IGJ5IHRoaXMgdGltZSBvdXI8L0xJTkU+Ci08TElORT5zZXh0b24gaGF0aCByZWZvcm1lZCBTaWduaW9yIExlb25hdG8gb2YgdGhlIG1hdHRlcjo8L0xJTkU+Ci08TElORT5hbmQsIG1hc3RlcnMsIGRvIG5vdCBmb3JnZXQgdG8gc3BlY2lmeSwgd2hlbiB0aW1lPC9MSU5FPgotPExJTkU+YW5kIHBsYWNlIHNoYWxsIHNlcnZlLCB0aGF0IEkgYW0gYW4gYXNzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgotPExJTkU+SGVyZSwgaGVyZSBjb21lcyBtYXN0ZXIgU2lnbmlvciBMZW9uYXRvLCBhbmQgdGhlPC9MSU5FPgotPExJTkU+U2V4dG9uIHRvby48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+UmUtZW50ZXIgTEVPTkFUTyBhbmQgQU5UT05JTywgd2l0aCB0aGUgU2V4dG9uPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XaGljaCBpcyB0aGUgdmlsbGFpbj8gbGV0IG1lIHNlZSBoaXMgZXllcyw8L0xJTkU+Ci08TElORT5UaGF0LCB3aGVuIEkgbm90ZSBhbm90aGVyIG1hbiBsaWtlIGhpbSw8L0xJTkU+Ci08TElORT5JIG1heSBhdm9pZCBoaW06IHdoaWNoIG9mIHRoZXNlIGlzIGhlPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Ci08TElORT5JZiB5b3Ugd291bGQga25vdyB5b3VyIHdyb25nZXIsIGxvb2sgb24gbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+QXJ0IHRob3UgdGhlIHNsYXZlIHRoYXQgd2l0aCB0aHkgYnJlYXRoIGhhc3Qga2lsbCdkPC9MSU5FPgotPExJTkU+TWluZSBpbm5vY2VudCBjaGlsZD88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgotPExJTkU+WWVhLCBldmVuIEkgYWxvbmUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Tm8sIG5vdCBzbywgdmlsbGFpbjsgdGhvdSBiZWxpZXN0IHRoeXNlbGY6PC9MSU5FPgotPExJTkU+SGVyZSBzdGFuZCBhIHBhaXIgb2YgaG9ub3VyYWJsZSBtZW47PC9MSU5FPgotPExJTkU+QSB0aGlyZCBpcyBmbGVkLCB0aGF0IGhhZCBhIGhhbmQgaW4gaXQuPC9MSU5FPgotPExJTkU+SSB0aGFuayB5b3UsIHByaW5jZXMsIGZvciBteSBkYXVnaHRlcidzIGRlYXRoOjwvTElORT4KLTxMSU5FPlJlY29yZCBpdCB3aXRoIHlvdXIgaGlnaCBhbmQgd29ydGh5IGRlZWRzOjwvTElORT4KLTxMSU5FPidUd2FzIGJyYXZlbHkgZG9uZSwgaWYgeW91IGJldGhpbmsgeW91IG9mIGl0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkkga25vdyBub3QgaG93IHRvIHByYXkgeW91ciBwYXRpZW5jZTs8L0xJTkU+Ci08TElORT5ZZXQgSSBtdXN0IHNwZWFrLiBDaG9vc2UgeW91ciByZXZlbmdlIHlvdXJzZWxmOzwvTElORT4KLTxMSU5FPkltcG9zZSBtZSB0byB3aGF0IHBlbmFuY2UgeW91ciBpbnZlbnRpb248L0xJTkU+Ci08TElORT5DYW4gbGF5IHVwb24gbXkgc2luOiB5ZXQgc2lubidkIEkgbm90PC9MSU5FPgotPExJTkU+QnV0IGluIG1pc3Rha2luZy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkJ5IG15IHNvdWwsIG5vciBJOjwvTElORT4KLTxMSU5FPkFuZCB5ZXQsIHRvIHNhdGlzZnkgdGhpcyBnb29kIG9sZCBtYW4sPC9MSU5FPgotPExJTkU+SSB3b3VsZCBiZW5kIHVuZGVyIGFueSBoZWF2eSB3ZWlnaHQ8L0xJTkU+Ci08TElORT5UaGF0IGhlJ2xsIGVuam9pbiBtZSB0by48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5JIGNhbm5vdCBiaWQgeW91IGJpZCBteSBkYXVnaHRlciBsaXZlOzwvTElORT4KLTxMSU5FPlRoYXQgd2VyZSBpbXBvc3NpYmxlOiBidXQsIEkgcHJheSB5b3UgYm90aCw8L0xJTkU+Ci08TElORT5Qb3NzZXNzIHRoZSBwZW9wbGUgaW4gTWVzc2luYSBoZXJlPC9MSU5FPgotPExJTkU+SG93IGlubm9jZW50IHNoZSBkaWVkOyBhbmQgaWYgeW91ciBsb3ZlPC9MSU5FPgotPExJTkU+Q2FuIGxhYm91ciBvdWdodCBpbiBzYWQgaW52ZW50aW9uLDwvTElORT4KLTxMSU5FPkhhbmcgaGVyIGFuIGVwaXRhcGggdXBvbiBoZXIgdG9tYjwvTElORT4KLTxMSU5FPkFuZCBzaW5nIGl0IHRvIGhlciBib25lcywgc2luZyBpdCB0by1uaWdodDo8L0xJTkU+Ci08TElORT5Uby1tb3Jyb3cgbW9ybmluZyBjb21lIHlvdSB0byBteSBob3VzZSw8L0xJTkU+Ci08TElORT5BbmQgc2luY2UgeW91IGNvdWxkIG5vdCBiZSBteSBzb24taW4tbGF3LDwvTElORT4KLTxMSU5FPkJlIHlldCBteSBuZXBoZXc6IG15IGJyb3RoZXIgaGF0aCBhIGRhdWdodGVyLDwvTElORT4KLTxMSU5FPkFsbW9zdCB0aGUgY29weSBvZiBteSBjaGlsZCB0aGF0J3MgZGVhZCw8L0xJTkU+Ci08TElORT5BbmQgc2hlIGFsb25lIGlzIGhlaXIgdG8gYm90aCBvZiB1czo8L0xJTkU+Ci08TElORT5HaXZlIGhlciB0aGUgcmlnaHQgeW91IHNob3VsZCBoYXZlIGdpdmVuIGhlciBjb3VzaW4sPC9MSU5FPgotPExJTkU+QW5kIHNvIGRpZXMgbXkgcmV2ZW5nZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5PIG5vYmxlIHNpciw8L0xJTkU+Ci08TElORT5Zb3VyIG92ZXIta2luZG5lc3MgZG90aCB3cmluZyB0ZWFycyBmcm9tIG1lITwvTElORT4KLTxMSU5FPkkgZG8gZW1icmFjZSB5b3VyIG9mZmVyOyBhbmQgZGlzcG9zZTwvTElORT4KLTxMSU5FPkZvciBoZW5jZWZvcnRoIG9mIHBvb3IgQ2xhdWRpby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5Uby1tb3Jyb3cgdGhlbiBJIHdpbGwgZXhwZWN0IHlvdXIgY29taW5nOzwvTElORT4KLTxMSU5FPlRvLW5pZ2h0IEkgdGFrZSBteSBsZWF2ZS4gVGhpcyBuYXVnaHR5IG1hbjwvTElORT4KLTxMSU5FPlNoYWxsIGZhY2UgdG8gZmFjZSBiZSBicm91Z2h0IHRvIE1hcmdhcmV0LDwvTElORT4KLTxMSU5FPldobyBJIGJlbGlldmUgd2FzIHBhY2snZCBpbiBhbGwgdGhpcyB3cm9uZyw8L0xJTkU+Ci08TElORT5IaXJlZCB0byBpdCBieSB5b3VyIGJyb3RoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KLTxMSU5FPk5vLCBieSBteSBzb3VsLCBzaGUgd2FzIG5vdCw8L0xJTkU+Ci08TElORT5Ob3Iga25ldyBub3Qgd2hhdCBzaGUgZGlkIHdoZW4gc2hlIHNwb2tlIHRvIG1lLDwvTElORT4KLTxMSU5FPkJ1dCBhbHdheXMgaGF0aCBiZWVuIGp1c3QgYW5kIHZpcnR1b3VzPC9MSU5FPgotPExJTkU+SW4gYW55IHRoaW5nIHRoYXQgSSBkbyBrbm93IGJ5IGhlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+TW9yZW92ZXIsIHNpciwgd2hpY2ggaW5kZWVkIGlzIG5vdCB1bmRlciB3aGl0ZSBhbmQ8L0xJTkU+Ci08TElORT5ibGFjaywgdGhpcyBwbGFpbnRpZmYgaGVyZSwgdGhlIG9mZmVuZGVyLCBkaWQgY2FsbDwvTElORT4KLTxMSU5FPm1lIGFzczogSSBiZXNlZWNoIHlvdSwgbGV0IGl0IGJlIHJlbWVtYmVyZWQgaW4gaGlzPC9MSU5FPgotPExJTkU+cHVuaXNobWVudC4gQW5kIGFsc28sIHRoZSB3YXRjaCBoZWFyZCB0aGVtIHRhbGsgb2Y8L0xJTkU+Ci08TElORT5vbmUgRGVmb3JtZWQ6IHRoZXkgc2F5IGJlIHdlYXJzIGEga2V5IGluIGhpcyBlYXIgYW5kPC9MSU5FPgotPExJTkU+YSBsb2NrIGhhbmdpbmcgYnkgaXQsIGFuZCBib3Jyb3dzIG1vbmV5IGluIEdvZCdzPC9MSU5FPgotPExJTkU+bmFtZSwgdGhlIHdoaWNoIGhlIGhhdGggdXNlZCBzbyBsb25nIGFuZCBuZXZlciBwYWlkPC9MSU5FPgotPExJTkU+dGhhdCBub3cgbWVuIGdyb3cgaGFyZC1oZWFydGVkIGFuZCB3aWxsIGxlbmQgbm90aGluZzwvTElORT4KLTxMSU5FPmZvciBHb2QncyBzYWtlOiBwcmF5IHlvdSwgZXhhbWluZSBoaW0gdXBvbiB0aGF0IHBvaW50LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkkgdGhhbmsgdGhlZSBmb3IgdGh5IGNhcmUgYW5kIGhvbmVzdCBwYWlucy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+WW91ciB3b3JzaGlwIHNwZWFrcyBsaWtlIGEgbW9zdCB0aGFua2Z1bCBhbmQ8L0xJTkU+Ci08TElORT5yZXZlcmVuZCB5b3V0aDsgYW5kIEkgcHJhaXNlIEdvZCBmb3IgeW91LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlRoZXJlJ3MgZm9yIHRoeSBwYWlucy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgotPExJTkU+R29kIHNhdmUgdGhlIGZvdW5kYXRpb24hPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+R28sIEkgZGlzY2hhcmdlIHRoZWUgb2YgdGh5IHByaXNvbmVyLCBhbmQgSSB0aGFuayB0aGVlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Ci08TElORT5JIGxlYXZlIGFuIGFycmFudCBrbmF2ZSB3aXRoIHlvdXIgd29yc2hpcDsgd2hpY2ggSTwvTElORT4KLTxMSU5FPmJlc2VlY2ggeW91ciB3b3JzaGlwIHRvIGNvcnJlY3QgeW91cnNlbGYsIGZvciB0aGU8L0xJTkU+Ci08TElORT5leGFtcGxlIG9mIG90aGVycy4gR29kIGtlZXAgeW91ciB3b3JzaGlwISBJIHdpc2g8L0xJTkU+Ci08TElORT55b3VyIHdvcnNoaXAgd2VsbDsgR29kIHJlc3RvcmUgeW91IHRvIGhlYWx0aCEgSTwvTElORT4KLTxMSU5FPmh1bWJseSBnaXZlIHlvdSBsZWF2ZSB0byBkZXBhcnQ7IGFuZCBpZiBhIG1lcnJ5PC9MSU5FPgotPExJTkU+bWVldGluZyBtYXkgYmUgd2lzaGVkLCBHb2QgcHJvaGliaXQgaXQhIENvbWUsIG5laWdoYm91ci48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50IERPR0JFUlJZIGFuZCBWRVJHRVM8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlVudGlsIHRvLW1vcnJvdyBtb3JuaW5nLCBsb3JkcywgZmFyZXdlbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+RmFyZXdlbGwsIG15IGxvcmRzOiB3ZSBsb29rIGZvciB5b3UgdG8tbW9ycm93LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+V2Ugd2lsbCBub3QgZmFpbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Uby1uaWdodCBJJ2xsIG1vdXJuIHdpdGggSGVyby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT48U1RBR0VESVI+VG8gdGhlIFdhdGNoPC9TVEFHRURJUj4gIEJyaW5nIHlvdSB0aGVzZSBmZWxsb3dzIG9uLiBXZSdsbDwvTElORT4KLTxMSU5FPnRhbGsgd2l0aCBNYXJnYXJldCw8L0xJTkU+Ci08TElORT5Ib3cgaGVyIGFjcXVhaW50YW5jZSBncmV3IHdpdGggdGhpcyBsZXdkIGZlbGxvdy48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50LCBzZXZlcmFsbHk8L1NUQUdFRElSPgotPC9TQ0VORT4KLQotPFNDRU5FPjxUSVRMRT5TQ0VORSBJSS4gIExFT05BVE8nUyBnYXJkZW4uPC9USVRMRT4KLTxTVEFHRURJUj5FbnRlciBCRU5FRElDSyBhbmQgTUFSR0FSRVQsIG1lZXRpbmc8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5QcmF5IHRoZWUsIHN3ZWV0IE1pc3RyZXNzIE1hcmdhcmV0LCBkZXNlcnZlIHdlbGwgYXQ8L0xJTkU+Ci08TElORT5teSBoYW5kcyBieSBoZWxwaW5nIG1lIHRvIHRoZSBzcGVlY2ggb2YgQmVhdHJpY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPldpbGwgeW91IHRoZW4gd3JpdGUgbWUgYSBzb25uZXQgaW4gcHJhaXNlIG9mIG15IGJlYXV0eT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SW4gc28gaGlnaCBhIHN0eWxlLCBNYXJnYXJldCwgdGhhdCBubyBtYW4gbGl2aW5nPC9MSU5FPgotPExJTkU+c2hhbGwgY29tZSBvdmVyIGl0OyBmb3IsIGluIG1vc3QgY29tZWx5IHRydXRoLCB0aG91PC9MSU5FPgotPExJTkU+ZGVzZXJ2ZXN0IGl0LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Ci08TElORT5UbyBoYXZlIG5vIG1hbiBjb21lIG92ZXIgbWUhIHdoeSwgc2hhbGwgSSBhbHdheXM8L0xJTkU+Ci08TElORT5rZWVwIGJlbG93IHN0YWlycz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+VGh5IHdpdCBpcyBhcyBxdWljayBhcyB0aGUgZ3JleWhvdW5kJ3MgbW91dGg7IGl0IGNhdGNoZXMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPkFuZCB5b3VycyBhcyBibHVudCBhcyB0aGUgZmVuY2VyJ3MgZm9pbHMsIHdoaWNoIGhpdCw8L0xJTkU+Ci08TElORT5idXQgaHVydCBub3QuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkEgbW9zdCBtYW5seSB3aXQsIE1hcmdhcmV0OyBpdCB3aWxsIG5vdCBodXJ0IGE8L0xJTkU+Ci08TElORT53b21hbjogYW5kIHNvLCBJIHByYXkgdGhlZSwgY2FsbCBCZWF0cmljZTogSSBnaXZlPC9MSU5FPgotPExJTkU+dGhlZSB0aGUgYnVja2xlcnMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPkdpdmUgdXMgdGhlIHN3b3Jkczsgd2UgaGF2ZSBidWNrbGVycyBvZiBvdXIgb3duLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5JZiB5b3UgdXNlIHRoZW0sIE1hcmdhcmV0LCB5b3UgbXVzdCBwdXQgaW4gdGhlPC9MSU5FPgotPExJTkU+cGlrZXMgd2l0aCBhIHZpY2U7IGFuZCB0aGV5IGFyZSBkYW5nZXJvdXMgd2VhcG9ucyBmb3IgbWFpZHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KLTxMSU5FPldlbGwsIEkgd2lsbCBjYWxsIEJlYXRyaWNlIHRvIHlvdSwgd2hvIEkgdGhpbmsgaGF0aCBsZWdzLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5BbmQgdGhlcmVmb3JlIHdpbGwgY29tZS48L0xJTkU+Ci08U1RBR0VESVI+RXhpdCBNQVJHQVJFVDwvU1RBR0VESVI+Ci08U1RBR0VESVI+U2luZ3M8L1NUQUdFRElSPgotPExJTkU+VGhlIGdvZCBvZiBsb3ZlLDwvTElORT4KLTxMSU5FPlRoYXQgc2l0cyBhYm92ZSw8L0xJTkU+Ci08TElORT5BbmQga25vd3MgbWUsIGFuZCBrbm93cyBtZSw8L0xJTkU+Ci08TElORT5Ib3cgcGl0aWZ1bCBJIGRlc2VydmUsLS08L0xJTkU+Ci08TElORT5JIG1lYW4gaW4gc2luZ2luZzsgYnV0IGluIGxvdmluZywgTGVhbmRlciB0aGUgZ29vZDwvTElORT4KLTxMSU5FPnN3aW1tZXIsIFRyb2lsdXMgdGhlIGZpcnN0IGVtcGxveWVyIG9mIHBhbmRlcnMsIGFuZDwvTElORT4KLTxMSU5FPmEgd2hvbGUgYm9va2Z1bCBvZiB0aGVzZSBxdW9uZGFtIGNhcnBldC1tYW5nZXJzLDwvTElORT4KLTxMSU5FPndob3NlIG5hbWVzIHlldCBydW4gc21vb3RobHkgaW4gdGhlIGV2ZW4gcm9hZCBvZiBhPC9MSU5FPgotPExJTkU+YmxhbmsgdmVyc2UsIHdoeSwgdGhleSB3ZXJlIG5ldmVyIHNvIHRydWx5IHR1cm5lZDwvTElORT4KLTxMSU5FPm92ZXIgYW5kIG92ZXIgYXMgbXkgcG9vciBzZWxmIGluIGxvdmUuIE1hcnJ5LCBJPC9MSU5FPgotPExJTkU+Y2Fubm90IHNob3cgaXQgaW4gcmh5bWU7IEkgaGF2ZSB0cmllZDogSSBjYW4gZmluZDwvTElORT4KLTxMSU5FPm91dCBubyByaHltZSB0byAnbGFkeScgYnV0ICdiYWJ5LCcgYW4gaW5ub2NlbnQ8L0xJTkU+Ci08TElORT5yaHltZTsgZm9yICdzY29ybiwnICdob3JuLCcgYSBoYXJkIHJoeW1lOyBmb3IsPC9MSU5FPgotPExJTkU+J3NjaG9vbCwnICdmb29sLCcgYSBiYWJibGluZyByaHltZTsgdmVyeSBvbWlub3VzPC9MSU5FPgotPExJTkU+ZW5kaW5nczogbm8sIEkgd2FzIG5vdCBib3JuIHVuZGVyIGEgcmh5bWluZyBwbGFuZXQsPC9MSU5FPgotPExJTkU+bm9yIEkgY2Fubm90IHdvbyBpbiBmZXN0aXZhbCB0ZXJtcy48L0xJTkU+Ci08U1RBR0VESVI+RW50ZXIgQkVBVFJJQ0U8L1NUQUdFRElSPgotPExJTkU+U3dlZXQgQmVhdHJpY2UsIHdvdWxkc3QgdGhvdSBjb21lIHdoZW4gSSBjYWxsZWQgdGhlZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+WWVhLCBzaWduaW9yLCBhbmQgZGVwYXJ0IHdoZW4geW91IGJpZCBtZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+Tywgc3RheSBidXQgdGlsbCB0aGVuITwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT4nVGhlbicgaXMgc3Bva2VuOyBmYXJlIHlvdSB3ZWxsIG5vdzogYW5kIHlldCwgZXJlPC9MSU5FPgotPExJTkU+SSBnbywgbGV0IG1lIGdvIHdpdGggdGhhdCBJIGNhbWU7IHdoaWNoIGlzLCB3aXRoPC9MSU5FPgotPExJTkU+a25vd2luZyB3aGF0IGhhdGggcGFzc2VkIGJldHdlZW4geW91IGFuZCBDbGF1ZGlvLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Pbmx5IGZvdWwgd29yZHM7IGFuZCB0aGVyZXVwb24gSSB3aWxsIGtpc3MgdGhlZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+Rm91bCB3b3JkcyBpcyBidXQgZm91bCB3aW5kLCBhbmQgZm91bCB3aW5kIGlzIGJ1dDwvTElORT4KLTxMSU5FPmZvdWwgYnJlYXRoLCBhbmQgZm91bCBicmVhdGggaXMgbm9pc29tZTsgdGhlcmVmb3JlIEk8L0xJTkU+Ci08TElORT53aWxsIGRlcGFydCB1bmtpc3NlZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+VGhvdSBoYXN0IGZyaWdodGVkIHRoZSB3b3JkIG91dCBvZiBoaXMgcmlnaHQgc2Vuc2UsPC9MSU5FPgotPExJTkU+c28gZm9yY2libGUgaXMgdGh5IHdpdC4gQnV0IEkgbXVzdCB0ZWxsIHRoZWU8L0xJTkU+Ci08TElORT5wbGFpbmx5LCBDbGF1ZGlvIHVuZGVyZ29lcyBteSBjaGFsbGVuZ2U7IGFuZCBlaXRoZXI8L0xJTkU+Ci08TElORT5JIG11c3Qgc2hvcnRseSBoZWFyIGZyb20gaGltLCBvciBJIHdpbGwgc3Vic2NyaWJlPC9MSU5FPgotPExJTkU+aGltIGEgY293YXJkLiBBbmQsIEkgcHJheSB0aGVlIG5vdywgdGVsbCBtZSBmb3I8L0xJTkU+Ci08TElORT53aGljaCBvZiBteSBiYWQgcGFydHMgZGlkc3QgdGhvdSBmaXJzdCBmYWxsIGluIGxvdmUgd2l0aCBtZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+Rm9yIHRoZW0gYWxsIHRvZ2V0aGVyOyB3aGljaCBtYWludGFpbmVkIHNvIHBvbGl0aWM8L0xJTkU+Ci08TElORT5hIHN0YXRlIG9mIGV2aWwgdGhhdCB0aGV5IHdpbGwgbm90IGFkbWl0IGFueSBnb29kPC9MSU5FPgotPExJTkU+cGFydCB0byBpbnRlcm1pbmdsZSB3aXRoIHRoZW0uIEJ1dCBmb3Igd2hpY2ggb2YgbXk8L0xJTkU+Ci08TElORT5nb29kIHBhcnRzIGRpZCB5b3UgZmlyc3Qgc3VmZmVyIGxvdmUgZm9yIG1lPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5TdWZmZXIgbG92ZSEgYSBnb29kIGVwaXRoZXQhIEkgZG8gc3VmZmVyIGxvdmU8L0xJTkU+Ci08TElORT5pbmRlZWQsIGZvciBJIGxvdmUgdGhlZSBhZ2FpbnN0IG15IHdpbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkluIHNwaXRlIG9mIHlvdXIgaGVhcnQsIEkgdGhpbms7IGFsYXMsIHBvb3IgaGVhcnQhPC9MSU5FPgotPExJTkU+SWYgeW91IHNwaXRlIGl0IGZvciBteSBzYWtlLCBJIHdpbGwgc3BpdGUgaXQgZm9yPC9MSU5FPgotPExJTkU+eW91cnM7IGZvciBJIHdpbGwgbmV2ZXIgbG92ZSB0aGF0IHdoaWNoIG15IGZyaWVuZCBoYXRlcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+VGhvdSBhbmQgSSBhcmUgdG9vIHdpc2UgdG8gd29vIHBlYWNlYWJseS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+SXQgYXBwZWFycyBub3QgaW4gdGhpcyBjb25mZXNzaW9uOiB0aGVyZSdzIG5vdCBvbmU8L0xJTkU+Ci08TElORT53aXNlIG1hbiBhbW9uZyB0d2VudHkgdGhhdCB3aWxsIHByYWlzZSBoaW1zZWxmLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5BbiBvbGQsIGFuIG9sZCBpbnN0YW5jZSwgQmVhdHJpY2UsIHRoYXQgbGl2ZWQgaW48L0xJTkU+Ci08TElORT50aGUgbGltZSBvZiBnb29kIG5laWdoYm91cnMuIElmIGEgbWFuIGRvIG5vdCBlcmVjdDwvTElORT4KLTxMSU5FPmluIHRoaXMgYWdlIGhpcyBvd24gdG9tYiBlcmUgaGUgZGllcywgaGUgc2hhbGwgbGl2ZTwvTElORT4KLTxMSU5FPm5vIGxvbmdlciBpbiBtb251bWVudCB0aGFuIHRoZSBiZWxsIHJpbmdzIGFuZCB0aGU8L0xJTkU+Ci08TElORT53aWRvdyB3ZWVwcy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+QW5kIGhvdyBsb25nIGlzIHRoYXQsIHRoaW5rIHlvdT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+UXVlc3Rpb246IHdoeSwgYW4gaG91ciBpbiBjbGFtb3VyIGFuZCBhIHF1YXJ0ZXIgaW48L0xJTkU+Ci08TElORT5yaGV1bTogdGhlcmVmb3JlIGlzIGl0IG1vc3QgZXhwZWRpZW50IGZvciB0aGU8L0xJTkU+Ci08TElORT53aXNlLCBpZiBEb24gV29ybSwgaGlzIGNvbnNjaWVuY2UsIGZpbmQgbm88L0xJTkU+Ci08TElORT5pbXBlZGltZW50IHRvIHRoZSBjb250cmFyeSwgdG8gYmUgdGhlIHRydW1wZXQgb2YgaGlzPC9MSU5FPgotPExJTkU+b3duIHZpcnR1ZXMsIGFzIEkgYW0gdG8gbXlzZWxmLiBTbyBtdWNoIGZvcjwvTElORT4KLTxMSU5FPnByYWlzaW5nIG15c2VsZiwgd2hvLCBJIG15c2VsZiB3aWxsIGJlYXIgd2l0bmVzcywgaXM8L0xJTkU+Ci08TElORT5wcmFpc2V3b3J0aHk6IGFuZCBub3cgdGVsbCBtZSwgaG93IGRvdGggeW91ciBjb3VzaW4/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlZlcnkgaWxsLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5BbmQgaG93IGRvIHlvdT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+VmVyeSBpbGwgdG9vLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5TZXJ2ZSBHb2QsIGxvdmUgbWUgYW5kIG1lbmQuIFRoZXJlIHdpbGwgSSBsZWF2ZTwvTElORT4KLTxMSU5FPnlvdSB0b28sIGZvciBoZXJlIGNvbWVzIG9uZSBpbiBoYXN0ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RW50ZXIgVVJTVUxBPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KLTxMSU5FPk1hZGFtLCB5b3UgbXVzdCBjb21lIHRvIHlvdXIgdW5jbGUuIFlvbmRlcidzIG9sZDwvTElORT4KLTxMSU5FPmNvaWwgYXQgaG9tZTogaXQgaXMgcHJvdmVkIG15IExhZHkgSGVybyBoYXRoIGJlZW48L0xJTkU+Ci08TElORT5mYWxzZWx5IGFjY3VzZWQsIHRoZSBwcmluY2UgYW5kIENsYXVkaW8gbWlnaHRpbHk8L0xJTkU+Ci08TElORT5hYnVzZWQ7IGFuZCBEb24gSm9obiBpcyB0aGUgYXV0aG9yIG9mIGFsbCwgd2hvIGlzPC9MSU5FPgotPExJTkU+ZmVkIGFuZCBnb25lLiBXaWxsIHlvdSBjb21lIHByZXNlbnRseT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+V2lsbCB5b3UgZ28gaGVhciB0aGlzIG5ld3MsIHNpZ25pb3I/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkkgd2lsbCBsaXZlIGluIHRoeSBoZWFydCwgZGllIGluIHRoeSBsYXAsIGFuZCBiZTwvTElORT4KLTxMSU5FPmJ1cmllZCBpbiB0aHkgZXllczsgYW5kIG1vcmVvdmVyIEkgd2lsbCBnbyB3aXRoPC9MSU5FPgotPExJTkU+dGhlZSB0byB0aHkgdW5jbGUncy48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KLTwvU0NFTkU+Ci0KLTxTQ0VORT48VElUTEU+U0NFTkUgSUlJLiAgQSBjaHVyY2guPC9USVRMRT4KLTxTVEFHRURJUj5FbnRlciBET04gUEVEUk8sIENMQVVESU8sIGFuZCB0aHJlZSBvciBmb3VyCi13aXRoIHRhcGVyczwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+SXMgdGhpcyB0aGUgbW9udW1lbnQgb2YgTGVvbmF0bz88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxvcmQ8L1NQRUFLRVI+Ci08TElORT5JdCBpcywgbXkgbG9yZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT48U1RBR0VESVI+UmVhZGluZyBvdXQgb2YgYSBzY3JvbGw8L1NUQUdFRElSPjwvTElORT4KLTxMSU5FPkRvbmUgdG8gZGVhdGggYnkgc2xhbmRlcm91cyB0b25ndWVzPC9MSU5FPgotPExJTkU+V2FzIHRoZSBIZXJvIHRoYXQgaGVyZSBsaWVzOjwvTElORT4KLTxMSU5FPkRlYXRoLCBpbiBndWVyZG9uIG9mIGhlciB3cm9uZ3MsPC9MSU5FPgotPExJTkU+R2l2ZXMgaGVyIGZhbWUgd2hpY2ggbmV2ZXIgZGllcy48L0xJTkU+Ci08TElORT5TbyB0aGUgbGlmZSB0aGF0IGRpZWQgd2l0aCBzaGFtZTwvTElORT4KLTxMSU5FPkxpdmVzIGluIGRlYXRoIHdpdGggZ2xvcmlvdXMgZmFtZS48L0xJTkU+Ci08TElORT5IYW5nIHRob3UgdGhlcmUgdXBvbiB0aGUgdG9tYiw8L0xJTkU+Ci08TElORT5QcmFpc2luZyBoZXIgd2hlbiBJIGFtIGR1bWIuPC9MSU5FPgotPExJTkU+Tm93LCBtdXNpYywgc291bmQsIGFuZCBzaW5nIHlvdXIgc29sZW1uIGh5bW4uPC9MSU5FPgotPFNVQkhFQUQ+U09ORy48L1NVQkhFQUQ+Ci08TElORT5QYXJkb24sIGdvZGRlc3Mgb2YgdGhlIG5pZ2h0LDwvTElORT4KLTxMSU5FPlRob3NlIHRoYXQgc2xldyB0aHkgdmlyZ2luIGtuaWdodDs8L0xJTkU+Ci08TElORT5Gb3IgdGhlIHdoaWNoLCB3aXRoIHNvbmdzIG9mIHdvZSw8L0xJTkU+Ci08TElORT5Sb3VuZCBhYm91dCBoZXIgdG9tYiB0aGV5IGdvLjwvTElORT4KLTxMSU5FPk1pZG5pZ2h0LCBhc3Npc3Qgb3VyIG1vYW47PC9MSU5FPgotPExJTkU+SGVscCB1cyB0byBzaWdoIGFuZCBncm9hbiw8L0xJTkU+Ci08TElORT5IZWF2aWx5LCBoZWF2aWx5OjwvTElORT4KLTxMSU5FPkdyYXZlcywgeWF3biBhbmQgeWllbGQgeW91ciBkZWFkLDwvTElORT4KLTxMSU5FPlRpbGwgZGVhdGggYmUgdXR0ZXJlZCw8L0xJTkU+Ci08TElORT5IZWF2aWx5LCBoZWF2aWx5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPk5vdywgdW50byB0aHkgYm9uZXMgZ29vZCBuaWdodCE8L0xJTkU+Ci08TElORT5ZZWFybHkgd2lsbCBJIGRvIHRoaXMgcml0ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkdvb2QgbW9ycm93LCBtYXN0ZXJzOyBwdXQgeW91ciB0b3JjaGVzIG91dDo8L0xJTkU+Ci08TElORT5UaGUgd29sdmVzIGhhdmUgcHJleSdkOyBhbmQgbG9vaywgdGhlIGdlbnRsZSBkYXksPC9MSU5FPgotPExJTkU+QmVmb3JlIHRoZSB3aGVlbHMgb2YgUGhvZWJ1cywgcm91bmQgYWJvdXQ8L0xJTkU+Ci08TElORT5EYXBwbGVzIHRoZSBkcm93c3kgZWFzdCB3aXRoIHNwb3RzIG9mIGdyZXkuPC9MSU5FPgotPExJTkU+VGhhbmtzIHRvIHlvdSBhbGwsIGFuZCBsZWF2ZSB1czogZmFyZSB5b3Ugd2VsbC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Hb29kIG1vcnJvdywgbWFzdGVyczogZWFjaCBoaXMgc2V2ZXJhbCB3YXkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Ci08TElORT5Db21lLCBsZXQgdXMgaGVuY2UsIGFuZCBwdXQgb24gb3RoZXIgd2VlZHM7PC9MSU5FPgotPExJTkU+QW5kIHRoZW4gdG8gTGVvbmF0bydzIHdlIHdpbGwgZ28uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+QW5kIEh5bWVuIG5vdyB3aXRoIGx1Y2tpZXIgaXNzdWUgc3BlZWQnczwvTElORT4KLTxMSU5FPlRoYW4gdGhpcyBmb3Igd2hvbSB3ZSByZW5kZXInZCB1cCB0aGlzIHdvZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KLTwvU0NFTkU+Ci0KLTxTQ0VORT48VElUTEU+U0NFTkUgSVYuICBBIHJvb20gaW4gTEVPTkFUTydTIGhvdXNlLjwvVElUTEU+Ci08U1RBR0VESVI+RW50ZXIgTEVPTkFUTywgQU5UT05JTywgQkVORURJQ0ssIEJFQVRSSUNFLAotTUFSR0FSRVQsIFVSU1VMQSwgRlJJQVIgRlJBTkNJUywgYW5kIEhFUk88L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KLTxMSU5FPkRpZCBJIG5vdCB0ZWxsIHlvdSBzaGUgd2FzIGlubm9jZW50PzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlNvIGFyZSB0aGUgcHJpbmNlIGFuZCBDbGF1ZGlvLCB3aG8gYWNjdXNlZCBoZXI8L0xJTkU+Ci08TElORT5VcG9uIHRoZSBlcnJvciB0aGF0IHlvdSBoZWFyZCBkZWJhdGVkOjwvTElORT4KLTxMSU5FPkJ1dCBNYXJnYXJldCB3YXMgaW4gc29tZSBmYXVsdCBmb3IgdGhpcyw8L0xJTkU+Ci08TElORT5BbHRob3VnaCBhZ2FpbnN0IGhlciB3aWxsLCBhcyBpdCBhcHBlYXJzPC9MSU5FPgotPExJTkU+SW4gdGhlIHRydWUgY291cnNlIG9mIGFsbCB0aGUgcXVlc3Rpb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+V2VsbCwgSSBhbSBnbGFkIHRoYXQgYWxsIHRoaW5ncyBzb3J0IHNvIHdlbGwuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkFuZCBzbyBhbSBJLCBiZWluZyBlbHNlIGJ5IGZhaXRoIGVuZm9yY2VkPC9MSU5FPgotPExJTkU+VG8gY2FsbCB5b3VuZyBDbGF1ZGlvIHRvIGEgcmVja29uaW5nIGZvciBpdC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5XZWxsLCBkYXVnaHRlciwgYW5kIHlvdSBnZW50bGUtd29tZW4gYWxsLDwvTElORT4KLTxMSU5FPldpdGhkcmF3IGludG8gYSBjaGFtYmVyIGJ5IHlvdXJzZWx2ZXMsPC9MSU5FPgotPExJTkU+QW5kIHdoZW4gSSBzZW5kIGZvciB5b3UsIGNvbWUgaGl0aGVyIG1hc2snZC48L0xJTkU+Ci08U1RBR0VESVI+RXhldW50IExhZGllczwvU1RBR0VESVI+Ci08TElORT5UaGUgcHJpbmNlIGFuZCBDbGF1ZGlvIHByb21pc2VkIGJ5IHRoaXMgaG91cjwvTElORT4KLTxMSU5FPlRvIHZpc2l0IG1lLiBZb3Uga25vdyB5b3VyIG9mZmljZSwgYnJvdGhlcjo8L0xJTkU+Ci08TElORT5Zb3UgbXVzdCBiZSBmYXRoZXIgdG8geW91ciBicm90aGVyJ3MgZGF1Z2h0ZXI8L0xJTkU+Ci08TElORT5BbmQgZ2l2ZSBoZXIgdG8geW91bmcgQ2xhdWRpby48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Ci08TElORT5XaGljaCBJIHdpbGwgZG8gd2l0aCBjb25maXJtJ2QgY291bnRlbmFuY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkZyaWFyLCBJIG11c3QgZW50cmVhdCB5b3VyIHBhaW5zLCBJIHRoaW5rLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KLTxMSU5FPlRvIGRvIHdoYXQsIHNpZ25pb3I/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRvIGJpbmQgbWUsIG9yIHVuZG8gbWU7IG9uZSBvZiB0aGVtLjwvTElORT4KLTxMSU5FPlNpZ25pb3IgTGVvbmF0bywgdHJ1dGggaXQgaXMsIGdvb2Qgc2lnbmlvciw8L0xJTkU+Ci08TElORT5Zb3VyIG5pZWNlIHJlZ2FyZHMgbWUgd2l0aCBhbiBleWUgb2YgZmF2b3VyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPlRoYXQgZXllIG15IGRhdWdodGVyIGxlbnQgaGVyOiAndGlzIG1vc3QgdHJ1ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+QW5kIEkgZG8gd2l0aCBhbiBleWUgb2YgbG92ZSByZXF1aXRlIGhlci48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5UaGUgc2lnaHQgd2hlcmVvZiBJIHRoaW5rIHlvdSBoYWQgZnJvbSBtZSw8L0xJTkU+Ci08TElORT5Gcm9tIENsYXVkaW8gYW5kIHRoZSBwcmluY2U6IGJ1dCB3aGF0J3MgeW91ciB3aWxsPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Zb3VyIGFuc3dlciwgc2lyLCBpcyBlbmlnbWF0aWNhbDo8L0xJTkU+Ci08TElORT5CdXQsIGZvciBteSB3aWxsLCBteSB3aWxsIGlzIHlvdXIgZ29vZCB3aWxsPC9MSU5FPgotPExJTkU+TWF5IHN0YW5kIHdpdGggb3VycywgdGhpcyBkYXkgdG8gYmUgY29uam9pbidkPC9MSU5FPgotPExJTkU+SW4gdGhlIHN0YXRlIG9mIGhvbm91cmFibGUgbWFycmlhZ2U6PC9MSU5FPgotPExJTkU+SW4gd2hpY2gsIGdvb2QgZnJpYXIsIEkgc2hhbGwgZGVzaXJlIHlvdXIgaGVscC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5NeSBoZWFydCBpcyB3aXRoIHlvdXIgbGlraW5nLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KLTxMSU5FPkFuZCBteSBoZWxwLjwvTElORT4KLTxMSU5FPkhlcmUgY29tZXMgdGhlIHByaW5jZSBhbmQgQ2xhdWRpby48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RW50ZXIgRE9OIFBFRFJPIGFuZCBDTEFVRElPLCBhbmQgdHdvIG9yCi10aHJlZSBvdGhlcnM8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+R29vZCBtb3Jyb3cgdG8gdGhpcyBmYWlyIGFzc2VtYmx5LjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkdvb2QgbW9ycm93LCBwcmluY2U7IGdvb2QgbW9ycm93LCBDbGF1ZGlvOjwvTElORT4KLTxMSU5FPldlIGhlcmUgYXR0ZW5kIHlvdS4gQXJlIHlvdSB5ZXQgZGV0ZXJtaW5lZDwvTElORT4KLTxMSU5FPlRvLWRheSB0byBtYXJyeSB3aXRoIG15IGJyb3RoZXIncyBkYXVnaHRlcj88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5JJ2xsIGhvbGQgbXkgbWluZCwgd2VyZSBzaGUgYW4gRXRoaW9wZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Ci08TElORT5DYWxsIGhlciBmb3J0aCwgYnJvdGhlcjsgaGVyZSdzIHRoZSBmcmlhciByZWFkeS48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+RXhpdCBBTlRPTklPPC9TVEFHRURJUj4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPkdvb2QgbW9ycm93LCBCZW5lZGljay4gV2h5LCB3aGF0J3MgdGhlIG1hdHRlciw8L0xJTkU+Ci08TElORT5UaGF0IHlvdSBoYXZlIHN1Y2ggYSBGZWJydWFyeSBmYWNlLDwvTElORT4KLTxMSU5FPlNvIGZ1bGwgb2YgZnJvc3QsIG9mIHN0b3JtIGFuZCBjbG91ZGluZXNzPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPkkgdGhpbmsgaGUgdGhpbmtzIHVwb24gdGhlIHNhdmFnZSBidWxsLjwvTElORT4KLTxMSU5FPlR1c2gsIGZlYXIgbm90LCBtYW47IHdlJ2xsIHRpcCB0aHkgaG9ybnMgd2l0aCBnb2xkPC9MSU5FPgotPExJTkU+QW5kIGFsbCBFdXJvcGEgc2hhbGwgcmVqb2ljZSBhdCB0aGVlLDwvTElORT4KLTxMSU5FPkFzIG9uY2UgRXVyb3BhIGRpZCBhdCBsdXN0eSBKb3ZlLDwvTElORT4KLTxMSU5FPldoZW4gaGUgd291bGQgcGxheSB0aGUgbm9ibGUgYmVhc3QgaW4gbG92ZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+QnVsbCBKb3ZlLCBzaXIsIGhhZCBhbiBhbWlhYmxlIGxvdzs8L0xJTkU+Ci08TElORT5BbmQgc29tZSBzdWNoIHN0cmFuZ2UgYnVsbCBsZWFwJ2QgeW91ciBmYXRoZXIncyBjb3csPC9MSU5FPgotPExJTkU+QW5kIGdvdCBhIGNhbGYgaW4gdGhhdCBzYW1lIG5vYmxlIGZlYXQ8L0xJTkU+Ci08TElORT5NdWNoIGxpa2UgdG8geW91LCBmb3IgeW91IGhhdmUganVzdCBoaXMgYmxlYXQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+Rm9yIHRoaXMgSSBvd2UgeW91OiBoZXJlIGNvbWVzIG90aGVyIHJlY2tvbmluZ3MuPC9MSU5FPgotPFNUQUdFRElSPlJlLWVudGVyIEFOVE9OSU8sIHdpdGggdGhlIExhZGllcyBtYXNrZWQ8L1NUQUdFRElSPgotPExJTkU+V2hpY2ggaXMgdGhlIGxhZHkgSSBtdXN0IHNlaXplIHVwb24/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgotPExJTkU+VGhpcyBzYW1lIGlzIHNoZSwgYW5kIEkgZG8gZ2l2ZSB5b3UgaGVyLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KLTxMSU5FPldoeSwgdGhlbiBzaGUncyBtaW5lLiBTd2VldCwgbGV0IG1lIHNlZSB5b3VyIGZhY2UuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+Tm8sIHRoYXQgeW91IHNoYWxsIG5vdCwgdGlsbCB5b3UgdGFrZSBoZXIgaGFuZDwvTElORT4KLTxMSU5FPkJlZm9yZSB0aGlzIGZyaWFyIGFuZCBzd2VhciB0byBtYXJyeSBoZXIuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+R2l2ZSBtZSB5b3VyIGhhbmQ6IGJlZm9yZSB0aGlzIGhvbHkgZnJpYXIsPC9MSU5FPgotPExJTkU+SSBhbSB5b3VyIGh1c2JhbmQsIGlmIHlvdSBsaWtlIG9mIG1lLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KLTxMSU5FPkFuZCB3aGVuIEkgbGl2ZWQsIEkgd2FzIHlvdXIgb3RoZXIgd2lmZTo8L0xJTkU+Ci08U1RBR0VESVI+VW5tYXNraW5nPC9TVEFHRURJUj4KLTxMSU5FPkFuZCB3aGVuIHlvdSBsb3ZlZCwgeW91IHdlcmUgbXkgb3RoZXIgaHVzYmFuZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5Bbm90aGVyIEhlcm8hPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgotPExJTkU+Tm90aGluZyBjZXJ0YWluZXI6PC9MSU5FPgotPExJTkU+T25lIEhlcm8gZGllZCBkZWZpbGVkLCBidXQgSSBkbyBsaXZlLDwvTElORT4KLTxMSU5FPkFuZCBzdXJlbHkgYXMgSSBsaXZlLCBJIGFtIGEgbWFpZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KLTxMSU5FPlRoZSBmb3JtZXIgSGVybyEgSGVybyB0aGF0IGlzIGRlYWQhPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+U2hlIGRpZWQsIG15IGxvcmQsIGJ1dCB3aGlsZXMgaGVyIHNsYW5kZXIgbGl2ZWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgotPExJTkU+QWxsIHRoaXMgYW1hemVtZW50IGNhbiBJIHF1YWxpZnk6PC9MSU5FPgotPExJTkU+V2hlbiBhZnRlciB0aGF0IHRoZSBob2x5IHJpdGVzIGFyZSBlbmRlZCw8L0xJTkU+Ci08TElORT5JJ2xsIHRlbGwgeW91IGxhcmdlbHkgb2YgZmFpciBIZXJvJ3MgZGVhdGg6PC9MSU5FPgotPExJTkU+TWVhbnRpbWUgbGV0IHdvbmRlciBzZWVtIGZhbWlsaWFyLDwvTElORT4KLTxMSU5FPkFuZCB0byB0aGUgY2hhcGVsIGxldCB1cyBwcmVzZW50bHkuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlNvZnQgYW5kIGZhaXIsIGZyaWFyLiBXaGljaCBpcyBCZWF0cmljZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+PFNUQUdFRElSPlVubWFza2luZzwvU1RBR0VESVI+ICBJIGFuc3dlciB0byB0aGF0IG5hbWUuIFdoYXQgaXMgeW91ciB3aWxsPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5EbyBub3QgeW91IGxvdmUgbWU/PC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPldoeSwgbm87IG5vIG1vcmUgdGhhbiByZWFzb24uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPldoeSwgdGhlbiB5b3VyIHVuY2xlIGFuZCB0aGUgcHJpbmNlIGFuZCBDbGF1ZGlvPC9MSU5FPgotPExJTkU+SGF2ZSBiZWVuIGRlY2VpdmVkOyB0aGV5IHN3b3JlIHlvdSBkaWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPkRvIG5vdCB5b3UgbG92ZSBtZT88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+VHJvdGgsIG5vOyBubyBtb3JlIHRoYW4gcmVhc29uLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5XaHksIHRoZW4gbXkgY291c2luIE1hcmdhcmV0IGFuZCBVcnN1bGE8L0xJTkU+Ci08TElORT5BcmUgbXVjaCBkZWNlaXZlZDsgZm9yIHRoZXkgZGlkIHN3ZWFyIHlvdSBkaWQuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPlRoZXkgc3dvcmUgdGhhdCB5b3Ugd2VyZSBhbG1vc3Qgc2ljayBmb3IgbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KLTxMSU5FPlRoZXkgc3dvcmUgdGhhdCB5b3Ugd2VyZSB3ZWxsLW5pZ2ggZGVhZCBmb3IgbWUuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPidUaXMgbm8gc3VjaCBtYXR0ZXIuIFRoZW4geW91IGRvIG5vdCBsb3ZlIG1lPzwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Ci08TElORT5ObywgdHJ1bHksIGJ1dCBpbiBmcmllbmRseSByZWNvbXBlbnNlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KLTxMSU5FPkNvbWUsIGNvdXNpbiwgSSBhbSBzdXJlIHlvdSBsb3ZlIHRoZSBnZW50bGVtYW4uPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgotPExJTkU+QW5kIEknbGwgYmUgc3dvcm4gdXBvbid0IHRoYXQgaGUgbG92ZXMgaGVyOzwvTElORT4KLTxMSU5FPkZvciBoZXJlJ3MgYSBwYXBlciB3cml0dGVuIGluIGhpcyBoYW5kLDwvTElORT4KLTxMSU5FPkEgaGFsdGluZyBzb25uZXQgb2YgaGlzIG93biBwdXJlIGJyYWluLDwvTElORT4KLTxMSU5FPkZhc2hpb24nZCB0byBCZWF0cmljZS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Ci08TElORT5BbmQgaGVyZSdzIGFub3RoZXI8L0xJTkU+Ci08TElORT5Xcml0IGluIG15IGNvdXNpbidzIGhhbmQsIHN0b2xlbiBmcm9tIGhlciBwb2NrZXQsPC9MSU5FPgotPExJTkU+Q29udGFpbmluZyBoZXIgYWZmZWN0aW9uIHVudG8gQmVuZWRpY2suPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KLTxMSU5FPkEgbWlyYWNsZSEgaGVyZSdzIG91ciBvd24gaGFuZHMgYWdhaW5zdCBvdXIgaGVhcnRzLjwvTElORT4KLTxMSU5FPkNvbWUsIEkgd2lsbCBoYXZlIHRoZWU7IGJ1dCwgYnkgdGhpcyBsaWdodCwgSSB0YWtlPC9MSU5FPgotPExJTkU+dGhlZSBmb3IgcGl0eS48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgotPExJTkU+SSB3b3VsZCBub3QgZGVueSB5b3U7IGJ1dCwgYnkgdGhpcyBnb29kIGRheSwgSSB5aWVsZDwvTElORT4KLTxMSU5FPnVwb24gZ3JlYXQgcGVyc3Vhc2lvbjsgYW5kIHBhcnRseSB0byBzYXZlIHlvdXIgbGlmZSw8L0xJTkU+Ci08TElORT5mb3IgSSB3YXMgdG9sZCB5b3Ugd2VyZSBpbiBhIGNvbnN1bXB0aW9uLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5QZWFjZSEgSSB3aWxsIHN0b3AgeW91ciBtb3V0aC48L0xJTkU+Ci08L1NQRUVDSD4KLQotCi08U1RBR0VESVI+S2lzc2luZyBoZXI8L1NUQUdFRElSPgotCi08U1BFRUNIPgotPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgotPExJTkU+SG93IGRvc3QgdGhvdSwgQmVuZWRpY2ssIHRoZSBtYXJyaWVkIG1hbj88L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+SSdsbCB0ZWxsIHRoZWUgd2hhdCwgcHJpbmNlOyBhIGNvbGxlZ2Ugb2Y8L0xJTkU+Ci08TElORT53aXQtY3JhY2tlcnMgY2Fubm90IGZsb3V0IG1lIG91dCBvZiBteSBodW1vdXIuIERvc3Q8L0xJTkU+Ci08TElORT50aG91IHRoaW5rIEkgIGNhcmUgZm9yIGEgc2F0aXJlIG9yIGFuIGVwaWdyYW0/IE5vOjwvTElORT4KLTxMSU5FPmlmIGEgbWFuIHdpbGwgYmUgYmVhdGVuIHdpdGggYnJhaW5zLCBhJyBzaGFsbCB3ZWFyPC9MSU5FPgotPExJTkU+bm90aGluZyBoYW5kc29tZSBhYm91dCBoaW0uIEluIGJyaWVmLCBzaW5jZSBJIGRvPC9MSU5FPgotPExJTkU+cHVycG9zZSB0byBtYXJyeSwgSSB3aWxsIHRoaW5rIG5vdGhpbmcgdG8gYW55PC9MSU5FPgotPExJTkU+cHVycG9zZSB0aGF0IHRoZSB3b3JsZCBjYW4gc2F5IGFnYWluc3QgaXQ7IGFuZDwvTElORT4KLTxMSU5FPnRoZXJlZm9yZSBuZXZlciBmbG91dCBhdCBtZSBmb3Igd2hhdCBJIGhhdmUgc2FpZDwvTElORT4KLTxMSU5FPmFnYWluc3QgaXQ7IGZvciBtYW4gaXMgYSBnaWRkeSB0aGluZywgYW5kIHRoaXMgaXMgbXk8L0xJTkU+Ci08TElORT5jb25jbHVzaW9uLiBGb3IgdGh5IHBhcnQsIENsYXVkaW8sIEkgZGlkIHRoaW5rIHRvPC9MSU5FPgotPExJTkU+aGF2ZSBiZWF0ZW4gdGhlZSwgYnV0IGluIHRoYXQgdGhvdSBhcnQgbGlrZSB0byBiZSBteTwvTElORT4KLTxMSU5FPmtpbnNtYW4sIGxpdmUgdW5icnVpc2VkIGFuZCBsb3ZlIG15IGNvdXNpbi48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Ci08TElORT5JIGhhZCB3ZWxsIGhvcGVkIHRob3Ugd291bGRzdCBoYXZlIGRlbmllZCBCZWF0cmljZSw8L0xJTkU+Ci08TElORT50aGF0IEkgbWlnaHQgaGF2ZSBjdWRnZWxsZWQgdGhlZSBvdXQgb2YgdGh5IHNpbmdsZTwvTElORT4KLTxMSU5FPmxpZmUsIHRvIG1ha2UgdGhlZSBhIGRvdWJsZS1kZWFsZXI7IHdoaWNoLCBvdXQgb2Y8L0xJTkU+Ci08TElORT5xdWVzdGlvbiwgdGhvdSB3aWx0IGJlLCBpZiBteSBjb3VzaW4gZG8gbm90IGxvb2s8L0xJTkU+Ci08TElORT5leGNlZWRpbmdseSBuYXJyb3dseSB0byB0aGVlLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5Db21lLCBjb21lLCB3ZSBhcmUgZnJpZW5kczogbGV0J3MgaGF2ZSBhIGRhbmNlIGVyZTwvTElORT4KLTxMSU5FPndlIGFyZSBtYXJyaWVkLCB0aGF0IHdlIG1heSBsaWdodGVuIG91ciBvd24gaGVhcnRzPC9MSU5FPgotPExJTkU+YW5kIG91ciB3aXZlcycgaGVlbHMuPC9MSU5FPgotPC9TUEVFQ0g+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgotPExJTkU+V2UnbGwgaGF2ZSBkYW5jaW5nIGFmdGVyd2FyZC48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNQRUVDSD4KLTxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgotPExJTkU+Rmlyc3QsIG9mIG15IHdvcmQ7IHRoZXJlZm9yZSBwbGF5LCBtdXNpYy4gUHJpbmNlLDwvTElORT4KLTxMSU5FPnRob3UgYXJ0IHNhZDsgZ2V0IHRoZWUgYSB3aWZlLCBnZXQgdGhlZSBhIHdpZmU6PC9MSU5FPgotPExJTkU+dGhlcmUgaXMgbm8gc3RhZmYgbW9yZSByZXZlcmVuZCB0aGFuIG9uZSB0aXBwZWQgd2l0aCBob3JuLjwvTElORT4KLTwvU1BFRUNIPgotCi0KLTxTVEFHRURJUj5FbnRlciBhIE1lc3NlbmdlcjwvU1RBR0VESVI+Ci0KLTxTUEVFQ0g+Ci08U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Ci08TElORT5NeSBsb3JkLCB5b3VyIGJyb3RoZXIgSm9obiBpcyB0YSdlbiBpbiBmbGlnaHQsPC9MSU5FPgotPExJTkU+QW5kIGJyb3VnaHQgd2l0aCBhcm1lZCBtZW4gYmFjayB0byBNZXNzaW5hLjwvTElORT4KLTwvU1BFRUNIPgotCi08U1BFRUNIPgotPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Ci08TElORT5UaGluayBub3Qgb24gaGltIHRpbGwgdG8tbW9ycm93OjwvTElORT4KLTxMSU5FPkknbGwgZGV2aXNlIHRoZWUgYnJhdmUgcHVuaXNobWVudHMgZm9yIGhpbS48L0xJTkU+Ci08TElORT5TdHJpa2UgdXAsIHBpcGVycy48L0xJTkU+Ci08L1NQRUVDSD4KLQotPFNUQUdFRElSPkRhbmNlPC9TVEFHRURJUj4KLTxTVEFHRURJUj5FeGV1bnQ8L1NUQUdFRElSPgotPC9TQ0VORT4KLTwvQUNUPgotPC9QTEFZPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC90ZXN0WFBhdGgueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC90ZXN0WFBhdGgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjkyYTc2Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvdGVzdFhQYXRoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+Ci0gIDxhIHRlc3Q9InRlc3QiIC8+Ci0gIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiAgIAotICB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KLSAgICA8YT4KLSAgICA8L2E+IAotICA8L2I+Ci08L2RvYz48IS0tIC0tPiAgICAgICAgIApkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0FsbFRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyNTcxNi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEFsbFRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFFOYW1lU2V0VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChTbW9rZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShKYXZlbGluVGVzdHMuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Fubm90YXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4YzQ0MS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEFubm90YXRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEFubm90YXRpb25zVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nW10gX2FyZ3M7Ci0gICAgc3RhdGljIFN0cmluZyBfdGVzdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDYXNlRmlsZShTdHJpbmcgdGhlQ2FzZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUZXN0RW52LnhiZWFuQ2FzZSgic3RvcmUvIiArIHRoZUNhc2UpOwotICAgIH0KLQotICAgIHN0YXRpYyBYbWxDdXJzb3IgbG9hZENhc2UoU3RyaW5nIHRoZUNhc2UpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShnZXRDYXNlRmlsZSh0aGVDYXNlKSwgbnVsbCkubmV3Q3Vyc29yKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFRlc3RCb29rbWFyayBleHRlbmRzIFhtbEN1cnNvci5YbWxCb29rbWFyawotICAgIHsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIEJhc2ljIGxvYWQgdXAgYSBmaWxlIGFuZCBpdGVyYXRlIHRocm91Z2ggaXQKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljWG1sKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgVGVzdEJvb2ttYXJrIGExID0gbmV3IFRlc3RCb29rbWFyaygpOwotCi0gICAgICAgIGMuc2V0Qm9va21hcmsoIGExICk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Qm9va21hcmsgYTIgPSBuZXcgVGVzdEJvb2ttYXJrKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIAotICAgICAgICBjLnNldEJvb2ttYXJrKCBhMiApOwotICAgICAgICAKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBjLnRvUHJldlRva2VuKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggYy5nZXRCb29rbWFyayggVGVzdEJvb2ttYXJrLmNsYXNzICksIGExICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGMuZ2V0Qm9va21hcmsoIFRlc3RCb29rbWFyay5jbGFzcyApLCBhMiApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsoIFRlc3RCb29rbWFyay5jbGFzcyApID09IG51bGwgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQXNzb3J0ZWRUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Fzc29ydGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyMTAwZi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQXNzb3J0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxUaW1lOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbEN1c3RvbWVyQmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbExpbmVJdGVtQmVhbjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCB4aW50LnRlc3QuUG9zaXRpb25Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEFzc29ydGVkVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBBc3NvcnRlZFRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShBc3NvcnRlZFRlc3RzLmNsYXNzKTsgfQotICAgIAotICAgIC8vIGJ1ZyAyNzQ4OQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U2F2ZXJDaGFyRXNjYXBpbmcoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApOwotICAgICAgICBYbWxPYmplY3QgeGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCI8dGVzdD5zb21ldGhpbmc8L3Rlc3Q+Iik7Ci0gICAgICAgIFhtbEN1cnNvciBjdXIgPSB4ZG9jLm5ld0N1cnNvcigpOwotICAgICAgICBjdXIudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIC8vIHZhbGlkIGNoYXJzCi0gICAgICAgIGN1ci5zZXRUZXh0VmFsdWUoIjxzb21ldGhpbmcgb3Igb3RoZXI6XHUwM0MwXHVEN0ZGPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI8dGVzdD4mbHQ7c29tZXRoaW5nIG9yIG90aGVyOlx1MDNDMFx1RDdGRj48L3Rlc3Q+IiArIG5ld0xpbmUsIHhkb2MudG9TdHJpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBpbnZhbGlkIGNoYXJzIC0gY29udHJvbCBjaGFycywgdW5pY29kZSBzdXJyb2dhdGVzLCBGRkZGL0ZGRkUsIGV0YwotICAgICAgICBjdXIuc2V0VGV4dFZhbHVlKCI8c29tZXRoaW5nXDBvclwxb3RoZXI6XHUwMDQ1XHVGRkZFXHVEODAwXHVERkZGXHVEQjgwXHVEQzAwXHUwM0MwXHVEN0ZGXHUwMDFGPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI8dGVzdD4mbHQ7c29tZXRoaW5nP29yP290aGVyOlx1MDA0NT8/Pz8/XHUwM0MwXHVEN0ZGPz48L3Rlc3Q+IiArIG5ld0xpbmUsIHhkb2MudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIGJ1ZyAyNjE0MC8yNjEwNAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Tm9UeXBlSW52YWxpZCgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIjx0ZXN0LW5vLXR5cGU+c29tZXRoaW5nPC90ZXN0LW5vLXR5cGU+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJVbnR5cGVkIGRvY3VtZW50IHNob3VsZCBiZSBpbnZhbGlkIiwgIXhkb2MudmFsaWRhdGUoKSk7Ci0gICAgICAgIAotICAgICAgICB4ZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIjx4OmJsYWggeG1sbnM6eD1cImh0dHA6Ly9uby10eXBlLmNvbS9cIi8+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJVbnR5cGVkIGRvY3VtZW50IHNob3VsZCBiZSBpbnZhbGlkIiwgIXhkb2MudmFsaWRhdGUoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIGJ1ZyAyNjc5MAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q29tcGxleFNldHRlcigpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4geGRvYyA9IFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJz4iICsKLSAgICAgICAgICAgICAgICAgIjxjdXN0b21lcj4iICsKLSAgICAgICAgICAgICAgICAgICAiPG5hbWU+RGF2aWQgQmF1PC9uYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICI8YWRkcmVzcz4xMDAgTWFpbiBTdHJlZXQ8L2FkZHJlc3M+IiArIAotICAgICAgICAgICAgICAgICAiPC9jdXN0b21lcj4iICsKLSAgICAgICAgICAgICAgICAgIjxkYXRlPjIwMDMtMDUtMThUMTE6NTA6MDA8L2RhdGU+IiArCi0gICAgICAgICAgICAgICAgICI8bGluZS1pdGVtPiIgKwotICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5SZWQgQ2FuZHk8L2Rlc2NyaXB0aW9uPiIgKwotICAgICAgICAgICAgICAgICAgIjxwZXItdW5pdC1vdW5jZXM+MC40MjM8L3Blci11bml0LW91bmNlcz4iICsKLSAgICAgICAgICAgICAgICAgICI8cXVhbnRpdHk+NDwvcXVhbnRpdHk+IiArCi0gICAgICAgICAgICAgICAgICI8L2xpbmUtaXRlbT4iICsKLSAgICAgICAgICAgICAgICAgIjxsaW5lLWl0ZW0+IiArCi0gICAgICAgICAgICAgICAgICAiPGRlc2NyaXB0aW9uPkJsdWUgQ2FuZHk8L2Rlc2NyaXB0aW9uPiIgKwotICAgICAgICAgICAgICAgICAgIjxwZXItdW5pdC1vdW5jZXM+NS4wPC9wZXItdW5pdC1vdW5jZXM+IiArCi0gICAgICAgICAgICAgICAgICAiPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKwotICAgICAgICAgICAgICAgICAiPC9saW5lLWl0ZW0+IiArCi0gICAgICAgICAgICAgICAgIjwvcHVyY2hhc2Utb3JkZXI+Iik7Ci0gICAgICAgIC8vIHRlc3QgY29weS13aXRoaW4gZG9jCi0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBuZXdJdGVtID0geGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuYWRkTmV3TGluZUl0ZW0oKTsKLSAgICAgICAgbmV3SXRlbS5zZXQoeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOwotICAgICAgICB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5zZXRMaW5lSXRlbUFycmF5KDAsIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgY29weS1iZXR3ZWVuIGRvY3MKLSAgICAgICAgWG1sTGluZUl0ZW1CZWFuIGFub3RoZXJJdGVtID0gWG1sTGluZUl0ZW1CZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQgeG1sbnM6ZXA9J2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8nIHhtbG5zOnhzaT0naHR0cDovL3d3d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6dHlwZT0nbGluZS1pdGVtJz4iICsKLSAgICAgICAgICAgICAgICAgIjxlcDpkZXNjcmlwdGlvbj5ZZWxsb3cgQmFsbG9vbjwvZXA6ZGVzY3JpcHRpb24+IiArCi0gICAgICAgICAgICAgICAgICI8ZXA6cGVyLXVuaXQtb3VuY2VzPjAuMDAxPC9lcDpwZXItdW5pdC1vdW5jZXM+IiArCi0gICAgICAgICAgICAgICAgICI8ZXA6cXVhbnRpdHk+MjAwPC9lcDpxdWFudGl0eT4iICsKLSAgICAgICAgICAgICAgICAiPC94bWwtZnJhZ21lbnQ+Iik7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJZZWxsb3cgQmFsbG9vbiIsIGFub3RoZXJJdGVtLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5zZXRMaW5lSXRlbUFycmF5KDEsIGFub3RoZXJJdGVtKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlllbGxvdyBCYWxsb29uIiwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDIwMCksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gdGVzdCBjb3B5LXRvLXNlbGYKLSAgICAgICAgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuc2V0TGluZUl0ZW1BcnJheSgxLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiWWVsbG93IEJhbGxvb24iLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMjAwKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoNCksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgfQotCi0gICAgLy8gYnVnIDQ1MzM4Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDb21wbGV4R2V0dGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbiB4ZG9jID0KLSAgICAgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJyIgKwotICAgICAgICAgICAgICAgICAgICAiIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIiArCi0gICAgICAgICAgICAgICAgICAgICIgeHNpOnR5cGU9J2Zvbyc+IiArCi0gICAgICAgICAgICAgICAgICI8Y3VzdG9tZXIgeHNpOnR5cGU9J2Jhcic+IiArCi0gICAgICAgICAgICAgICAgICAgIjxuYW1lPkRhdmlkIEJhdTwvbmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAiPGFkZHJlc3M+MTAwIE1haW4gU3RyZWV0PC9hZGRyZXNzPiIgKwotICAgICAgICAgICAgICAgICAiPC9jdXN0b21lcj4iICsKLSAgICAgICAgICAgICAgICAgIjxkYXRlPjIwMDMtMDUtMThUMTE6NTA6MDA8L2RhdGU+IiArCi0gICAgICAgICAgICAgICAgICI8bGluZS1pdGVtPiIgKwotICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5CbHVlIENhbmR5PC9kZXNjcmlwdGlvbj4iICsKLSAgICAgICAgICAgICAgICAgICI8cGVyLXVuaXQtb3VuY2VzPjUuMDwvcGVyLXVuaXQtb3VuY2VzPiIgKwotICAgICAgICAgICAgICAgICAgIjxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKLSAgICAgICAgICAgICAgICAgIjwvbGluZS1pdGVtPiIgKwotICAgICAgICAgICAgICAgICI8L3B1cmNoYXNlLW9yZGVyPiIpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIHhkb2MudmFsaWRhdGUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi50eXBlLCB4ZG9jLnNjaGVtYVR5cGUoKSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZSBvZiBlbGVtZW50IHdoZW4geHNpOnR5cGUgaXMgYmFkCi0gICAgICAgIFhtbE9iamVjdCBjdXN0ID0geGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0Q3VzdG9tZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxDdXN0b21lckJlYW4udHlwZSwgY3VzdC5zY2hlbWFUeXBlKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRhdmlkIEJhdSIsICgoWG1sQ3VzdG9tZXJCZWFuKWN1c3QpLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb250dGVzdFByZXR0eVByaW50KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHhvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgiPHRlc3QgeG1sbnM6eD0nZm9vJz4mbHQ7U0hPVUxETk9UQkVBVEFHJmd0OzxhPnNpbXBsZTxiLz48L2E+Jmx0O0FMU09TSE9VTEROT1RCRUFUQUcmZ3Q7PC90ZXN0PiIpOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oeG9iaik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqLnhtbFRleHQoKSk7Ci0gICAgICAgIC8qCi0gICAgICAgIFhtbEN1cnNvciB4Y3VyID0geG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgeG9iaiA9IHhjdXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSB4b2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQpOwotICAgICAgICAKLSAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgeGN1ci50b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIHhjdXIuaW5zZXJ0Q2hhcnMoIjxodG1sPjxib2R5PnRoaXMgaXMgYSB0ZXN0PC9ib2R5PjwvaHRtbD4iKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqKTsKLSAgICAgICAgKi8KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvbnRUZXN0UU5hbWVDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnQgeG9iaiA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKLSAgICAgICAgICAgICAgICAiPHhzOmVsZW1lbnQgbmFtZT0nZm9vJyB0eXBlPSd4czpzdHJpbmcnLz48L3hzOnNjaGVtYT4iKTsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnQgeG9iajIgPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+Iik7Ci0gICAgICAgIHhvYmoyLmdldFNjaGVtYSgpLmFkZE5ld0VsZW1lbnQoKS5zZXQoeG9iai5nZXRTY2hlbWEoKS5nZXRFbGVtZW50QXJyYXkoMCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oeG9iajIpOwotICAgIH0KLSAgICAKLSAgICAvLyBkb24ndCBydW4gb24gbm9ybWFsIGRydCBiZWNhdXNlIGl0J3MgdG9vIHNsb3c6IGFib3V0IDIwLTMwIHNlY3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9udHRlc3RDdXJzb3JGaW5hbGl6ZSgpCi0gICAgewotICAgICAgICBYbWxPYmplY3Qgb2JqID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIwMDAgKiAxMDAwOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgICAgICAvLyBjdXIuZGlzcG9zZSgpOyBza2lwcGluZyB0aGlzIGRlcGVuZHMgb24gZmluYWxpemF0aW9uIG9yIGVsc2UgT09NCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEaWQgIiArIGkgKyAiIGl0ZXJhdGlvbnMgYmVmb3JlIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE91dE9mUmFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBQb3NpdGlvbkRvY3VtZW50IGRvYyA9IFBvc2l0aW9uRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgiPHBvc2l0aW9uIHhtbG5zPSdqYXZhOmludC50ZXN0Jz48bGF0PjQzPC9sYXQ+PGxvbj4wMzc8L2xvbj48L3Bvc2l0aW9uPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzcsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLnZhbGlkYXRlKCkpOwotICAgICAgICAKLSAgICAgICAgZG9jID0gUG9zaXRpb25Eb2N1bWVudC5GYWN0b3J5LnBhcnNlKCI8cG9zaXRpb24geG1sbnM9J2phdmE6aW50LnRlc3QnPjxsYXQ+NDQzPC9sYXQ+PGxvbj43Mzc8L2xvbj48L3Bvc2l0aW9uPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQ0MywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDczNywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TG9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghZG9jLnZhbGlkYXRlKCkpOwotICAgICAgICAKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TGF0KChzaG9ydCktMzAwKTsKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TG9uKChzaG9ydCkzMjc2Nyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTMwMCwgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyNzY3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCFkb2MudmFsaWRhdGUoKSk7Ci0gICAgICAgIAotICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS5zZXRMYXQoKHNob3J0KTQzKTsKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TG9uKChzaG9ydCkxMjcpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTI3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy52YWxpZGF0ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RQYXJzZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbFRpbWUgeHQgPSBYbWxUaW1lLkZhY3RvcnkucGFyc2UoIjx4bWwtZnJhZ21lbnQ+MTI6MDA6MDA8L3htbC1mcmFnbWVudD4iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTI6MDA6MDAiLCB4dC5jYWxlbmRhclZhbHVlKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ29tcGlsYXRpb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NvbXBpbGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiNmQ0NC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ29tcGlsYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5Db2RlR2VuVXRpbDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIENvbXBpbGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKENvbXBpbGF0aW9uVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfX3Rlc3RKMkVFKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgVGVzdEVudi5kZWx0cmVlKFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9qMmVlIikpOwotICAgICAgICAvLyBGaXJzdCwgY29tcGlsZSBzY2hlbWEKLSAgICAgICAgRmlsZSBzcmNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvajJlZS9qMmVlY29uZmlneG1sL3NyYyIpOwotICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvajJlZS9qMmVlY29uZmlneG1sL2NsYXNzZXMiKTsKLSAgICAgICAgRmlsZSBvdXRwdXRqYXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvajJlZS9qMmVlY29uZmlneG1sLmphciIpOwotICAgICAgICBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCIpLAotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiKSwKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9jb25uZWN0b3JfMV81LnhzZCIpLAotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2VqYi1qYXJfMl8xLnhzZCIpLAotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2oyZWVfMV80LnhzZCIpLAotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2pzcF8yXzAueHNkIiksCi0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvd2ViLWFwcF8yXzQueHNkIiksCi0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvWE1MLnhzZCIpLAotICAgICAgICB9KTsKLSAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQnVpbGQgZmFpbGVkIiwgU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNhbm5vdXQgZmluZCAiICsgb3V0cHV0amFyLCBvdXRwdXRqYXIuZXhpc3RzKCkpOwotICAgIH0KLQotCi0gICAgLyogdGVzdCBub3QgbmVlZGVkIGJlY2F1c2UgYm9vdHN0cmFwIGJ1aWxkIHRlc3RzIHRoaXMgYmV0dGVyCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld0J1aWxkKCkKLSAgICB7Ci0gICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvczRzIikpOwotICAgICAgICBGaWxlIGlucHV0ZmlsZTEgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3M0cy9YTUwueHNkIik7Ci0gICAgICAgIEZpbGUgaW5wdXRmaWxlMiA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvczRzL1hNTFNjaGVtYS54c2QiKTsKLSAgICAgICAgRmlsZSBvdXRwdXRqYXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvczRzL3M0c3R5cGVzLmphciIpOwotICAgICAgICBTY2hlbWFDb21waWxlci5jb21waWxlKG5ldyBGaWxlW10geyBpbnB1dGZpbGUxLCBpbnB1dGZpbGUyIH0sIG5ldyBGaWxlWzBdLCBuZXcgRmlsZVswXSwgbmV3IEZpbGVbMF0sIG51bGwsIG91dHB1dGphciwgInNjaGVtYS5zNHMiLCBudWxsLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRqYXIsIG91dHB1dGphci5leGlzdHMoKSk7Ci0gICAgfQotICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBfX3Rlc3RTaW1wbGUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3NpbXBsZSIpKTsKLSAgICAgICAgLy8gRmlyc3QsIGNvbXBpbGUgc2NoZW1hCi0gICAgICAgIEZpbGUgaW5wdXRmaWxlMSA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QiKTsKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUyID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zaW1wbGUvc2ltcGxlYy54c2QiKTsKLSAgICAgICAgRmlsZSBzcmNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvc2ltcGxlL3NpbXBsZXR5cGVzL3NyYyIpOwotICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvc2ltcGxlL3NpbXBsZXR5cGVzL2NsYXNzZXMiKTsKLSAgICAgICAgRmlsZSBvdXRwdXRqYXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvc2ltcGxlL3NpbXBsZXR5cGVzLmphciIpOwotICAgICAgICBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsgaW5wdXRmaWxlMSwgaW5wdXRmaWxlMiB9KTsKLSAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQnVpbGQgZmFpbGVkIiwgU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpKTsKLQotICAgICAgICAvLyBUaGVuLCBjb21waWxlIGphdmEgY2xhc3NlcwotICAgICAgICBGaWxlIGphdmFzcmMgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3NpbXBsZS9qYXZhc3JjIik7Ci0gICAgICAgIEZpbGUgamF2YWNsYXNzZXMgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvc2ltcGxlL2phdmFjbGFzc2VzIik7Ci0gICAgICAgIGphdmFjbGFzc2VzLm1rZGlycygpOwotICAgICAgICBMaXN0IHRlc3RjcCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGVzdGNwLmFkZEFsbChBcnJheXMuYXNMaXN0KENvZGVHZW5VdGlsLnN5c3RlbUNsYXNzcGF0aCgpKSk7Ci0gICAgICAgIHRlc3RjcC5hZGQob3V0cHV0amFyKTsKLSAgICAgICAgQ29kZUdlblV0aWwuZXh0ZXJuYWxDb21waWxlKEFycmF5cy5hc0xpc3QobmV3IEZpbGVbXSB7IGphdmFzcmMgfSksIGphdmFjbGFzc2VzLCAoRmlsZVtdKXRlc3RjcC50b0FycmF5KG5ldyBGaWxlW3Rlc3RjcC5zaXplKCldKSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlbiBydW4gdGhlIHRlc3QKLSAgICAgICAgdGVzdGNwLmFkZChqYXZhY2xhc3Nlcyk7Ci0gICAgICAgIFRlc3RSdW5VdGlsLnJ1bigiU2ltcGxlUGVyc29uVGVzdCIsIG5ldyBGaWxlW10geyBvdXRwdXRqYXIsIGphdmFjbGFzc2VzIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF9fdGVzdERvd25sb2FkKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgVGVzdEVudi5kZWx0cmVlKFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlIikpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZpcnN0LCBjb21waWxlIHNjaGVtYSB3aXRob3V0IGRvd25sb2FkIGFuZCB2ZXJpZnkgZmFpbHVyZQotICAgICAgICAgICAgRmlsZSBzcmNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRmYWlsL3NyYyIpOwotICAgICAgICAgICAgRmlsZSBjbGFzc2VzZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkZmFpbC9jbGFzc2VzIik7Ci0gICAgICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZGZhaWwuamFyIik7Ci0gICAgICAgICAgICBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7Ci0gICAgICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2oyZWVfMV80LnhzZCIpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzZGlyKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRPdXRwdXRKYXIob3V0cHV0amFyKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQiLCAhU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJTaG91bGQgbm90IGhhdmUgY3JlYXRlZCAiICsgb3V0cHV0amFyLCAhb3V0cHV0amFyLmV4aXN0cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIG5vdyB0dXJuIG9uIGRvd25sb2FkIGFuZCB2ZXJpZnkgc3VjY2VzcwotICAgICAgICAgICAgRmlsZSBzcmNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRzdWNjZWVkL3NyYyIpOwotICAgICAgICAgICAgRmlsZSBjbGFzc2VzZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkc3VjY2VlZC9jbGFzc2VzIik7Ci0gICAgICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZHN1Y2NlZWQuamFyIik7Ci0gICAgICAgICAgICBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0RG93bmxvYWQodHJ1ZSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7Ci0gICAgICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2oyZWVfMV80LnhzZCIpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzZGlyKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRPdXRwdXRKYXIob3V0cHV0amFyKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNhbm5vdXQgZmluZCAiICsgb3V0cHV0amFyLCBvdXRwdXRqYXIuZXhpc3RzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaWNlcXVvdGUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3ByaWNlcXVvdGUiKSk7Ci0gICAgICAgIC8vIEZpcnN0LCBjb21waWxlIHNjaGVtYQotICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9wcmljZXF1b3RlL3NyYyIpOwotICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvcHJpY2VxdW90ZS9jbGFzc2VzIik7Ci0gICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3ByaWNlcXVvdGUvcHJpY2VxdW90ZS5qYXIiKTsKLSAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZCIpIH0pOwotICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRqYXIsIG91dHB1dGphci5leGlzdHMoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBbXSBpbnZhbGlkU2NoZW1hcyA9IHsKLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9J2V4dGVuc2lvbicvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdleHQnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotCi0gICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnIGZpbmFsPScjYWxsJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2V4dCc+XG4iICsKLSAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0KLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyBmaW5hbERlZmF1bHQ9JyNhbGwnPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0KLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyBmaW5hbERlZmF1bHQ9J3Jlc3RyaWN0aW9uJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotICAgIH07Ci0KLSAgICBzdGF0aWMgU3RyaW5nIFtdIHZhbGlkU2NoZW1hcyA9IHsKLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9J2V4dGVuc2lvbicvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotCi0gICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnIGZpbmFsPSdyZXN0cmljdGlvbicvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdleHQnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotCi0gICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgZmluYWxEZWZhdWx0PSdyZXN0cmljdGlvbic+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXh0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgIjwveHM6c2NoZW1hPlxuIiwKLQotICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIGZpbmFsRGVmYXVsdD0nZXh0ZW5zaW9uJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotICAgIH07Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluYWwoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBTY2hlbWFEb2N1bWVudFtdIHNjaGVtYXMgPSBuZXcgU2NoZW1hRG9jdW1lbnRbaW52YWxpZFNjaGVtYXMubGVuZ3RoXTsKLQotICAgICAgICAvLyBQYXJzZSB0aGUgaW52YWxpZCBzY2hlbWEgZmlsZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgaW52YWxpZFNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgc2NoZW1hc1tpXSA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoaW52YWxpZFNjaGVtYXNbaV0pOwotCi0gICAgICAgIC8vIE5vdyBjb21waWxlIHRoZSBpbnZhbGlkIHNjaGVtYXMsIHRlc3QgdGhhdCB0aGV5IGZhaWwKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10ge3NjaGVtYXNbaV19KTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTY2hlbWEgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGNvbXBpbGU6XG4iICsgaW52YWxpZFNjaGVtYXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBzdWNjZXNzKSB7fQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIHZhbGlkIHNjaGVtYSBmaWxlcwotICAgICAgICBzY2hlbWFzID0gbmV3IFNjaGVtYURvY3VtZW50W3ZhbGlkU2NoZW1hcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWxpZFNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgc2NoZW1hc1tpXSA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UodmFsaWRTY2hlbWFzW2ldKTsKLQotICAgICAgICAvLyBDb21waWxlIHRoZSB2YWxpZCBzY2hlbWFzLiBUaGV5IHNob3VsZCBub3QgZmFpbAotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYbWxCZWFucy5sb2FkWHNkKG5ldyBYbWxPYmplY3RbXXtzY2hlbWFzW2ldfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGZhaWwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gY29tcGlsZSBzY2hlbWE6XG4iICsgdmFsaWRTY2hlbWFzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NyZWF0aW9uVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9DcmVhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YmUzMzguLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NyZWF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLlB1cmNoYXNlT3JkZXI7Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxMaW5lSXRlbUJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxTaGlwcGVyQmVhbjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIENyZWF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKENyZWF0aW9uVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUG8oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIGRvYyA9Ci0gICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIFB1cmNoYXNlT3JkZXIgb3JkZXIgPSBkb2MuYWRkTmV3UHVyY2hhc2VPcmRlcigpOwotICAgICAgICBvcmRlci5hZGROZXdDdXN0b21lcigpLnNldE5hbWUoIkRhdmlkIEJhdSIpOwotICAgICAgICBvcmRlci5nZXRDdXN0b21lcigpLnNldEFkZHJlc3MoIkdsYWR3eW5lLCBQQSIpOwotICAgICAgICBYbWxMaW5lSXRlbUJlYW4gbGk7Ci0gICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKLSAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxIik7Ci0gICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIyMS43OSIpKTsKLSAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTsKLSAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKLSAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOwotICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDIiKTsKLSAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IikpOwotICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMikpOwotICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOwotICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7Ci0gICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMyIpOwotICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSk7Ci0gICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigxKSk7Ci0gICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7Ci0gICAgICAgIFhtbFNoaXBwZXJCZWFuIHNoID0gb3JkZXIuYWRkTmV3U2hpcHBlcigpOwotICAgICAgICBzaC5zZXROYW1lKCJVUFMiKTsKLSAgICAgICAgc2guc2V0UGVyT3VuY2VSYXRlKG5ldyBCaWdEZWNpbWFsKCIwLjc0IikpOwotCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRvYy54bWxUZXh0KCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRhdmlkIEJhdSIsIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2xhZHd5bmUsIFBBIiwgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIG9yZGVyLnNpemVPZkxpbmVJdGVtQXJyYXkoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIyMS43OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMyIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjEiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlLCBvcmRlci5pc1NldFNoaXBwZXIoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVQUyIsIG9yZGVyLmdldFNoaXBwZXIoKS5nZXROYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIwLjc0IiksIG9yZGVyLmdldFNoaXBwZXIoKS5nZXRQZXJPdW5jZVJhdGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0RvbVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRG9tVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzYmI2Yy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRG9tVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIERvbVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgRG9tVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKERvbVRlc3RzLmNsYXNzKTsgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOwotICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCi0gICAgewotICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZ2V0Q2FzZUZpbGUodGhlQ2FzZSksIG51bGwpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGVzdERvbUltcG9ydCAoIFN0cmluZyB4bWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZSggbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCB4bWwgKSApICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggZG9jICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9UZXN0RG9tRXhwb3J0ICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS5uZXdEb21Ob2RlKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9UZXN0ICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvVGVzdERvbUltcG9ydCggeG1sICk7Ci0gICAgICAgIGRvVGVzdERvbUV4cG9ydCggeG1sICk7Ci0gICAgfQotCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9tMiAoICkKLS8vICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0vLyAgICB7Ci0vLyAgICAgICAgRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgICAgICAKLS8vICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSApOwotLy8gICAgICAgIAotLy8gICAgICAgIHBhcnNlci5wYXJzZSggbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAiPGZvbyBhPSd4XG5cbnknPjwvZm9vPiIgKSApICk7Ci0vLwotLy8gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sTG9hZGVyLkZhY3RvcnkucGFyc2UoIHBhcnNlci5nZXREb2N1bWVudCgpICk7Ci0vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggeC54bWxUZXh0KCkgKTsKLS8vICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9tICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1Rlc3QoICI8Zm9vIHhtbG5zPVwieFwiLz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28geG1sbnM9XCJ4XCIgeG1sbnM6ZT1cInZcIi8+IiApOwotICAgICAgICBkb1Rlc3QoICI8Zm9vPmE8P1g/PmI8L2Zvbz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28+YTwhLS1YLS0+YjwvZm9vPiIgKTsKLSAgICAgICAgZG9UZXN0KCAiPCEtLVgtLT48Zm9vLz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28vPiIgKTsKLSAgICAgICAgZG9UZXN0KCAiPGZvbyB4PVwieVwiLz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28+PGEvPjxiPm1vbzwvYj48L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgeHggPQotICAgICAgICAgICAgIjwhLS1nZy0tPjw/YSBiPz48Zm9vPnNkc2Q8YS8+c2RzZDxiPm1vbzwvYj5zZDwhLS1hc2FzLS0+c2Q8L2Zvbz48IS0taGgtLT4iOwotICAgICAgICAKLSAgICAgICAgZG9UZXN0KCB4eCApOwotCi0gICAgICAgIFN0cmluZyB4bWwgPQotICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQ+IiArCi0gICAgICAgICAgICAiZm9vIiArCi0gICAgICAgICAgICAiPC94bWwtZnJhZ21lbnQ+IjsKLQotICAgICAgICBkb1Rlc3REb21FeHBvcnQoIHhtbCApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHhtbCA9Ci0gICAgICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQgIiArCi0gICAgICAgICAgICAgICAgIiAgZm9vPSdiYXInPiIgKwotICAgICAgICAgICAgICAgICI8L3htbC1mcmFnbWVudD4iOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZG9UZXN0RG9tRXhwb3J0KCB4bWwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHh4ICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbiA9IGMubmV3RG9tTm9kZSgpOwotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIG4gKTsKLQotICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FYXN5UG9UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Vhc3lQb1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDQ4ZTQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Vhc3lQb1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLlB1cmNoYXNlT3JkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFYXN5UG9UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEVhc3lQb1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShFYXN5UG9UZXN0cy5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFYXN5UG8oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIGRvYyA9IChYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuKQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoInN0b3JlL2Vhc3lwbzEueG1sIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBkb2MuaXNOaWwoKSk7Ci0gICAgICAgIFB1cmNoYXNlT3JkZXIgb3JkZXIgPSBkb2MuZ2V0UHVyY2hhc2VPcmRlcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEYXZpZCBCYXUiLCBvcmRlci5nZXRDdXN0b21lcigpLmdldE5hbWUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdsYWR3eW5lLCBQQSIsIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBvcmRlci5zaXplT2ZMaW5lSXRlbUFycmF5KCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjIiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIxIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXIuaXNTZXRTaGlwcGVyKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVUFMiLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMC43NCIpLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0UGVyT3VuY2VSYXRlKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgb3JkZXIuc2l6ZU9mTGluZUl0ZW1BcnJheSgpKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUF1dG9WYWxpZGFpdG9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxwdXJjaGFzZS1vcmRlciB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwbycvPiIgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8cHVyY2hhc2Utb3JkZSB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwbycvPiIgKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxwdXJjaGFzZS1vcmRlciB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwJy8+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8ZjpmcmFnbWVudCB4bWxuczpmPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL2ZyYWdtZW50Jy8+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8ZjpmcmFnbWVudCB4bWxuczpmPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL2ZyYWdtZW50Jz48YS8+PC9mOmZyYWdtZW50PiIgKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGY6ZnJhZ21lbnQgeG1sbnM6Zj0naHR0cDovL3d3dy5vcGVudXJpLm9yZy9mcmFnbWVudCc+PGEvPjxhLz48L2Y6ZnJhZ21lbnQ+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0VudW1UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0VudW1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzA0OGFiLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FbnVtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZW51bXRlc3QuU3RhdHVzcmVwb3J0RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZW51bXRlc3QuU2FsZXNyZXBvcnREb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5lbnVtdGVzdC5TYWxlc3JlcG9ydERvY3VtZW50LlNhbGVzcmVwb3J0LlVuaXQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZW51bXRlc3QuUXVhbnRpdHk7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZW51bXRlc3QuRGF0YTsKLQotcHVibGljIGNsYXNzIEVudW1UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEVudW1UZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRW51bVRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXBvcnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RhdHVzcmVwb3J0RG9jdW1lbnQgZG9jID0gKFN0YXR1c3JlcG9ydERvY3VtZW50KQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgiZW51bXRlc3QvcmVwb3J0MS54bWwiKSk7Ci0KLSAgICAgICAgUXVhbnRpdHkuRW51bVtdIGNvbnRlbnRzID0gbmV3IFF1YW50aXR5LkVudW1bXQotICAgICAgICB7Ci0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5GRVcsCi0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5NT1NULAotICAgICAgICAgICAgUXVhbnRpdHkuTk9ORSwKLSAgICAgICAgICAgIFF1YW50aXR5Lk5PTkUsCi0gICAgICAgICAgICBRdWFudGl0eS5OT05FLAotICAgICAgICB9OwotICAgICAgICBEYXRhW10gZGF0YSA9IGRvYy5nZXRTdGF0dXNyZXBvcnQoKS5nZXRTdGF0dXNBcnJheSgpOwotICAgICAgICBpbnQgdCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCBkYXRhW2ldLmVudW1WYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgZGF0YVtpXS5nZXRUYXJnZXQoKSArICIsIHZhbHVlOiAiICsgZGF0YVtpXS5lbnVtVmFsdWUoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sIGRhdGFbaV0uZ2V0VGFyZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXBvcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RhdHVzcmVwb3J0RG9jdW1lbnQgZG9jID0gU3RhdHVzcmVwb3J0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTdGF0dXNyZXBvcnREb2N1bWVudC5TdGF0dXNyZXBvcnQgcmVwb3J0ID0gZG9jLmFkZE5ld1N0YXR1c3JlcG9ydCgpOwotCi0gICAgICAgIERhdGEgZCA9IHJlcG9ydC5hZGROZXdTdGF0dXMoKTsKLSAgICAgICAgZC5zZXQoUXVhbnRpdHkuQUxMKTsKLSAgICAgICAgZC5zZXRUYXJnZXQoUXVhbnRpdHkuQUxMKTsKLQotICAgICAgICBkID0gcmVwb3J0LmFkZE5ld1N0YXR1cygpOwotICAgICAgICBkLnNldChRdWFudGl0eS5GRVcpOwotICAgICAgICBkLnNldFRhcmdldChRdWFudGl0eS5BTEwpOwotCi0gICAgICAgIGQgPSByZXBvcnQuYWRkTmV3U3RhdHVzKCk7Ci0gICAgICAgIGQuc2V0KFF1YW50aXR5Lk1PU1QpOwotICAgICAgICBkLnNldFRhcmdldChRdWFudGl0eS5OT05FKTsKLQotICAgICAgICBkID0gcmVwb3J0LmFkZE5ld1N0YXR1cygpOwotICAgICAgICBkLnNldChRdWFudGl0eS5OT05FKTsKLSAgICAgICAgZC5zZXRUYXJnZXQoUXVhbnRpdHkuTk9ORSk7Ci0KLSAgICAgICAgUXVhbnRpdHkuRW51bVtdIGNvbnRlbnRzID0gbmV3IFF1YW50aXR5LkVudW1bXQotICAgICAgICB7Ci0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5GRVcsCi0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5NT1NULAotICAgICAgICAgICAgUXVhbnRpdHkuTk9ORSwKLSAgICAgICAgICAgIFF1YW50aXR5Lk5PTkUsCi0gICAgICAgICAgICBRdWFudGl0eS5OT05FLAotICAgICAgICB9OwotICAgICAgICBEYXRhW10gZGF0YSA9IGRvYy5nZXRTdGF0dXNyZXBvcnQoKS5nZXRTdGF0dXNBcnJheSgpOwotICAgICAgICBpbnQgdCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCBkYXRhW2ldLmVudW1WYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgZGF0YVtpXS5nZXRUYXJnZXQoKSArICIsIHZhbHVlOiAiICsgZGF0YVtpXS5lbnVtVmFsdWUoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sIGRhdGFbaV0uZ2V0VGFyZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXBvcnQzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2FsZXNyZXBvcnREb2N1bWVudCBkb2MgPSBTYWxlc3JlcG9ydERvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU2FsZXNyZXBvcnREb2N1bWVudC5TYWxlc3JlcG9ydCByZXBvcnQgPSBkb2MuYWRkTmV3U2FsZXNyZXBvcnQoKTsKLQotICAgICAgICByZXBvcnQuYWRkVW5pdChVbml0Lk9ORSk7Ci0gICAgICAgIHJlcG9ydC5hZGRVbml0KFVuaXQuVFdPKTsKLSAgICAgICAgcmVwb3J0LmFkZFVuaXQoVW5pdC5OSU5FVFlfTklORSk7Ci0gICAgICAgIHJlcG9ydC5hZGRVbml0KFVuaXQuT05FX0hVTkRSRUQpOwotCi0gICAgICAgIFVuaXQuRW51bVtdIGNvbnRlbnRzID0gbmV3IFVuaXQuRW51bVtdCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVuaXQuT05FLAotICAgICAgICAgICAgVW5pdC5UV08sCi0gICAgICAgICAgICBVbml0Lk5JTkVUWV9OSU5FLAotICAgICAgICAgICAgVW5pdC5PTkVfSFVORFJFRCwKLSAgICAgICAgfTsKLQotICAgICAgICBVbml0W10geHVuaXRzID0gcmVwb3J0LnhnZXRVbml0QXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4dW5pdHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGVudHNbaV0sIHh1bml0c1tpXS5lbnVtVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBVbml0LkVudW1bXSB1bml0cyA9IHJlcG9ydC5nZXRVbml0QXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1tpXSwgdW5pdHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9HRGF0ZVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvR0RhdGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ0MjEwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9HRGF0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGVCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIEdEYXRlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBHRGF0ZVRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShHRGF0ZVRlc3RzLmNsYXNzKTsgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIHZhbGlkRHVyYXRpb25zID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAiUFQwUyIsCi0gICAgICAgICAgICAgICAgIlAxWSIsCi0gICAgICAgICAgICAgICAgIlAxTSIsCi0gICAgICAgICAgICAgICAgIlAxRCIsCi0gICAgICAgICAgICAgICAgIlAyWSIsCi0gICAgICAgICAgICAgICAgIlAyTSIsCi0gICAgICAgICAgICAgICAgIlAyRCIsCi0gICAgICAgICAgICAgICAgIlBUMUgiLAotICAgICAgICAgICAgICAgICJQVDFNIiwKLSAgICAgICAgICAgICAgICAiUFQxUyIsCi0gICAgICAgICAgICAgICAgIlBUMzYwMFMiLAotICAgICAgICAgICAgICAgICJQMVkxTTFEVDFIMU0xUyIsCi0gICAgICAgICAgICAgICAgIlAxWTFNMURUMUgxTTEuMVMiLAotICAgICAgICAgICAgICAgICJQMVkzNjVEIiwKLSAgICAgICAgICAgICAgICAiUDFZMzY2RCIsCi0gICAgICAgICAgICAgICAgIlBUMC4xUyIsCi0gICAgICAgICAgICAgICAgIlAxWS0zNjREIiwKLSAgICAgICAgICAgICAgICAiUDFZLTM2NUQiLAotICAgICAgICAgICAgICAgICJQMVktMzY2RCIsCi0gICAgICAgICAgICAgICAgIlAxWS0zNjdEIiwKLSAgICAgICAgICAgICAgICAiUDFZLTEyTSIsCi0gICAgICAgICAgICAgICAgIlAxTTI5RCIsCi0gICAgICAgICAgICAgICAgIlAxTS0yN0QiLAotICAgICAgICAgICAgICAgICJQMU0tMjhEIiwKLSAgICAgICAgICAgICAgICAiUDFNLTI5RCIsCi0gICAgICAgICAgICAgICAgIlAxTS0zMUQiLAotICAgICAgICAgICAgICAgICJQMU0tMzJEIiwKLSAgICAgICAgICAgICAgICAiUDFNVC02NjBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC02NzBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC02ODBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC02OTBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC03MDBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC03MTBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC03MjBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC03MzBIIiwKLSAgICAgICAgICAgICAgICAiUDFNVC03NDBIIiwKLSAgICAgICAgICAgICAgICAiUFQwLjE0MTU5MjZTIiwKLSAgICAgICAgICAgICAgICAiUFQ1MjMzMTMyUyIsCi0gICAgICAgICAgICAgICAgIlBUMTQyMzMyTSIsCi0gICAgICAgICAgICAgICAgIlBUOTgwMjNIIiwKLQotICAgICAgICAgICAgICAgICItUFQwUyIsCi0gICAgICAgICAgICAgICAgIi1QMVkiLAotICAgICAgICAgICAgICAgICItUDFNIiwKLSAgICAgICAgICAgICAgICAiLVAxRCIsCi0gICAgICAgICAgICAgICAgIi1QVDFIIiwKLSAgICAgICAgICAgICAgICAiLVBUMU0iLAotICAgICAgICAgICAgICAgICItUFQxUyIsCi0gICAgICAgICAgICAgICAgIi1QMVkxTTFEVDFIMU0xUyIsCi0gICAgICAgICAgICAgICAgIi1QMVkxTTFEVDFIMU0xLjFTIiwKLSAgICAgICAgICAgICAgICAiLVAyN0QiLAotICAgICAgICAgICAgICAgICItUDI4RCIsCi0gICAgICAgICAgICAgICAgIi1QMjlEIiwKLSAgICAgICAgICAgICAgICAiLVAzMEQiLAotICAgICAgICAgICAgICAgICItUDMxRCIsCi0gICAgICAgICAgICAgICAgIi1QMzY0RCIsCi0gICAgICAgICAgICAgICAgIi1QMzY1RCIsCi0gICAgICAgICAgICAgICAgIi1QMzY2RCIsCi0gICAgICAgICAgICAgICAgIi1QVDAuMVMiLAotICAgICAgICAgICAgICAgICItUFQwLjE0MTU5MjZTIiwKLSAgICAgICAgICAgICAgICAiLVBUNTIzMzEzMlMiLAotICAgICAgICAgICAgICAgICItUFQxNDIzMzJNIiwKLSAgICAgICAgICAgICAgICAiLVBUOTgwMjNIIiwKLQotICAgICAgICAgICAgfTsKLQotICAgIHN0YXRpYyBTdHJpbmdbXSBpbnZhbGlkRGF0ZXMgPQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICIrMTQ6MDEiLCAvLyB0egotICAgICAgICAgICAgICAgICItMTQ6MDEiLCAvLyB0egotICAgICAgICAgICAgICAgICIrMTU6MDAiLCAvLyB0egotICAgICAgICAgICAgICAgICItMTU6MDAiLCAvLyB0egotICAgICAgICAgICAgICAgICJYIiwKLSAgICAgICAgICAgICAgICAiLCIsCi0gICAgICAgICAgICAgICAgIlQiLAotICAgICAgICAgICAgICAgICIrIiwKLSAgICAgICAgICAgICAgICAiLSIsCi0gICAgICAgICAgICAgICAgIjoiLAotICAgICAgICAgICAgICAgICIwIiwKLSAgICAgICAgICAgICAgICAiTWFyY2ggMiIsCi0gICAgICAgICAgICAgICAgIlQwMDowMDowMFoiLCAvLyBUIG5vdCBhbGxvd2VkCi0gICAgICAgICAgICAgICAgIi0wMDowMDowMFoiLCAvLyAtIG5vdCBhbGxvd2VkCi0gICAgICAgICAgICAgICAgIjk2LTAyLTI4VDAwOjAwOjAwWiIsIC8vIHllYXIgd2lkdGgKLSAgICAgICAgICAgICAgICAiMTAwLTAyLTI4VDAwOjAwOjAwWiIsIC8vIHllYXIgd2lkdGgKLSAgICAgICAgICAgICAgICAiMTkwMC0yLTI4VDAwOjAwOjAwWiIsIC8vIG1vbnRoIHdpZHRoCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItOFQwMDowMDowMFoiLCAvLyBkYXkgd2lkdGgKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0wOFQwOjAwOjAwWiIsIC8vIGhvdXIgd2lkdGgKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0wOFQwMDowOjAwWiIsIC8vIGhvdXIgd2lkdGgKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0wOFQwMDowMDowWiIsIC8vIGhvdXIgd2lkdGgKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0wOFQwMDowMFoiLCAvLyB0aW1lIGluY29tcGxldGUKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0wOCBUMDA6MDA6MDBaIiwgLy8gc3BhY2UKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0wOFQgMDA6MDA6MDBaIiwgLy8gc3BhY2UKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0wOFQwMDowMDowMCBaIiwgLy8gc3BhY2UKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0yOVQwMFoiLCAvLyB0aW1lIGluY29tcGxldGUKLSAgICAgICAgICAgICAgICAiMDA6MDAiLCAvLyB0aW1lIGluY29tcGxldGUKLSAgICAgICAgICAgICAgICAiMDAiLCAvLyBpbmNvbXBsZXRlCi0gICAgICAgICAgICAgICAgIjIxMDAtMDItMjkiLCAvLyBub3QgbGVhcAotICAgICAgICAgICAgICAgICItOTk5OTk5OS0wMi0yOFQwMDowMDowMFoiLCAvLyB0b28gbG9uZyBhZ28KLSAgICAgICAgICAgICAgICAiOTk5OTk5OS0wMi0yOFQwMDowMDowMFoiLCAvLyB0b28gbG9uZyBmcm9tIG5vdwotICAgICAgICAgICAgICAgICI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5LTAyLTI4VDAwOjAwOjAwWiIsIC8vIG92ZXJmbG93PwotICAgICAgICAgICAgICAgICIxOTk2LTAwLTI4VDAwOjAwOjAwWiIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIjE5OTYtMTMtMjhUMDA6MDA6MDBaIiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0wMFQwMDowMDowMFoiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiMjAwMC0wMi0zMFQwMDowMDowMFoiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQyNDowMDowMFoiLCAvLyBocgotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjYwOjAwWiIsIC8vIG1pbgotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjAwOjYwWiIsIC8vIHNlYwotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjAwOjAwKzE0OjAxIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDowMDowMC0xNDowMSIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDArMTU6MDAiLCAvLyB0egotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjAwOjAwLTE1OjAwIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMC0yOSIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIjE5OTYtMTMtMjkiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICIxOTk2LTAyLTAwIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIjIwMDAtMDItMzAiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiLS0wMCIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIi0tMTMiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICItLTAwLTAxIiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiLS0xMy0wMSIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIi0tMDItMDAiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiLS0wMi0zMCIsIC8vIGRheQotICAgICAgICAgICAgICAgICItLTAxLTMyIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIi0tMTEtMzEiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiLS0tMDAiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiLS0tMzIiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiMjQ6MDA6MDBaIiwgLy8gaHIKLSAgICAgICAgICAgICAgICAiMDA6NjA6MDBaIiwgLy8gbWluCi0gICAgICAgICAgICAgICAgIjAwOjAwOjYwWiIsIC8vIHNlYwotICAgICAgICAgICAgICAgICIwMDowMDowMCsxNDowMSIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIjAwOjAwOjAwLTE0OjAxIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiMDA6MDA6MDArMTU6MDAiLCAvLyB0egotICAgICAgICAgICAgICAgICIwMDowMDowMC0xNTowMCIsIC8vIHR6Ci0gICAgICAgICAgICB9OwotCi0gICAgc3RhdGljIFN0cmluZ1tdIHZhbGlkRGF0ZXMgPQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICJaIiwgLy8gdGltZXpvbmUgb25seQotICAgICAgICAgICAgICAgICItMTQ6MDAiLCAvLyB0aW1lem9uZSBvbmx5Ci0gICAgICAgICAgICAgICAgIjk5OTk5OS0xMi0zMVQyMzo1OTo1OS45OTlaIiwKLSAgICAgICAgICAgICAgICAiMTk3MC0xMi0zMVQyMzo1OTo1OS45OTArMTQ6MDAiLAotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjAwOjAwWiIsIC8vIGxlYXAKLSAgICAgICAgICAgICAgICAiMjAwMC0wMi0yOVQwMDowMDowMFoiLCAvLyBsZWFwCi0gICAgICAgICAgICAgICAgIjIwMDQtMDItMjlUMDA6MDA6MDBaIiwgLy8gbGVhcAotICAgICAgICAgICAgICAgICIyMDA4LTAyLTI5VDAwOjAwOjAwWiIsIC8vIGxlYXAKLSAgICAgICAgICAgICAgICAiMjAxMi0wMi0yOVQwMDowMDowMFoiLCAvLyBsZWFwCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMjhUMDA6MDA6MDBaIiwgLy8gbm90IGxlYXAKLSAgICAgICAgICAgICAgICAiMjEwMC0wMi0yOFQwMDowMDowMFoiLCAvLyBub3QgbGVhcAotICAgICAgICAgICAgICAgICIxOTAwLTAzLTI4VDAwOjAwOjAwWiIsIC8vIG5vdCBsZWFwCi0gICAgICAgICAgICAgICAgIi00NzEyLTAxLTAxVDAwOjAwOjAwWiIsCi0gICAgICAgICAgICAgICAgIjE5OTktMDEtMDFUMDA6MDA6MDArMDE6MDAiLAotICAgICAgICAgICAgICAgICIyMDAxLTEyLTMxVDIzOjU5OjU5LjAxMCIsCi0gICAgICAgICAgICAgICAgIjIwMDEtMTItMzFUMjM6NTk6NTkuOTk5OTAxMDAwIiwKLSAgICAgICAgICAgICAgICAiMTk5OS0xMi0zMVQyMzo1OTo1OS4xMjM0NTY3ODkwLTE0OjAwIiwKLSAgICAgICAgICAgICAgICAiMTk5Mi0xMi0zMVQyMzo1OTo1OS4wMS0xNDowMCIsCi0gICAgICAgICAgICAgICAgIjE5NjUtMTItMzFUMjM6NTk6NTkuMDAwWiIsCi0gICAgICAgICAgICAgICAgIjAwMDAtMTItMzFUMDQ6MzU6MjIuNDU2IiwKLSAgICAgICAgICAgICAgICAiMTY5Ni0wOS0wMVQwMDowMDowMFoiLAotICAgICAgICAgICAgICAgICIxNjk3LTAyLTAxVDAwOjAwOjAwWiIsCi0gICAgICAgICAgICAgICAgIjE5MDMtMDMtMDFUMDA6MDA6MDBaIiwKLSAgICAgICAgICAgICAgICAiMTkwMy0wNy0wMVQwMDowMDowMFoiLAotICAgICAgICAgICAgICAgICIxNjk2LTA5LTAxVDAwOjAwOjAwKzAwOjAwIiwKLSAgICAgICAgICAgICAgICAiMTY5Ny0wMi0wMVQwMDowMDowMC0wMDowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDIiLAotICAgICAgICAgICAgICAgICItMDAwMSIsCi0gICAgICAgICAgICAgICAgIi0tMTIiLAotICAgICAgICAgICAgICAgICItMDAwMS0xMSIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDEiLAotICAgICAgICAgICAgICAgICItLS0zMSIsCi0gICAgICAgICAgICAgICAgIjE1NTQtLTMxIiwKLSAgICAgICAgICAgICAgICAiLTAwMDQtLTMxIiwKLSAgICAgICAgICAgICAgICAiLS0wMi0yOSIsCi0gICAgICAgICAgICAgICAgIi0tMTItMzEiLAotICAgICAgICAgICAgICAgICIyMDAyLTA0LTE4IiwKLSAgICAgICAgICAgICAgICAiLTA0MjMtMTItMzEiLAotICAgICAgICAgICAgICAgICIyMzo1OTo1OSIsCi0gICAgICAgICAgICAgICAgIjAwOjAwOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAxMFQyMzo1OTo1OSIsCi0gICAgICAgICAgICAgICAgIi0wMDAxVDAwOjAwOjAwIiwKLSAgICAgICAgICAgICAgICAiLS0xMlQyMzo1OTo1OSIsCi0gICAgICAgICAgICAgICAgIi0wMDAxLTExVDAwOjAwOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAxMS0wMVQyMzo1OTo1OSIsCi0gICAgICAgICAgICAgICAgIi0tLTMxVDAwOjAwOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0tMzFUMjM6NTk6NTkiLAotICAgICAgICAgICAgICAgICItMDAwNC0tMzFUMDA6MDA6MDAiLAotICAgICAgICAgICAgICAgICIyMDAyLTAyLTE4VDIzOjU5OjU5IiwKLSAgICAgICAgICAgICAgICAiLTA0MjMtMTItMzFUMDA6MDA6MDAiLAotICAgICAgICAgICAgICAgICIyMDAyWiIsCi0gICAgICAgICAgICAgICAgIi0wMDAxKzAxOjMwIiwKLSAgICAgICAgICAgICAgICAiLS0xMi0xNDowMCIsCi0gICAgICAgICAgICAgICAgIi0wMDAxLTExWiIsCi0gICAgICAgICAgICAgICAgIjE5NzAtMTItMDE6MDAiLAotICAgICAgICAgICAgICAgICItLS0zMSswMTozMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItLTMxWiIsCi0gICAgICAgICAgICAgICAgIi0tMDMtMzEtMDM6MDAiLAotICAgICAgICAgICAgICAgICItLTA0LTMwKzA1OjAwIiwKLSAgICAgICAgICAgICAgICAiLTAwMDQtLTMxLTAxOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0wNC0xOC0xNDowMCIsCi0gICAgICAgICAgICAgICAgIi0wNDIzLTEyLTMxWiIsCi0gICAgICAgICAgICAgICAgIjIzOjU5OjU5LTAxOjAwIiwKLSAgICAgICAgICAgICAgICAiMDA6MDA6MDBaIiwKLSAgICAgICAgICAgICAgICAiMDA6MDA6MDArMDE6MzAiLAotICAgICAgICAgICAgICAgICIxNzc2VDIzOjU5OjU5LTE0OjAwIiwKLSAgICAgICAgICAgICAgICAiLTAwMDFUMDA6MDA6MDBaIiwKLSAgICAgICAgICAgICAgICAiLS0xMlQyMzo1OTo1OSswMTozMCIsCi0gICAgICAgICAgICAgICAgIi0wMDAxLTExVDAwOjAwOjAwLTAxOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0wMlQyMzo1OTo1OVoiLAotICAgICAgICAgICAgICAgICItLS0zMVQwMDowMDowMC0xNDowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItLTMxVDIzOjU5OjU5LTAxOjAwIiwKLSAgICAgICAgICAgICAgICAiLTAwMDQtLTMxVDAwOjAwOjAwKzAxOjMwIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0wNC0xOFQyMzo1OTo1OVoiLAotICAgICAgICAgICAgICAgICItMDQyMy0xMi0zMVQwMDowMDowMC0wNTowMCIsCi0gICAgICAgICAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNUaW1lKEdEdXJhdGlvbiBnZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZC5nZXRIb3VyKCkgIT0gMCB8fCBnZC5nZXRNaW51dGUoKSAhPSAwIHx8IGdkLmdldFNlY29uZCgpICE9IDAgfHwgZ2QuZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSAhPSAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEdyZWdvcmlhbkNhbGVuZGFyKCkKLSAgICB7Ci0gICAgICAgIC8vIHRoaXMgaXMgYSBjaGVjayBvZiBEU1Qgb2Zmc2V0cwotICAgICAgICBEYXRlIGRhdGUgPSBuZXcgR0RhdGUoIjIwMDItMDQtMThUMjM6NTk6NTlaIikuZ2V0RGF0ZSgpOwotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnY2FsID0gbmV3IFhtbENhbGVuZGFyKGRhdGUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRhdGUsIGdjYWwuZ2V0VGltZSgpKTsKLQotICAgICAgICAvLyBub3cgY2hlY2sgb3V0IHNvbWUgdGhpbmdzCi0gICAgICAgIEdEYXRlIGdkID0gbmV3IEdEYXRlKCIyMDAxLTEyLTMxVDA3OjAwOjU5LjAxMCIpOwotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnYyA9IGdkLmdldENhbGVuZGFyKCk7Ci0gICAgICAgIERhdGUgZ2RkID0gZ2QuZ2V0RGF0ZSgpOwotICAgICAgICBEYXRlIGdjZCA9IGdjLmdldFRpbWUoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGQsIGdjZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBzZXQgdXAgMi8yOSwgYW5kIHJlYWQgb3V0IEZlYiAyOSBpbiB0aGUgeWVhciAxIEJDLgotICAgICAgICBDYWxlbmRhciBncmVnY2FsID0gbmV3IEdEYXRlKCItLTAyLTI5IikuZ2V0Q2FsZW5kYXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyOSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiAtIDEsIGdyZWdjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuWUVBUikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGdyZWdjYWwuZ2V0KENhbGVuZGFyLkVSQSkpOwotICAgICAgICAvLyByZXBlYXQgc29tZSB0ZXN0cyB0byBtYWtlIHN1cmUgaXQncyBzdGFibGUuCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjksIGdyZWdjYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIgLSAxLCBncmVnY2FsLmdldChDYWxlbmRhci5NT05USCkpOwotCi0gICAgICAgIC8vIG5vdyB0cnkgc29tZSBzZXR0ZXJzCi0gICAgICAgIGdyZWdjYWwgPSBuZXcgR0RhdGUoIi0tMDItMjkiKS5nZXRDYWxlbmRhcigpOwotICAgICAgICBncmVnY2FsLnNldChDYWxlbmRhci5NT05USCwgMTApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCItLTExLTI5IiwgZ3JlZ2NhbC50b1N0cmluZygpKTsKLSAgICAgICAgLy8gcmVwZWF0IHRvIGVuc3VyZSBpdCdzIHN0YWJsZS4KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiLS0xMS0yOSIsIGdyZWdjYWwudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RWYWxpZER1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWREdXJhdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdEdXJhdGlvbiBnZCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gdmFsaWREdXJhdGlvbnNbaV07Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZCA9IG5ldyBHRHVyYXRpb24oc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvYmxlbSB3aXRoICIgKyBzdHIgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdHIsIGdkLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbGlkRHVyYXRpb25zLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdEdXJhdGlvbiBnZDIgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdHIyID0gdmFsaWREdXJhdGlvbnNbal07Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZDIgPSBuZXcgR0R1cmF0aW9uKHN0cjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvYmxlbSB3aXRoICIgKyBzdHIyICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc3VidHJhY3RpbmcgdHdvIHdheXMgd29ya3MKLSAgICAgICAgICAgICAgICBHRHVyYXRpb24gZGlmZiA9IGdkLnN1YnRyYWN0KGdkMik7Ci0gICAgICAgICAgICAgICAgR0R1cmF0aW9uQnVpbGRlciBnZGIgPSBuZXcgR0R1cmF0aW9uQnVpbGRlcihnZDIpOwotICAgICAgICAgICAgICAgIGdkYi5zZXRTaWduKC1nZGIuZ2V0U2lnbigpKTsKLSAgICAgICAgICAgICAgICBnZGIuYWRkR0R1cmF0aW9uKGdkKTsKLSAgICAgICAgICAgICAgICBHRHVyYXRpb24gc3VtMiA9IGdkYi50b0dEdXJhdGlvbigpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgZGlmZi5jb21wYXJlVG9HRHVyYXRpb24oc3VtMikpOwotICAgICAgICAgICAgICAgIGdkYi5ub3JtYWxpemUoKTsKLSAgICAgICAgICAgICAgICBHRHVyYXRpb25CdWlsZGVyIGdkYjEgPSBuZXcgR0R1cmF0aW9uQnVpbGRlcihkaWZmKTsKLSAgICAgICAgICAgICAgICBnZGIxLm5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlByb2JsZW06ICIgKyBnZCArICIgYW5kICIgKyBnZDIsIGdkYi50b1N0cmluZygpLCBnZGIxLnRvU3RyaW5nKCkpOwotCi0KLSAgICAgICAgICAgICAgICAvLyBjb21wYXJpbmcgaXMgcmV2ZXJzaWJsZQotICAgICAgICAgICAgICAgIGludCBjb21wMSA9IGdkLmNvbXBhcmVUb0dEdXJhdGlvbihnZDIpOwotICAgICAgICAgICAgICAgIGludCBjb21wMiA9IGdkMi5jb21wYXJlVG9HRHVyYXRpb24oZ2QpOwotICAgICAgICAgICAgICAgIGlmIChjb21wMSA9PSAyKQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGNvbXAyKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLWNvbXAxLCBjb21wMik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjb21wYXJpbmcgdHJhbnNsYXRlcyB0byBhZGRpdGlvbiB0byBkYXRlcwotICAgICAgICAgICAgICAgIGJvb2xlYW5bXSBzZWVuID0gbmV3IGJvb2xlYW5bM107Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHZhbGlkRGF0ZXMubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHRGF0ZSBkYXRlID0gbmV3IEdEYXRlKHZhbGlkRGF0ZXNba10pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGUuaGFzRGF0ZSgpIHx8IGRhdGUuZ2V0WWVhcigpID4gOTk5OTkgfHwgZGF0ZS5nZXRZZWFyKCkgPCAtNDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGhhc1RpbWUoZ2QpIHx8IGhhc1RpbWUoZ2QyKSkgJiYgIWRhdGUuaGFzVGltZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyBnZCArICIgYW5kICIgKyBnZDIgKyAiIHRvICIgKyBkYXRlICsgIiwgZXhwZWN0aW5nICIgKyBjb21wMSk7Ci0gICAgICAgICAgICAgICAgICAgIEdEYXRlIGRhdGUxID0gZGF0ZS5hZGQoZ2QpOwotICAgICAgICAgICAgICAgICAgICBHRGF0ZSBkYXRlMiA9IGRhdGUuYWRkKGdkMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29tcDIgPSBkYXRlMS5jb21wYXJlVG9HRGF0ZShkYXRlMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wMSAhPSAyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJBZGRpbmcgIiArIGRhdGUgKyAiICsgIiArIGdkICsgIiAtPiAiICsgZGF0ZTEgKyAiLCAiICsgZ2QyICsgIiAtPiAiICsgZGF0ZTIgKyAiLCBleHBlY3RpbmcgIiArIGNvbXAxLCBjb21wMSwgY29tcDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29tcDIgIT0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2NvbXAyICsgMV0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc3VidHJhY3Rpb24gc2hvdWxkIHllaWxkIHRoZSBzYW1lIHJlc3VsdAotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcDEgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR0RhdGUgZGF0ZTMgPSBkYXRlLmFkZChkaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29tcDEsIGRhdGUzLmNvbXBhcmVUb0dEYXRlKGRhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjb21wMSA9PSAyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNlZW5jb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2Vlbi5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5jb3VudCArPSAxOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm90IGFtYmlndW91cyBhcyBhZHZlcnRpc2VkIiAvKiArIGdkICsgIiwgIiArIGdkMiArICIgZDogIiArIGRpZmYgKi8sIHNlZW5jb3VudCA+IDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0T3JkZXIoKQotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIxOTk4LTA4LTI2IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA2IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIxOTcwLTEyLTIwVDA0OjE0OjIyWiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMTk3MS0wNC0xOFQxMjo1MTo0MVoiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjAwMS0wOC0wNiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wOC0wNloiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjAwMS0wOC0wNiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wOC0wNysxMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTA4LTA2IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA1LTEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIwMDEtMDItMjgiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDMtMDErMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjAwMS0wMy0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wMi0yOC0xMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMjAwMC0wMi0yOCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMC0wMy0wMSsxMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCIyMDAwLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAwLTAyLTI4LTEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAxLTA4LTA2WiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wOC0wNi0wMDowMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbmV3IEdEYXRlKCIwMDowMDowMFoiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAxOjAwKzAwOjAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBuZXcgR0RhdGUoIjEyOjAwOjAwLTA1OjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwOTowMDowMC0wODowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMDk6MDA6MDAtMDU6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjA5OjAwOjAwLTA4OjAwIikpKTsgLy8gdGhlIGVhc3QgY29hc3QgcmlzZXMgYmVmb3JlIHRoZSB3ZXN0Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMjAwMy0wNS0wNVQwOTowMDowMC0wNTowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMy0wNS0wNVQwOTowMDowMC0wODowMCIpKSk7IC8vIHRoZSBlYXN0IGNvYXN0IHJpc2VzIGJlZm9yZSB0aGUgd2VzdAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0zMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTMxKzE0OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMzEtMTQ6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMzEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTMxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMSsxNDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0zMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDEtMTQ6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0wMiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMloiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMDIiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxWiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLS0wMiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDEtMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAyKzEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTAyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMS0wOTowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAyKzA5OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMjAwMyIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwNCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0xMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0xMiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMjAwMy0xMiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwNC0wMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0xMS0zMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0xMi0wMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0wMi0yOCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMi0yOSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMy0wMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLTAyLTI5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAzLTAxKzEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tMDItMjgiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDErMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiLS0wMy0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMi0yOC0xMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI5LTEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTAyLTI5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAzLTAxKzA5OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTAyLTI4IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAzLTAxKzA5OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDItMjgtMDk6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0wMy0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMi0yOS0wOTowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMDA6MDA6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIzOjU5OjU5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6NTkrMDk6NTkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTowMSswOTo1OSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6MDArMDk6NTkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMDA6MDA6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIzOjU5OjU5KzEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6NTktMTQ6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiMjM6NTk6NTkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAwOjAwLTA5OjU5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIjIzOjU5OjU5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwMDowMDo1OC0wOTo1OSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMzo1OTo1OSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDA6NTktMDk6NTkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjM6NTk6NTkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAwOjAwLTEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIjIzOjU5OjU5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwMDowMDowMCsxNDowMCIpKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0QVBJKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgR0RhdGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgR0RhdGVCdWlsZGVyKCIxOTcwLTEyLTIwVDA0OjE0OjIyWiIpOwotICAgICAgICBidWlsZGVyLm5vcm1hbGl6ZVRvVGltZVpvbmUoMSwgMCwgMCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjE5NzAtMTItMjBUMDQ6MTQ6MjIrMDA6MDAiLCBidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBidWlsZGVyLnNldFRpbWVab25lKDYxNSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjE5NzAtMTItMjBUMDQ6MTQ6MjIrMTA6MTUiLCBidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBidWlsZGVyLnNldFRpbWVab25lKC0zNDUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxOTcwLTEyLTIwVDA0OjE0OjIyLTA1OjQ1IiwgYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgYnVpbGRlci5ub3JtYWxpemVUb1RpbWVab25lKC0zMDApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxOTcwLTEyLTIwVDA0OjU5OjIyLTA1OjAwIiwgYnVpbGRlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0RmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZERhdGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gaW52YWxpZERhdGVzW2ldOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IEdEYXRlKHN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTWlzc2luZyBleGNlcHRpb24gZm9yIEdEYXRlICIgKyBzdHIsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWREYXRlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IHZhbGlkRGF0ZXNbaV07Ci0gICAgICAgICAgICBHRGF0ZSBnZGF0ZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZGF0ZSA9IG5ldyBHRGF0ZShzdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9ibGVtIHdpdGggIiArIHN0ciArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtdXN0IHJvdW5kLXRyaXAgdG8gc3RyaW5nCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0ciwgZ2RhdGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIG11c3Qgcm91bmQtdHJpcCB0byBHcmVnb3JpYW5DYWxlbmRhciBpZiBmcmFjdGlvbnMtb2Ytc2Vjb25kcyA8PTMgZGlnaXRzCi0gICAgICAgICAgICBpZiAoZ2RhdGUuZ2V0RnJhY3Rpb24oKSA9PSBudWxsIHx8IGdkYXRlLmdldEZyYWN0aW9uKCkuc2NhbGUoKSA8PSAzKQotICAgICAgICAgICAgICAgIGlmICghZ2RhdGUudG9TdHJpbmcoKS5lcXVhbHMoIi0tMDItMjkiKSkgLy8gYnVnIGluIGdjYWwgLT4gMDMtMDEKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnY2FsID0gZ2RhdGUuZ2V0Q2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBHRGF0ZSBnZGF0ZTIgPSBuZXcgR0RhdGUoZ2NhbCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZSwgZ2RhdGUyKTsKLQotICAgICAgICAgICAgICAgIC8vIGFuZCBpZiBmcmFjdGlvbnMtb2Ytc2Vjb25kcyBpcyAzIGRpZ2l0cywgc3RyaW5ncmVwIG11c3Qgcm91bmQtdHJpcAotICAgICAgICAgICAgICAgIGlmIChnZGF0ZS5nZXRGcmFjdGlvbigpID09IG51bGwgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID09IDMgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RhdGUudG9TdHJpbmcoKSwgZ2RhdGUyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtdXN0IHJvdW5kLXRyaXAgdG8gRGF0ZSBpZiBhYnNvbHV0ZSB0aW1lK3RpbWV6b25lICsgZnJhY3Rpb25zLW9mLXNlY29uZHMgPD0gMwotICAgICAgICAgICAgaWYgKGdkYXRlLmhhc1RpbWVab25lKCkgJiYgZ2RhdGUuZ2V0WWVhcigpID4gLTQwMDAgJiYgZ2RhdGUuZ2V0WWVhcigpIDwgOTk5OTkgJiYgZ2RhdGUuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfREFURV9USU1FICYmIGdkYXRlLmdldEZyYWN0aW9uKCkuc2NhbGUoKSA8PSAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERhdGUgZGF0ZSA9IGdkYXRlLmdldERhdGUoKTsKLSAgICAgICAgICAgICAgICBHRGF0ZSBnZGF0ZTIgPSBuZXcgR0RhdGUoZGF0ZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZSwgZ2RhdGUyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBub3JtYWxpemUgdG8gVVRDIGZyYWN0aW9ucy1vZi1zZWNvbmRzIGlzIDAgb3IgMyBkaWdpdHMgW25vdCAwMDBdLCBzdHJpbmdyZXAgbXVzdCByb3VuZC10cmlwCi0gICAgICAgICAgICAgICAgaWYgKGdkYXRlLmdldFRpbWVab25lU2lnbigpID09IDAgJiYgKChnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPT0gMyAmJiBnZGF0ZS5nZXRGcmFjdGlvbigpLnNpZ251bSgpICE9IDApIHx8IGdkYXRlLmdldEZyYWN0aW9uKCkuc2NhbGUoKSA9PSAwKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdEYXRlQnVpbGRlciBnZGIgPSBuZXcgR0RhdGVCdWlsZGVyKGdkYXRlMik7Ci0gICAgICAgICAgICAgICAgICAgIGdkYi5ub3JtYWxpemVUb1RpbWVab25lKDAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkYXRlLnRvU3RyaW5nKCksIGdkYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBnb2luZyB0aHJvdWdoIGdjYWwgZ2l2ZXMgdXMgdGhlIHNhbWUgdGhpbmcKLSAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnY2FsID0gZ2RhdGUuZ2V0Q2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRhdGUsIGdjYWwuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBkb3VibGUtY2hlY2sgWG1sQ2FsZW5kYXIgY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICBnY2FsID0gbmV3IFhtbENhbGVuZGFyKGRhdGUpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRvaW5nICIgKyBnZGF0ZSwgZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZ2RhdGUuaGFzRGF0ZSgpICYmIChnZGF0ZS5nZXRGcmFjdGlvbigpID09IG51bGwgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpIDw9IDMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgYWJsZSB0byBnZXQgYSBkYXRlIGlmIHRpbWUrdGltZXpvbmUgaXMgdW5zZXQgKG1pZG5pZ2h0LCBsdHogYXJlIGFzc3VtZWQpCi0gICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gZ2RhdGUuZ2V0RGF0ZSgpOwotICAgICAgICAgICAgICAgIEdEYXRlQnVpbGRlciBnZGF0ZTEgPSBuZXcgR0RhdGVCdWlsZGVyKGdkYXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoIWdkYXRlMS5oYXNUaW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIGdkYXRlMS5zZXRUaW1lKDAsIDAsIDAsIG51bGwpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RhdGUxLmdldERhdGUoKSwgZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBnb2luZyB0aHJvdWdoIGdjYWwgZ2l2ZXMgdXMgdGhlIHNhbWUgdGhpbmcKLSAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnY2FsID0gZ2RhdGUuZ2V0Q2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJDb21wYXJpbmcgIiArIGdkYXRlICsgIiBhbmQgIiArIGdjYWwsIGRhdGUsIGdjYWwuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JREVDdXJzb3JVc2FnZVRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JREVDdXJzb3JVc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzZjgyMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSURFQ3Vyc29yVXNhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdHMgYSBzaW1wbGUgdXNhZ2Ugb2YgdGhlIGN1cnNvciBJJ20gaGF2aW5nIHRyb3VibGUgd2l0aCBpbiBJREUgY29kZS4KLSAqLwotcHVibGljIGNsYXNzIElERUN1cnNvclVzYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIElERUN1cnNvclVzYWdlVGVzdChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoSURFQ3Vyc29yVXNhZ2VUZXN0LmNsYXNzKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGdldENhc2VGaWxlKHRoZUNhc2UpKS5uZXdDdXJzb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NhbkVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3Vyc29yID0gbG9hZENhc2UoIkNvbnNvbGlkYXRlVGVzdC54bWwiKTsKLSAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotCi0gICAgICAgIFhtbEN1cnNvciBjdXIgPSBjdXJzb3IubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgLy8gYmFjayB1cCB0byBwcmV2aW91cyBzdGFydCBvciBlbmQgdGFnCi0gICAgICAgIHdoaWxlICghaXNTdGFydE9yRW5kKGN1ci50b1ByZXZUb2tlbigpKSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkJhY2tpbmcgdXA6IGF0ICIgKyBjdXIuY3VycmVudFRva2VuVHlwZSgpKTsgfQotICAgICAgICAvLyB0aGVuIGZvcndhcmQgdG8gZmlyc3Qgc3RhcnQgb3IgY29tbWVudCAobWF5IGVuZCB1cCB3aGVyZSB3ZSBzdGFydGVkKQotICAgICAgICB3aGlsZSAoIWlzU3RhcnRPckNvbW1lbnQoY3VyLnRvTmV4dFRva2VuKCkpKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWR2YW5jaW5nOiBhdCAiICsgY3VyLmN1cnJlbnRUb2tlblR5cGUoKSk7IH0KLSAgICAgICAgLy8gdGhlbiBncmFiIHRoZSAic3RhcnQiIGphdmVsaW4gYW5ub3RhdGlvbiwgYW5kIGdyYWIgdGhlIHN0YXJ0IHRva2VuIGFuZCB0aGUgZmlyc3QgY2hhcgotICAgICAgICAvLyBfZmlyc3RUb2tlbiA9ICgoSmF2ZWxpbkFubm90YXRpb24pY3VyLmdldEFubm90YXRpb24oSmF2ZWxpbkFubm90YXRpb24uY2xhc3MpKS5nZXRTdGFydFRva2VuKCk7Ci0KLSAgICAgICAgLy8gbm93IHBlZWsgYXQgdGhlIGVuZCB0YWcgKGl0IG1heSBiZSB1bnBsYWNlZCBmb3IgdGhlIDxhLz4gY2FzZSwgc28gdXNlIHRoZSBzdGFydCB0YWcgaWYgbmVlZGVkCi0gICAgICAgIGN1ci50b0N1cnNvcihjdXJzb3IpOwotICAgICAgICAvLyBfbGFzdFRva2VuID0gKChKYXZlbGluQW5ub3RhdGlvbiljdXIuZ2V0QW5ub3RhdGlvbihKYXZlbGluQW5ub3RhdGlvbi5jbGFzcykpLmdldEVuZFRva2VuKCk7Ci0gICAgICAgIGN1ci50b0VuZFRva2VuKCk7Ci0gICAgICAgIC8vIEphdmVsaW5Bbm5vdGF0aW9uIGVuZEFubiA9IChKYXZlbGluQW5ub3RhdGlvbiljdXIuZ2V0QW5ub3RhdGlvbihKYXZlbGluQW5ub3RhdGlvbi5jbGFzcyk7Ci0gICAgICAgIC8vIGlmIChlbmRBbm4gIT0gbnVsbCkKLSAgICAgICAgLy8gICAgX2xhc3RUb2tlbiA9IGVuZEFubi5nZXRFbmRUb2tlbigpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNTdGFydE9yRW5kKFhtbEN1cnNvci5Ub2tlblR5cGUgdG9rVHlwZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAodG9rVHlwZS5pbnRWYWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX0VORDoKLSAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfRU5ERE9DOgotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9TVEFSVDoKLSAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfU1RBUlRET0M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNTdGFydE9yQ29tbWVudChYbWxDdXJzb3IuVG9rZW5UeXBlIHRva1R5cGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHRva1R5cGUuaW50VmFsdWUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9TVEFSVDoKLSAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfU1RBUlRET0M6Ci0gICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX0NPTU1FTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0ludFRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjZWVkNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IHhpbnQudGVzdC5Qb3NpdGlvbkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgSW50VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBJbnRUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoSW50VGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdExhdExvbmcoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBQb3NpdGlvbkRvY3VtZW50IGRvYyA9IFBvc2l0aW9uRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAiPHA6cG9zaXRpb24geG1sbnM6cD0namF2YTppbnQudGVzdCc+PHA6bGF0PjQzPC9wOmxhdD48cDpsb24+MDIwPC9wOmxvbj48L3A6cG9zaXRpb24+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDMsIGRvYy5nZXRQb3NpdGlvbigpLmdldExhdCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMCwgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TG9uKCkpOwotICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS54Z2V0TGF0KCkuc2V0KCIwNyIpOwotICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS54Z2V0TG9uKCkuc2V0KCIwNDAiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TGF0KChzaG9ydCkyMik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0pheGVuWFBhdGhUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0pheGVuWFBhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJjMjk1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9KYXhlblhQYXRoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQotICogRGF0ZTogT2N0IDEwLCAyMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXhlblhQYXRoVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBKYXhlblhQYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5qYXhlbi5YUGF0aCIpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoSmF4ZW5YUGF0aFRlc3RzLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5XQVJOSU5HISEhXG5cbkpheGVuLmphciBub3Qgb24gY2xhc3NwYXRoIHNraXBwaW5nIEpheGVuWFBhdGhUZXN0cy5cblxuIik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbmZvcm1hbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgieHBhdGgvdGVzdFhQYXRoLnhtbCIpKTsKLQotICAgICAgICAgICAgU3RyaW5nW10geHBhdGggPSBuZXcgU3RyaW5nWzI1XTsKLSAgICAgICAgICAgIHhwYXRoWzBdID0gIi9kb2MvYS9AdGVzdCI7Ci0gICAgICAgICAgICB4cGF0aFsxXSA9ICIvLy4iOwotICAgICAgICAgICAgeHBhdGhbMl0gPSAiL2RvYyI7Ci0gICAgICAgICAgICB4cGF0aFszXSA9ICIvZG9jL2EiOwotICAgICAgICAgICAgeHBhdGhbNF0gPSAiLy9AKiI7Ci0gICAgICAgICAgICB4cGF0aFs1XSA9ICIuIjsKLSAgICAgICAgICAgIHhwYXRoWzZdID0gIi8vYW5jZXN0b3Itb3Itc2VsZjo6KiI7Ci0gICAgICAgICAgICB4cGF0aFs3XSA9ICIuL2NoaWxkOjoqWzFdIjsKLSAgICAgICAgICAgIHhwYXRoWzhdID0gIi8vZGVzY2VuZGFudC1vci1zZWxmOjoqL0AqWzFdIjsKLSAgICAgICAgICAgIHhwYXRoWzldID0gIi8vQCogfCAqIHwgbm9kZSgpIjsKLSAgICAgICAgICAgIHhwYXRoWzEwXSA9ICIvLyoiOwotICAgICAgICAgICAgeHBhdGhbMTFdID0gIi9kb2MvbmFtZXNwYWNlOjoqIjsKLSAgICAgICAgICAgIHhwYXRoWzEyXSA9ICIvL2Rlc2NlbmRhbnQ6OmNvbW1lbnQoKSI7Ci0gICAgICAgICAgICB4cGF0aFsxM10gPSAiLy8qW2xvY2FsLW5hbWUoKT0nYSddIjsKLSAgICAgICAgICAgIHhwYXRoWzE0XSA9ICIvLyovQCoiOwotICAgICAgICAgICAgeHBhdGhbMTVdID0gIi8vKltsYXN0KCldIjsKLSAgICAgICAgICAgIHhwYXRoWzE2XSA9ICJkb2MvKltsYXN0KCldIjsKLSAgICAgICAgICAgIHhwYXRoWzE3XSA9ICIvZG9jL2EvKi9AKiI7Ci0gICAgICAgICAgICB4cGF0aFsxOF0gPSAiZG9jL2Rlc2NlbmRhbnQ6Om5vZGUoKSI7Ci0gICAgICAgICAgICB4cGF0aFsxOV0gPSAiZG9jL2EvQCoiOwotICAgICAgICAgICAgeHBhdGhbMjBdID0gImRvYy9iL2EvYW5jZXN0b3Itb3Itc2VsZjo6KiI7Ci0gICAgICAgICAgICB4cGF0aFsyMV0gPSAiZG9jL2IvYS9wcmVjZWRpbmc6OioiOwotICAgICAgICAgICAgeHBhdGhbMjJdID0gImRvYy9hL2ZvbGxvd2luZzo6KiI7Ci0gICAgICAgICAgICB4cGF0aFsyM10gPSAiL2RvYy9iL3ByZWNlZGluZy1zaWJsaW5nOjoqIjsKLSAgICAgICAgICAgIHhwYXRoWzI0XSA9ICIvZG9jL2EvZm9sbG93aW5nLXNpYmxpbmc6OioiOwotCi0gICAgICAgICAgICBydW5BbGwoZG9jLCB4cGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuQWxsKFhtbE9iamVjdCBkb2MsIFN0cmluZ1tdIHhwYXRoZXMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8eHBhdGhlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcnVuWHBhdGgyKGRvYywgeHBhdGhlc1tpXSwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8vICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuWHBhdGgoWG1sT2JqZWN0IGRvYywgU3RyaW5nIHhwYXRoU3RyLCBpbnQgaSkKLS8vICAgIHsKLS8vICAgICAgICB0cnkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIFhtbEN1cnNvciB4YyA9IGRvYy5uZXdDdXJzb3IoKTsKLS8vICAgICAgICAgICAgWFBhdGggeHBhdGggPSBuZXcgWEJlYW5zWFBhdGgoeHBhdGhTdHIpOwotLy8gICAgICAgICAgICBMaXN0IHJlc3VsdHMgPSB4cGF0aC5zZWxlY3ROb2RlcyggeGMgKTsKLS8vCi0vLyAgICAgICAgICAgIEl0ZXJhdG9yIHJlc3VsdEl0ZXIgPSByZXN1bHRzLml0ZXJhdG9yKCk7Ci0vLwotLy8gICAgICAgICAgICBpbnQgaiA9IDA7Ci0vLyAgICAgICAgICAgIHdoaWxlICggcmVzdWx0SXRlci5oYXNOZXh0KCkgKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICB4YyA9IChYbWxDdXJzb3IpcmVzdWx0SXRlci5uZXh0KCk7ICAvL2l0J3MgdGhlIHNhbWUgb2JqZWN0IGFzIHByZXZpb3VzIHhjCi0vLyAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZUV4cGVjdGVkKGksIGosIHhjLnRvU3RyaW5nKCkpOwotLy8gICAgICAgICAgICAgICAgY2hlY2soaSwgaiwgeGMpOwotLy8gICAgICAgICAgICAgICAgaisrOwotLy8gICAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgICB4Yy5kaXNwb3NlKCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGNhdGNoIChYUGF0aFN5bnRheEV4Y2VwdGlvbiBlKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCBlLmdldE11bHRpbGluZU1lc3NhZ2UoKSApOwotLy8gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1blhwYXRoMihYbWxPYmplY3QgZG9jLCBTdHJpbmcgeHBhdGhTdHIsIGludCBpKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIHhjID0gZG9jLm5ld0N1cnNvcigpOwotCQl4Yy5zZWxlY3RQYXRoKCB4cGF0aFN0ciApOwotCi0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgd2hpbGUgKCB4Yy50b05leHRTZWxlY3Rpb24oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGdlbmVyYXRlRXhwZWN0ZWQoaSwgaiwgeGMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBjaGVjayhpLCBqLCB4Yyk7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLQotCQl4Yy5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVjayhpbnQgZXhwcmVzaW9uTnVtYmVyLCBpbnQgcmVzdWx0TnVtYmVyLCBYbWxDdXJzb3IgYWN0dWFsKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciBleHBlY3RlZCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCJ4cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8iICsgZXhwcmVzaW9uTnVtYmVyICsKLSAgICAgICAgICAgICAgICAiXyIgKyByZXN1bHROdW1iZXIgKyAiLnhtbCIpKS5uZXdDdXJzb3IoKTsKLQotICAgICAgICAgICAgWG1sQ29tcGFyYXRvci5EaWFnbm9zdGljIGRpYWcgPSBuZXcgWG1sQ29tcGFyYXRvci5EaWFnbm9zdGljKCk7Ci0gICAgICAgICAgICBib29sZWFuIG1hdGNoID0gWG1sQ29tcGFyYXRvci5sZW5pZW50bHlDb21wYXJlVHdvWG1sU3RyaW5ncyhhY3R1YWwudG9TdHJpbmcoKSwgZXhwZWN0ZWQudG9TdHJpbmcoKSwgZGlhZyk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCItLS0tLS0tLS0tLS0gIEZvdW5kIGRpZmZlcmVuY2U6IiArIGV4cHJlc2lvbk51bWJlciArICIgIiArIHJlc3VsdE51bWJlciArCi0gICAgICAgICAgICAgICAgIiBhY3R1YWw9XG4nIiArIGFjdHVhbCArICInXG5leHBlY3RlZD1cbiciICsgZXhwZWN0ZWQgKyAiJ1xuZGlhZ25vc3RpYz0iICsgZGlhZyAsIG1hdGNoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgb25seSB1c2VkIHRvIHJlZ2VuIHRoZSBleHBlY3RlZCBmaWxlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdlbmVyYXRlRXhwZWN0ZWQoaW50IGV4cHJlc2lvbk51bWJlciwgaW50IHJlc3VsdE51bWJlciwgU3RyaW5nIGNvbnRlbnQpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKFRlc3RFbnYueGJlYW5DYXNlKCJ4cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8iICsgZXhwcmVzaW9uTnVtYmVyICsKLSAgICAgICAgICAgICAgICAiXyIgKyByZXN1bHROdW1iZXIgKyAiLnhtbCIpKTsKLQotICAgICAgICAgICAgZncud3JpdGUoY29udGVudCk7Ci0gICAgICAgICAgICBmdy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0xpc3RBbmRVbmlvblRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTGlzdEFuZFVuaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwNDI1Zi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTGlzdEFuZFVuaW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubHV0Lkxpc3RzRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubHV0LlVuaW9uc0RvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLmx1dC5JbmNpZGVudFJlcG9ydHNEb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5sdXQuRGF0ZU9yRGF0ZVRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIExpc3RBbmRVbmlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgTGlzdEFuZFVuaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKExpc3RBbmRVbmlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RHZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdHNEb2N1bWVudCBsaXN0cyA9IExpc3RzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGx1dDpsaXN0cyB4bWxuczpsdXQ9J2h0dHA6Ly9vcGVudXJpLm9yZy9sdXQnPjxsdXQ6aW50LWxpc3Q+MiA0IDggMTYgMzI8L2x1dDppbnQtbGlzdD48bHV0Om5uaS1saXN0PnVuYm91bmRlZCAzIHVuYm91bmRlZCA2PC9sdXQ6bm5pLWxpc3Q+PC9sdXQ6bGlzdHM+Iik7Ci0gICAgICAgIExpc3QgaW50TGlzdCA9IGxpc3RzLmdldExpc3RzKCkuZ2V0SW50TGlzdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDIpLCBpbnRMaXN0LmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIGludExpc3QuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig4KSwgaW50TGlzdC5nZXQoMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE2KSwgaW50TGlzdC5nZXQoMykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyKSwgaW50TGlzdC5nZXQoNCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUsIGludExpc3Quc2l6ZSgpKTsKLQotICAgICAgICBMaXN0IG5uaUxpc3QgPSBsaXN0cy5nZXRMaXN0cygpLmdldE5uaUxpc3QoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5ib3VuZGVkIiwgbm5pTGlzdC5nZXQoMCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigzKSwgbm5pTGlzdC5nZXQoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCBubmlMaXN0LmdldCgyKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDYpLCBubmlMaXN0LmdldCgzKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNCwgbm5pTGlzdC5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0U2V0dGVycygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExpc3RzRG9jdW1lbnQgZG9jID0gTGlzdHNEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIExpc3RzRG9jdW1lbnQuTGlzdHMgbGlzdHMgPSBkb2MuYWRkTmV3TGlzdHMoKTsKLSAgICAgICAgbGlzdHMuc2V0SW50TGlzdChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDQpLCBuZXcgSW50ZWdlcigxOCkgfSkpOwotICAgICAgICBsaXN0cy5zZXRObmlMaXN0KEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgQmlnSW50ZWdlci52YWx1ZU9mKDEpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMiksICJ1bmJvdW5kZWQiIH0pKTsKLSAgICAgICAgU3RyaW5nIHh0ZXh0ID0gZG9jLnhtbFRleHQoKTsKLQotICAgICAgICBMaXN0c0RvY3VtZW50IGRvY3J0ID0gTGlzdHNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHh0ZXh0KTsKLSAgICAgICAgTGlzdCBpbnRMaXN0ID0gZG9jcnQuZ2V0TGlzdHMoKS5nZXRJbnRMaXN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIGludExpc3QuZ2V0KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxOCksIGludExpc3QuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBpbnRMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgTGlzdCBubmlMaXN0ID0gZG9jcnQuZ2V0TGlzdHMoKS5nZXRObmlMaXN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEpLCBubmlMaXN0LmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDIpLCBubmlMaXN0LmdldCgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVuYm91bmRlZCIsIG5uaUxpc3QuZ2V0KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBubmlMaXN0LnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW9uR2V0dGVycygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IHVuaW9ucyA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxsdXQ6dW5pb25zIHhtbG5zOmx1dD0naHR0cDovL29wZW51cmkub3JnL2x1dCc+PGx1dDpubmk+dW5ib3VuZGVkPC9sdXQ6bm5pPjxsdXQ6c2l6ZXM+MiAzIDUgNyAxMTwvbHV0OnNpemVzPjwvbHV0OnVuaW9ucz4iKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCB1bmlvbnMuZ2V0VW5pb25zKCkuZ2V0Tm5pKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHVuaW9ucy5nZXRVbmlvbnMoKS5nZXRTaXplcygpIGluc3RhbmNlb2YgTGlzdCk7Ci0gICAgICAgIExpc3Qgc2l6ZXMgPSAoTGlzdCl1bmlvbnMuZ2V0VW5pb25zKCkuZ2V0U2l6ZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgc2l6ZXMuZ2V0KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzKSwgc2l6ZXMuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgc2l6ZXMuZ2V0KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig3KSwgc2l6ZXMuZ2V0KDMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMSksIHNpemVzLmdldCg0KSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNSwgc2l6ZXMuc2l6ZSgpKTsKLQotICAgICAgICBVbmlvbnNEb2N1bWVudCB1bmlvbnMyID0gVW5pb25zRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGx1dDp1bmlvbnMgeG1sbnM6bHV0PSdodHRwOi8vb3BlbnVyaS5vcmcvbHV0Jz48bHV0Om5uaT4zNzwvbHV0Om5uaT48bHV0OnNpemVzPmFsbDwvbHV0OnNpemVzPjwvbHV0OnVuaW9ucz4iKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigzNyksIHVuaW9uczIuZ2V0VW5pb25zKCkuZ2V0Tm5pKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhbGwiLCB1bmlvbnMyLmdldFVuaW9ucygpLmdldFNpemVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvblNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGRvY3VtZW50Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IGRvYyA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgVW5pb25zRG9jdW1lbnQuVW5pb25zIHVuaW9ucyA9IGRvYy5hZGROZXdVbmlvbnMoKTsKLSAgICAgICAgdW5pb25zLnNldE5uaSgidW5ib3VuZGVkIik7Ci0gICAgICAgIHVuaW9ucy5zZXRTaXplcyhBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDUpLCBuZXcgSW50ZWdlcigyMikgfSkpOwotCi0gICAgICAgIC8vIHJvdW5kIHRyaXAgdG8gcyB0ZXh0Ci0gICAgICAgIFN0cmluZyB4dGV4dCA9IGRvYy54bWxUZXh0KCk7Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IGRvY3J0ID0gVW5pb25zRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4dGV4dCk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGNvbnRlbnRzCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVuYm91bmRlZCIsIGRvY3J0LmdldFVuaW9ucygpLmdldE5uaSgpKTsKLSAgICAgICAgTGlzdCBzaXplcyA9IChMaXN0KWRvY3J0LmdldFVuaW9ucygpLmdldFNpemVzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIHNpemVzLmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMjIpLCBzaXplcy5nZXQoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIHNpemVzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmlnaW5hbCBkb2N1bWVudAotICAgICAgICB1bmlvbnMuc2V0Tm5pKG5ldyBJbnRlZ2VyKDExKSk7Ci0gICAgICAgIHVuaW9ucy5zZXRTaXplcygidW5rbm93biIpOwotCi0gICAgICAgIC8vIHJvdW5kIHRyaXAgaXQgYWdhaW4KLSAgICAgICAgeHRleHQgPSBkb2MueG1sVGV4dCgpOwotICAgICAgICBkb2NydCA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoeHRleHQpOwotCi0gICAgICAgIC8vIHZlcmlmeSBjb250ZW50cyBhZ2FpbgotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxMSksIGRvY3J0LmdldFVuaW9ucygpLmdldE5uaSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5rbm93biIsIGRvY3J0LmdldFVuaW9ucygpLmdldFNpemVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbkFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5jaWRlbnRSZXBvcnRzRG9jdW1lbnQgZG9jID0gSW5jaWRlbnRSZXBvcnRzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgIjxsdXQ6aW5jaWRlbnQtcmVwb3J0cyB4bWxuczpsdXQ9J2h0dHA6Ly9vcGVudXJpLm9yZy9sdXQnPjxsdXQ6d2hlbj4yMDAxLTA4LTA2VDAzOjM0OjAwPC9sdXQ6d2hlbj48bHV0OndoZW4+MjAwMi0wMS0wNDwvbHV0OndoZW4+PGx1dDp3aGVuPjIwMDItMDgtMjZUMjM6MTA6MDA8L2x1dDp3aGVuPjwvbHV0OmluY2lkZW50LXJlcG9ydHM+Iik7Ci0gICAgICAgIEluY2lkZW50UmVwb3J0c0RvY3VtZW50LkluY2lkZW50UmVwb3J0cyByZXBvcnRzID0gZG9jLmdldEluY2lkZW50UmVwb3J0cygpOwotICAgICAgICBEYXRlT3JEYXRlVGltZVtdIGR0ID0gcmVwb3J0cy54Z2V0V2hlbkFycmF5KCk7Ci0gICAgICAgIENhbGVuZGFyW10gZ2QgPSByZXBvcnRzLmdldFdoZW5BcnJheSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGR0Lmxlbmd0aCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgZ2QubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoKChTaW1wbGVWYWx1ZSlkdFtpXSkuZ0RhdGVWYWx1ZSgpLCBuZXcgR0RhdGUoZ2RbaV0pKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RbaV0sIGR0W2ldLm9iamVjdFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjIwMDEtMDgtMDZUMDM6MzQ6MDAiKSwgZ2RbMF0pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMi0wMS0wNCIpLCBnZFsxXSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIyMDAyLTA4LTI2VDIzOjEwOjAwIiksIGdkWzJdKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFhtbERhdGVUaW1lLnR5cGUsIGR0WzBdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlLnR5cGUsIGR0WzFdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlVGltZS50eXBlLCBkdFsyXS5pbnN0YW5jZVR5cGUoKSk7Ci0KLSAgICAgICAgcmVwb3J0cy5zZXRXaGVuQXJyYXkoMCwgbmV3IFhtbENhbGVuZGFyKCIxOTgwLTA0LTE4IikpOwotICAgICAgICByZXBvcnRzLnNldFdoZW5BcnJheSgxLCBuZXcgWG1sQ2FsZW5kYXIoIjE5NzAtMTItMjBUMDQ6MzM6MDAiKSk7Ci0KLSAgICAgICAgZHQgPSByZXBvcnRzLnhnZXRXaGVuQXJyYXkoKTsKLSAgICAgICAgZ2QgPSByZXBvcnRzLmdldFdoZW5BcnJheSgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIxOTgwLTA0LTE4IiksIGdkWzBdKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjE5NzAtMTItMjBUMDQ6MzM6MDAiKSwgZ2RbMV0pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMi0wOC0yNlQyMzoxMDowMCIpLCBnZFsyXSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlLnR5cGUsIGR0WzBdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlVGltZS50eXBlLCBkdFsxXS5pbnN0YW5jZVR5cGUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sRGF0ZVRpbWUudHlwZSwgZHRbMl0uaW5zdGFuY2VUeXBlKCkpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTmFtZXdvcmxkVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL05hbWV3b3JsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZGY2ZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTmFtZXdvcmxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLm9wZW51cmkubmFtZXdvcmxkLk5hbWV3b3JsZERvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLm5hbWV3b3JsZC5OYW1ld29ybGREb2N1bWVudC5OYW1ld29ybGQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubmFtZXdvcmxkLkxvYzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgTmFtZXdvcmxkVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIE5hbWV3b3JsZFRlc3QoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKE5hbWV3b3JsZFRlc3QuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFdvcmxkMSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE5hbWV3b3JsZERvY3VtZW50IGRvYyA9IChOYW1ld29ybGREb2N1bWVudCkKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoIm5hbWV3b3JsZC93b3JsZDEueG1sIikpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFFOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIiwgIm5hbWV3b3JsZCIpLCBkb2Muc2NoZW1hVHlwZSgpLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSk7Ci0KLSAgICAgICAgUU5hbWVbXSBjb250ZW50cyA9IG5ldyBRTmFtZVtdCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcmNpdHkiKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3Rvd24iKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnZpbGxhZ2UiKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnRvd24iKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3ZpbGxhZ2UiKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnZpbGxhZ2UiKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb2NpdHkiKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnRvd24iKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3ZpbGxhZ2UiKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3Rvd24iKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnZpbGxhZ2UiKSwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3ZpbGxhZ2UiKSwKLSAgICAgICAgfTsKLSAgICAgICAgaW50IHQgPSAwOwotCi0gICAgICAgIE5hbWV3b3JsZCB3b3JsZCA9IGRvYy5nZXROYW1ld29ybGQoKTsKLSAgICAgICAgTmFtZXdvcmxkLklzbGFuZFtdIGlzbGFuZHMgPSB3b3JsZC5nZXRJc2xhbmRBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlzbGFuZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvY1tdIGxvY3MgPSBpc2xhbmRzW2ldLmdldExvY2F0aW9uQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG9jcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMb2MuUmVmZXJlbmNlW10gcmVmcyA9IGxvY3Nbal0uZ2V0UmVmZXJlbmNlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlZnMubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sIHJlZnNba10uZ2V0VG8oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEFjY2Vzc0J5TmFtZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE5hbWV3b3JsZERvY3VtZW50IGRvYyA9IChOYW1ld29ybGREb2N1bWVudCkKLSAgICAgICAgICAgICAgICAgICAgWG1sTG9hZGVyLkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoIm5hbWV3b3JsZC93b3JsZDEueG1sIiksCi0gICAgICAgICAgICAgICAgICAgIE5hbWV3b3JsZERvY3VtZW50LnR5cGUpOwotICAgICAgICBTdHJpbmdbXSBjb250ZW50cyA9IG5ldyBTdHJpbmdbXQotICAgICAgICB7Ci0gICAgICAgICAgICAiaHR0cDovL2Zvby5jb20vIiwKLSAgICAgICAgICAgICJmb29jaXR5IiwKLSAgICAgICAgICAgICJmb290b3duIiwKLSAgICAgICAgICAgICJmb292aWxsYWdlIiwKLSAgICAgICAgICAgICJodHRwOi8vYmFyLmNvbS8iLAotICAgICAgICAgICAgImJhcmNpdHkiLAotICAgICAgICAgICAgImJhcnRvd24iLAotICAgICAgICAgICAgImJhcnZpbGxhZ2UiLAotICAgICAgICB9OwotICAgICAgICBpbnQgdCA9IDA7Ci0gICAgICAgIE5hbWV3b3JsZCB3b3JsZCA9IChOYW1ld29ybGQpZG9jLmVsZW1lbnRCeU5hbWUobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAibmFtZXdvcmxkIiksIDApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmxkLmNvdW50T2ZFbGVtZW50QnlOYW1lKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIiwgImlzbGFuZCIpKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1ld29ybGQuSXNsYW5kIGlzbGFuZCA9IChOYW1ld29ybGQuSXNsYW5kKXdvcmxkLmVsZW1lbnRCeU5hbWUobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAiaXNsYW5kIiksIGkpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCAoKFNpbXBsZVZhbHVlKWlzbGFuZC5hdHRyaWJ1dGVCeU5hbWUobmV3IE5hbWUoInRhcmdldE5hbWVzcGFjZSIpKSkuc3RyaW5nVmFsdWUoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlzbGFuZC5jb3VudE9mRWxlbWVudEJ5TmFtZShuZXcgTmFtZSggImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAibG9jYXRpb24iKSk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMb2MgbG9jID0gKExvYylpc2xhbmQuZWxlbWVudEJ5TmFtZShuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJsb2NhdGlvbiIpLCBqKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sICgoU2ltcGxlVmFsdWUpbG9jLmF0dHJpYnV0ZUJ5TmFtZShuZXcgTmFtZSgibmFtZSIpKSkuc3RyaW5nVmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL051bWVyYWxzVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9OdW1lcmFsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDFlMGIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL051bWVyYWxzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkudGVzdE51bWVyYWxzLkRvY0RvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQotICogRGF0ZTogTm92IDIzLCAyMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBOdW1lcmFsc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgTnVtZXJhbHNUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTnVtZXJhbHNUZXN0cy5jbGFzcyk7IH0KLQotICAgIHByaXZhdGUgc3RhdGljIERvY0RvY3VtZW50LkRvYyBkb2M7Ci0gICAgc3RhdGljCi0gICAgewotICAgICAgICBTdHJpbmcgaW5zdCA9Ci0gICAgICAgICAgICAiPGRvYyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Rlc3ROdW1lcmFscyc+XG4iICsKLSAgICAgICAgICAgICIgIDxzdHJpbmc+ICAgIHRoaXMgaXMgYSBsb25nIHN0cmluZyBcbiIgKwotICAgICAgICAgICAgIiAgLi4uICAgPC9zdHJpbmc+XG4iICsKLSAgICAgICAgICAgICIgIDxpbnQ+XG4iICsKLSAgICAgICAgICAgICIgIAkJKzVcbiIgKwotICAgICAgICAgICAgIiAgPC9pbnQ+XG4iICsKLSAgICAgICAgICAgICIgIDxpbnQ+XG4iICsKLSAgICAgICAgICAgICIgIAkJLTZcbiIgKwotICAgICAgICAgICAgIiAgPC9pbnQ+XG4iICsKLSAgICAgICAgICAgICIgIDxpbnQ+XG4iICsKLSAgICAgICAgICAgICIgIAkJKzAwMDAwMDAwMDE1XG4iICsKLSAgICAgICAgICAgICIgIDwvaW50PlxuIiArCi0gICAgICAgICAgICAiICA8aW50Pjc8IS0tdGhpcyBoYXMgdG8gYmUgYSA3NyBpbnQgdmFsdWUtLT43PC9pbnQ+XG4iICsKLSAgICAgICAgICAgICIgIDxib29sZWFuPlxuIiArCi0gICAgICAgICAgICAiICAJCXRydWVcbiIgKwotICAgICAgICAgICAgIiAgPC9ib29sZWFuPlxuIiArCi0gICAgICAgICAgICAiICA8Ym9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgCQlmYWxzZVxuIiArCi0gICAgICAgICAgICAiICA8L2Jvb2xlYW4+XG4iICsKLSAgICAgICAgICAgICIgIDxib29sZWFuPlxuIiArCi0gICAgICAgICAgICAiICAJCTBcbiIgKwotICAgICAgICAgICAgIiAgPC9ib29sZWFuPlxuIiArCi0gICAgICAgICAgICAiICA8Ym9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgCQkxXG4iICsKLSAgICAgICAgICAgICIgIDwvYm9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgPGJvb2xlYW4+XG4iICsKLSAgICAgICAgICAgICIgIAkJdHJ1ZSBpcyBub3RcbiIgKwotICAgICAgICAgICAgIiAgPC9ib29sZWFuPlxuIiArCi0gICAgICAgICAgICAiICA8c2hvcnQ+XG4iICsKLSAgICAgICAgICAgICIgIAkJKzAzXG4iICsKLSAgICAgICAgICAgICIgIDwvc2hvcnQ+XG4iICsKLSAgICAgICAgICAgICIgIDxieXRlPlxuIiArCi0gICAgICAgICAgICAiICAJCSswMDFcbiIgKwotICAgICAgICAgICAgIiAgPC9ieXRlPlxuIiArCi0gICAgICAgICAgICAiICA8bG9uZz4tMDUwMDAwMDwvbG9uZz5cbiIgKwotICAgICAgICAgICAgIiAgPGxvbmc+XG4iICsKLSAgICAgICAgICAgICIgICAgMDAxXG4iICsKLSAgICAgICAgICAgICIgIDwvbG9uZz5cbiIgKwotICAgICAgICAgICAgIiAgPGxvbmc+XG4iICsKLSAgICAgICAgICAgICIgICAgKzAwMlxuIiArCi0gICAgICAgICAgICAiICA8L2xvbmc+XG4iICsKLSAgICAgICAgICAgICIgIDxkb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgICAgKzAwMVxuIiArCi0gICAgICAgICAgICAiICA8L2RvdWJsZT5cbiIgKwotICAgICAgICAgICAgIiAgPGRvdWJsZT5cbiIgKwotICAgICAgICAgICAgIiAgICAtMDAyLjAwNzAwMFxuIiArCi0gICAgICAgICAgICAiICA8L2RvdWJsZT5cbiIgKwotICAgICAgICAgICAgIiAgPGRvdWJsZT5cbiIgKwotICAgICAgICAgICAgIiAgICBJTkZcbiIgKwotICAgICAgICAgICAgIiAgPC9kb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgIDxkb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgICAgLUlORlxuIiArCi0gICAgICAgICAgICAiICA8L2RvdWJsZT5cbiIgKwotICAgICAgICAgICAgIiAgPGRvdWJsZT5cbiIgKwotICAgICAgICAgICAgIiAgICBOYU5cbiIgKwotICAgICAgICAgICAgIiAgPC9kb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgIDxmbG9hdD5cbiIgKwotICAgICAgICAgICAgIiAgICArMTIuMzI1XG4iICsKLSAgICAgICAgICAgICIgIDwvZmxvYXQ+XG4iICsKLSAgICAgICAgICAgICIgIDxmbG9hdD5cbiIgKwotICAgICAgICAgICAgIiAgICBOYU5cbiIgKwotICAgICAgICAgICAgIiAgPC9mbG9hdD5cbiIgKwotICAgICAgICAgICAgIiAgPGZsb2F0PlxuIiArCi0gICAgICAgICAgICAiICAgIElORlxuIiArCi0gICAgICAgICAgICAiICA8L2Zsb2F0PlxuIiArCi0gICAgICAgICAgICAiICA8ZmxvYXQ+XG4iICsKLSAgICAgICAgICAgICIgICAgLUlORlxuIiArCi0gICAgICAgICAgICAiICA8L2Zsb2F0PlxuIiArCi0gICAgICAgICAgICAiICA8ZGVjaW1hbD5cbiIgKwotICAgICAgICAgICAgIiAgICArMDAxLjAwMVxuIiArCi0gICAgICAgICAgICAiICA8L2RlY2ltYWw+XG4iICsKLSAgICAgICAgICAgICIgIDxpbnRlZ2VyPlxuIiArCi0gICAgICAgICAgICAiICAgICswMDE8IS0tY29tbWVudHMtLT4wMDAwMDAwMDBcbiIgKwotICAgICAgICAgICAgIiAgPC9pbnRlZ2VyPlxuIiArCi0gICAgICAgICAgICAiPC9kb2M+IjsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZG9jID0gRG9jRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShpbnN0KS5nZXREb2MoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgcyA9ICIgICAgdGhpcyBpcyBhIGxvbmcgc3RyaW5nIFxuIiArICIgIC4uLiAgICI7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJTdHJpbmcgZXhwZWN0ZWQ6XG4nIiArIHMgKyAiJyAgICAgICAgIGFjdHVhbDpcbiciICsKLSAgICAgICAgICAgIGRvYy5nZXRTdHJpbmdBcnJheSgpWzBdICsgIiciLCBzLmVxdWFscyhkb2MuZ2V0U3RyaW5nQXJyYXkoKVswXSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImludCBleHBlY3RlZDoiICsgNSArICIgYWN0dWFsOiIgKyBkb2MuZ2V0SW50QXJyYXkoKVswXSwgZG9jLmdldEludEFycmF5KClbMF09PTUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImludCBleHBlY3RlZDoiICsgKC02KSArICIgYWN0dWFsOiIgKyBkb2MuZ2V0SW50QXJyYXkoKVsxXSwgZG9jLmdldEludEFycmF5KClbMV09PS02KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJpbnQgZXhwZWN0ZWQ6IiArIDE1ICsgIiBhY3R1YWw6IiArIGRvYy5nZXRJbnRBcnJheSgpWzJdLCBkb2MuZ2V0SW50QXJyYXkoKVsyXT09MTUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImludCBleHBlY3RlZDoiICsgNzcgKyAiIGFjdHVhbDoiICsgZG9jLmdldEludEFycmF5KClbM10sIGRvYy5nZXRJbnRBcnJheSgpWzNdPT03Nyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDYoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MuZ2V0Qm9vbGVhbkFycmF5KDApPT10cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy5nZXRCb29sZWFuQXJyYXkoMSk9PWZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0OCgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy5nZXRCb29sZWFuQXJyYXkoMik9PWZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0OSgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy5nZXRCb29sZWFuQXJyYXkoMyk9PXRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxMCgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSB7IGJvb2xlYW4gYiA9IGRvYy5nZXRCb29sZWFuQXJyYXkoKVs0XTsgQXNzZXJ0LmFzc2VydFRydWUoZmFsc2UpOyB9Ci0gICAgICAgIGNhdGNoKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7IEFzc2VydC5hc3NlcnRUcnVlKHRydWUpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDExKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLmdldFNob3J0QXJyYXkoKVswXT09Myk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEyKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLmdldEJ5dGVBcnJheSgpWzBdPT0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MTMoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgibG9uZyBleHBlY3RlZDoiICsgKC01MDAwMCkgKyAiIGFjdHVhbDoiICsgZG9jLmdldExvbmdBcnJheSgpWzBdLAotICAgICAgICAgICAgZG9jLmdldExvbmdBcnJheSgpWzBdPT0tNTAwMDAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MTQoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgibG9uZyBleHBlY3RlZDoiICsgMSArICIgYWN0dWFsOiIgKyBkb2MuZ2V0TG9uZ0FycmF5KClbMV0sCi0gICAgICAgICAgICBkb2MuZ2V0TG9uZ0FycmF5KClbMV09PTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxNSgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJsb25nIGV4cGVjdGVkOiIgKyAyICsgIiBhY3R1YWw6IiArIGRvYy5nZXRMb25nQXJyYXkoKVsyXSwKLSAgICAgICAgICAgIGRvYy5nZXRMb25nQXJyYXkoKVsyXT09Mik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDE2KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLmdldERvdWJsZUFycmF5KClbMF09PTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxNygpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJkb3VibGUgZXhwZWN0ZWQ6IiArIC0yLjAwN2QgKyAiIGFjdHVhbDoiICsgZG9jLmdldERvdWJsZUFycmF5KClbMV0sCi0gICAgICAgICAgICBkb2MuZ2V0RG91YmxlQXJyYXkoKVsxXT09LTIuMDA3ZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDE4KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IERvdWJsZShEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpLgotICAgICAgICAgICAgZXF1YWxzKG5ldyBEb3VibGUoZG9jLmdldERvdWJsZUFycmF5KClbMl0pKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDE5KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IERvdWJsZShEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpLgotICAgICAgICAgICAgZXF1YWxzKG5ldyBEb3VibGUoZG9jLmdldERvdWJsZUFycmF5KClbM10pKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIwKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IERvdWJsZShEb3VibGUuTmFOKS4KLSAgICAgICAgICAgIGVxdWFscyhuZXcgRG91YmxlKGRvYy5nZXREb3VibGVBcnJheSgpWzRdKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMSgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJmbG9hZCBleHBlY3RlZDoiICsgMTIuMzI1ZiArICIgYWN0dWFsOiIgKyBkb2MuZ2V0RmxvYXRBcnJheSgpWzBdLAotICAgICAgICAgICAgZG9jLmdldEZsb2F0QXJyYXkoKVswXT09MTIuMzI1Zik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIyKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IEZsb2F0KEZsb2F0Lk5hTikuCi0gICAgICAgICAgICBlcXVhbHMobmV3IEZsb2F0KGRvYy5nZXRGbG9hdEFycmF5KClbMV0pKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIzKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImZsb2FkIGV4cGVjdGVkOiIgKyBGbG9hdC5QT1NJVElWRV9JTkZJTklUWSArICIgYWN0dWFsOiIgKyBkb2MuZ2V0RmxvYXRBcnJheSgpWzJdLAotICAgICAgICAgICAgbmV3IEZsb2F0KEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKS5lcXVhbHMobmV3IEZsb2F0KGRvYy5nZXRGbG9hdEFycmF5KClbMl0pKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDI0KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IEZsb2F0KEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKS4KLSAgICAgICAgICAgIGVxdWFscyhuZXcgRmxvYXQoZG9jLmdldEZsb2F0QXJyYXkoKVszXSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MjUoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgQmlnRGVjaW1hbCgiMS4wMDEiKS5lcXVhbHMoZG9jLmdldERlY2ltYWxBcnJheSgpWzBdKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDI2KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IEJpZ0ludGVnZXIoIjEwMDAwMDAwMDAiKS5lcXVhbHMoZG9jLmdldEludGVnZXJBcnJheSgwKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9RTmFtZVNldFRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9RTmFtZVNldFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxZTg1Mi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVTZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgUU5hbWVTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgUU5hbWVTZXRUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShRTmFtZVNldFRlc3QuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoaW50IGluZGVudCwgaW50IGl0ZXIsIFN0cmluZyBwLCBRTmFtZVNldEJ1aWxkZXIgc2V0KQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgU3lzdGVtLmVyci5wcmludChuZXcgRGVjaW1hbEZvcm1hdCgiMDAwMDAgIikuZm9ybWF0KGl0ZXIpKTsKLSAgICAgICAgd2hpbGUgKGluZGVudC0tID4gMCkKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoJyAnKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludChwKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludCgiID0gIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzZXQuZHVtcCgpKTsKLSAgICAgICAgKi8KLQotICAgICAgICByZXR1cm4gImNhc2UjICIgKyBpdGVyICsgIiAiICsgcCArICIgIiArIHNldC50b1N0cmluZygpOwotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UU5hbWVTZXRzKCkKLSAgICB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gMTAwMDA7Ci0gICAgICAgIGludCBzZWVkID0gMDsKLSAgICAgICAgaW50IHN0b3BhdCA9IC0xOwotCi0gICAgICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKHNlZWQpOwotICAgICAgICBTdHJpbmdbXSBsb2NhbG5hbWUgPSB7ImEiLCAiYiIsICJjIiwgImQiLCAiZSJ9OwotICAgICAgICBTdHJpbmdbXSBuYW1lc3BhY2UgPSB7Im4xIiwgIm4yIiwgIm4zIiwgIm40IiwgIm41In07Ci0gICAgICAgIGludCB3aWR0aCA9IGxvY2FsbmFtZS5sZW5ndGg7Ci0KLSAgICAgICAgUU5hbWVbXSBuYW1lID0gbmV3IFFOYW1lW3dpZHRoICogbmFtZXNwYWNlLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lc3BhY2UubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZVtpICsgd2lkdGggKiBqXSA9IG5ldyBRTmFtZShuYW1lc3BhY2Vbal0sIGxvY2FsbmFtZVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdGFjayB0ZXN0c3RhY2sgPSBuZXcgU3RhY2soKTsgLy8gc3RhY2sgb2Ygc2V0cwotICAgICAgICBTdGFjayB0cmFja3N0YWNrID0gbmV3IFN0YWNrKCk7IC8vIHN0YWNrIG9mIGJvb2xlYW4gYXJyYXlzCi0KLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgIGJvb2xlYW5bXSBjb250ZW50cyA9IG5ldyBib29sZWFuW3dpZHRoICogbmFtZXNwYWNlLmxlbmd0aF07Ci0gICAgICAgIGJvb2xlYW5bXSB0ZW1wOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBqID0gMDsKLQotICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGl0ZXJhdGlvbnM7IGwrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZm9yIGRlYnVnZ2luZwotCi0gICAgICAgICAgICBpZiAobCA9PSBzdG9wYXQpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXZSdyZSBoZXJlIik7Ci0KLSAgICAgICAgICAgIC8vIGFwcGx5IGEgcmFuZG9tIG9wZXJhdGlvbgotCi0gICAgICAgICAgICBpZiAocm5kLm5leHRJbnQoMykgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpID0gcm5kLm5leHRJbnQod2lkdGggLSAxKTsgLy8gZG9uJ3QgZG8gdGhlIGxhc3Qgb25lIGZvciBpc0FsbCB0ZXN0Ci0gICAgICAgICAgICAgICAgaiA9IHJuZC5uZXh0SW50KG5hbWVzcGFjZS5sZW5ndGggLSAxKTsgLy8gZG9uJ3QgZG8gdGhlIGxhc3Qgb25lIGZvciBpc0FsbCB0ZXN0Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbDsKLQotICAgICAgICAgICAgc3dpdGNoICh0ZXN0c3RhY2suc2l6ZSgpIDwgMSA/IDI0IDogcm5kLm5leHRJbnQoaXRlcmF0aW9ucyAtIGwgPiB0ZXN0c3RhY2suc2l6ZSgpID8gMjQgOiA1KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0ZXN0c3RhY2sucHVzaChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tzdGFjay5wdXNoKGNvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBuZXcgYm9vbGVhblt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJuZXciOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgICB0ZXN0c3RhY2sucHVzaChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tzdGFjay5wdXNoKGNvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBuZXcgYm9vbGVhblt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChybmQubmV4dEludCgyKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2sgKyB3aWR0aCAqIChuYW1lc3BhY2UubGVuZ3RoIC0gMSldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgbmFtZXNwYWNlLmxlbmd0aCAtIDE7IGgrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJuZC5uZXh0SW50KDIpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmVOYW1lc3BhY2UobmFtZXNwYWNlW2hdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZE5hbWVzcGFjZShuYW1lc3BhY2VbaF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW3dpZHRoIC0gMSArIHdpZHRoICogaF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAtIDE7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm5kLm5leHRJbnQoMikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmUobmFtZVtrICsgd2lkdGggKiBoXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGQobmFtZVtrICsgd2lkdGggKiBoXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2sgKyB3aWR0aCAqIGhdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAicmFuZG9tIjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYWRkQWxsKChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBvcCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiYWRkIHNldCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZUFsbCgoUU5hbWVTZXRTcGVjaWZpY2F0aW9uKXRlc3RzdGFjay5wb3AoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoYm9vbGVhbltdKXRyYWNrc3RhY2sucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgc2V0IjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVzdHJpY3QoKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKGJvb2xlYW5bXSl0cmFja3N0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gInJlc3RyaWN0IHNldCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJ1bmlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKGN1cnJlbnQudW5pb24oKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAidW5pb24iOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiaW50ZXJzZWN0IjsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudC5pbnRlcnNlY3QoKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGVtcFtrXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJpbnRlcnNlY3QiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImNvcHkiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZChuYW1lW2kgKyB3aWR0aCAqIGpdKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHNbaSArIHdpZHRoICogal0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJhZGQgb25lICIgKyBuYW1lW2kgKyB3aWR0aCAqIGpdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlKG5hbWVbaSArIHdpZHRoICogal0pOwotICAgICAgICAgICAgICAgICAgICBjb250ZW50c1tpICsgd2lkdGggKiBqXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgb25lICIgKyBuYW1lW2kgKyB3aWR0aCAqIGpdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGROYW1lc3BhY2UobmFtZXNwYWNlW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbayArIHdpZHRoICogal0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJhZGQgbmFtZXNwYWNlICIgKyBuYW1lc3BhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZU5hbWVzcGFjZShuYW1lc3BhY2Vbal0pOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trICsgd2lkdGggKiBqXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgbmFtZXNwYWNlICIgKyBuYW1lc3BhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSAhY29udGVudHNba107Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImludmVydCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudC5pbnZlcnNlKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSAhY29udGVudHNba107Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImludmVyc2UiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZm9ybWF0KHRlc3RzdGFjay5zaXplKCksIGwsIGxhYmVsLCBjdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4sIHZlcmlmeSBjdXJyZW50IG1hdGNoZXMgY29udGVudHMKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvcm1hdCgwLCBsLCAiQ29udGVudCBtaXNtYXRjaCAiICsgbmFtZVtrXSwgY3VycmVudCksIChjdXJyZW50LmNvbnRhaW5zKG5hbWVba10pID09IGNvbnRlbnRzW2tdKSk7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgIkVSUk9SIE9OICIgKyBuYW1lW2tdLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgY29udGVudHNba10gKyAiLCBnb3QgIiArICFjb250ZW50c1trXSwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudHNba10pCi0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvcm1hdCgwLCBsLCAiRVJST1I6IGlzRW1wdHkgaXMgd3JvbmciLCBjdXJyZW50KSwgKChjb3VudCA9PSAwKSA9PSBjdXJyZW50LmlzRW1wdHkoKSkpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiRVJST1I6IGlzRW1wdHkgaXMgd3JvbmciLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgImV4cGVjdGVkICIgKyAoY291bnQgPT0gMCkgKyAiLCBnb3QgIiArICEoY291bnQgPT0gMCksIGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkVSUk9SOiBpc0FsbCBpcyB3cm9uZyIsIGN1cnJlbnQpLCAoY291bnQgPT0gd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoKSA9PSBjdXJyZW50LmlzQWxsKCkpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiRVJST1I6IGlzQWxsIGlzIHdyb25nIiwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgKGNvdW50ID09IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aCkgKyAiLCBnb3QgIiArICEoY291bnQgPT0gd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoKSwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRlc3QgaXNEaXNqb2ludCBhbmQgY29udGFpbnNBbGwKLSAgICAgICAgICAgIGlmICh0ZXN0c3RhY2suc2l6ZSgpID49IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNqb2ludCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wZWVrKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdICYmIGNvbnRlbnRzW2tdKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNqb2ludCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZm9ybWF0KDAsIGwsICJFUlJPUjogZGlzam9pbnQgaXMgd3JvbmciLCBjdXJyZW50KSwgZGlzam9pbnQgPT0gY3VycmVudC5pc0Rpc2pvaW50KChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBlZWsoKSkpOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJFUlJPUjogZGlzam9pbnQgaXMgd3JvbmciLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgZGlzam9pbnQgKyAiLCBnb3QgIiArICFkaXNqb2ludCwgKFFOYW1lU2V0QnVpbGRlcil0ZXN0c3RhY2sucGVlaygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNBbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSAmJiAhY29udGVudHNba10pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zQWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkVSUk9SOiBjb250YWluc0FsbCBpcyB3cm9uZyIsIGN1cnJlbnQpLCBjb250YWluc0FsbCA9PSBjdXJyZW50LmNvbnRhaW5zQWxsKChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBlZWsoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5NThlNC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBRTmFtZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgUU5hbWVUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUU5hbWVUZXN0cy5jbGFzcyk7IH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKLSAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OwotCi0gICAgcHVibGljIHZvaWQgdGVzdFFOYW1lICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2FueSc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCi0gICAgICAgICAgICAiIjsKLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9Ci0gICAgICAgICAgICBYbWxCZWFucy5sb2FkWHNkKCBuZXcgWG1sT2JqZWN0W10gewotICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHNjaGVtYSkgfSApOwotCi0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAvLyBUZXN0IHRoZSBzZXRfWE1MTmFtZSBmdW5jdGlvbiBvbiBYbWxRTmFtZUltcGwKLSAgICAgICAgLy8KLQotICAgICAgICBTdHJpbmcgbnMgPQotICAgICAgICAgICAgInhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnICIgKwotICAgICAgICAgICAgICAgICJ4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIjsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdCBzb3VyY2VEb2N1bWVudCA9Ci0gICAgICAgICAgICBzdGwucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6UU5hbWUnIHhtbG5zOnh4eD0neHh4LmNvbSc+IiArCi0gICAgICAgICAgICAgICAgICAgICJ4eHg6YWJjPC9hbnk+IiwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIFhtbEN1cnNvciBzb3VyY2VDdXJzb3IgPSBzb3VyY2VEb2N1bWVudC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBzb3VyY2VDdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgWG1sUU5hbWUgc291cmNlUU5hbWUgPSAoWG1sUU5hbWUpIHNvdXJjZUN1cnNvci5nZXRPYmplY3QoKTsKLQotICAgICAgICBYbWxPYmplY3QgdGFyZ2V0RG9jdW1lbnQgPQotICAgICAgICAgICAgc3RsLnBhcnNlKAotICAgICAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOlFOYW1lJz4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvYW55PiIsIG51bGwsIG51bGwgKTsKLQotICAgICAgICBYbWxDdXJzb3IgdGFyZ2V0Q3Vyc29yID0gdGFyZ2V0RG9jdW1lbnQubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgdGFyZ2V0Q3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotCi0gICAgICAgIFhtbFFOYW1lIHRhcmdldFFOYW1lID0gKFhtbFFOYW1lKSB0YXJnZXRDdXJzb3IuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgdGFyZ2V0UU5hbWUuc2V0KCBzb3VyY2VRTmFtZSApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgdGFyZ2V0UU5hbWUucU5hbWVWYWx1ZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggInh4eC5jb20iICkgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBUZXN0IHRoZSBzZXRfdGV4dCBmdW5jdGlvbiBvbiBYbWxRTmFtZUltcGwKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHRhcmdldERvY3VtZW50ID0KLSAgICAgICAgICAgIHN0bC5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpRTmFtZScgeG1sbnM6eHh4PSd4eHguY29tJz4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvYW55PiIsIG51bGwsIG51bGwgKTsKLQotICAgICAgICB0YXJnZXRDdXJzb3IgPSB0YXJnZXREb2N1bWVudC5uZXdDdXJzb3IoKTsKLQotICAgICAgICB0YXJnZXRDdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgdGFyZ2V0UU5hbWUgPSAoWG1sUU5hbWUpIHRhcmdldEN1cnNvci5nZXRPYmplY3QoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0UU5hbWUuc2V0KCAienp6OmFiYyIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7IC8vIE11c3QgZmFpbAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIHQgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRhcmdldFFOYW1lLnNldCggInh4eDphYmMiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHRhcmdldFFOYW1lLnFOYW1lVmFsdWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoICJ4eHguY29tIiApICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1J1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUnVudGltZVNjaGVtYUxvYWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2MmI4MC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUnVudGltZVNjaGVtYUxvYWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBSdW50aW1lU2NoZW1hTG9hZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShSdW50aW1lU2NoZW1hTG9hZGVyVGVzdC5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTG9hZCgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIEZpbGUgaW5wdXRmaWxlMSA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvZHluYW1pYy9keW50ZXN0LnhzZCIpOwotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciA9IFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtdIHsgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoaW5wdXRmaWxlMSkgfSk7Ci0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBsb2FkZXIucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9keW5hbWljL2R5bnRlc3QueG1sIiksIG51bGwsIG51bGwpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEPXdyYXBwZWRpbnN0YW5jZUBodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IiwgcmVzdWx0LnNjaGVtYVR5cGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2FkZXIuZmluZERvY3VtZW50VHlwZShuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCAid3JhcHBlZGluc3RhbmNlIiApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2NoZW1hVHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0xvYWQyKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhzZCIpOwotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciA9IFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtdIHsgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoaW5wdXRmaWxlMSkgfSk7Ci0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBsb2FkZXIucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbCIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRD13cmFwcGVkd2lsZGNhcmRAaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCIsIHJlc3VsdC5zY2hlbWFUeXBlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobG9hZGVyLmZpbmREb2N1bWVudFR5cGUobmV3IFFOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IiwgIndyYXBwZWR3aWxkY2FyZCIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2NoZW1hVHlwZSgpKTsKLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHJlc3VsdC5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNob3VsZCBoYXZlIGEgcm9vdCBlbGVtZW50IiwgY3VyLnRvRmlyc3RDaGlsZCgpKTsKLSAgICAgICAgcmVzdWx0ID0gY3VyLmdldE9iamVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJFPXdyYXBwZWR3aWxkY2FyZHxEPXdyYXBwZWR3aWxkY2FyZEBodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IiwgcmVzdWx0LnNjaGVtYVR5cGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2FkZXIuZmluZEVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IiwgIndyYXBwZWR3aWxkY2FyZCIpKS5nZXRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNjaGVtYVR5cGUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBhIGZpcnN0IGNoaWxkIiwgY3VyLnRvRmlyc3RDaGlsZCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgInNjaGVtYSIpLCBjdXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgWG1sT2JqZWN0IG9iaiA9IGN1ci5nZXRPYmplY3QoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTY2hlbWEudHlwZSwgb2JqLnNjaGVtYVR5cGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NjaGVtYVR5cGVzVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TY2hlbWFUeXBlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTJjZmEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NjaGVtYVR5cGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ2FsZW5kYXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5vcGVudXJpLnhzdHlwZXMudGVzdC4qOwotaW1wb3J0IG9yZy5vcGVudXJpLmRlZi5EZWZhdWx0c0RvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hVHlwZXNUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFNjaGVtYVR5cGVzVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwcml2YXRlIEN1c3RvbWVyRG9jdW1lbnQgZG9jOwotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZURvYygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBkb2M9PW51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb2MgPSAoQ3VzdG9tZXJEb2N1bWVudCkKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoIi4uL3NyYy94c3R5cGVzL3hzdHlwZXMueG1sIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgRGVmYXVsdHNEb2N1bWVudCBkb2MgPSBEZWZhdWx0c0RvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgRGVmYXVsdHNEb2N1bWVudC5EZWZhdWx0cyBkZWZzID0gZG9jLmFkZE5ld0RlZmF1bHRzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzgzLCBkZWZzLmdldENvb2woKSk7IC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlTmFtZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gRGVmYXVsdHNEb2N1bWVudC50eXBlLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZGVmYXVsdHMueHNkIiwgbmFtZSk7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0ciA9IFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkuZ2V0U291cmNlQXNTdHJlYW0oImRlZmF1bHRzLnhzZCIpOwotICAgICAgICBTY2hlbWFEb2N1bWVudCBkb2MgPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHN0cik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy52YWxpZGF0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZCgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGVuc3VyZURvYygpOwotCi0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSG93ZHkiLCBwZXJzb24uZ2V0Rmlyc3RuYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsICAgcGVyc29uLnNpemVPZk51bWJlckFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzNiwgcGVyc29uLmdldE51bWJlckFycmF5KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjMsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDQsICBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDkzMywgcGVyc29uLmdldE51bWJlckFycmF5KDMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCAgIHBlcnNvbi5zaXplT2ZCaXJ0aGRheUFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMTk5OC0wOC0yNloiKSwKLSAgICAgICAgICAgICBwZXJzb24uZ2V0QmlydGhkYXlBcnJheSgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIyMDAwLTA4LTA2LTA4OjAwIiksCi0gICAgICAgICAgICAgcGVyc29uLmdldEJpcnRoZGF5QXJyYXkoMSkpOwotCi0gICAgICAgIFBlcnNvbi5HZW5kZXIuRW51bSBnID0gcGVyc29uLmdldEdlbmRlcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFBlcnNvbi5HZW5kZXIuTUFMRSwgZyk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRUdJUVRXWVpKIiwgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4KCkpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhpcyBzdHJpbmcgaXMgYmFzZTY0QmluYXJ5IGVuY29kZWQhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjQoKSkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdHSVFUV1lHRyIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleEF0dCgpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoaXMgc3RyaW5nIGlzIGJhc2U2NEJpbmFyeSBlbmNvZGVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0QXR0KCkpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7c29tZV91cml9bG9jYWxuYW1lIiwgcGVyc29uLmdldFFuYW1lQXR0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIntodHRwOi8vb3BlbnVyaS5vcmcveHN0eXBlcy90ZXN0fW9wZW51cmlfb3JnX2xvY2FsbmFtZSIsIHBlcnNvbi5nZXRRbmFtZSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly9kbW96Lm9yZy9Xb3JsZC9GcmFuXHUwMGU3YWlzLyIsIHBlcnNvbi5nZXRBbnl1cmlBdHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovLzNzcGFjZS5vcmcvc3BhY2UlMjBzcGFjZS8iLCBwZXJzb24uZ2V0QW55dXJpKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgLy9SdW50aW1lRXhjZXB0aW9uOiBzcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NwbGF5LmphdmEoMTUzNyk6IG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwIGZhaWxlZAotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkpQRUciLCBwZXJzb24uZ2V0Tm90YXRpb25BdHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJHSUYiLCBwZXJzb24uZ2V0Tm90YXRpb24oKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVSZWFkKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgZW5zdXJlRG9jKCk7Ci0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLQotICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2VvcmdlIiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLQotICAgICAgICBwZXJzb24uc2V0SGV4KCJoZXggZW5jb2RpbmciLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXgoKSkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRCYXNlNjQoImJhc2U2NCBlbmNvZGVkIi5nZXRCeXRlcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYmFzZTY0IGVuY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEhleEF0dCgiaGV4IGVuY29kaW5nIGluIGF0dHJpYnV0ZXMiLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmcgaW4gYXR0cmlidXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4QXR0KCkpKTsKLQotICAgICAgICBwZXJzb24uc2V0QmFzZTY0QXR0KCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEFueXVyaSgiYS5jOjcwMDEiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYS5jOjcwMDEiLCBwZXJzb24uZ2V0QW55dXJpKCkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRBbnl1cmlBdHQoImIuZDo3MDAyIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImIuZDo3MDAyIiwgcGVyc29uLmdldEFueXVyaUF0dCgpKTsKLQotICAgICAgICBwZXJzb24uc2V0UW5hbWVBdHQobmV3IFFOYW1lKCJhYWEiLCJiYmIiKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInthYWF9YmJiIiwgcGVyc29uLmdldFFuYW1lQXR0KCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldFFuYW1lKG5ldyBRTmFtZSgiZGRkIiwiZWVlIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7ZGRkfWVlZSIsIHBlcnNvbi5nZXRRbmFtZSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vRXhjZXB0aW9uOiBzcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1R5cGUuamF2YSgxODkpOiB1c2VyID09IF91c2VyIGZhaWxlZAotLy8gICAgICAgIHBlcnNvbi5zZXRBbnl1cmlBdHQoVVJJLmNyZWF0ZSgiYi5kOjcwMDIiKSk7Ci0vLyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYi5kOjcwMDIiLCBwZXJzb24uZ2V0QW55dXJpQXR0KCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgLy9YbWxOT1RBVElPTiBub3RhdGlvbiA9IChYbWxOT1RBVElPTilQZXJzb24uTm90YXRpb24udHlwZS5jcmVhdGVOb2RlKCk7Ci0gICAgICAgIC8vbm90YXRpb24uc2V0VmFsdWUoIkpQRUciKTsKLSAgICAgICAgLy9wZXJzb24uc2V0Tm90YXRpb24oIG5vdGF0aW9uICk7Ci0gICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiSlBFRyIsIHBlcnNvbi5nZXROb3RhdGlvbigpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vWG1sTk9UQVRJT04gbm90YXRpb25BdHQgPSAoWG1sTk9UQVRJT04pUGVyc29uLk5vdGF0aW9uQXR0LnR5cGUuY3JlYXRlTm9kZSgpOwotICAgICAgICAvL25vdGF0aW9uQXR0LnNldFZhbHVlKCJHSUYiKTsKLSAgICAgICAgLy9wZXJzb24uc2V0Tm90YXRpb25BdHQoIG5vdGF0aW9uQXR0ICk7Ci0gICAgICAgIC8vcGVyc29uLnNldE5vdGF0aW9uQXR0KG5vdGF0aW9uKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJHSUYiLCBwZXJzb24uZ2V0Tm90YXRpb25BdHQoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVXcml0ZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGVuc3VyZURvYygpOwotICAgICAgICAvLyBNb3ZlIGZyb20gdGhlIHJvb3QgdG8gdGhlIHJvb3QgY3VzdG9tZXIgZWxlbWVudAotICAgICAgICBQZXJzb24gcGVyc29uID0gZG9jLmdldEN1c3RvbWVyKCk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHhtbG9iajsKLSAgICAgICAgWG1sQ3Vyc29yIHhtbGN1cnM7Ci0KLSAgICAgICAgcGVyc29uLnNldEZpcnN0bmFtZSgiR2VvcmdlIik7Ci0gICAgICAgIHhtbG9iaiA9IHBlcnNvbi54Z2V0Rmlyc3RuYW1lKCk7Ci0gICAgICAgIHhtbGN1cnMgPSB4bWxvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdlb3JnZSIsIHhtbGN1cnMuZ2V0VGV4dFZhbHVlKCkgKTsKLQotICAgICAgICBwZXJzb24uc2V0UW5hbWVBdHQoIG5ldyBRTmFtZSgiaHR0cDovL2dnZy5jb20iLCJoaGgiKSApOwotICAgICAgICB4bWxvYmogPSBwZXJzb24ueGdldFFuYW1lQXR0KCk7Ci0gICAgICAgIHhtbGN1cnMgPSB4bWxvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdnZzpoaGgiLCB4bWxjdXJzLmdldFRleHRWYWx1ZSgpICk7Ci0KLSAgICAgICAgcGVyc29uLnNldFFuYW1lKCBuZXcgUU5hbWUoImh0dHA6Ly9nZ2cuY29tL2dnZ0FnYWluIiwia2trIikgKTsKLSAgICAgICAgeG1sb2JqID0gcGVyc29uLnhnZXRRbmFtZSgpOwotICAgICAgICB4bWxjdXJzID0geG1sb2JqLm5ld0N1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZ2cxOmtrayIsIHhtbGN1cnMuZ2V0VGV4dFZhbHVlKCkgKTsKLQotICAgICAgICBwZXJzb24uc2V0QW55dXJpKCAiY3Jvc3NnYWluLmNvbSIgKTsKLSAgICAgICAgeG1sb2JqID0gcGVyc29uLnhnZXRBbnl1cmkoKTsKLSAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiY3Jvc3NnYWluLmNvbSIsIHhtbGN1cnMuZ2V0VGV4dFZhbHVlKCkgKTsKLQotICAgICAgICBwZXJzb24uc2V0QW55dXJpQXR0KCAid3d3LmNyb3NzZ2Fpbi5jb20iICk7Ci0gICAgICAgIHhtbG9iaiA9IHBlcnNvbi54Z2V0QW55dXJpQXR0KCk7Ci0gICAgICAgIHhtbGN1cnMgPSB4bWxvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInd3dy5jcm9zc2dhaW4uY29tIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOwotCi0gICAgICAgIC8vcGVyc29uLnNldE5vdGF0aW9uKCJHSUYiKTsKLSAgICAgICAgLy94bWxvYmogPSBwZXJzb24uZ2V0Tm90YXRpb24oKTsKLSAgICAgICAgLy94bWxjdXJzID0geG1sb2JqLm5ld1htbEN1cnNvcigpOwotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkdJRiIsIHhtbGN1cnMuZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgLy9wZXJzb24uc2V0Tm90YXRpb25BdHQoIkpQRUd1Iik7Ci0gICAgICAgIC8veG1sb2JqID0gcGVyc29uLnhnZXROb3RhdGlvbkF0dCgpOwotICAgICAgICAvL3htbGN1cnMgPSB4bWxvYmoubmV3WG1sQ3Vyc29yKCk7Ci0gICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiSlBFRyIsIHhtbGN1cnMuZ2V0VGV4dCgpICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NlcmlhbGl6YXRpb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NlcmlhbGl6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE1ODg1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TZXJpYWxpemF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLlB1cmNoYXNlT3JkZXI7Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxMaW5lSXRlbUJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxTaGlwcGVyQmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBTZXJpYWxpemF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uVGVzdHMgKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShTZXJpYWxpemF0aW9uVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sT2JqZWN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzaW1wbGVEb2N1bWVudCA9ICI8c2ltcGxlRG9jPjxuZXN0ZWRUYWcgYXR0cj1cInNhbXBsZVwiPjQzPC9uZXN0ZWRUYWc+PC9zaW1wbGVEb2M+IjsKLSAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHNpbXBsZURvY3VtZW50KTsKLQotICAgICAgICAvLyBiYXNlbGluZSB0ZXN0Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2ltcGxlRG9jdW1lbnQsIGRvYy54bWxUZXh0KCkpOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7Ci0gICAgICAgIG9vcy53cml0ZU9iamVjdChkb2MpOwotICAgICAgICBvb3MuY2xvc2UoKTsKLQotICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSk7Ci0gICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpbik7Ci0gICAgICAgIFhtbE9iamVjdCBuZXdkb2MgPSAoWG1sT2JqZWN0KW9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIG9pcy5jbG9zZSgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2ltcGxlRG9jdW1lbnQsIG5ld2RvYy54bWxUZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RYQmVhblNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIGRvYyA9IFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBQdXJjaGFzZU9yZGVyIG9yZGVyID0gZG9jLmFkZE5ld1B1cmNoYXNlT3JkZXIoKTsKLSAgICAgICAgb3JkZXIuYWRkTmV3Q3VzdG9tZXIoKS5zZXROYW1lKCJEYXZpZCBCYXUiKTsKLSAgICAgICAgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5zZXRBZGRyZXNzKCJHbGFkd3luZSwgUEEiKTsKLSAgICAgICAgWG1sTGluZUl0ZW1CZWFuIGxpOwotICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7Ci0gICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMSIpOwotICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSk7Ci0gICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigyKSk7Ci0gICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7Ci0gICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKLSAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIik7Ci0gICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpKTsKLSAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTsKLSAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKLSAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOwotICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiKTsKLSAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IikpOwotICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMSkpOwotICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOwotICAgICAgICBYbWxTaGlwcGVyQmVhbiBzaCA9IG9yZGVyLmFkZE5ld1NoaXBwZXIoKTsKLSAgICAgICAgc2guc2V0TmFtZSgiVVBTIik7Ci0gICAgICAgIHNoLnNldFBlck91bmNlUmF0ZShuZXcgQmlnRGVjaW1hbCgiMC43NCIpKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXQpOwotICAgICAgICBvb3Mud3JpdGVPYmplY3QoZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpKTsKLSAgICAgICAgb29zLndyaXRlT2JqZWN0KGRvYyk7Ci0gICAgICAgIG9vcy53cml0ZU9iamVjdChkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMikpOwotICAgICAgICBvb3MuY2xvc2UoKTsKLQotICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSk7Ci0gICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpbik7Ci0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBuZXdsaTEgPSAoWG1sTGluZUl0ZW1CZWFuKW9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4gbmV3ZG9jID0gKFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4pb2lzLnJlYWRPYmplY3QoKTsKLSAgICAgICAgWG1sTGluZUl0ZW1CZWFuIG5ld2xpMiA9IChYbWxMaW5lSXRlbUJlYW4pb2lzLnJlYWRPYmplY3QoKTsKLSAgICAgICAgb2lzLmNsb3NlKCk7Ci0KLSAgICAgICAgUHVyY2hhc2VPcmRlciBuZXdvcmRlciA9IG5ld2RvYy5nZXRQdXJjaGFzZU9yZGVyKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXdsaTEsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ld2xpMiwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRGF2aWQgQmF1IiwgbmV3b3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXROYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHbGFkd3luZSwgUEEiLCBuZXdvcmRlci5nZXRDdXN0b21lcigpLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgbmV3b3JkZXIuc2l6ZU9mTGluZUl0ZW1BcnJheSgpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMSIsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjIxLjc5IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjIiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDIiLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzIiwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUsIG5ld29yZGVyLmlzU2V0U2hpcHBlcigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVVBTIiwgbmV3b3JkZXIuZ2V0U2hpcHBlcigpLmdldE5hbWUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjAuNzQiKSwgbmV3b3JkZXIuZ2V0U2hpcHBlcigpLmdldFBlck91bmNlUmF0ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU21va2VUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Ntb2tlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzNjEwNS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU21va2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNtb2tlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIFNtb2tlVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFNtb2tlVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBc3NvcnRlZFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEludFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN0b3JlVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoUU5hbWVUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChWYWxpZGF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ29tcGlsYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBbm5vdGF0aW9uc1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEVhc3lQb1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KE5hbWV3b3JsZFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoU2NoZW1hVHlwZXNUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChFbnVtVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ3JlYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChUaHJlYWRpbmdUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFNlcmlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChEb21UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChHRGF0ZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN1YnN0R3JvdXBUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChKYXhlblhQYXRoVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoTnVtZXJhbHNUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdGFuZGFsb25lVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdGFuZGFsb25lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzM2QxMi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RhbmRhbG9uZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBTdGFuZGFsb25lVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFN0YW5kYWxvbmVUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEFzc29ydGVkVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoSW50VGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoUnVudGltZVNjaGVtYUxvYWRlclRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoU3RvcmVUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChRTmFtZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFZhbGlkYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChDb21waWxhdGlvblRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEFubm90YXRpb25zVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoRWFzeVBvVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoTmFtZXdvcmxkVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChTY2hlbWFUeXBlc1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEVudW1UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChDcmVhdGlvblRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFRocmVhZGluZ1Rlc3Quc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoU2VyaWFsaXphdGlvblRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KERvbVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEdEYXRlVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoU3Vic3RHcm91cFRlc3RzLnN1aXRlKCkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0b3JlVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdG9yZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGQ2YTguLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0b3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MTAgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbE5hbWVJbXBsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ29tbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7Ci0gICAKLXB1YmxpYyBjbGFzcyBTdG9yZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgU3RvcmVUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RvcmVUZXN0cy5jbGFzcyk7IH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKLSAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OwotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGdldENhc2VGaWxlKHRoZUNhc2UpLCBudWxsKS5uZXdDdXJzb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUNvbnRlbnRzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeERzdCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFhtbE9iamVjdCB4U3JjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vLz4iICk7Ci0gICAgICAgIFhtbE9iamVjdCBuZXdEc3QgPSB4RHN0LnNldCggeFNyYyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmV3RHN0LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vLz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIHhEc3QgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXIvPiIgKTsKLSAgICAgICAgeFNyYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvby8+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHhEc3QubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgeERzdCA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHhEc3Quc2V0KCB4U3JjICk7Ci0gICAgICAgIGMudG9TdGFydERvYygpOwotICAgICAgICB4RHN0ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhEc3QueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+PGZvby8+PC9iYXI+IiApICk7Ci0KLSAgICAgICAgeERzdCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhciB4PSd5Jy8+IiApOwotICAgICAgICB4U3JjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPm1vbzwvZm9vPiIgKTsKLSAgICAgICAgYyA9IHhEc3QubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICB4RHN0ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgeERzdC5zZXQoIHhTcmMgKTsKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIHhEc3QgPSBjLmdldE9iamVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeERzdC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhciB4PVwibW9vXCIvPiIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U25pZmZpbmcgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHhvby8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC5zY2hlbWFUeXBlKCkgPT0gWG1sQmVhbnMuTk9fVFlQRSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICI8c2NoZW1hIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS9tb28nLz4iICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnNjaGVtYVR5cGUoKSA9PSBYbWxCZWFucy5OT19UWVBFICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOwotCi0gICAgICAgIHggPSBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4ID0gCi0gICAgICAgICAgICAgICAgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAiPHNjaGVtYSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEvbW9vJy8+IiApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApIHsgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yU3RhY2sgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHg9J3knLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy5wdXNoKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5wdXNoKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNBdHRyKCkgKTsKLSAgICAgICAgYy5wb3AoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNTdGFydCgpICk7Ci0gICAgICAgIGMucG9wKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmlzU3RhcnRkb2MoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXROYW1lc3BhY2VzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNYXAgbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG5hbWVzcGFjZXMucHV0KCAiZm9vIiwgImZvby5jb20iICk7Ci0gICAgICAgIG5hbWVzcGFjZXMucHV0KCAiYmFyIiwgImJhci5jb20iICk7Ci0gICAgICAgIG5hbWVzcGFjZXMucHV0KCAiIiwgImRlZmF1bHQuY29tIiApOwotCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUywgbmFtZXNwYWNlcyApOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmJlZ2luRWxlbWVudCggImEiLCAiZm9vLmNvbSIgKTsKLSAgICAgICAgYy5iZWdpbkVsZW1lbnQoICJiIiwgImRlZmF1bHQuY29tIiApOwotICAgICAgICBjLmJlZ2luRWxlbWVudCggImMiLCAiYmFyLmNvbSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxmb286YT48Yj48YmFyOmMvPjwvYj48L2ZvbzphPiIgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRlbnQgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQgKCApIHRocm93cyBTQVhFeGNlcHRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNUQVJUX0RPQ1VNRU5UIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQgKCApIHRocm93cyBTQVhFeGNlcHRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIkVORF9ET0NVTUVOVCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCAoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMgKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfRUxFTUVOVCIgKTsKLSAgICAgICAgICAgIGFkZCggIiAgbmFtZXNwYWNlVVJJOiAiICsgbmFtZXNwYWNlVVJJICk7Ci0gICAgICAgICAgICBhZGQoICIgIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSApOwotLy8gICAgICAgICAgICBhZGQoICIgIHFOYW1lOiAiICsgcU5hbWUgKTsgCi0KLSAgICAgICAgICAgIFRyZWVTZXQgc29ydGVkQXR0cnMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgYXR0cy5nZXRMZW5ndGgoKSA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxuID0gYXR0cy5nZXRMb2NhbE5hbWUoIGkgKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0cy5nZXRVUkkoIGkgKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWUgPSBhdHRzLmdldFFOYW1lKCBpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG4uZXF1YWxzKCJ4bWxucyIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAocW5hbWUuc3RhcnRzV2l0aCgieG1sbnMiKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLS8vICAgICAgICAgICAgICAgIGlmIChsbi5lcXVhbHMoICJ4bWxucyIgKSkKLS8vICAgICAgICAgICAgICAgICAgICBsbiA9ICIiOwotLy8KLS8vICAgICAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKCAieG1sbnMiICkpCi0vLyAgICAgICAgICAgICAgICAgICAgdXJpID0gIiI7Ci0KLSAgICAgICAgICAgICAgICBzb3J0ZWRBdHRycy5hZGQoCi0gICAgICAgICAgICAgICAgICAgIHVyaSArICItIiArIGxuICsgIi0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0UU5hbWUoIGkgKSArICItIiArIGF0dHMuZ2V0VHlwZSggaSApICsgIi0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRzLmdldFZhbHVlKCBpICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IHNvcnRlZEF0dHJzLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICBhZGQoICIgIEF0dHI6ICIgKyBpLm5leHQoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudCAoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUgKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiRU5EX0VMRU1FTlQiICk7Ci0gICAgICAgICAgICBhZGQoICIgIG5hbWVzcGFjZVVSSTogIiArIG5hbWVzcGFjZVVSSSApOwotICAgICAgICAgICAgYWRkKCAiICBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUgKTsKLS8vICAgICAgICAgICAgYWRkKCAiICBxTmFtZTogIiArIHFOYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzICggY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoICJDSEFSQUNURVJTIiApOwotICAgICAgICAgICAgICAgIGFkZCggY2gsIHN0YXJ0LCBsZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApIAotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGFkZCggIkNPTU1FTlQiICk7Ci0gICAgICAgICAgICBhZGQoICIgIENvbW1lbnQ6ICIsIGNoLCBzdGFydCwgbGVuZ3RoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gKCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iICk7Ci0gICAgICAgICAgICBhZGQoICAgInRhcmdldDogIiArIHRhcmdldCApOwotICAgICAgICAgICAgYWRkKCAgICJkYXRhOiAiICsgZGF0YSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSAoIGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKCAiSUdOT1JBQkxFX1dISVRFU1BBQ0UiICk7Ci0gICAgICAgICAgICAgICAgYWRkKCAiICB3aGl0ZXNwYWNlOiAiLCBjaCwgc3RhcnQsIGxlbmd0aCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfUFJFRklYX01BUFBJTkciICk7Ci0vLyAgICAgICAgICAgIGFkZCggIiAgcHJlZml4OiAiICsgcHJlZml4ICk7Ci0gICAgICAgICAgICBhZGQoICIgIHVyaTogIiArIHVyaSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nICggU3RyaW5nIHByZWZpeCApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiRU5EX1BSRUZJWF9NQVBQSU5HIiApOwotLy8gICAgICAgICAgICBhZGQoICIgIHByZWZpeDogIiArIHByZWZpeCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNUQVJUX0NEQVRBIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoICJFTkRfQ0RBVEEiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RFREICggU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfRFREIiApOwotICAgICAgICAgICAgYWRkKCAiICBuYW1lOiAiICsgbmFtZSApOwotICAgICAgICAgICAgYWRkKCAiICBwdWJsaWNJZDogIiArIHB1YmxpY0lkICk7Ci0gICAgICAgICAgICBhZGQoICIgIHN5c3RlbUlkOiAiICsgc3lzdGVtSWQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZW5kRFREICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIkVORF9EVEQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNUQVJUX0VOVElUWSIgKTsKLSAgICAgICAgICAgIGFkZCggIiAgbmFtZTogIiArIG5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZW5kRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIkVORF9FTlRJVFkiICk7Ci0gICAgICAgICAgICBhZGQoICIgIG5hbWU6ICIgKyBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvciAoIExvY2F0b3IgbG9jYXRvciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFkZCggIlNUQVJUX0RPQ1VNRU5UX0xPQ0FUT1IiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNLSVBQRURfRU5USVRZIiApOwotICAgICAgICAgICAgYWRkKCAiICBuYW1lOiAiICsgbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZCAoIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgX3NiLmFwcGVuZCggcyApOwotICAgICAgICAgICAgX3NiLmFwcGVuZCggIlxuIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgYWRkICggU3RyaW5nIHMsIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCBzICk7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCAiXG4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGQgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgX3NiLmFwcGVuZCggYnVmLCBvZmYsIGNjaCApOwotICAgICAgICAgICAgX3NiLmFwcGVuZCggIlxuIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMgKCBPYmplY3QgdGhhdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0b1N0cmluZygpLmVxdWFscyggdGhhdC50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3NiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBfc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvVGVzdFNheFNhdmVyICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIE1FCi0gICAgICAgIAotICAgICAgICBDb250ZW50IGNvbnRlbnQyID0gbmV3IENvbnRlbnQoKTsKLQotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLQotICAgICAgICB4LnNhdmUoIGNvbnRlbnQyLCBjb250ZW50MiApOwotCi0gICAgICAgIC8vIFRIRU0KLQotICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU0FYUGFyc2VyIHNwID0gc3BmLm5ld1NBWFBhcnNlcigpOwotICAgICAgICAKLSAgICAgICAgWE1MUmVhZGVyIHhyID0gc3AuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBDb250ZW50IGNvbnRlbnQxID0gbmV3IENvbnRlbnQoKTsKLSAgICAgICAgCi0gICAgICAgIHhyLnNldFByb3BlcnR5KCAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgY29udGVudDEgKTsKLSAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlICk7Ci0gICAgICAgIHhyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKLSAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLQotICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggY29udGVudDEgKTsKLSAgICAgICAgCi0gICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAgeG1sICkgKTsKLQotICAgICAgICB4ci5wYXJzZSggaXMgKTsKLQotCi0gICAgICAgIGlmICghY29udGVudDEuZXF1YWxzKCBjb250ZW50MiApKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJTQVggc2F2ZSBmYWlsdXJlOiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHhtbCApOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlNBWDogIiApOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCBjb250ZW50MS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiTUU6ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggY29udGVudDIudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXhTYXZlciAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8YSB4bWxucz0nbm5uJz48L2E+IiApOwotICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhIHg9J3knPjwhLS0tLT54PGIvPjxjIHA9J3EnPno8L2M+PC9hPiIgKTsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8YSB4PSd5Jz48IS0tLS0+PGI+bW9vPC9iPjxjIHA9J3EnPjwvYz48L2E+IiApOwotICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhPmFzYTxiLz5zZHNkPGM+YWF6PC9jPmFkc2FzZDwvYT4iICk7Ci0gICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPGE+PD90YXJnZXQgdmFsdWU/PjwvYT4iICk7Ci0gICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPG46YSB4bWxuczpuPSdubm4nPjwvbjphPiIgKTsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8ajphIHg9J3knIHA9J3EnIHhtbG5zOmo9J2snPjwvajphPiIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgX190ZXN0UGFyc2luZyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCAxICk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgMTAwMDAwIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHhtbCA9IG1ha2VSYW5kb21Eb2N1bWVudCggciApOwotCi0vLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlN0YXJ0aW5nLi4uIiApOwotLy8KLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmFpbGVkIHBhcnNlIHRlc3Q6IiApOwotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKLQotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCAiYzpcXGVlLnhtbCIgKTsKLSAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbSggb3MgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludGxuKCB4bWwgKTsKLSAgICAgICAgICAgICAgICBwcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJGaW5pc2hlZC4uLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGVzdExpbmVOdW1iZXJzICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBsaW5lID0gMTsKLSAgICAgICAgaW50IGNvbCA9IDE7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgeG1sLCBuZXcgWG1sT3B0aW9ucygpLnNldExvYWRMaW5lTnVtYmVycygpICkuCi0gICAgICAgICAgICAgICAgICAgIG5ld0N1cnNvcigpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCB4bWwubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0geG1sLmNoYXJBdCggaSApOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJzwnICYmIENoYXJhY3Rlci5pc0xldHRlciggeG1sLmNoYXJBdCggaSArIDEgKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIWMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnQoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBYbWxMaW5lTnVtYmVyIGxuID0KLSAgICAgICAgICAgICAgICAgICAgKFhtbExpbmVOdW1iZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldEJvb2ttYXJrKCBYbWxMaW5lTnVtYmVyLmNsYXNzICk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbG4gIT0gbnVsbCApOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxuLmdldExpbmUoKSAgID09IC0xIHx8IGxuLmdldExpbmUoKSA9PSBsaW5lICk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxuLmdldENvbHVtbigpID09IC0xIHx8IGxuLmdldENvbHVtbigpID09IGNvbCApOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBsbi5nZXRPZmZzZXQoKSA9PSAtMSB8fCBsbi5nZXRPZmZzZXQoKSA9PSBpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaW5lKys7Ci0gICAgICAgICAgICAgICAgY29sPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIF9fdGVzdExpbmVOdW1iZXJzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oIDEgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCAxMDAwIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHhtbCA9IG1ha2VSYW5kb21Eb2N1bWVudCggciApOwotCi0vLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlN0YXJ0aW5nLi4uIiApOwotLy8KLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9UZXN0TGluZU51bWJlcnMoIHhtbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmFpbGVkIGxpbmUgbnVtYmVyIHRlc3Q6IiApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeG1sICk7Ci0KLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggImM6XFxlZS54bWwiICk7Ci0gICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oIG9zICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnRsbiggeG1sICk7Ci0gICAgICAgICAgICAgICAgcHMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmluaXNoZWQuLi4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb2NCdWlsZGVyCi0gICAgewotICAgICAgICBSYW5kb20gcjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiOwotICAgICAgICAKLSAgICAgICAgRG9jQnVpbGRlciAoIFJhbmRvbSBfciwgU3RyaW5nQnVmZmVyIF9zYiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHIgPSBfcjsKLSAgICAgICAgICAgIHNiID0gX3NiOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhcHBlbmQgKCBjaGFyIGNoICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCBjaCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGFwcGVuZCAoIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCBzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aGl0ZXNwYWNlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcCA9IHIubmV4dEludCggMTAwICk7Ci0KLSAgICAgICAgICAgIGlmIChwIDwgMjApCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAnXHQnICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwIDwgNDApCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAnXG4nICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAnICcgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdoaXRlc3BhY2VzICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggOCApIDsgaSA+IDAgOyBpLS0gKQotICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBjaGFyIG1ha2VMZXR0ZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoY2hhcikgKCgoaW50KSAnYScpICsgci5uZXh0SW50KCAyNiApKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgbGV0dGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmQoIG1ha2VMZXR0ZXIoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hhckVudGl0eSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggci5uZXh0SW50KCA1ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwIDogYXBwZW5kKCAiJmx0OyIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEgOiBhcHBlbmQoICImZ3Q7IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMiA6IGFwcGVuZCggIiZhbXA7IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMyA6IGFwcGVuZCggIiZhcG9zOyIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQgOiBhcHBlbmQoICImcXVvdDsiICk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHRleHQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gci5uZXh0SW50KCAyMCApIDsgaSA+IDAgOyBpLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwID0gci5uZXh0SW50KCAxMDAgKTsKLQotICAgICAgICAgICAgICAgIGlmIChwIDwgNzApCi0gICAgICAgICAgICAgICAgICAgIGxldHRlcigpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPCA3NCkKLSAgICAgICAgICAgICAgICAgICAgY2hhckVudGl0eSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBtYWtlTmNOYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gbWFrZUxldHRlcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoID09ICd4JyB8fCBjaCA9PSAnWCcpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgbmFtZS5hcHBlbmQoIGNoICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGkgPSByLm5leHRJbnQoIDIwICkgOyBpID4gMCA7IGktLSApCi0gICAgICAgICAgICAgICAgbmFtZS5hcHBlbmQoIG1ha2VMZXR0ZXIoKSApOwotCi0gICAgICAgICAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbmNOYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmQoIG1ha2VOY05hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29tbWVudCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwZW5kKCAiPCEtLSIgKTsKLSAgICAgICAgICAgIHRleHQoKTsKLSAgICAgICAgICAgIGFwcGVuZCggIi0tPiIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2luc3QgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGVuZCggIjw/IiApOwotICAgICAgICAgICAgbmNOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApIDwgOTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgICAgIHRleHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXBwZW5kKCAiPz4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aGl0ZUNvbnRlbnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHAgPSByLm5leHRJbnQoIDEwMCApOwotCi0gICAgICAgICAgICAgICAgaWYgKHAgPCAyMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocCA8IDUwKQotICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPCA3MCkKLSAgICAgICAgICAgICAgICAgICAgY29tbWVudCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHJvY2luc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgeG1sRGVjbCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwZW5kKCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRlbnQgKCBpbnQgZGVwdGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggMTAgKSA7IGkgPiAwIDsgaS0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCByLm5leHRJbnQoIDQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRDb250ZW50KCBkZXB0aCArIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNhc2UgMSA6IHRleHQoKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMiA6IGNvbW1lbnQoKTsgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMyA6IHByb2NpbnN0KCk7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYXR0cmlidXRlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBuY05hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAwICkgPT0gMCkKLSAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotCi0gICAgICAgICAgICBhcHBlbmQoICc9JyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQotICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgIGNoYXIgcSA9IHIubmV4dEludCggMiApID09IDAgPyAnXCcnIDogJyInOwotCi0gICAgICAgICAgICBhcHBlbmQoIHEgKTsKLQotICAgICAgICAgICAgdGV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcHBlbmQoIHEgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnQgKCBpbnQgZGVwdGggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBkZXB0aCA9PSAwLCBndWFyYW50ZWUgYW4gZWxlbWVudCwgb3RoZXJ3aXNlLCBhcyBkZXB0aAotICAgICAgICAgICAgLy8gaW5jcmVhc2VzLCB0aGUgcHJvYmFibGlsaXR5IHdlJ2xsIHNwaXQgb3V0IGFuIGVsZW1lbnQKLSAgICAgICAgICAgIC8vIGdldHMgc21hbGxlci4KLQotICAgICAgICAgICAgaWYgKHIubmV4dEludCggZGVwdGggKyAxICkgPD0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1ha2VOY05hbWUoKTsKLQotICAgICAgICAgICAgICAgIGFwcGVuZCggJzwnICk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kKCBuYW1lICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotCi0gICAgICAgICAgICAgICAgSGFzaE1hcCBhdHRycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSByLm5leHRJbnQoIDMgKSA7IGkgPiAwIDsgaS0tICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggJyAnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5hbWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYW5hbWUgPSBtYWtlTmNOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJzLmNvbnRhaW5zS2V5KCBhbmFtZSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYXR0cnMucHV0KCBhbmFtZSwgbnVsbCApOwotCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggYW5hbWUgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICBhcHBlbmQoICc9JyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgcSA9IHIubmV4dEludCggMiApID09IDAgPyAnXCcnIDogJyInOwotCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcSApOwotCi0gICAgICAgICAgICAgICAgICAgIHRleHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIHEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAgKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcHBlbmQoICc+JyApOwotCi0gICAgICAgICAgICAgICAgY29udGVudCggZGVwdGggKTsKLQotICAgICAgICAgICAgICAgIGFwcGVuZCggIjwvIiApOwotICAgICAgICAgICAgICAgIGFwcGVuZCggbmFtZSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCi0gICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICBhcHBlbmQoICc+JyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBkb2N1bWVudCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHIubmV4dEludCggMiApID09IDApCi0gICAgICAgICAgICAgICAgeG1sRGVjbCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGl0ZUNvbnRlbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZWxlbWVudENvbnRlbnQoIDAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpdGVDb250ZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBtYWtlUmFuZG9tRG9jdW1lbnQgKCBSYW5kb20gciApCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgRG9jQnVpbGRlciBkYiA9IG5ldyBEb2NCdWlsZGVyKCByLCBzYiApOwotCi0gICAgICAgIGRiLmRvY3VtZW50KCk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUaGF0QXNzZXJ0SXNPbiAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBzdGF0aWMgY2xhc3MgTXlNYXJrIGV4dGVuZHMgWG1sQm9va21hcmsKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJvb2ttYXJrcyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geD0neSc+YWJjZGVmZzwhLS0tLT54eTwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgTXlNYXJrIG0xID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtMSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeU1hcmsgbTIgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG0yICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIE15TWFyayBtMyA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTMgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgTXlNYXJrIG00ID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtNCApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRDaGFyKCAxICk7Ci0gICAgICAgIE15TWFyayBtNSA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTUgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0Q2hhciggMyApOwotICAgICAgICBNeU1hcmsgbTYgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG02ICk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgTXlNYXJrIG03ID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtNyApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeU1hcmsgbTggPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG04ICk7Ci0KLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsgICAoIE15TWFyay5jbGFzcyApID09IG0xICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTMgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG00ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTYgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG03ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtOCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsgICAoIE15TWFyay5jbGFzcyApID09IG04ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTYgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG01ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTMgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG0yICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSdhJy8+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5zZXROYW1lKCBuZXcgUU5hbWUoICJiYXIiICkgKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnNldE5hbWUoIG5ldyBRTmFtZSggInkiICkgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhciB5PVwiYVwiLz4iICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyBCYXNpYyBsb2FkIHVwIGEgZmlsZSBhbmQgaXRlcmF0ZSB0aHJvdWdoIGl0Ci0gICAgLy8KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljWG1sKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgaW50IG4gPSAwOwotICAgICAgICAKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVG9rZW5UeXBlIHQgPSBjLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHQgPT0gVG9rZW5UeXBlLk5PTkUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuID09IDYgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIE1ha2Ugc3VyZSB0aGUgdG9rZW5zIGdvaW5nIGZvcndhcmQgdGhlIHRoZSByZXZlcnNlIG9mIHRoZSB0b2tlbnMKLSAgICAvLyBnb2luZyBiYWNrd2FyZAotICAgIC8vCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2lzdGVudFRva2VuT3JkZXIoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBsb2FkQ2FzZSgidGVzdC54bWwiKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotICAgICAgICAgICAgbC5hZGQoYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoYy50b05leHRUb2tlbigpID09IFRva2VuVHlwZS5OT05FKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oIlJldmVyc2luZyIpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gbC5zaXplKCkgLSAxIDsgOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsLmdldChpKSwgYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoYy50b1ByZXZUb2tlbigpID09IFRva2VuVHlwZS5OT05FKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBNYWtlIHN1cmUgeW91IGNhbid0IGluc2VydCB0ZXh0IGJlZm9yZSB0aGUgZG9jIGJlZ2luCi0gICAgLy8gZ29pbmcgYmFja3dhcmQKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxUZXh0SW5zZXJ0KCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuaW5zZXJ0Q2hhcnMoICJIbyBobyBobyIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJEaWQgbm90IGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIE1ha2Ugc3VyZSBnZXRUZXh0IHdvcmtzIGluIGEgYmFzaWMgd2F5Ci0gICAgLy8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RnZXRUZXh0KCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0VGV4dFZhbHVlKCkuZXF1YWxzKCAiYWIiICkgKTsgLy8gRG9jIG5vZGUKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldFRleHRWYWx1ZSgpLmVxdWFscyggImFiIiApICk7IC8vIERvYyBlbGVtCi0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJ5IiApICk7IC8vIEF0dHIgeAotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Q2hhcnMoKS5lcXVhbHMoICJhYiIgKSApOyAvLyBUZXh0Ci0KLSAgICAgICAgYy50b05leHRDaGFyKCAxICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldENoYXJzKCkuZXF1YWxzKCAiYiIgKSApOyAvLyBUZXh0Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRDaGFycygpLmxlbmd0aCgpID09IDAgKTsgICAgICAgLy8gRW5kIHRhZwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Q2hhcnMoKS5sZW5ndGgoKSA9PSAwICk7ICAgICAgIC8vIEVuZCBkb2MKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFRleHQgWE1MSW5wdXRTdHJlYW0gc3VwcG9ydAotICAgIC8vCi0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TmFtZSAoCi0gICAgICAgIFhNTE5hbWUgbmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsLCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBsb2NhbCAhPSBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZVVyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lTG9jYWwgPSBuYW1lLmdldExvY2FsTmFtZSgpOwotICAgICAgICBTdHJpbmcgbmFtZVByZWZpeCA9IG5hbWUuZ2V0UHJlZml4KCk7Ci0KLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWVVcmkgPT0gbnVsbCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVVyaS5lcXVhbHMoIHVyaSApICk7Ci0gICAgICAgIAotICAgICAgICBpZiAobG9jYWwgPT0gbnVsbCkKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lTG9jYWwgPT0gbnVsbCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZUxvY2FsLmVxdWFscyggbG9jYWwgKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWVQcmVmaXggPT0gbnVsbCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVByZWZpeC5lcXVhbHMoIHByZWZpeCApICk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBwcmVmaXggKyAiOiIgKyBsb2NhbDsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoIHFOYW1lICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCBsb2NhbCApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvWG1sU3RyZWFtVGVzdCAoIFN0cmluZyB4bWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geG1sU3RyZWFtID0gYy5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICBYbWxPYmplY3QgbyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWxTdHJlYW0gKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG8ueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TYXZlclRlc3QgKCBTdHJpbmcgeG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICkubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoIHhtbCApICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBkb1NhdmVUZXN0ICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvWG1sU3RyZWFtVGVzdCggeG1sICk7Ci0gICAgICAgIGRvU2F2ZXJUZXN0KCB4bWwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2aW5nICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1NhdmVUZXN0KCAiPGZvbyB4bWxucz1cImZvby5jb21cIj48YmFyPjE8L2Jhcj48L2Zvbz4iICk7Ci0gICAgICAgIGRvU2F2ZVRlc3QoICI8Zm9vPjwhLS1jb21tZW50LS0+PD90YXJnZXQgZm9vPz48L2Zvbz4iICk7Ci0gICAgICAgIGRvU2F2ZVRlc3QoICI8Zm9vPmE8YmFyPmI8L2Jhcj5jPGJhcj5kPC9iYXI+ZTwvZm9vPiIgKTsKLSAgICAgICAgZG9TYXZlVGVzdCggIjxmb28geG1sbnM6eD1cInlcIj48YmFyIHhtbG5zOng9XCJ6XCIvPjwvZm9vPiIgKTsKLSAgICAgICAgZG9TYXZlVGVzdCggIjxmb28geD1cInlcIiBwPVwiclwiLz4iICk7Ci0KLSAgICAgICAgU3RyaW5nIHMgPSAiPGZvbz5hYWE8L2Zvbz5iYmIiOwotICAgICAgICBzID0gcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzOwotICAgICAgICBzID0gIjxiYXI+eHh4eCIgKyBzICsgIjwvYmFyPiI7Ci0gICAgICAgIAotICAgICAgICBkb1NhdmVUZXN0KCBzICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHhtbG5zOmE9J2EuY29tJz48YmFyIHhtbG5zOmE9J2IuY29tJy8+PC9mb28+IiApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHhtbG5zOmE9XCJiLmNvbVwiLz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geG1sbnM6YT0nYS5jb20nPjxiYXIvPjwvZm9vPiIgKTsKLQotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHhtbG5zOmE9XCJhLmNvbVwiLz4iICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WE1MU3RyZWFtICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgbyA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGZvbyB4PVwieVwiIHhtbG5zPVwiZGVmYXVsdC5jb21cIj4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwhLS0geCAtLT5iYXI8L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBYbWxDdXJzb3IgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIAotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiYXIiLCAiYmFyLmNvbSIgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9TdGFydERvYygpOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxFdmVudCB4ZXY7Ci0gICAgICAgIFN0YXJ0RG9jdW1lbnQgc3RhcnREb2N1bWVudDsKLSAgICAgICAgRW5kRG9jdW1lbnQgZW5kRG9jdW1lbnQ7Ci0gICAgICAgIFN0YXJ0RWxlbWVudCBzdGFydEVsZW1lbnQ7Ci0gICAgICAgIEF0dHJpYnV0ZUl0ZXJhdG9yIGF0dHJpYnV0ZUl0ZXJhdG9yOwotICAgICAgICBTdGFydFByZWZpeE1hcHBpbmcgc3RhcnRQcmVmaXhNYXBwaW5nOwotICAgICAgICBFbmRQcmVmaXhNYXBwaW5nIGVuZFByZWZpeE1hcHBpbmc7Ci0gICAgICAgIENoYW5nZVByZWZpeE1hcHBpbmcgY3BtOwotICAgICAgICBFbmRFbGVtZW50IGVuZEVsZW1lbnQ7Ci0gICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0gICAgICAgIENvbW1lbnQgY29tbWVudDsKLSAgICAgICAgQ2hhcmFjdGVyRGF0YSBjaGFyYWN0ZXJEYXRhOwotICAgICAgICBYTUxOYW1lIG5hbWU7Ci0gICAgICAgIFN0cmluZyBzdHI7Ci0gICAgICAgIE1hcCBtYXA7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBzdGFydERvY3VtZW50ID0gKFN0YXJ0RG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnREb2N1bWVudC5pc1N0YXJ0RG9jdW1lbnQoKSApOwotICAgICAgICAKLSAgICAgICAgeGV2ID0gc3RhcnRQcmVmaXhNYXBwaW5nID0gKFN0YXJ0UHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNTdGFydFByZWZpeE1hcHBpbmcoKSApOwotICAgICAgICBzdHIgPSBzdGFydFByZWZpeE1hcHBpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAiZGVmYXVsdC5jb20iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0YXJ0UHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNTdGFydEVsZW1lbnQoKSApOwotICAgICAgICBhc3NlcnROYW1lKCBzdGFydEVsZW1lbnQuZ2V0TmFtZSgpLCAiZGVmYXVsdC5jb20iLCAiZm9vIiwgbnVsbCApOwotICAgICAgICBhdHRyaWJ1dGVJdGVyYXRvciA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0TmFtZSggYXR0cmlidXRlLmdldE5hbWUoKSwgbnVsbCwgIngiLCBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgPT0gbnVsbCApOwotICAgICAgICBhdHRyaWJ1dGVJdGVyYXRvciA9IHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0TmFtZSggYXR0cmlidXRlLmdldE5hbWUoKSwgbnVsbCwgInhtbG5zIiwgbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAiZGVmYXVsdC5jb20iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZXNBbmROYW1lc3BhY2VzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgIT0gbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpICE9IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIG5hbWUgPSBuZXcgWG1sTmFtZUltcGwoIG51bGwsICJ4IiwgbnVsbCApOwotICAgICAgICBhdHRyaWJ1dGUgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlQnlOYW1lKCBuYW1lICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUgIT0gbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAieSIgKSApOwotICAgICAgICBuYW1lID0gbmV3IFhtbE5hbWVJbXBsKCBudWxsLCAieG1sbnMiLCBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVCeU5hbWUoIG5hbWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZSA9PSBudWxsICk7Ci0gICAgICAgIHN0ciA9IHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VVcmkoIG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJkZWZhdWx0LmNvbSIgKSApOwotCi0gICAgICAgIHhldiA9IHN0YXJ0UHJlZml4TWFwcGluZyA9IChTdGFydFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzU3RhcnRQcmVmaXhNYXBwaW5nKCkgKTsKLSAgICAgICAgc3RyID0gc3RhcnRQcmVmaXhNYXBwaW5nLmdldE5hbWVzcGFjZVVyaSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggImJhci5jb20iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0YXJ0UHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJiYXIiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc1N0YXJ0RWxlbWVudCgpICk7Ci0gICAgICAgIGFzc2VydE5hbWUoIHN0YXJ0RWxlbWVudC5nZXROYW1lKCksICJiYXIuY29tIiwgImJhciIsICJiYXIiICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBhc3NlcnROYW1lKCBhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBudWxsLCAiYmFyIiwgInhtbG5zIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAiYmFyLmNvbSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpID09IG51bGwgKTsKLSAgICAgICAgYXR0cmlidXRlSXRlcmF0b3IgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSAhPSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgPT0gbnVsbCApOwotICAgICAgICBzdHIgPSBzdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlVXJpKCAiYmFyIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggImJhci5jb20iICkgKTsKLSAgICAgICAgbWFwID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbWFwLmdldCggImJhciIgKS5lcXVhbHMoICJiYXIuY29tIiApICk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkVORF9FTEVNRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNFbmRFbGVtZW50KCkgKTsKLSAgICAgICAgYXNzZXJ0TmFtZSggZW5kRWxlbWVudC5nZXROYW1lKCksICJiYXIuY29tIiwgImJhciIsICJiYXIiICk7Ci0KLSAgICAgICAgeGV2ID0gZW5kUHJlZml4TWFwcGluZyA9IChFbmRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNFbmRQcmVmaXhNYXBwaW5nKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGVuZFByZWZpeE1hcHBpbmcuZ2V0UHJlZml4KCkuZXF1YWxzKCAiYmFyIiApICk7Ci0KLSAgICAgICAgeGV2ID0gY29tbWVudCA9IChDb21tZW50KSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5DT01NRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY29tbWVudC5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNvbW1lbnQuZ2V0Q29udGVudCgpLmVxdWFscyggIiB4ICIgKSApOwotICAgICAgICAKLSAgICAgICAgeGV2ID0gY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5DSEFSQUNURVJfREFUQSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0NoYXJhY3RlckRhdGEoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImJhciIgKSApOwotCi0gICAgICAgIHhldiA9IGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZEVsZW1lbnQoKSApOwotICAgICAgICBhc3NlcnROYW1lKCBlbmRFbGVtZW50LmdldE5hbWUoKSwgImRlZmF1bHQuY29tIiwgImZvbyIsIG51bGwgKTsKLQotICAgICAgICB4ZXYgPSBjcG0gPSAoQ2hhbmdlUHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzQ2hhbmdlUHJlZml4TWFwcGluZygpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjcG0uZ2V0UHJlZml4KCkubGVuZ3RoKCkgPT0gMCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY3BtLmdldE9sZE5hbWVzcGFjZVVyaSgpLmVxdWFscyggImRlZmF1bHQuY29tIiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjcG0uZ2V0TmV3TmFtZXNwYWNlVXJpKCkuZXF1YWxzKCAiIiApICk7Ci0KLSAgICAgICAgeGV2ID0gZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkVORF9ET0NVTUVOVCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZERvY3VtZW50KCkgKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYgPT0gbnVsbCApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgQ2hhbmdlUHJlZml4TWFwcGluZyBldmVudAotICAgICAgICAvLwotCi0gICAgICAgIG8gPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geG1sbnM6eD1cInlcIj48YmFyIHhtbG5zOng9XCJ6XCIvPjwvZm9vPiIgKTsKLSAgICAgICAgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0UHJlZml4TWFwcGluZyA9IChTdGFydFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIHN0ciA9IHN0YXJ0UHJlZml4TWFwcGluZy5nZXROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdGFydFByZWZpeE1hcHBpbmcuZ2V0UHJlZml4KCkuZXF1YWxzKCAieCIgKSApOwotICAgICAgICAKLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBzdGFydFByZWZpeE1hcHBpbmcgPSAoU3RhcnRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBzdHIgPSBzdGFydFByZWZpeE1hcHBpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAieiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnRQcmVmaXhNYXBwaW5nLmdldFByZWZpeCgpLmVxdWFscyggIngiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgY3BtID0gKENoYW5nZVByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIHN0ciA9IGNwbS5nZXRPbGROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ6IiApICk7Ci0gICAgICAgIHN0ciA9IGNwbS5nZXROZXdOYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIHN0ciA9IGNwbS5nZXRQcmVmaXgoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ4IiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgZW5kUHJlZml4TWFwcGluZyA9IChFbmRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZW5kUHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJ4IiApICk7Ci0KLSAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBUZXN0IENoYXJhY3RlckRhdGEgZXZlbnRzCi0gICAgICAgIC8vCi0KLSAgICAgICAgbyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hPGJhcj5iPGJhej5jPC9iYXo+ZDwvYmFyPmU8L2Zvbz4iICk7Ci0gICAgICAgIGMgPSBvLm5ld0N1cnNvcigpOwotICAgICAgICB4aXMgPSBjLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgICAgIAotICAgICAgICBzdGFydERvY3VtZW50ID0gKFN0YXJ0RG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYSIgKSApOwotCi0gICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYiIgKSApOwotCi0gICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYyIgKSApOwotCi0gICAgICAgIGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJkIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJlIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBUZXN0IFN1YlN0cmVhbXMKLSAgICAgICAgLy8KLQotICAgICAgICBvID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmE8YmFyPmI8YmF6PmM8L2Jhej5kPC9iYXI+ZTwvZm9vPiIgKTsKLSAgICAgICAgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJhIiApICk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJiIiApICk7Ci0KLSAgICAgICAgICAgIFhNTElucHV0U3RyZWFtIHhpczIgPSB4aXMuZ2V0U3ViU3RyZWFtKCk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJjIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImQiICkgKTsKLQotICAgICAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzMi5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzMi5uZXh0KCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJjIiApICk7Ci0KLSAgICAgICAgICAgIGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzMi5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHhldiA9IHhpczIubmV4dCgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldiA9PSBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJlIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2RG9jICggWG1sT2JqZWN0IHgsIFN0cmluZyBkaXJzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYXZDdXJzb3IoIHgubmV3Q3Vyc29yKCksIGRpcnMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2TmV3Q3Vyc29yICggWG1sQ3Vyc29yIGMsIFN0cmluZyBkaXJzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYXZDdXJzb3IoIGMubmV3Q3Vyc29yKCksIGRpcnMgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIEZvcm1hdDoKLSAgICAvLwotICAgIC8vICAgICggWy1dW05dIHR5cGUgKSAqCi0gICAgLy8KLSAgICAvLyAgICB0eXBlOgotICAgIC8vCi0gICAgLy8gICAgICBjIC0gY2hhcmFjdGVyCi0gICAgLy8gICAgICB0IC0gdG9rZW4KLSAgICAvLyAgICAgIHAgLSBwYXJlbnQgZWxlbWVudAotICAgIC8vICAgICAgcyAtIHNpYmxpbmcgZWxlbWVudAotICAgIC8vICAgICAgZCAtIGRlc2NlbmRlbnQgKGNoaWxkKSBlbGVtZW50Ci0gICAgLy8gICAgICByIC0gZW5kIG9mIHRoZSBkb2MgKHJvb3QpCi0gICAgLy8gICAgICBiIC0gYmVnaW4gb2YgdGhlIGRvYwotICAgIC8vCi0gICAgCi0gICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2Q3Vyc29yICggWG1sQ3Vyc29yIGMsIFN0cmluZyBkaXJzICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gMDsKLSAgICAgICAgYm9vbGVhbiBwcmV2ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZGlycy5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBkaXJzLmNoYXJBdCggaSApOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJy0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByZXYgPSAhIHByZXY7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG4gPSBuICogMTAgKyAoY2ggLSAnMCcpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobiA9PSAwKQotICAgICAgICAgICAgICAgIG4gPSAxOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ2MnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcmV2KQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZDaGFyKCBuICkgPT0gbiApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Q2hhciggbiApID09IG4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICd0JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIG4tLSA+IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYpCi0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZUb2tlbigpICE9IFRva2VuVHlwZS5OT05FICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dFRva2VuKCkgIT0gVG9rZW5UeXBlLk5PTkUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAncCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgcHJldiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdyJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdiJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGMudG9TdGFydERvYygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ3MnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJldikKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlNpYmxpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnZCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgcHJldiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvRmlyc3RDaGlsZCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgcHJldiA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcHMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4LCB4MiwgeTsKLSAgICAgICAgWG1sQ3Vyc29yIGNGcm9tLCBjVG8sIGNUZW1wLCBjVGVtcDIsIGMsIGQ7Ci0gICAgICAgIFhtbEJvb2ttYXJrIGFubm87Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hYmNkZWY8L2Zvbz4iICk7Ci0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZCIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIiIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9ucy5wdXQoCi0gICAgICAgICAgICBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsCi0gICAgICAgICAgICBuZXcgUU5hbWUoIG51bGwsICJiYXIiICkgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxiYXI+W0ZST01dW1RPXTxmb28+YWJjZGVmPC9mb28+PC9iYXI+IiApIHx8Ci0gICAgICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj5bVE9dW0ZST01dPGZvbz5hYmNkZWY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZCIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgInR0dCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxiYXI+W0ZST01dPGZvbz5hYmNkZWY8L2Zvbz5bVE9dPC9iYXI+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hYmNkZWY8L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImQiICk7Ci0gICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJ0M2MiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoIG9wdGlvbnMgKS5lcXVhbHMoICI8YmFyPltGUk9NXTxmb28+YWJjW1RPXWRlZjwvZm9vPjwvYmFyPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48Yj5wcXI8L2I+PC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJyLTF0IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08Yj5wcXI8L2I+PGE+eHl6PC9hPltUT108L3I+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj5BQjwvcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAici0xdC0xYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHI+W0ZST01dPGI+cHFyPC9iPkE8YT54eXo8L2E+W1RPXUI8L3I+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj5BQjwvcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAic3RjIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08Yj5wPGE+eHl6PC9hPltUT11xcjwvYj5BQjwvcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PGI+cHFyPC9iPkFCPC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImQiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICB0ZXN0VGV4dEZyYWcoIHgueG1sVGV4dCgpLCAiPGE+eHl6PC9hPltUT108cj5bRlJPTV08Yj5wcXI8L2I+QUI8L3I+IiApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48Yj5wcXI8L2I+QUI8L3I+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiciIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj48cj5bRlJPTV08Yj5wcXI8L2I+QUI8L3I+PGE+eHl6PC9hPltUT108L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PC9yPiIgKTsKLSAgICAgICAgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxzPjwvcz4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgyLCAiZHQiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIHgueG1sVGV4dCgpLmVxdWFscyggIjxyPltGUk9NXTwvcj4iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgyLnhtbFRleHQoKS5lcXVhbHMoICI8cz48YT54eXo8L2E+W1RPXTwvcz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT5wcTwvYT48Yj48L2I+PC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImRkc3QiICk7Ci0gICAgICAgIGNUZW1wID0gbmF2RG9jKCB4LCAiZGR0MWMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLSAgICAgICAgY1RlbXAuaW5zZXJ0Q2hhcnMoICJbVEVNUF0iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV1bVEVNUF08Yj48YT5wcTwvYT5bVE9dPC9iPjwvcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMnQyYyIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIi0xYyIgKTsKLSAgICAgICAgY0Zyb20ubW92ZUNoYXJzKCAyLCBjVG8gKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmFjZFtUT11iW0ZST01dZWY8L2Zvbz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMnQyYyIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIjNjIiApOwotICAgICAgICBjRnJvbS5tb3ZlQ2hhcnMoIDIsIGNUbyApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscyggIjxmb28+YWJbRlJPTV1lY2RbVE9dZjwvZm9vPiIgKSApOwotICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vPmFiY2RlZjwvZm9vPjxmb28+MTIzNDU2PC9mb28+PC9iYXI+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIzdDJjIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAiM3QzYyIgKTsKLSAgICAgICAgY0Zyb20ubW92ZUNoYXJzKCAyLCBjVG8gKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgIjxiYXI+PGZvbz5hYltGUk9NXWVmPC9mb28+PGZvbz4xMjNjZFtUT100NTY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjxmb28+YWJjZGVmPC9mb28+PGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIyZHN0MmMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb3B5WG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj5bRlJPTV08Zm9vPmFiY2RlZjwvZm9vPjxmb28+MTIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8Zm9vPmFiY2RlZjwvZm9vPltUT10zNDU2PC9mb28+PC9iYXI+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48L3I+IiApOwotICAgICAgICB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHM+PC9zPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeDIsICJkdCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHI+W0ZST01dPGE+eHl6PC9hPjwvcj4iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgyLnhtbFRleHQoKS5lcXVhbHMoICI8cz48YT54eXo8L2E+W1RPXTwvcz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPGJhcj48Zm9vPmFiY2RlZjwvZm9vPmJsYWg8Zm9vPjEyMzQ1NjwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMmQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIjJkc3QyYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICI8YmFyPltGUk9NXTxmb28+YWJjZGVmPC9mb28+YmxhaDxmb28+MTIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8Zm9vPmFiY2RlZjwvZm9vPltUT10zNDU2PC9mb28+PC9iYXI+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxiYXI+PGZvbyB4PSd5Jz5hYmNkZWY8L2Zvbz48Zm9vPjEyMzQ1NjwvZm9vPjc4OTA8L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkdCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmRzdCIgKTsKLSAgICAgICAgY1RlbXAgPSBuYXZEb2MoIHgsICIyZHN0M2MiICk7Ci0gICAgICAgIGNUZW1wMiA9IG5hdkRvYyggeCwgIjJkczN0MmMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb3B5WG1sKCBjVG8gKSApOwotICAgICAgICBjVGVtcC5pbnNlcnRDaGFycyggIltURU1QXSIgKTsKLSAgICAgICAgY1RlbXAyLmluc2VydENoYXJzKCAiW1RFTVAyXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj48Zm9vIHg9XCJ5XCI+YWJjZGVmPC9mb28+IiArCi0gICAgICAgICAgICAgICAgICAgICI8Zm9vIHg9XCJ5XCI+MTIzW1RFTVBdNDU2PC9mb28+NzhbVEVNUDJdOTA8L2Jhcj4iICkgKTsKLQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxiYXI+eHk8Zm9vIHg9J3knPmFiY2RlZjwvZm9vPnBxcjxmb28+MTIzNDU2PC9mb28+PC9iYXI+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIyZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmRzLTJjIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLnJlbW92ZVhtbCgpICk7Ci0KLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgIjxiYXI+eHlbRlJPTV1wW1RPXXFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPGJhcj54eTxmb28geD0neSc+YWJjZGVmPC9mb28+cHFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkMnQyYyIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmQydDVjIiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20ucmVtb3ZlQ2hhcnMoIDIgKTsKLQotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj54eTxmb28geD1cInlcIj5hYltGUk9NXWVbVE9dZiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9mb28+cHFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjwhLS0tLT5hYmM8L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgInR0IiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJ0dHRjIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLnJlbW92ZVhtbCgpICk7Ci0KLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+W0ZST01dYVtUT11iYzwvYmFyPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJ0IiApOwotICAgICAgICBjVG8uaW5zZXJ0RWxlbWVudCggImJvbyIgKTsKLSAgICAgICAgY1RvLnRvUHJldlRva2VuKCk7Ci0gICAgICAgIGNUby5pbnNlcnRFbGVtZW50KCAibW9vIiApOwotICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKLSAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJnb28iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICI8Ym9vPjxtb28+PGdvby8+PC9tb28+PC9ib28+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInQiICk7Ci0gICAgICAgIGNUby5pbnNlcnRFbGVtZW50KCAiYm9vIiApOwotICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKLSAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJtb28iICk7Ci0gICAgICAgIGNUby50b1ByZXZUb2tlbigpOwotICAgICAgICBjVG8uaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCAieCIsICJ5IiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoCi0gICAgICAgICAgICAiPGJvbz48bW9vIHg9XCJ5XCIvPjwvYm9vPiIgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhciB4PSd5Jz5hYmM8L2Jhcj4iICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInR0IiApOwotICAgICAgICBjVG8uaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCAicCIsICJxIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICI8YmFyIHA9XCJxXCIgeD1cInlcIj5hYmM8L2Jhcj4iICkgKTsKLQotICAgICAgICAvLyBUZXh0IFhtbEJvb2ttYXJrCi0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGZvbz5hYmM8L2Zvbz48YmFyPjwvYmFyPjwvcj4iICk7Ci0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAidHQiICk7Ci0gICAgICAgIGFubm8gPSBuZXcgQW5ubygpOwotICAgICAgICBjRnJvbS5zZXRCb29rbWFyayggYW5ubyApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICI2dCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotICAgICAgICBhbm5vLmNyZWF0ZUN1cnNvcigpLmluc2VydENoYXJzKCAiW0FOTk9dIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICI8cj5bRlJPTV08YmFyPltBTk5PXTxmb28+YWJjPC9mb28+W1RPXTwvYmFyPjwvcj4iICkgKTsKLQotICAgICAgICAvLyBUZXN0IGNvbnRlbnQgb3BzCi0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hYmM8L2Zvbz4iICk7Ci0gICAgICAgIHkgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkID0geS5uZXdDdXJzb3IoKTsKLSAgICAgICAgZC50b05leHRUb2tlbigpOwotICAgICAgICB4Lm5ld0N1cnNvcigpLm1vdmVYbWxDb250ZW50cyggZCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeS54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwieVwiPmFiYzwvZm9vPiIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vIHg9J3knPmFiYzwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgeSA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGQgPSB5Lm5ld0N1cnNvcigpOwotICAgICAgICBkLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMubW92ZVhtbENvbnRlbnRzKCBkICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB5LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vIHg9XCJ5XCI+YWJjPC9mb28+IiApICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vIHg9J3knPmFiYzwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5yZW1vdmVYbWxDb250ZW50cygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhci8+IiApICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hYmM8L2Zvbz4iICk7Ci0gICAgICAgIHkgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkID0geS5uZXdDdXJzb3IoKTsKLSAgICAgICAgZC50b05leHRUb2tlbigpOwotICAgICAgICB4Lm5ld0N1cnNvcigpLmNvcHlYbWxDb250ZW50cyggZCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeS54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwieVwiPmFiYzwvZm9vPiIgKSApOwotICAgIH0gICAgICAgIAotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vIGV4dGVuZHMgWG1sQm9va21hcmsKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgWG1sQ3Vyc29yIGNUbzsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmEmbHQ7YiZhbXA7YzwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmEmbHQ7YiZhbXA7YzwvZm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImR0IiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICImPCIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPiZhbXA7Jmx0OzwvZm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjxib28+YmFyPC9ib28+PC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiZHQiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLnhtbFRleHQoKS5lcXVhbHMoICI8Ym9vPmJhcjwvYm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjxib28geD1cInlcIj5iYXI8L2Jvbz48L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJkdCIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxib28geD1cInlcIj5iYXI8L2Jvbz4iICkgKTsKLQotICAgICAgICAvLyBUZXN0cyBmcmFnbWVudCBzYXZpbmcgYW5kIGxvYWRpbmcKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+RXJpYzwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImR0IiApOwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggY1RvLnhtbFRleHQoKSApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNUby5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJFcmljIiApICk7Ci0KLSAgICAgICAgLy8gdGVzdCBzYXZlIHdoZXJlIEkgcmVwbGFjZSB0aGUgbmFtZSBvZiBhbiBlbGVtZW50Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPkVyaWM8L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJkIiApOwotCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb25zLnB1dCgKLSAgICAgICAgICAgIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCwKLSAgICAgICAgICAgIG5ldyBRTmFtZSggbnVsbCwgImJhciIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBjVG8ueG1sVGV4dCggb3B0aW9ucyApICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyPkVyaWM8L2Jhcj4iICkgKTsKLQotICAgICAgICAvLyB0ZXN0IHNhdmUgd2hlcmUgSSByZXBsYWNlIHRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudAotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5FcmljPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotCi0gICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9ucy5wdXQoCi0gICAgICAgICAgICBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsCi0gICAgICAgICAgICBuZXcgUU5hbWUoIG51bGwsICJiYXIiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggY1RvLnhtbFRleHQoIG9wdGlvbnMgKSApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+PGZvbz5FcmljPC9mb28+PC9iYXI+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhIHhtbG5zPSdmb28nLz4iICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICBjLnRvRmlyc3RDb250ZW50VG9rZW4oKTsKLQotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiIiApOwotICAgICAgICBjLnRvUHJldlNpYmxpbmcoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImIiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeC54bWxUZXh0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICAKLSAgICAgICAgYy50b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGMudG9GaXJzdENvbnRlbnRUb2tlbigpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJiIiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RUZXh0RnJhZyAoIFN0cmluZyBhY3R1YWwsIFN0cmluZyBleHBlY3RlZCApCi0gICAgewotICAgICAgICBTdHJpbmcgcHJlID0gIjx4bWwtZnJhZ21lbnQ+IjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwb3N0ID0gIjwveG1sLWZyYWdtZW50PiI7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYWN0dWFsLnN0YXJ0c1dpdGgoIHByZSApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhY3R1YWwuZW5kc1dpdGgoIHBvc3QgKSApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICBleHBlY3RlZC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgYWN0dWFsLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcHJlLmxlbmd0aCgpLCBhY3R1YWwubGVuZ3RoKCkgLSBwb3N0Lmxlbmd0aCgpICkgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZyYWcgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICBYbWxDdXJzb3IgYzsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAKLSAgICAgICAgYy5pbnNlcnRDaGFycyggIkVyaWMiICk7Ci0KLSAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIkVyaWMiICk7Ci0KLSAgICAgICAgLy8KLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgYy5pbnNlcnRDb21tZW50KCAiIiApOwotICAgICAgICBjLmluc2VydENoYXJzKCAieCIgKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RUZXh0RnJhZyggeC54bWxUZXh0KCksICI8IS0tLS0+eCIgKTsKLQotICAgICAgICAvLwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJmb28iICk7Ci0gICAgICAgIGMuaW5zZXJ0Q2hhcnMoICJ4IiApOwotICAgICAgICAKLSAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIjxmb28vPngiICk7Ci0gICAgICAgIAotICAgICAgICAvLwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJmb28iICk7Ci0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImJhciIgKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RUZXh0RnJhZyggeC54bWxUZXh0KCksICI8Zm9vLz48YmFyLz4iICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5MT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgeCA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGJhciBwPSdxJyB4PSd5Jz5hYjxmb28+eHk8L2Zvbz5jZDwvYmFyPiIsIG9wdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbEN1cnNvciBjID0gbmF2RG9jKCB4LCAidCIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBUb2tlblR5cGUuQVRUUiApOwotCi0gICAgICAgIFN0cmluZyBvcGVuID0gInhtbG5zOm9wZW49J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQnIjsKLSAgICAgICAgCi0gICAgICAgIHggPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxvcGVuOmZyYWdtZW50IHA9J3EnIHg9J3knICIgKyBvcGVuICsKLSAgICAgICAgICAgICAgICAgICAgIj5hYjxmb28+eHk8L2Zvbz5jZDwvb3BlbjpmcmFnbWVudD4iICk7Ci0gICAgICAgIAotICAgICAgICBjID0gbmF2RG9jKCB4LCAidCIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBUb2tlblR5cGUuQVRUUiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIFhtbEN1cnNvciBjRnJvbSwgY1RvOwotCi0gICAgICAgIC8vIEZvcndhcmQgbmF2aWdhdGlvbiAKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXIgcD0ncScgeD0neSc+YWI8Zm9vPnh5PC9mb28+Y2Q8L2Jhcj4iICk7Ci0KLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIiIgKTsKLSAgICAgICAgICAgIAotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29tcGFyZVBvc2l0aW9uKCBjVG8gKSA9PSAwICk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uaXNBdFNhbWVQb3NpdGlvbkFzKCBjVG8gKSApOwotCi0gICAgICAgICAgICBUb2tlblR5cGUgdHQgPSBjRnJvbS5jdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0dCA9PSBUb2tlblR5cGUuRU5ERE9DKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHQgPT0gVG9rZW5UeXBlLlRFWFQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY0Zyb20udG9OZXh0Q2hhciggMSApOwotICAgICAgICAgICAgICAgIGNUby50b05leHRDaGFyKCAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY0Zyb20udG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBjVG8udG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJhY2t3YXJkIG5hdmlnYXRpb24gCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyIHA9J3EnIHg9J3knPmFiPGZvbz54eTwvZm9vPmNkPC9iYXI+IiApOwotCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiciIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiciIgKTsKLSAgICAgICAgICAgIAotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29tcGFyZVBvc2l0aW9uKCBjVG8gKSA9PSAwICk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uaXNBdFNhbWVQb3NpdGlvbkFzKCBjVG8gKSApOwotCi0gICAgICAgICAgICBpZiAoY0Zyb20udG9QcmV2Q2hhciggMSApID09IDEpCi0gICAgICAgICAgICAgICAgY1RvLnRvUHJldkNoYXIoIDEgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNGcm9tLnRvUHJldlRva2VuKCkgIT0gVG9rZW5UeXBlLk5PTkUpCi0gICAgICAgICAgICAgICAgY1RvLnRvUHJldlRva2VuKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxiYXIgcD0ncScgeD0neSc+YWI8Zm9vPnh5PC9mb28+YzxmIHk9J3gnPnh5PC9mPmQ8L2Jhcj4iICk7Ci0KLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIiICk7Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjVG8uaXNBdFNhbWVQb3NpdGlvbkFzKCBjRnJvbSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFwYXNzZWQgKTsKLSAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY1RvLmlzTGVmdE9mKCBjRnJvbSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFwYXNzZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHBhc3NlZCApOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLmlzUmlnaHRPZiggY0Zyb20gKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY1RvLnRvTmV4dENoYXIoIDEgKSAhPSAxKQotICAgICAgICAgICAgICAgICAgICBpZiAoY1RvLnRvTmV4dFRva2VuKCkgPT0gVG9rZW5UeXBlLkVORERPQykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY0Zyb20udG9OZXh0Q2hhciggMSApICE9IDEpCi0gICAgICAgICAgICAgICAgaWYgKGNGcm9tLnRvTmV4dFRva2VuKCkgPT0gVG9rZW5UeXBlLkVORERPQykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgTXlBbm5vIGV4dGVuZHMgWG1sQm9va21hcmsKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24gKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeUFubm8gYSA9IG5ldyBNeUFubm8oKTsKLSAgICAgICAgYy5zZXRCb29rbWFyayggYSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5yZW1vdmVYbWwoKSApOwotICAgICAgICBYbWxDdXJzb3IgYzIgPSBhLmNyZWF0ZUN1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYzIgPT0gbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0clNldHRlciAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28vPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMuc2V0QXR0cmlidXRlVGV4dCggbmV3IFFOYW1lKCBudWxsLCAieCIgKSwgImhhcmRlaGFyIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwiaGFyZGVoYXJcIi8+IiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGE+PHgvPjx5Lz48ei8+PC9hPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gZmFsc2UgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2U2libGluZygpID09IGZhbHNlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvRmlyc3RBdHRyaWJ1dGUoKSA9PSBmYWxzZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b0xhc3RBdHRyaWJ1dGUoKSA9PSBmYWxzZSApOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggInkiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggInoiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IGZhbHNlICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGEgcD0ncScgbT0nbic+PHgvPjx5Lz48ei8+PC9hPiIgKTsKLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5jdXJyZW50VG9rZW5UeXBlKCkuaXNBdHRyKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2U2libGluZygpID09IGZhbHNlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKS5pc0F0dHIoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieCIgKSApOwotCi0gICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieCIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gZmFsc2UgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1BhcmVudCgpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImEiICkgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhPm1vbzwhLS0tLT5mb288L2E+IiApOwotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYSIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7Ci0KLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRDaGFyKCAyICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYSIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5lYXJseTxiYXI+dGV4dDxjaGFyPnphcDwvY2hhcj48L2Jhcj48L2Zvbz4iICk7Ci0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9GaXJzdENoaWxkKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJ6YXAiICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YSB4PSd5Jz5lcmljPCEtLS0tPjw/bW9vPz48L2E+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJ4IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJtb28iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhcnMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZmdoaWprbDwvZm9vPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRDaGFyKCAyICk7Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbIDMgXTsKLSAgICAgICAgaW50IG4gPSBjLmdldENoYXJzKCBidWYsIDAsIDQwMCApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuID09IDMgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlswXSA9PSAnYycgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlsxXSA9PSAnZCcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlsyXSA9PSAnZScgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVzcGFjZVN1YnN0aXR1dGlvbiAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSGFzaE1hcCBzdWJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgc3Vicy5wdXQoICJmb28iLCAibW9vIiApOwotICAgICAgICBzdWJzLnB1dCggImEiLCAiYiIgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkxPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTLCBzdWJzICk7Ci0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0IHggPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxhIHhtbG5zPSdmb28nIHhtbG5zOmE9J2EnIGE6eD0neScvPiIsCi0gICAgICAgICAgICAgICAgb3B0aW9ucyApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoICJtb28iICkgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggIm1vbyIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAiYiIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAiYiIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZXNwYWNlSW5zZXJ0aW9uICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5pbnNlcnRFbGVtZW50KCAiZm9vIiwgImh0dHA6Ly9wLmNvbSIgKTsKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBjLmluc2VydE5hbWVzcGFjZSggInAiLCAiaHR0cDovL3AuY29tIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHA6Zm9vIHhtbG5zOnA9XCJodHRwOi8vcC5jb21cIi8+IiApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvdGVzdFBhcnNlciAoIFN0cmluZyB4bWwsIFN0cmluZyB4bWxSZXN1bHQgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHgueG1sVGV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeG1sUmVzdWx0LmVxdWFscyggcmVzdWx0ICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRvdGVzdFBhcnNlckVycm9ycyAoIFN0cmluZyB4bWwgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmlsICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IG5vTmFtZXNwYWNlLkNhbkJlTmlsRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSggIjxjYW5CZU5pbC8+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIFhtbE9iamVjdCBmYyA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhIGZjLmlzTmlsKCkgKTsKLSAgICAgICAgZmMuc2V0TmlsKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYy5pc05pbCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Y2FuQmVOaWwgeHNpOm5pbD1cInRydWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiLz4iICkgKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5pc0F0dHIoKSApOwotICAgICAgICBjLnJlbW92ZVhtbCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGNhbkJlTmlsLz4iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgZmMuaXNOaWwoKSApOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8aGVlIHllZT0nZml2ZSc+PGhhdz42NjwvaGF3PjwvYW55PiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz48L21vbz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxhPjxmb28+PC9tb28+PC9hPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiIiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICIgICAgIiApOwotICAgICAgICAKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiaGFyIiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8IS0tIGNvbW1lbnQgLS0+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8P21vbz8+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxhJC8+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8Zm9vIGE9JzwnPjwvZm9vPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbyBhPjwvZm9vPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjwvZm9vPiIgKTsKLS8vIEZpeCB0aGUgcGFyc2VyIHRvIG1ha2UgdGhlc2Ugd29yawotLy8gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxmb28+PCEtLSAtLSAtLT48L2Zvbz4iICk7Ci0vLyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz48IS0tIC0tLT48L2Zvbz4iICk7Ci0KLSAgICAgICAgZG90ZXN0UGFyc2VyKCAiPGEgYj1cInhcblxueVwiLz4iLCAiPGEgYj1cInggIHlcIi8+IiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F4UGFyc2VyICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgeG1sID0gICI8YSB4PSd5Jz48IS0tLS0+eDxiLz48YyBwPSdxJz56PC9jPjwvYT4iOwotICAgICAgICAKLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNBWFBhcnNlciBzcCA9IHNwZi5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgWE1MUmVhZGVyIHhyID0gc3AuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAgeG1sICkgKTsKLSAgICAgICAgWG1sU2F4SGFuZGxlciBzaCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld1htbFNheEhhbmRsZXIoKTsKLSAgICAgICAgCi0gICAgICAgIHhyLnNldEZlYXR1cmUoCi0gICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCi0gICAgICAgICAgICB0cnVlICk7Ci0KLSAgICAgICAgeHIuc2V0RmVhdHVyZSgKLSAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKLQotICAgICAgICB4ci5zZXRGZWF0dXJlKAotICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLQotICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggc2guZ2V0Q29udGVudEhhbmRsZXIoKSApOwotICAgICAgICAKLSAgICAgICAgeHIuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwKLSAgICAgICAgICAgIHNoLmdldExleGljYWxIYW5kbGVyKCkgKTsKLQotICAgICAgICB4ci5wYXJzZSggaXMgKTsKLQotICAgICAgICBYbWxPYmplY3QgeDEgPSBzaC5nZXRPYmplY3QoKTsKLQotICAgICAgICBYbWxPYmplY3QgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgxLnhtbFRleHQoKS5lcXVhbHMoIHgyLnhtbFRleHQoKSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZGl0aW9uYWxOYW1lc3BhY2VzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHhtbCA9ICI8YSB4bWxuczphPSdhTlMnPjxhOmIvPjwvYT4iOwotCi0gICAgICAgIE1hcCBtYXAgPSBuZXcgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgbWFwLnB1dCgiYiIsICJiTlMiKTsKLSAgICAgICAgbWFwLnB1dCgiYyIsICJjTlMiKTsKLSAgICAgICAgbWFwLnB1dCgiYSIsICJub3QtYU5TIik7Ci0KLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXMobWFwKTsKLQotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhtbCwgb3B0aW9ucyk7Ci0KLSAgICAgICAgLy8gJ2EnIHByZWZpeCBuYW1lc3BhY2UgaXMgbm90IHJlbWFwcGVkCi0gICAgICAgIFN0cmluZyBleHBlY3QgPSAiPGEgeG1sbnM6Yz1cImNOU1wiIHhtbG5zOmI9XCJiTlNcIiB4bWxuczphPVwiYU5TXCI+PGE6Yi8+PC9hPiI7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGV4cGVjdCwgeC54bWxUZXh0KCkgKTsKLQotICAgICAgICB4bWwgPSAiPGEgeG1sbnM9J2FOUyc+PGIvPjwvYT4iOwotCi0gICAgICAgIG1hcCA9IG5ldyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBtYXAucHV0KCJiIiwgImJOUyIpOwotICAgICAgICBtYXAucHV0KCJjIiwgImNOUyIpOwotICAgICAgICBtYXAucHV0KCIiLCAibm90LWFOUyIpOwotCi0gICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlcyhtYXApOwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSh4bWwsIG9wdGlvbnMpOwotCi0gICAgICAgIC8vIGRlZmF1bHQgbmFtZXNwYWNlIGlzIG5vdCByZW1hcHBlZAotICAgICAgICBleHBlY3QgPSAiPGEgeG1sbnM6Yz1cImNOU1wiIHhtbG5zOmI9XCJiTlNcIiB4bWxucz1cImFOU1wiPjxiLz48L2E+IjsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggZXhwZWN0LCB4LnhtbFRleHQoKSApOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENSMTM1MTkzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHhtbCA9ICI8YSB4bWxucz0nYU5TJyB4bWxuczpiPSdiTlMnPjxiPjxjLz48L2I+PC9hPiI7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSh4bWwpOwotCi0gICAgICAgIC8vIGdldCBhbiBYTUxJbnB1dFN0cmVhbSBhbmQgbW92ZSB0byBYTUxFdmVudC5TVEFSVF9FTEVNRU5UIGZvciAnYicKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMgPSBjLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB3aGlsZSAoeGlzLmhhc05leHQoKSAmJiB4aXMubmV4dCgpLmdldFR5cGUoKSAhPSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXBhcnNlIGZyb20gJ2InIGVsZW1lbnQgdXNpbmcgYW4gc3ViLVhNTElucHV0U3RyZWFtCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhpczEgPSB4aXMuZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIFhtbE9iamVjdCB4MSA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhpczEpOwotCi0gICAgICAgIC8vIENSMTM1MTkzOiBuYW1lc3BhY2VzIGluY2x1ZGluZyBkZWZhdWx0IGFyZSBzZXQgb24gdGhlICdiJyBjaGlsZAotICAgICAgICBTdHJpbmcgZXhwZWN0ID0gIjxiIHhtbG5zPVwiYU5TXCIgeG1sbnM6Yj1cImJOU1wiPjxjLz48L2I+IjsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggZXhwZWN0LCB4MS54bWxUZXh0KCkgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdWJzdEdyb3VwVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdWJzdEdyb3VwVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlODA4My4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3Vic3RHcm91cFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9ybWFsaXplZFN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy8gVHlwZXMgZnJvbSBzdWJzdGdyb3VwLnhzZAotaW1wb3J0IG9yZy5vcGVudXJpLnNncy5BRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkuc2dzLkJEb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5zZ3MuQ0RvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLnNncy5Sb290RG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFN1YnN0R3JvdXBUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIFN1YnN0R3JvdXBUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3Vic3RHcm91cFRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbDEgPSAiPHJvb3QgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPiIgKwotICAgICAgICAgICAgIjxBPlx0YVx0YVx0PC9BPiIgKwotICAgICAgICAgICAgIjxCPlx0Ylx0Ylx0PC9CPiIgKwotICAgICAgICAgICAgIjxDPlx0Y1x0Y1x0PC9DPiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iOwotCi0KLSAgICAgICAgUm9vdERvY3VtZW50IGRvYzEgPSBSb290RG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4bWwxKTsKLSAgICAgICAgUm9vdERvY3VtZW50LlJvb3Qgcm9vdCA9IGRvYzEuZ2V0Um9vdCgpOwotICAgICAgICBhc3NlcnRUcnVlKGRvYzEudmFsaWRhdGUoKSk7Ci0KLSAgICAgICAgWG1sU3RyaW5nIGEgPSByb290LnhnZXRBQXJyYXkoMCk7Ci0gICAgICAgIGFzc2VydFRydWUoYS5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbFN0cmluZy50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXHRhXHRhXHQiLCBhLnN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgIFhtbFN0cmluZyBiID0gcm9vdC54Z2V0QUFycmF5KDEpOwotICAgICAgICBhc3NlcnRUcnVlKGIuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxOb3JtYWxpemVkU3RyaW5nLnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIgYiBiICIsIGIuc3RyaW5nVmFsdWUoKSk7Ci0KLSAgICAgICAgWG1sU3RyaW5nIGMgPSByb290LnhnZXRBQXJyYXkoMik7Ci0gICAgICAgIGFzc2VydFRydWUoYy5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbFRva2VuLnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIGMiLCBjLnN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgIHJvb3QuaW5zZXJ0QSgyLCAiZCBkIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZCBkIiwgcm9vdC5nZXRBQXJyYXkoMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcm9vdC5zaXplT2ZBQXJyYXkoKSk7Ci0gICAgICAgIHJvb3QucmVtb3ZlQSgyKTsKLQotICAgICAgICByb290LnJlbW92ZUEoMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYyBjIiwgcm9vdC5nZXRBQXJyYXkoMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcm9vdC5zaXplT2ZBQXJyYXkoKSk7Ci0KLSAgICAgICAgcm9vdC5hZGRBKCJmIGYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJvb3Quc2l6ZU9mQUFycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImYgZiIsIHJvb3QuZ2V0QUFycmF5KDIpKTsKLQotICAgICAgICAvLyBUZXN0IGFycmF5IHNldHRlcnMKLQotICAgICAgICAvLyB0ZXN0IG0gPCBuIGNhc2UKLSAgICAgICAgU3RyaW5nW10gc21hbGxlciA9IG5ldyBTdHJpbmdbXXsgIngiLCAieSIgfTsKLSAgICAgICAgcm9vdC5zZXRBQXJyYXkoc21hbGxlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByb290LnNpemVPZkFBcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ5Iiwgcm9vdC5nZXRBQXJyYXkoMSkpOwotCi0gICAgICAgIC8vIHRlc3QgbSA+IG4gY2FzZQotICAgICAgICBTdHJpbmdbXSBsYXJnZXIgPSBuZXcgU3RyaW5nW10geyAicCIsICJxIiwgInIiLCAicyIgfTsKLSAgICAgICAgcm9vdC5zZXRBQXJyYXkobGFyZ2VyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJvb3Quc2l6ZU9mQUFycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInIiLCByb290LmdldEFBcnJheSgyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbDEgPSAiPEEgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPlx0YVx0YVx0PC9BPiI7Ci0gICAgICAgIFN0cmluZyB4bWwyID0gIjxCIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvc2dzJz5cdGJcdGJcdDwvQj4iOwotICAgICAgICBTdHJpbmcgeG1sMyA9ICI8QyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+XHRjXHRjXHQ8L0M+IjsKLQotICAgICAgICBBRG9jdW1lbnQgZDEgPSBBRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4bWwxKTsKLSAgICAgICAgWG1sU3RyaW5nIGEgPSBkMS54Z2V0QSgpOwotICAgICAgICBhc3NlcnRUcnVlKGEuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxTdHJpbmcudHlwZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlx0YVx0YVx0IiwgYS5zdHJpbmdWYWx1ZSgpKTsKLQotICAgICAgICBBRG9jdW1lbnQgZDIgPSBBRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4bWwyKTsKLSAgICAgICAgWG1sU3RyaW5nIGIgPSBkMi54Z2V0QSgpOwotICAgICAgICBhc3NlcnRUcnVlKGQyLnNjaGVtYVR5cGUoKS5lcXVhbHMoQkRvY3VtZW50LnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShiLnNjaGVtYVR5cGUoKS5lcXVhbHMoWG1sTm9ybWFsaXplZFN0cmluZy50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIGIgYiAiLCBiLnN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgIEFEb2N1bWVudCBkMyA9IEFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHhtbDMpOwotICAgICAgICBYbWxTdHJpbmcgYyA9IGQzLnhnZXRBKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZDMuc2NoZW1hVHlwZSgpLmVxdWFscyhDRG9jdW1lbnQudHlwZSkpOwotICAgICAgICBhc3NlcnRUcnVlKGMuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxUb2tlbi50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYyBjIiwgYy5zdHJpbmdWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGludmFsaWRTY2hlbWFzID0gCi0gICAgewotICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQScgdHlwZT0neHNkOnN0cmluZycvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0InIHR5cGU9J3hzZDppbnQnIHN1YnN0aXR1dGlvbkdyb3VwPSdBJy8+ICIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCi0gICAgICAgICIgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz4gIiArCi0gICAgICAgICIgICAgPHhzZDpzZXF1ZW5jZT4gIiArCi0gICAgICAgICIgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0nYmFyJyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiIgKwotICAgICAgICAiICAgIDwveHNkOnNlcXVlbmNlPiAiICsKLSAgICAgICAgIiAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnIGZpbmFsPScjYWxsJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQicgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnIGZpbmFsPSdyZXN0cmljdGlvbicvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0InIHR5cGU9J3hzZDp0b2tlbicgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdCJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQicgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0MnLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdDJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nRCcvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0QnIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdFJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nRScgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDp0b2tlbicgc3Vic3RpdHV0aW9uR3JvdXA9J0InLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdCJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0NvbXBsZXgnPiAiICsKLSAgICAgICAgIiAgICA8eHNkOmNvbXBsZXhUeXBlPiAiICsKLSAgICAgICAgIiAgICAgIDx4c2Q6Y2hvaWNlPiAiICsKLSAgICAgICAgIiAgICAgICAgPHhzZDplbGVtZW50IHJlZj0nQScvPiIgKwotICAgICAgICAiICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSdCJy8+IiArCi0gICAgICAgICIgICAgICA8L3hzZDpjaG9pY2U+ICIgKwotICAgICAgICAiICAgIDwveHNkOmNvbXBsZXhUeXBlPiAiICsKLSAgICAgICAgIiAgPC94c2Q6ZWxlbWVudD4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB2YWxpZFNjaGVtYXMgPSAKLSAgICB7Ci0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKLSAgICAgICAgIiAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJz4iICsKLSAgICAgICAgIiAgICA8eHNkOmFsbD4iICsKLSAgICAgICAgIiAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J2hlYWQnLz4iICsKLSAgICAgICAgIiAgICA8L3hzZDphbGw+IiArCi0gICAgICAgICIgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAiICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3RyJz4iICsKLSAgICAgICAgIiAgICA8eHNkOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAiICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZSc+IiArCi0gICAgICAgICIgICAgICAgICA8eHNkOmFsbD4iICsKLSAgICAgICAgIiAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ndGFpbCcvPiIgKwotICAgICAgICAiICAgICAgICAgPC94c2Q6YWxsPiIgKwotICAgICAgICAiICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPiIgKwotICAgICAgICAiICAgIDwveHNkOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAiICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J2hlYWQnIHR5cGU9J3hzZDpzdHJpbmcnLz4iICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J3RhaWwnIHN1YnN0aXR1dGlvbkdyb3VwPSdoZWFkJy8+IiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICB9OwotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTY2hlbWFEb2N1bWVudFtdIHNjaGVtYXMgPSBuZXcgU2NoZW1hRG9jdW1lbnRbaW52YWxpZFNjaGVtYXMubGVuZ3RoXTsKLQotICAgICAgICAvLyBQYXJzZSB0aGUgaW52YWxpZCBzY2hlbWEgZmlsZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgaW52YWxpZFNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgc2NoZW1hc1tpXSA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoaW52YWxpZFNjaGVtYXNbaV0pOwotCi0gICAgICAgIC8vIE5vdyBjb21waWxlIHRoZSBpbnZhbGlkIHNjaGVtYXMsIHRlc3QgdGhhdCB0aGV5IGZhaWwKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10ge3NjaGVtYXNbaV19KTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTY2hlbWEgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGNvbXBpbGU6XG4iICsgaW52YWxpZFNjaGVtYXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBzdWNjZXNzKSB7IC8qIFN5c3RlbS5vdXQucHJpbnRsbihzdWNjZXNzKTsgKi8gfQotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBQYXJzZSB0aGUgdmFsaWQgc2NoZW1hIGZpbGVzCi0gICAgICAgIHNjaGVtYXMgPSBuZXcgU2NoZW1hRG9jdW1lbnRbdmFsaWRTY2hlbWFzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbGlkU2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBzY2hlbWFzW2ldID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh2YWxpZFNjaGVtYXNbaV0pOwotCi0gICAgICAgIC8vIE5vdyBjb21waWxlIHRoZSB2YWxpZCBzY2hlbWFzLCB0ZXN0IHRoYXQgdGhleSBzdWNjZWVkCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtdIHtzY2hlbWFzW2ldfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGZhaWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gY29tcGlsZSBzY2hlbWE6ICIgKyBzY2hlbWFzW2ldICsgIiB3aXRoIGVycm9yOiAiICsgZmFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGludmFsaWREb2NzID0gCi0gICAgewotICAgICAgICAiPGFic3RyYWN0VGVzdCB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+IiArCi0gICAgICAgICIgICAgPGFic3RyYWN0PmNvbnRlbnQ8L2Fic3RyYWN0PiAiICsKLSAgICAgICAgIjwvYWJzdHJhY3RUZXN0PiAiLAotICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHZhbGlkRG9jcyA9IAotICAgIHsKLSAgICAgICAgIjxhYnN0cmFjdFRlc3QgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPiIgKwotICAgICAgICAiICAgIDxjb25jcmV0ZT5jb250ZW50PC9jb25jcmV0ZT4gIiArCi0gICAgICAgICI8L2Fic3RyYWN0VGVzdD4gIiwKLSAgICB9OwotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB0aHJvd3MgRXhjZXB0aW9uIAotICAgIHsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpbnZhbGlkRG9jcy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCB4byA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGludmFsaWREb2NzW2ldKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkRvYyB3YXMgdmFsaWQuIFNob3VsZCBiZSBpbnZhbGlkOiAiICsgaW52YWxpZERvY3NbaV0sIAotICAgICAgICAgICAgICAgICEgeG8udmFsaWRhdGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWxpZERvY3MubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG8gPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSh2YWxpZERvY3NbaV0pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRG9jIHdhcyBpbnZhbGlkLiBTaG91bGQgYmUgdmFsaWQ6ICIgKyB2YWxpZERvY3NbaV0sCi0gICAgICAgICAgICAgICAgeG8udmFsaWRhdGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0RW52LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdEVudi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmIyZWQyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0RW52LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEVudgotewotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZndyb290ID0gZ2V0Um9vdEZpbGUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGNhc2Vyb290ID0gbmV3IEZpbGUoZndyb290LCAidGVzdC9jYXNlcyIpOwotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgb3V0cHV0cm9vdCA9IG5ldyBGaWxlKGZ3cm9vdCwgImJ1aWxkL3Rlc3Qvb3V0cHV0Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Um9vdEZpbGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCBTeXN0ZW0uZ2V0UHJvcGVydHkoICJ4YmVhbi5yb290ZGlyIiApICkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIHhiZWFuQ2FzZShTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChuZXcgRmlsZShjYXNlcm9vdCwgc3RyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIHhiZWFuT3V0cHV0KFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICBGaWxlIHJlc3VsdCA9IChuZXcgRmlsZShvdXRwdXRyb290LCBzdHIpKTsKLSAgICAgICAgRmlsZSBwYXJlbnRkaXIgPSByZXN1bHQuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBwYXJlbnRkaXIubWtkaXJzKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbHRyZWUoRmlsZSBkaXIpCi0gICAgewotICAgICAgICBpZiAoZGlyLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGlzdCA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBkZWx0cmVlKG5ldyBGaWxlKGRpciwgbGlzdFtpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaXIuZGVsZXRlKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZSAiICsgZGlyKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Rlc3RSdW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhY2Y3MzguLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Rlc3RSdW5VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJ1blV0aWwKLXsKLSAgICAvKioKLSAgICAgKiBSdW5zIG1ldGhvZCB0aGF0IG11c3QgYmUgZGVjbGFyZWQgInN0YXRpYyB2b2lkIHRlc3QoKSIgb24gdGhlIGdpdmVuCi0gICAgICogY2xhc3MsIHdpdGggdGhlIGdpdmVuIGFkZGl0aW9uYWwgamFycyBvciBkaXJlY3RvcmllcyBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oU3RyaW5nIGNsYXNzbmFtZSwgRmlsZVtdIGNsYXNzcGF0aCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJSdW5uaW5nICIgKyBjbGFzc25hbWUgKyAiIHdpdGggY2xhc3NwYXRoOiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKGNsYXNzcGF0aFtpXSk7Ci0gICAgICAgICAgICBpZiAoIWNsYXNzcGF0aFtpXS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzc3BhdGggY29tcG9uZW50ICIgKyBjbGFzc3BhdGggKyAiIGNhbm5vdCBiZSBmb3VuZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSTFtdIGV4dHJhY3AgPSBuZXcgVVJMW2NsYXNzcGF0aC5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0cmFjcFtpXSA9IGNsYXNzcGF0aFtpXS50b1VSTCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hbGZvcm1lZCBjbGFzc3BhdGggZmlsZW5hbWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzTG9hZGVyIGN1cmNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2hpbGRjbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihleHRyYWNwKTsKLSAgICAgICAgICAgIENsYXNzIGphdmFDbGFzcyA9IGNoaWxkY2wubG9hZENsYXNzKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBjaGlsZGNsLmxvYWRDbGFzcygib3JnLm9wZW51cmkubXl0ZXN0LkN1c3RvbWVyRG9jdW1lbnQiKTsKLSAgICAgICAgICAgIGlmICh0ZXN0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aCA9IGphdmFDbGFzcy5nZXRNZXRob2QoInRlc3QiLCBuZXcgQ2xhc3NbMF0pOyAvLyBzaG91bGQgYmUgc3RhdGljCi0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjaGlsZGNsKTsKLSAgICAgICAgICAgIG1ldGguaW52b2tlKG51bGwsIG5ldyBPYmplY3RbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNsYXNzIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gdGVzdCgpIG1ldGhvZCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdWxkIG5vdCBpbnZva2Ugc3RhdGljIHB1YmxpYyB0ZXN0IG1ldGhvZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cmNsKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UaHJlYWRpbmdUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGhyZWFkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGE2ZWMyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UaHJlYWRpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFRocmVhZGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBUaHJlYWRpbmdUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShUaHJlYWRpbmdUZXN0LmNsYXNzKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX0NPVU5UID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVSQVRJT05fQ09VTlQgPSAxOwotCi0gICAgcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVGhyZWFkIGV4dGVuZHMgVGhyZWFkCi0gICAgewotICAgICAgICBwcml2YXRlIFRocm93YWJsZSBfdGhyb3dhYmxlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX3Jlc3VsdDsKLQotICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdGhyb3dhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElURVJBVElPTl9DT1VOVDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIgPSBYbWxCZWFucy5sb2FkWHNkKG5ldyBYbWxPYmplY3RbXSB7IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIikpIH0pOwotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gbG9hZGVyLnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbCIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2FkZXIuZmluZERvY3VtZW50VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiLCAiU2lnbmF0dXJlIikpLCByZXN1bHQuc2NoZW1hVHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Rocm93YWJsZSA9IHQ7Ci0gICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJlYWRlZENvbXBpbGF0aW9uKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgQ29tcGlsYXRpb25UaHJlYWRbXSB0aHJlYWRzID0gbmV3IENvbXBpbGF0aW9uVGhyZWFkW1RIUkVBRF9DT1VOVF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZWFkc1tpXSA9IG5ldyBDb21waWxhdGlvblRocmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlYWRzW2ldLnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocmVhZHNbaV0uam9pbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCh0aHJlYWRzW2ldLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJUaHJlYWQgIiArIGkgKyAiIGRpZG4ndCBzdWNjZWVkIiwgdGhyZWFkc1tpXS5nZXRSZXN1bHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVHlwZWRTZXR0ZXJzVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UeXBlZFNldHRlcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjFkMGUxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UeXBlZFNldHRlcnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuVG9rZW5UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlhtbEJvb2ttYXJrOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExpbmVOdW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5Db21wYXJhYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLSAgIAotcHVibGljIGNsYXNzIFR5cGVkU2V0dGVyc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgVHlwZWRTZXR0ZXJzVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFR5cGVkU2V0dGVyc1Rlc3RzLmNsYXNzKTsgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNjaGVtYU5zID0ieG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluc3RhbmNlTnMgPSAieG1sbnM6eHM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmbXQgKCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHMubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gcy5jaGFyQXQoIGkgKTsKLQotICAgICAgICAgICAgaWYgKGNoICE9ICckJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIGNoICk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoICsraSApOwotCi0gICAgICAgICAgICBTdHJpbmcgaWQgPSAiIjsKLQotICAgICAgICAgICAgd2hpbGUgKCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlkID0gaWQgKyBjaDsKLSAgICAgICAgICAgICAgICBjaCA9IHMuY2hhckF0KCArK2kgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFyZyA9ICIiOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJygnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoICsraSApOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBjaCAhPSAnKScgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnICs9IGNoOwotICAgICAgICAgICAgICAgICAgICBjaCA9IHMuY2hhckF0KCArK2kgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaS0tOwotCi0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKCAic2NoZW1hIiApKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggc2NoZW1hTnMgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlkLmVxdWFscyggInhzaSIgKSkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIGluc3RhbmNlTnMgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlkLmVxdWFscyggInR5cGUiICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGFyZy5sZW5ndGgoKSA+IDAgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJ4c2k6dHlwZT1cIiIgKyBhcmcgKyAiXCIiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnNlcyA9IHNjaGVtYU5zICsgIiAiICsgaW5zdGFuY2VOczsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YU5vVHlwZVNpbmdsZXRvbkVsZW1lbnQgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8eHl6enkvPiIgKTsKLSAgICAgICAgWG1sT2JqZWN0IHgyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YnViYmE+bW9vPC9idWJiYT4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMyID0geDIubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjMi50b05leHRUb2tlbigpOwotCi0gICAgICAgIGMuZ2V0T2JqZWN0KCkuc2V0KCBjMi5nZXRPYmplY3QoKSApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8eHl6enk+bW9vPC94eXp6eT4iICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEphdmFOb1R5cGVTaW5nbGV0b25BdHRyaWJ1dGUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8eHl6enkgYT0nJy8+IiApOwotICAgICAgICBYbWxPYmplY3QgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxidWJiYSBiPSdtb28nLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMyID0geDIubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMyLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMyLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgYy5nZXRPYmplY3QoKS5zZXQoIGMyLmdldE9iamVjdCgpICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjx4eXp6eSBhPVwibW9vXCIvPiIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YU5vVHlwZVNpbmdsZXRvbkVsZW1lbnRXaXRoWHNpVHlwZSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjx4eXp6eS8+IiwgbmV3IFhtbE9wdGlvbnMoKS5zZXREb2N1bWVudFR5cGUoIFhtbE9iamVjdC50eXBlICkgKTsKLSAgICAgICAgWG1sT2JqZWN0IHgyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIGZtdCggIjxidWJiYSAkdHlwZSh4czppbnQpICR4c2kgJHNjaGVtYT42OTwvYnViYmE+IiApICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMyID0geDIubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjMi50b05leHRUb2tlbigpOwotCi0gICAgICAgIFhtbE9iamVjdCB4eXp6eSA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIFhtbE9iamVjdCBidWJiYSA9IGMyLmdldE9iamVjdCgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBidWJiYS5zY2hlbWFUeXBlKCkgPT0gWG1sSW50LnR5cGUgKTsKLQotLy8gICAgICAgIHh5enp5LnNldCggYnViYmEgKTsKLQotLy8gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoIGZtdCggIjx4eXp6eSAkdHlwZSh4czppbnQpICR4c2kgJHNjaGVtYT5tb288L3h5enp5PiIgKSApICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1ZhbGlkYXRpb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1ZhbGlkYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMwZjY5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9WYWxpZGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MDIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBWYWxpZGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbGlkYXRpb25UZXN0cy5jbGFzcyk7IH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKLSAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OwotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICBnZXRDYXNlRmlsZSggdGhlQ2FzZSApICkubmV3Q3Vyc29yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgbWFrZVNjaGVtYVR5cGVMb2FkZXIgKCBTdHJpbmdbXSBzY2hlbWFzICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hRG9jcyA9IG5ldyBYbWxPYmplY3QgWyBzY2hlbWFzLmxlbmd0aCBdOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNjaGVtYURvY3NbIGkgXSA9Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYXNbIGkgXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmxvYWRYc2QoIHNjaGVtYURvY3MgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgbWFrZVNjaGVtYVR5cGVMb2FkZXIgKCBGaWxlW10gc2NoZW1hcyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdFtdIHNjaGVtYURvY3MgPSBuZXcgWG1sT2JqZWN0IFsgc2NoZW1hcy5sZW5ndGggXTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY2hlbWFEb2NzWyBpIF0gPQotICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFzWyBpIF0sIG5ldyBYbWxPcHRpb25zKCkuc2V0TG9hZExpbmVOdW1iZXJzKCkuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gWG1sQmVhbnMubG9hZFhzZCggc2NoZW1hRG9jcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2ICggU3RyaW5nIHhtbCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC5zY2hlbWFUeXBlKCkgIT0gWG1sT2JqZWN0LnR5cGUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgudmFsaWRhdGUoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBudiAoIFN0cmluZyB4bWwgKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHguc2NoZW1hVHlwZSgpICE9IFhtbE9iamVjdC50eXBlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheC52YWxpZGF0ZSgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIF9fX3Rlc3REZWZhdWx0ICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBEZWZhdWx0Ci0gICAgICAgIAotLy8gICAgICAgIHYoICI8dmFsaWRFbGVtRGVmYXVsdC8+IiApOwotLy8gICAgICAgIHYoICI8dmFsaWRBdHRyRGVmYXVsdC8+IiApOwotLy8gICAgICAgIAotLy8gICAgICAgIG52KCAiPGludmFsaWRFbGVtRGVmYXVsdC8+IiApOwotICAgICAgICBudiggIjxpbnZhbGlkQXR0ckRlZmF1bHQvPiIgKTsKLQotICAgICAgICB2KCAiPGludmFsaWRFbGVtRGVmYXVsdD4xMTxpbnZhbGlkRWxlbURlZmF1bHQ+IiApOwotICAgICAgICB2KCAiPGludmFsaWRBdHRyRGVmYXVsdCBhdHRyPScyMic+IiApOwotICAgICAgICAKLSAgICAgICAgLy8gRml4ZWQKLQotICAgICAgICB2KCAiPHZhbGlkRWxlbUZpeGVkLz4iICk7Ci0gICAgICAgIHYoICI8dmFsaWRBdHRyRml4ZWQvPiIgKTsKLSAgICAgICAgCi0gICAgICAgIG52KCAiPGludmFsaWRFbGVtRml4ZWQvPiIgKTsKLSAgICAgICAgbnYoICI8aW52YWxpZEF0dHJGaXhlZC8+IiApOwotICAgICAgICAKLSAgICAgICAgdiggIjxpbnZhbGlkRWxlbUZpeGVkPjMzPGludmFsaWRFbGVtRml4ZWQ+IiApOwotICAgICAgICB2KCAiPGludmFsaWRBdHRyRml4ZWQgYXR0cj0nNDQnLz4iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9UZXN0ICgKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcywgUU5hbWUgZG9jVHlwZSwKLSAgICAgICAgU3RyaW5nW10gdmFsaWRJbnN0YW5jZXMsIFN0cmluZ1tdIGludmFsaWRJbnN0YW5jZXMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgZG9jVHlwZSwgdmFsaWRJbnN0YW5jZXMsIGludmFsaWRJbnN0YW5jZXMsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGVzdCAoCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMsIFFOYW1lIGRvY1R5cGUsCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkSW5zdGFuY2VzLCBTdHJpbmdbXSBpbnZhbGlkSW5zdGFuY2VzLCBib29sZWFuIHN0YXJ0T25Eb2N1bWVudCApCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7Ci0KLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLQotICAgICAgICBpZiAoZG9jVHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGRvY1NjaGVtYSA9IHN0bC5maW5kRG9jdW1lbnRUeXBlKCBkb2NUeXBlICk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBkb2NTY2hlbWEgIT0gbnVsbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9UWVBFLCBkb2NTY2hlbWEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCB2YWxpZEluc3RhbmNlcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeCA9Ci0gICAgICAgICAgICAgICAgc3RsLnBhcnNlKCAoU3RyaW5nKSB2YWxpZEluc3RhbmNlc1sgaSBdLCBudWxsLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIGlmICghc3RhcnRPbkRvY3VtZW50KSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgYy50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICB4ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCB4ZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSLCB4ZWwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0geC52YWxpZGF0ZSggb3B0aW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW52YWxpZCBkb2MsIGV4cGVjdGVkIGEgdmFsaWQgZG9jOiAiICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW5zdGFuY2UoIiArIGkgKyAiKTogIiApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeC54bWxUZXh0KCkgKTsKLSAgICAgICAgICAgICAgICBSb290LmR1bXAoIHggKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvcnM6ICIgKTsKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgeGVsLnNpemUoKSA7IGorKyApCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeGVsLmdldCggaiApICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBpc1ZhbGlkICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgaW52YWxpZEluc3RhbmNlcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeCA9IHN0bC5wYXJzZSggKFN0cmluZykgaW52YWxpZEluc3RhbmNlc1sgaSBdLCBudWxsLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBzdGFydE9uRG9jdW1lbnQpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICAgICAgICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgICAgICB4ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0geC52YWxpZGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJWYWxpZCBkb2MsIGV4cGVjdGVkIGEgaW52YWxpZCBkb2M6ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW5zdGFuY2UoIiArIGkgKyAiKTogIiApOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHgueG1sVGV4dCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIFJvb3QuZHVtcCggeCApOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIWlzVmFsaWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSnVzdCBjb21waWxlIGEgc2NoZW1hLCBnb29kIGFuZCBiYWQKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUwICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgbW9zdCBiYXNpYyBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKwotICAgICAgICAgICAgIiI7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE9uZSB3aGljaCB1c2VzICMjdGFyZ2V0TmFtZXNwYWNlIG9uIGEgd2lsZGNhcmQKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6YW55IG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCi0gICAgICAgICAgICAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXM5OSA9IHsgc2NoZW1hIH07Ci0gICAgICAgIAotICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczk5ICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAvLyBBIGJpZywgbmFzdHkgc2NoZW1hIDotKQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgRmlsZSBmaWxlID0gVGVzdEVudi5nZXRSb290RmlsZSgpOwotICAgICAgICBGaWxlIHNjaGVtZUZpbGUgPSBuZXcgRmlsZSggZmlsZSwgInNyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QiICk7Ci0gICAgICAgIEZpbGUgeG1sRmlsZSA9IG5ldyBGaWxlKCBmaWxlLCAic3JjL3htbHNjaGVtYS9zY2hlbWEvWE1MLnhzZCIgKTsKLQotICAgICAgICBGaWxlW10gc2NoZW1hc0YgPSB7IHNjaGVtZUZpbGUsIHhtbEZpbGUgfTsKLQotICAgICAgICBSb290LmRpc2FibGVTdG9yZVZhbGlkYXRpb24oKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzRiApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgUm9vdC5lbmFibGVTdG9yZVZhbGlkYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9Ci0gICAgICAgICAgICBzdGwuZmluZERvY3VtZW50VHlwZSgKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJzY2hlbWEiICkgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggdHlwZSAhPSBudWxsICk7Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBBIGdvb2QgcGllY2UgZnJvbSBhIEoyRUUgc2NoZW1hCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgPQotICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+XG4iICsgCi0gICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArIAotICAgICAgICAgICAgIiAgICAgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKyAKLSAgICAgICAgICAgICIgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJ1xuIiArIAotICAgICAgICAgICAgIiAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9J3VucXVhbGlmaWVkJz5cbiIgKyAKLSAgICAgICAgICAgICI8eHNkOmFubm90YXRpb24+XG4iICsgCi0gICAgICAgICAgICAiPHhzZDpkb2N1bWVudGF0aW9uPlxuIiArIAotICAgICAgICAgICAgIkAoIylhcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZHMJMS43IDA3LzA4LzAyXG4iICsgCi0gICAgICAgICAgICAiPC94c2Q6ZG9jdW1lbnRhdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICI8L3hzZDphbm5vdGF0aW9uPlxuIiArIAotICAgICAgICAgICAgIjwveHNkOnNjaGVtYT5cbiI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXM1ID0geyBzY2hlbWEgfTsKLQotICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczUgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBBIGJhZCBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSA9ICI8Zm9vLz4iOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hczIgPSB7IHNjaGVtYSB9OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczIgKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBBIGJhZCBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICIgIDxmb28vPlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCi0gICAgICAgICAgICAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMzID0geyBzY2hlbWEgfTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlMSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGVyaWNTY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWFcbiIgKwotICAgICAgICAgICAgIiAgIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIHhtbG5zOm53PSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCc+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Zvbyc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZm9vJyB0eXBlPSdudzpmb28nPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZXJpYyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdhJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdiJyAvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0neWF5YScgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9JzEnIHByb2Nlc3NDb250ZW50cz0nbGF4Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2MnIC8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czphbnkgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgcHJvY2Vzc0NvbnRlbnRzPSdzdHJpY3QnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDwveHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J3gnIHVzZT0nb3B0aW9uYWwnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0neScgdXNlPSdyZXF1aXJlZCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSd6JyB1c2U9J3Byb2hpYml0ZWQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiI7Ci0KLSAgICAgICAgU3RyaW5nIGVyaWMyU2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hXG4iICsKLSAgICAgICAgICAgICIgICB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICB4bWxuczpudz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyJ1xuIiArCi0gICAgICAgICAgICAiICAgeG1sbnM6ZXJpYz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hMidcbiIgKwotICAgICAgICAgICAgIiAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXJpYzInPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nZXJpYzpmb28nPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYScgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDwveHM6ZXh0ZW5zaW9uPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiI7Ci0KLSAgICAgICAgU3RyaW5nIGVyaWMgPSAiPGVyaWMgeT0nWScgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJz4iOwotICAgICAgICBTdHJpbmcgZXJpYzIgPSAiPGVyaWMgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hMic+IjsKLSAgICAgICAgU3RyaW5nIHhzaSA9ICJ4bWxuczplcmljMj0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyJyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyI7Ci0KLSAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7Ci0gICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGMvPjxmb28geHNpOnR5cGU9J2VyaWMyOmVyaWMyJyAiICsKLSAgICAgICAgICAgICAgICB4c2kgKyAiPjxhIHhtbG5zPVwiaHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyXCIvPjwvZm9vPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YS8+PGIvPjxib28geG1sbnM9J3lheWEnLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YSB4PSd5Jy8+PGIvPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgICI8ZXJpYyB5PSdZJyB4PSdYJyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnPiIgKwotICAgICAgICAgICAgICAgICI8YS8+PGIvPjxjLz48L2VyaWM+IgotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZyBlcmljU2Fuc1kgPQotICAgICAgICAgICAgIjxlcmljIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSc+IjsKLQotICAgICAgICBTdHJpbmdbXSBpbnZhbGlkID0gewotICAgICAgICAgICAgIjxmb28vPiIsCi0gICAgICAgICAgICAiPGVyaWM+PGEvPjxmb28vPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAidGV4dDxhLz48Yi8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YS8+dGV4dDxiLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+dGV4dDxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEvPjxiLz48Yy8+dGV4dDwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YSB4PSd5Jy8+PGIvPjxjLz50ZXh0PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGJvbyB4bWxucz0neWF5YScvPjxtb28geG1sbnM9J3lheWEnLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljU2Fuc1kgKyAiPGEvPjxiLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICAiPGVyaWMgeT0nJyB6PScnIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSc+IiArCi0gICAgICAgICAgICAgICAgIjxhLz48Yi8+PGMvPjwvZXJpYz4iCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgZXJpY1NjaGVtYSwgZXJpYzJTY2hlbWEgfTsKLSAgICAgICAgCi0gICAgICAgIGRvVGVzdCgKLSAgICAgICAgICAgIHNjaGVtYXMsCi0gICAgICAgICAgICBuZXcgUU5hbWUoICJodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSIsICJlcmljIiApLAotICAgICAgICAgICAgdmFsaWQsIGludmFsaWQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUyICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgYm9iU2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hXG4iICsKLSAgICAgICAgICAgICIgICB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICB4bWxuczpib2I9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCc+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2JpZmYnPlxuIiArCi0gICAgICAgICAgICAiICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpleHRlbnNpb24gYmFzZT0nYm9iOmZvbyc+XG4iICsKLSAgICAgICAgICAgICIgICAgIDx4czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdhJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgIDwveHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpleHRlbnNpb24+XG4iICsKLSAgICAgICAgICAgICIgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZm9vJyB0eXBlPSdib2I6Zm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iOwotCi0gICAgICAgIFN0cmluZyB4c2lUeXBlID0gInhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIjsKLQotICAgICAgICBTdHJpbmdbXSB2YWxpZCA9IHsKLSAgICAgICAgICAgICI8Ym9iOmZvbyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4bWxuczpib2I9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnICIgKwotICAgICAgICAgICAgICAgICJ4c2k6dHlwZT0nYm9iOmJpZmYnPjxib2I6YS8+PGJvYjphLz48Ym9iOmEvPjwvYm9iOmZvbz4iCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKLSAgICAgICAgICAgICI8Ym9iOmZvbyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4bWxuczpib2I9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnICIgKwotICAgICAgICAgICAgICAgICJ4c2k6dHlwZT0nYm9iOmJpZmYnPjxib2I6cS8+PC9ib2I6Zm9vPiIsCi0gICAgICAgICAgICAiPGJvYjpmb28gYT0nYicgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeG1sbnM6Ym9iPSdodHRwOi8vb3BlbnVyaS5vcmcvYm9ic2NoZW1hJyAiICsKLSAgICAgICAgICAgICAgICAieHNpOnR5cGU9J2JvYjpiaWZmJz48Ym9iOmEvPjxib2I6YS8+PGJvYjphLz48L2JvYjpmb28+IgotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IGJvYlNjaGVtYSB9OwotICAgICAgICAKLSAgICAgICAgZG9UZXN0KCBzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCApOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbnMgPQotICAgICAgICAieG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgIiArCi0gICAgICAgICAgICAieG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgPHhzOnNpbXBsZVR5cGUgbmFtZT0nYWxsTk5JJz5cbiIgKyAKLSAgICAgICAgICAgICIgIDx4czphbm5vdGF0aW9uPjx4czpkb2N1bWVudGF0aW9uPlxuIiArIAotICAgICAgICAgICAgIiAgIGZvciBtYXhPY2N1cnM8L3hzOmRvY3VtZW50YXRpb24+PC94czphbm5vdGF0aW9uPlxuIiArIAotICAgICAgICAgICAgIiAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSd4czpub25OZWdhdGl2ZUludGVnZXInPlxuIiArIAotICAgICAgICAgICAgIiAgIDx4czpzaW1wbGVUeXBlPlxuIiArIAotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Tk1UT0tFTic+XG4iICsgCi0gICAgICAgICAgICAiICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J3VuYm91bmRlZCcvPlxuIiArIAotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArIAotICAgICAgICAgICAgIiAgIDwveHM6c2ltcGxlVHlwZT5cbiIgKyAKLSAgICAgICAgICAgICIgIDwveHM6dW5pb24+XG4iICsgCi0gICAgICAgICAgICAiIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZXJpY0Jhc2U2NEJpbmFyeSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmJhc2U2NEJpbmFyeSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J0VyaWMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2FiY2RIZXhCaW5hcnknPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpoZXhCaW5hcnknPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdhYmNkJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd6ZXJvTnVtYmVyJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nbnVtYmVyJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nWmVybycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdudW1iZXInPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czp1bmlvbj5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSdjb2xsYXBzZScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nWmVybycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nT25lJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdUd28nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1RocmVlJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdNYW55Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czp1bmlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdsaXN0T2ZJbnQnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpsaXN0IGl0ZW1UeXBlPSd4czppbnQnLz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdsaXN0T2ZQcmltZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmxpc3QgaXRlbVR5cGU9J3ByaW1lJy8+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZXJpY0Jyb3RoZXInPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9J2NvbGxhcHNlJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J0JyaWFuJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J0tldmluJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdlcmljQnJvdGhlcnMnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpsaXN0IGl0ZW1UeXBlPSdlcmljQnJvdGhlcicvPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3dlZWtTdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9J2NvbGxhcHNlJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J01vbmRheScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdUdWVzZGF5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1dlZG5lc2RheScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdUaHVyc2RheScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdGcmlkYXknLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nU2F0dXJkYXknLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nU3VuZGF5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdhWWVhcic+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmR1cmF0aW9uJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nUDFZJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdlcmljQkRheSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRhdGUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxOTY1LTA2LTEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd5b3VuZ2VyVGhhbkVyaWMnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkYXRlJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5FeGNsdXNpdmUgdmFsdWU9JzE5NjUtMDYtMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2ZpdmVDaGFyUW5hbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpRTmFtZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSc1Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd3YWNreVFuYW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6UU5hbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0nMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbeHM6YWJjZGVdKicvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSd4czphYmMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0neHM6YmNkJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdmaXZlQ2hhckFueVVSSSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmFueVVSSSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSc1Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd3YWNreUFueVVSSSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmFueVVSSSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSczJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4TGVuZ3RoIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdmb28nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nYmFyJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdiaXQnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpib29sZWFuJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPScxfDAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2V2ZW5JbnRlZ2VyJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0nWzAtOV0qWzAyNDY4XScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ncHJpbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbMC05XSpbMTM1NzldJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nNScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc3Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzExJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzEzJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE3Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdmb3VyQ2hhclN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSc0Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0aHJlZU9yTW9yZUNoYXJTdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0nMycvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZml2ZU9yTGVzc0NoYXJTdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0nNScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZml2ZVRvdGFsRGlnaXRzJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6dG90YWxEaWdpdHMgdmFsdWU9JzUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3RocmVlRnJhY3Rpb25EaWdpdHMnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0nMycvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluRXhjbHVzaXZlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluRXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4RXhjbHVzaXZlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4RXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4SW5jbHVzaXZlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluSW5jbHVzaXZlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluRXhjbHVzaXZlRmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluRXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4RXhjbHVzaXZlRmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4RXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4SW5jbHVzaXZlRmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluSW5jbHVzaXZlRmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5FeGNsdXNpdmVEb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkV4Y2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1heEV4Y2x1c2l2ZURvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4RXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4SW5jbHVzaXZlRG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5JbmNsdXNpdmVEb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYW55Jz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdkZWZhdWx0XzEyMzQ1JyBkZWZhdWx0PScxMjM0NSc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZGVmYXVsdF8xMjM0JyBkZWZhdWx0PScxMjM0Jz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdkZWZhdWx0X2VyaWMnIGRlZmF1bHQ9J2VyaWMnPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiI7Ci0KLSAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz4uMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz4uMTI8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGhyZWVGcmFjdGlvbkRpZ2l0cyc+LjEyMzwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FsbE5OSSc+dW5ib3VuZGVkPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FsbE5OSSc+MDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhbGxOTkknPjE8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpiYXNlNjRCaW5hcnknPkNBRkVCQUJFPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FiY2RIZXhCaW5hcnknPmFiY2Q8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpiYXNlNjRCaW5hcnknPmFiY2RlZmdoPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCYXNlNjRCaW5hcnknPkVyaWM8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd6ZXJvTnVtYmVyJz4gWmVybzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd6ZXJvTnVtYmVyJz5aZXJvPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3plcm9OdW1iZXInPjA8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz4gMSA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz5Ud288L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz4gVGhyZWUgPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5CcmlhbjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPktldmluPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+S2V2aW4gQnJpYW48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5CcmlhbiBLZXZpbjwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+ICAxICAyMiAgMzMzICA0NDQ0ICA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz41OTk5PC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYVllYXInPlAxWTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyQW55VVJJJz5hYmNkZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czphbnlVUkknPmZvbzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3YWNreUFueVVSSSc+Zm9vPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neW91bmdlclRoYW5FcmljJz4xOTY1LTA2LTExPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCRGF5Jz4xOTY1LTA2LTEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmRhdGVUaW1lJz4xOTk5LTA1LTMxVDEzOjIwOjAwLTA1OjAwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOnRpbWUnPjAwOjAwOjAwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOnRpbWUnPjEzOjIwOjAwLTA1OjAwPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lRbmFtZSc+eHM6YWJjPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyUW5hbWUnPmFiY2RlPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyUW5hbWUnPnhzOmFiPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3ByaW1lJz4zPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3ByaW1lJz4xMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4rNDU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+MTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4wPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPi0xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPi0xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPjQ4OTc0MzU3OTgzNzU4OTc0MzQzNDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpib29sZWFuJz4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8ZGVmYXVsdF8xMjM0ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz48L2RlZmF1bHRfMTIzND4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjEyPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+MTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPjA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6Ym9vbGVhbic+ZmFsc2U8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Vla1N0cmluZyc+TW9uZGF5PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dlZWtTdHJpbmcnPlN1bmRheTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3ZWVrU3RyaW5nJz4gIFRodXJzZGF5ICA8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmUnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlJz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmUnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmUnPjkuOTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZUZsb2F0Jz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRmxvYXQnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZUZsb2F0Jz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVGbG9hdCc+OS45PC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRG91YmxlJz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZURvdWJsZSc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZURvdWJsZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRG91YmxlJz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZURvdWJsZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlRG91YmxlJz45Ljk8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmb3VyQ2hhclN0cmluZyc+ZXJpYzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZU9yTW9yZUNoYXJTdHJpbmcnPjEyMzQ1PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVPckxlc3NDaGFyU3RyaW5nJz4xMjM0PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVUb3RhbERpZ2l0cyc+MTIzNDU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZVRvdGFsRGlnaXRzJz4xMjM0PC9hbnk+IiwKLSAgICAgICAgICAgICI8ZGVmYXVsdF8xMjM0ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz5cblxuPC9kZWZhdWx0XzEyMzQ+IgotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhbGxOTkknPmZvbzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpoZXhCaW5hcnknPlA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aGV4QmluYXJ5Jz5DQUZFQkFCUDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhYmNkSGV4QmluYXJ5Jz5hYmNlPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6YmFzZTY0QmluYXJ5Jz5hYmNkZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQmFzZTY0QmluYXJ5Jz5FcmlrPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nemVyb051bWJlcic+T25lPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3plcm9OdW1iZXInPlR3ZW50eTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+U2V2ZW48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz5Cb2I8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz48L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5Cb2I8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5SYWxwaCBGcmFuazwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+ICAxICAyMiAgMzMzICBFcmljICA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz5FcmljPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+LTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FZZWFyJz5QMlk8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd5b3VuZ2VyVGhhbkVyaWMnPjE5NjUtMDYtMTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0JEYXknPjE5ODUtMDYtMTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6ZGF0ZVRpbWUnPnh4MTk5OS0wNS0zMVQxMzoyMDowMC0wNTowMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpkYXRlVGltZSc+ZXJpYzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czp0aW1lJz45OTo5OTowMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czp0aW1lJz4xMzoyMDowMC05OTowMDwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dhY2t5QW55VVJJJz5tb288L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZUNoYXJBbnlVUkknPmFiPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lRbmFtZSc+eHM6YWJjZGVmZ2hpams8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lRbmFtZSc+eHM6cHFyPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOlFOYW1lJz5mb286YmFyPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyUW5hbWUnPnhzOmFiYzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdwcmltZSc+MTI8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ncHJpbWUnPjY8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+Zm9vPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPi4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+dHJ1ZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPmZhbHNlPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+bmliYmxlPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+MjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpib29sZWFuJz5ibHVyZjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpib29sZWFuJz48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3ZWVrU3RyaW5nJz5Nb25kYXkgU3Vja3M8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmUnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZSc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZSc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZSc+MTAuMTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZUZsb2F0Jz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVGbG9hdCc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRmxvYXQnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVGbG9hdCc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlRG91YmxlJz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZURvdWJsZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRG91YmxlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVEb3VibGUnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVEb3VibGUnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVEb3VibGUnPjEwLjE8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlT3JMZXNzQ2hhclN0cmluZyc+IDEyMzQgPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVUb3RhbERpZ2l0cyc+MTIzNDU2PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZvdXJDaGFyU3RyaW5nJz52YXNpbGlrPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3RocmVlT3JNb3JlQ2hhclN0cmluZyc+MTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlT3JMZXNzQ2hhclN0cmluZyc+MTIzNDU2NzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz4uMTIzNDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmb3VyQ2hhclN0cmluZyc+IGVyaWMgPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxkZWZhdWx0XzEyMzQ1ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz48L2RlZmF1bHRfMTIzNDU+IiwKLSAgICAgICAgICAgICI8ZGVmYXVsdF8xMjM0NSAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+XG5cbjwvZGVmYXVsdF8xMjM0NT4iCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgc2NoZW1hIH07Ci0KLSAgICAgICAgZG9UZXN0KCBzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTQgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdhbnknPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0na2luZGFQcmltZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1swLTldKlsxMzU3OV0nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc1Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzcnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTEnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTcnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTknLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCi0gICAgICAgICAgICAiIjsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPQotICAgICAgICAgICAgc3RsLnBhcnNlKAotICAgICAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2tpbmRhUHJpbWUnPjEwMDwvYW55PiIsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdW52YWxpZGF0ZWQgc3RyZWFtIGlzIE9LCi0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlzID0geC5uZXdYTUxJbnB1dFN0cmVhbSgpOwotCi0gICAgICAgIHdoaWxlICggeGlzLmhhc05leHQoKSApCi0gICAgICAgICAgICB4aXMubmV4dCgpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdmFsaWRhdGVkIHN0cmVhbSBmYWlscwotCi0gICAgICAgIGJvb2xlYW4gYmxld0NodW5rcyA9IGZhbHNlOwotCi0gICAgICAgIHhpcyA9Ci0gICAgICAgICAgICBzdGwubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgIHgubmV3WE1MSW5wdXRTdHJlYW0oKSwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoIHhpcy5oYXNOZXh0KCkgKQotICAgICAgICAgICAgICAgIHhpcy5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBibGV3Q2h1bmtzID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBibGV3Q2h1bmtzICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlNSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2hlZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdoYXcnIHR5cGU9J3hzOmludCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPC94czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0neWVlJyB0eXBlPSd4czppbnQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0na2luZGFQcmltZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1swLTldKlsxMzU3OV0nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc1Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzcnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTEnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTcnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTknLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCi0gICAgICAgICAgICAiIjsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPQotICAgICAgICAgICAgc3RsLnBhcnNlKAotICAgICAgICAgICAgICAgICI8aGVlIHllZT0nMyc+PGhhdz42NjwvaGF3PjwvaGVlPiIsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwgKTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IG9iaiA9IGMuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBvYmoudmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGludmFsaWQKLQotICAgICAgICB4ID0KLSAgICAgICAgICAgIHN0bC5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGhlZSB5ZWU9J2ZpdmUnPjxoYXc+NjY8L2hhdz48L2hlZT4iLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISB4LnZhbGlkYXRlKCkgKTsKLQotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgYy5nZXRPYmplY3QoKS52YWxpZGF0ZSgpICk7Ci0KLSAgICAgICAgLy8gTm8gc2NoZW1hCi0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hc2FzPGJhcj5hc2FzPC9iYXI+PC9mb28+IiApOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCBvYmogPSBjLmdldE9iamVjdCgpOwotCi0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICAgICAgICAgICAgb2JqLnZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGU2ICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2hlZSc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCi0gICAgICAgICAgICAiIjsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEsIHNjaGVtYSB9OwotCi0KLSAgICAgICAgLy8gU2hvdWxkIGdldCBhIHNjaGVtYSBjb21waWxlIGVycm9yCi0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlNyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYmFzZScgdHlwZT0nYmFzZScvPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnPiIgKwotICAgICAgICAgICAgIiAgICA8eHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZm9vJy8+IiArCi0gICAgICAgICAgICAiICAgIDwveHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Rlcml2ZWQnPiIgKwotICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdiYXNlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYmFyJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgIDwveHM6ZXh0ZW5zaW9uPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT4iICsKLSAgICAgICAgICAgICIiOwotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OwotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLQotICAgICAgICBYbWxPYmplY3QgeCA9Ci0gICAgICAgICAgICBzdGwucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxiYXNlPjxmb28vPjwvYmFzZT4iLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgudmFsaWRhdGUoKSApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotCi0gICAgICAgIFhtbE9iamVjdCBiYXNlID0gYy5nZXRPYmplY3QoKTsKLQotICAgICAgICBjLnRvRW5kVG9rZW4oKTsKLSAgICAgICAgYy5pbnNlcnRFbGVtZW50KCAiYmFyIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheC52YWxpZGF0ZSgpICk7Ci0KLSAgICAgICAgYy50b1ByZXZTaWJsaW5nKCk7Ci0KLSAgICAgICAgYy5yZW1vdmVYbWwoKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC52YWxpZGF0ZSgpICk7Ci0KLSAgICAgICAgYmFzZS5jaGFuZ2VUeXBlKCBzdGwuZmluZFR5cGUoIG5ldyBRTmFtZSggImRlcml2ZWQiICkgKSApOwotCi0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImJhciIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC52YWxpZGF0ZSgpICk7Ci0gICAgfQotCi0gICAgLy8gVGVzdHMgYWJzdHJhY3QgJiBibG9jayBhdHRyaWJ1dGVzIG9uIENvbXBsZXhUeXBlCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlOCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYWJzdHJhY3QnIHR5cGU9J2Fic3RyYWN0Jy8+IiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdiYXNlJyB0eXBlPSdiYXNlJy8+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYWJzdHJhY3QnIGFic3RyYWN0PSd0cnVlJy8+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nY29uY3JldGUnPiIgKwotICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdhYnN0cmFjdCcvPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJyBibG9jaz0nZXh0ZW5zaW9uJy8+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXh0Jz4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSdiYXNlJy8+IiArCi0gICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKwotICAgICAgICAgICAgIiIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nIHhzaVR5cGUgPSAiIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnICI7Ci0KLSAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGFic3RyYWN0IiArIHhzaVR5cGUgKyAieHNpOnR5cGU9J2NvbmNyZXRlJy8+IiwKLSAgICAgICAgICAgICI8YmFzZS8+IiwKLSAgICAgICAgICAgICI8YmFzZSIgKyB4c2lUeXBlICsgInhzaTp0eXBlPSdyZXN0Jy8+IiwKLSAgICAgICAgfTsKLSAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKLSAgICAgICAgICAgICI8YWJzdHJhY3QvPiIsCi0gICAgICAgICAgICAiPGJhc2UiICsgeHNpVHlwZSArICJ4c2k6dHlwZT0nZXh0Jy8+IiwKLSAgICAgICAgfTsKLQotICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgbnVsbCwgdmFsaWQsIGludmFsaWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTkoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKwotICAgICAgICAgICAgIiAgIDx4czplbGVtZW50IG5hbWU9J29yZGVyJyB0eXBlPSdPcmRlclR5cGUnPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6a2V5cmVmIG5hbWU9J3Byb2ROdW1LZXlSZWYnIHJlZmVyPSdwcm9kTnVtS2V5Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0naXRlbXMvKicvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmZpZWxkIHhwYXRoPSdAbnVtYmVyJy8+IiArCi0gICAgICAgICAgICAiICAgICAgIDwveHM6a2V5cmVmPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6a2V5IG5hbWU9J3Byb2ROdW1LZXknPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPScuLy9wcm9kdWN0Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZmllbGQgeHBhdGg9J251bWJlcicvPiIgKwotICAgICAgICAgICAgIiAgICAgICA8L3hzOmtleT4iICsKLSAgICAgICAgICAgICIgICA8L3hzOmVsZW1lbnQ+IiArCi0KLSAgICAgICAgICAgICIgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nT3JkZXJUeXBlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naXRlbXMnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naXRlbScgdHlwZT0nSXRlbVR5cGUnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPC94czplbGVtZW50PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ncHJvZHVjdHMnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ncHJvZHVjdCcgdHlwZT0nUHJvZHVjdFR5cGUnIG1heE9jY3Vycz0ndW5ib3VuZGVkJyBtaW5PY2N1cnM9JzAnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPC94czplbGVtZW50PiIgKwotICAgICAgICAgICAgIiAgICAgICA8L3hzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J251bWJlcicgdHlwZT0neHM6c3RyaW5nJy8+IiArCi0gICAgICAgICAgICAiICAgPC94czpjb21wbGV4VHlwZT4iICsKLQotICAgICAgICAgICAgIiAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdJdGVtVHlwZSc+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3F1YW50aXR5JyB0eXBlPSd4czppbnQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgPC94czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdudW1iZXInIHR5cGU9J3hzOmludCcvPiIgKwotICAgICAgICAgICAgIiAgIDwveHM6Y29tcGxleFR5cGU+IiArCi0KLSAgICAgICAgICAgICIgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nUHJvZHVjdFR5cGUnPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdudW1iZXInIHR5cGU9J3hzOmludCcgbWluT2NjdXJzPScwJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSduYW1lJyB0eXBlPSd4czpzdHJpbmcnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3ByaWNlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSd4czpkZWNpbWFsJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J2N1cnJlbmN5JyB0eXBlPSd4czpzdHJpbmcnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDwveHM6ZWxlbWVudD4iICsKLSAgICAgICAgICAgICIgICAgICAgPC94czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPiAiLAotCi0gICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+IiArCi0KLSAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J3Jvb3QnIHR5cGU9J1Jvb3RUeXBlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6a2V5IG5hbWU9J0Zvb0lkJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPScuLy9zdHJpbmd8Li8vdG9rZW58Li8vaW50Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0nQGlkJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDprZXk+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCi0KLSAgICAgICAgICAgICIgICAgPHhzZDpncm91cCBuYW1lPSdncm91cCc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmNob2ljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSdzdHJpbmcnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSd0b2tlbicvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J2ludCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y2hvaWNlPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDpncm91cD4iICsKLQotICAgICAgICAgICAgIiAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9J1Jvb3RUeXBlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSdncm91cCcgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLQotICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0nc3RyaW5nJz4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0nZ3JvdXAnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSdpZCcgdHlwZT0neHNkOnN0cmluZycvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCi0KLSAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J2ludCc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSdncm91cCcgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9J2lkJyB0eXBlPSd4c2Q6aW50Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKLQotICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0ndG9rZW4nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0nZ3JvdXAnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSdpZCcgdHlwZT0neHNkOnRva2VuJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKLQotICAgICAgICAgICAgIjwveHNkOnNjaGVtYT4iLAotCi0gICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgIiArCi0gICAgICAgICAgICAiICAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL3d3dy50aW0taGFuc29uLmNvbS8nIHhtbG5zOnRoPSdodHRwOi8vd3d3LnRpbS1oYW5zb24uY29tLycgIiArCi0gICAgICAgICAgICAiICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz4iICsKLQotICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0ncm9vdCc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdmb28nIG1heE9jY3Vycz0ndW5ib3VuZGVkJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0naWQnIHR5cGU9J3hzZDppbnQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmtleSBuYW1lPSdpZCc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0nLi90aDpmb28nLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSdAdGg6aWQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmtleT4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKLSAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLQotICAgICAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnID4iICsKLSAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J2lkdGVzdCc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2UgbWF4T2NjdXJzPSd1bmJvdW5kZWQnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8eHNkOmNob2ljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdpZCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIHR5cGU9J3hzZDpJRCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9J2lkcmVmJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgdHlwZT0neHNkOklEUkVGJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0naWRyZWZzJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgdHlwZT0neHNkOklEUkVGUycvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKLSAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLQotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkID0gewotICAgICAgICAgICAgIjxvcmRlcj4iICsKLSAgICAgICAgICAgICIgICAgPGl0ZW1zPiIgKwotICAgICAgICAgICAgIiAgICAgIDxpdGVtIG51bWJlcj0nMTI0ICc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgIDxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKLSAgICAgICAgICAgICIgICAgICA8L2l0ZW0+IiArCi0gICAgICAgICAgICAiICAgICAgPGl0ZW0gbnVtYmVyPSc1NjMnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8cXVhbnRpdHk+MTwvcXVhbnRpdHk+IiArCi0gICAgICAgICAgICAiICAgICAgPC9pdGVtPiIgKwotICAgICAgICAgICAgIiAgICA8L2l0ZW1zPiIgKwotICAgICAgICAgICAgIiAgICA8cHJvZHVjdHM+IiArCi0gICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPiAxMjQ8L251bWJlcj4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5TaGlydDwvbmFtZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+MjkuOTk8L3ByaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj41NjM8L251bWJlcj4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5IYXQ8L25hbWU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjY5Ljk5PC9wcmljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+NDQzPC9udW1iZXI+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG5hbWU+VW1icmVsbGE8L25hbWU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjQ5Ljk5PC9wcmljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgPC9wcm9kdWN0cz4iICsKLSAgICAgICAgICAgICI8L29yZGVyPiIsCi0KLSAgICAgICAgICAgICI8cm9vdD4iICsKLSAgICAgICAgICAgICIgICAgPHN0cmluZyBpZD0nZm9vMSc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8c3RyaW5nIGlkPSdmb28yJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb28zJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vNic+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb283Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb284Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vNCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8c3RyaW5nIGlkPSdmb285Jy8+IiArCi0gICAgICAgICAgICAiICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iLAotCi0gICAgICAgICAgICAiPHJvb3Q+IiArCi0gICAgICAgICAgICAiICAgIDxpbnQgaWQ9JzEnLz4iICsKLSAgICAgICAgICAgICIgICAgPHN0cmluZyBpZD0nMScvPiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iLAotCi0gICAgICAgICAgICAiPHh5ejpyb290IHhtbG5zOnh5ej0naHR0cDovL3d3dy50aW0taGFuc29uLmNvbS8nPiIgKwotICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPScxJy8+IiArCi0gICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzInLz4iICsKLSAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMycvPiIgKwotICAgICAgICAgICAgIjwveHl6OnJvb3Q+IiwKLQotICAgICAgICAgICAgIjxpZHRlc3Q+IiArCi0gICAgICAgICAgICAiICA8aWRyZWY+eHl6PC9pZHJlZj4iICsKLSAgICAgICAgICAgICIgIDxpZHJlZnM+YWJjIGRlZjwvaWRyZWZzPiIgKwotICAgICAgICAgICAgIiAgPGlkPmFiYzwvaWQ+IiArCi0gICAgICAgICAgICAiICA8aWQ+ZGVmPC9pZD4iICsKLSAgICAgICAgICAgICIgIDxpZD54eXo8L2lkPiIgKwotICAgICAgICAgICAgIiAgPGlkcmVmPmFiYzwvaWRyZWY+IiArCi0gICAgICAgICAgICAiICA8aWRyZWZzPnh5eiBhYmM8L2lkcmVmcz4iICsKLSAgICAgICAgICAgICI8L2lkdGVzdD4iLAotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7Ci0gICAgICAgICAgICAiPG9yZGVyPiIgKwotICAgICAgICAgICAgIiAgICA8aXRlbXM+IiArCi0gICAgICAgICAgICAiICAgICAgPGl0ZW0gbnVtYmVyPScxMjUgJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKwotICAgICAgICAgICAgIiAgICAgIDwvaXRlbT4iICsKLSAgICAgICAgICAgICIgICAgICA8aXRlbSBudW1iZXI9JzU2Myc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgIDxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKLSAgICAgICAgICAgICIgICAgICA8L2l0ZW0+IiArCi0gICAgICAgICAgICAiICAgIDwvaXRlbXM+IiArCi0gICAgICAgICAgICAiICAgIDxwcm9kdWN0cz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+IDEyNDwvbnVtYmVyPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPlNoaXJ0PC9uYW1lPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxwcmljZSBjdXJyZW5jeT0nVVNEJz4yOS45OTwvcHJpY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3Byb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPjU2MzwvbnVtYmVyPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPkhhdDwvbmFtZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+NjkuOTk8L3ByaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj40NDM8L251bWJlcj4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5VbWJyZWxsYTwvbmFtZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+NDkuOTk8L3ByaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICA8L3Byb2R1Y3RzPiIgKwotICAgICAgICAgICAgIjwvb3JkZXI+IiwKLQotICAgICAgICAgICAgIjxyb290PiIgKwotICAgICAgICAgICAgIiAgICA8dG9rZW4gdG9rZW49JyAgYmxhaCAgYmxhaCcvPiIgKwotICAgICAgICAgICAgIiAgICA8c3RyaW5nIGlkPSdibGFoIGJsYWgnLz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IiwKLQotICAgICAgICAgICAgIjxyb290PiIgKwotICAgICAgICAgICAgIiAgICA8c3RyaW5nIGlkPSdmb28xJz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzInPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzMnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb282Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzcnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzMnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IiwKLQotICAgICAgICAgICAgIjx4eXo6cm9vdCB4bWxuczp4eXo9J2h0dHA6Ly93d3cudGltLWhhbnNvbi5jb20vJz4iICsKLSAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMScvPiIgKwotICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPScyJy8+IiArCi0gICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzInLz4iICsKLSAgICAgICAgICAgICI8L3h5ejpyb290PiIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gaW52YWxpZE9uRG9jT25seSA9IG5ldyBTdHJpbmdbXQotICAgICAgICB7Ci0KLSAgICAgICAgICAgICI8aWR0ZXN0PiIgKwotICAgICAgICAgICAgIiAgPGlkcmVmPmZvbzwvaWRyZWY+IiArCi0gICAgICAgICAgICAiICA8aWQ+YWJjPC9pZD4iICsKLSAgICAgICAgICAgICIgIDxpZD5kZWY8L2lkPiIgKwotICAgICAgICAgICAgIiAgPGlkPnh5ejwvaWQ+IiArCi0gICAgICAgICAgICAiPC9pZHRlc3Q+IiwKLQotICAgICAgICAgICAgIjxpZHRlc3Q+IiArCi0gICAgICAgICAgICAiICA8aWRyZWZzPmFiYyBmb288L2lkcmVmcz4iICsKLSAgICAgICAgICAgICIgIDxpZD5hYmM8L2lkPiIgKwotICAgICAgICAgICAgIiAgPGlkPmRlZjwvaWQ+IiArCi0gICAgICAgICAgICAiICA8aWQ+eHl6PC9pZD4iICsKLSAgICAgICAgICAgICI8L2lkdGVzdD4iLAotICAgICAgICB9OwotCi0KLSAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkLCB0cnVlKTsKLSAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkLCBmYWxzZSk7Ci0KLSAgICAgICAgIC8vIElEUmVmcyBhcmUgdmFsaWRhdGVkIG9ubHkgaWYgc3RhcnRpbmcgYXQgdGhlIHZlcnkgcm9vdCBvZiB0aGUgd29ybGQKLSAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIG5ldyBTdHJpbmdbMF0sIGludmFsaWRPbkRvY09ubHksIHRydWUpOwotICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgbnVsbCwgaW52YWxpZE9uRG9jT25seSwgbmV3IFN0cmluZ1swXSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8vIFRlc3QgdmFsaWRhdGlvbiBvZiBzZXR0aW5nIHdpdGggdGhlIFZhbGlkYXRlT25TZXQgb3B0aW9uCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdkZWMtcmVzdHJpY3Rpb24nPiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+IiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heEV4Y2x1c2l2ZSB2YWx1ZT0nMTAwJy8+IiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+IiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+IiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCi0gICAgICAgICAgICAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OwotICAgICAgICAKLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hcyApOwotCi0gICAgICAgIFhtbE9wdGlvbnMgdmFsaWRhdGUgPSBuZXcgWG1sT3B0aW9ucygpLnNldFZhbGlkYXRlT25TZXQoKTsKLSAgICAgICAgWG1sT3B0aW9ucyBub1ZhbGlkYXRlID0gbmV3IFhtbE9wdGlvbnMoKTsKLQotICAgICAgICBTY2hlbWFUeXBlIHN0ID0gc3RsLmZpbmRUeXBlKG5ldyBRTmFtZSgiIiwgImRlYy1yZXN0cmljdGlvbiIpKTsKLQotICAgICAgICBYbWxEZWNpbWFsIGRlYyA9IChYbWxEZWNpbWFsKXN0bC5uZXdJbnN0YW5jZShzdCwgdmFsaWRhdGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZWMuc2V0KCIyMDAiKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkge30KLQotICAgICAgICBkZWMgPSAoWG1sRGVjaW1hbClzdGwubmV3SW5zdGFuY2Uoc3QsIG5vVmFsaWRhdGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZWMuc2V0KCIyMDAiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vIEJ1Z3ppbGxhIGJ1ZyAjMjYxMDU6IHZhbGlkYXRlIGRlcml2ZWQgdHlwZSBmcm9tIGJhc2UgdHlwZSBlbnVtZXJhdGlvbgotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWFzW10gPSB7Ci0gICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLQotICAgICAgICAgICAgIjx4c2Q6ZWxlbWVudCBuYW1lPSdlbnVtRGVmJyB0eXBlPSdlbnVtRGVmVHlwZScvPlxuIiArCi0gICAgICAgICAgICAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPSdlbnVtRGVmVHlwZSc+XG4iICsKLSAgICAgICAgICAgICIgIDx4c2Q6c2ltcGxlQ29udGVudD5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSdlbnVtVHlwZScvPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzZDpzaW1wbGVDb250ZW50PlxuIiArCi0gICAgICAgICAgICAiPC94c2Q6Y29tcGxleFR5cGU+XG4iICsKLQotICAgICAgICAgICAgIjx4c2Q6c2ltcGxlVHlwZSBuYW1lPSdlbnVtVHlwZSc+XG4iICsKLSAgICAgICAgICAgICIgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0neHNkOnRva2VuJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSdlbnVtMScvPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzZDpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIjwveHNkOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+XG4iLAotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkID0gewotICAgICAgICAgICAgIjxlbnVtRGVmPmVudW0xPC9lbnVtRGVmPiIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKLSAgICAgICAgICAgICI8ZW51bURlZj5lbnVtMi9lbnVtRGVmPiIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9YbWxDb21wYXJhdG9yLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvWG1sQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzJmOGNkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9YbWxDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sV2hpdGVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCi0gKiBEYXRlOiBPY3QgMzAsIDIwMDMKLSAqLwotcHVibGljIGNsYXNzIFhtbENvbXBhcmF0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpYWdub3N0aWMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBudWxsOwotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGQoU3RyaW5nIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlPT1udWxsKQotICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChzKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UhPW51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChtZXNzYWdlPT1udWxsID8gbnVsbCA6IG1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkKERpYWdub3N0aWMgZGlhZywgU3RyaW5nIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZGlhZyE9bnVsbCkKLSAgICAgICAgICAgICAgICBkaWFnLmFkZChzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3c0NvbGxhcHNlRXF1YWwoU3RyaW5nIHMxLCBTdHJpbmcgczIpCi0gICAgewotICAgICAgICBTdHJpbmcgczFjID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShzMSk7Ci0gICAgICAgIFN0cmluZyBzMmMgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKHMyKTsKLSAgICAgICAgcmV0dXJuIChzMWMuZXF1YWxzKHMyYykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTmFtZXNBbmRBdHRyaWJ1dGVzKFhtbEN1cnNvciBjdXIxLCBYbWxDdXJzb3IgY3VyMiwgRGlhZ25vc3RpYyBkaWFnKQotICAgIHsKLSAgICAgICAgaWYgKCFjdXIxLmdldE5hbWUoKS5lcXVhbHMoY3VyMi5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEaWFnbm9zdGljLmFkZChkaWFnLCAiRWxlbWVudCBuYW1lcyAiICsgUU5hbWVIZWxwZXIucHJldHR5KGN1cjEuZ2V0TmFtZSgpKSArICIgYW5kICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY3VyMi5nZXROYW1lKCkpICsgIiBkbyBub3QgbWF0Y2giKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbW9yZSA9IGN1cjEudG9GaXJzdEF0dHJpYnV0ZSgpOwotICAgICAgICBpZiAobW9yZSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICg7IG1vcmU7IG1vcmUgPSBjdXIxLnRvTmV4dEF0dHJpYnV0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0MSA9IGN1cjEuZ2V0VGV4dFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQyID0gY3VyMi5nZXRBdHRyaWJ1dGVUZXh0KGN1cjEuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAodGV4dDIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWMuYWRkKGRpYWcsICJBdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShjdXIxLmdldE5hbWUoKSkgKyAiIG5vdCBwcmVzZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXdzQ29sbGFwc2VFcXVhbCh0ZXh0MSwgdGV4dDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpYy5hZGQoZGlhZywgIkF0dHJpYnV0ZSB2YWx1ZXMgZm9yICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY3VyMS5nZXROYW1lKCkpICsgIiBkbyBub3QgbWF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cjEudG9QYXJlbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vcmUgPSBjdXIyLnRvRmlyc3RBdHRyaWJ1dGUoKTsKLSAgICAgICAgaWYgKG1vcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoOyBtb3JlOyBtb3JlID0gY3VyMi50b05leHRBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBjdXIxLmdldEF0dHJpYnV0ZVRleHQoY3VyMi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0MSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpYy5hZGQoZGlhZywgIkF0dHJpYnV0ZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KGN1cjIuZ2V0TmFtZSgpKSArICIgbm90IHByZXNlbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cjIudG9QYXJlbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRGlhZ25vc3RpYyBsZW5pZW50bHlDb21wYXJlVHdvWG1sU3RyaW5ncyhTdHJpbmcgYWN0dWFsLCBTdHJpbmcgZXhwZWN0KQotICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEaWFnbm9zdGljIGRpYWcgPSBuZXcgRGlhZ25vc3RpYygpOwotICAgICAgICBsZW5pZW50bHlDb21wYXJlVHdvWG1sU3RyaW5ncyhhY3R1YWwsIGV4cGVjdCwgZGlhZyk7Ci0gICAgICAgIHJldHVybiBkaWFnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGFuIHV0aWxpdHkgdG8gY29tcGFyZSB0aGUgeG1sIGluc2lkZSB0aGUgdHdvIHN0cmluZ3MKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHhtbCBpbnNpZGUgdGhlIHR3byBzdHJpbmdzIGlzIGxlbmllbnRseSB0aGUgc2FtZQotICAgICAqICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxlbmllbnRseUNvbXBhcmVUd29YbWxTdHJpbmdzKFN0cmluZyBhY3R1YWwsIFN0cmluZyBleHBlY3QsIERpYWdub3N0aWMgZGlhZykKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHhvYmoxID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoYWN0dWFsKTsKLSAgICAgICAgWG1sT2JqZWN0IHhvYmoyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZXhwZWN0KTsKLQotICAgICAgICBYbWxDdXJzb3IgY3VyMSA9IHhvYmoxLm5ld0N1cnNvcigpOwotICAgICAgICBYbWxDdXJzb3IgY3VyMiA9IHhvYmoyLm5ld0N1cnNvcigpOwotCi0gICAgICAgIGN1cjEudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIGN1cjIudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgcmV0dXJuIGxlbmllbnRseUNvbXBhcmVUd29YbWxTdHJpbmdzKGN1cjEsICBjdXIyLCBkaWFnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhbiB1dGlsaXR5IHRvIGNvbXBhcmUgdGhlIHhtbCBpbnNpZGUgdGhlIHR3byBjdXJzb3JzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB4bWwgaW5zaWRlIHRoZSB0d28gc3RyaW5ncyBpcyBsZW5pZW50bHkgdGhlIHNhbWUKLSAgICAgKiAgIG90aGVyd2lzZSBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsZW5pZW50bHlDb21wYXJlVHdvWG1sU3RyaW5ncyhYbWxDdXJzb3IgY3VyMSwgWG1sQ3Vyc29yIGN1cjIsIERpYWdub3N0aWMgZGlhZykKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gbWF0Y2ggPSB0cnVlOwotICAgICAgICBpbnQgZGVwdGggPSAwOwotICAgICAgICB3aGlsZSAoY3VyMS5jdXJyZW50VG9rZW5UeXBlKCkgIT0gWG1sQ3Vyc29yLlRva2VuVHlwZS5TVEFSVERPQykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjb21wYXJlTmFtZXNBbmRBdHRyaWJ1dGVzKGN1cjEsIGN1cjIsIGRpYWcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4xID0gY3VyMS50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4yID0gY3VyMi50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGRlcHRoKys7Ci0gICAgICAgICAgICBpZiAoaGFzQ2hpbGRyZW4xICE9IGhhc0NoaWxkcmVuMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEaWFnbm9zdGljLmFkZChkaWFnLCAiVG9wb2xvZ3kgZGlmZmVyczogb25lIGRvY3VtZW50IGhhcyBjaGlsZHJlbiB3aGVyZSB0aGUgb3RoZXIgZG9lcyBub3QgKCIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY3VyMS5nZXROYW1lKCkpICsgIiwgIiArIFFOYW1lSGVscGVyLnByZXR0eShjdXIyLmdldE5hbWUoKSkgKyAiKSIpOyAvLyBUT0RPOiB3aGVyZT8KLSAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChoYXNDaGlsZHJlbjEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdXIxLnRvUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuMSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFzQ2hpbGRyZW4yKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyMi50b1BhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbjIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbjEgPT0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCF3c0NvbGxhcHNlRXF1YWwoY3VyMS5nZXRUZXh0VmFsdWUoKSwgY3VyMi5nZXRUZXh0VmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljLmFkZChkaWFnLCAiVmFsdWUgIiArIGN1cjEuZ2V0VGV4dFZhbHVlKCkgKyAiIGRpZmZlcnMgZnJvbSB2YWx1ZSAiICsgY3VyMi5nZXRUZXh0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFzQ2hpbGRyZW4xKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzU2libGluZzEgPSBjdXIxLnRvTmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc1NpYmxpbmcyID0gY3VyMi50b05leHRTaWJsaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFzU2libGluZzEgIT0gaGFzU2libGluZzIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljLmFkZChkaWFnLCAiVG9wb2xvZ3kgZGlmZmVyczogb25lIGRvY3VtZW50IGhhcyBzaWJsaW5ncyB3aGVyZSB0aGUgb3RoZXIgZG9lcyBub3QiKTsgLy8gVE9ETzogd2hlcmU/Ci0gICAgICAgICAgICAgICAgICAgIGhhc1NpYmxpbmcxID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1NpYmxpbmcyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhhc1NpYmxpbmcxKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGN1cjEudG9QYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBjdXIyLnRvUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgZGVwdGgtLTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXIxLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBYbWxDdXJzb3IuVG9rZW5UeXBlLlNUQVJURE9DIHx8IGRlcHRoPD0wKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2g7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZWFzeXBvL2Vhc3lwby54c2QgYi92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlODM3My4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icHVyY2hhc2Utb3JkZXIiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY3VzdG9tZXIiIHR5cGU9InBvOmN1c3RvbWVyIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImRhdGUiIHR5cGU9InhzOmRhdGVUaW1lIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxpbmUtaXRlbSIgdHlwZT0icG86bGluZS1pdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InNoaXBwZXIiIHR5cGU9InBvOnNoaXBwZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tZXIiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFnZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb28iIHR5cGU9InhzOmludCIgZGVmYXVsdD0iMTAwIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb28iIHR5cGU9InhzOmludCIgZml4ZWQ9IjIwMCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsaW5lLWl0ZW0iPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InBlci11bml0LW91bmNlcyIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2hpcHBlciI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwZXItb3VuY2UtcmF0ZSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZWFzeXBvL2Vhc3lwby54c2Rjb25maWcgYi92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYzZlZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhiOmNvbmZpZyB4bWxuczp4Yj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveGJlYW4vY29uZmlnIgotICAgICAgICAgICB4bWxuczplcD0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyI+Ci0KLSAgPHhiOm5hbWVzcGFjZSB1cmk9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iPgotICAgIDx4YjpwYWNrYWdlPmNvbS5lYXN5cG88L3hiOnBhY2thZ2U+Ci0gIDwveGI6bmFtZXNwYWNlPgotCi0gIDx4YjpuYW1lc3BhY2UgdXJpPSIjI2FueSI+Ci0gICAgPHhiOnByZWZpeD5YbWw8L3hiOnByZWZpeD4KLSAgICA8eGI6c3VmZml4PkJlYW48L3hiOnN1ZmZpeD4KLSAgPC94YjpuYW1lc3BhY2U+Ci0KLTwveGI6Y29uZmlnPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZWFzeXBvdXNlL2NvbS9iZWEvdGVzdC9Mb2FkQW5kVXNlUG8uamF2YSBiL3YxL3Rlc3Qvc3JjL2Vhc3lwb3VzZS9jb20vYmVhL3Rlc3QvTG9hZEFuZFVzZVBvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDExOGUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZWFzeXBvdXNlL2NvbS9iZWEvdGVzdC9Mb2FkQW5kVXNlUG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5iZWEudGVzdDsKLQotaW1wb3J0IHhtbC51dGlsLio7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZWFzeXBvLio7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBMb2FkQW5kVXNlUG8KLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGZpbGUgIiArIGFyZ3NbaV0pOwotICAgICAgICAgICAgc3VtbWFyaXplUG9Eb2N1bWVudChQdXJjaGFzZU9yZGVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShuZXcgRmlsZShhcmdzW2ldKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN1bW1hcml6ZVBvRG9jdW1lbnQoUHVyY2hhc2VPcmRlckRvY3VtZW50IGRvYykKLSAgICB7Ci0gICAgICAgIFB1cmNoYXNlT3JkZXIgb3JkZXIgPSBkb2MuZ2V0UHVyY2hhc2VPcmRlcigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1c3RvbWVyOiAiICsgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXROYW1lKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZHJlc3M6ICAiICsgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBMaW5lSXRlbVtdIGl0ZW0gPSBvcmRlci5nZXRMaW5lSXRlbSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdGVtIGRlc2NyaXB0aW9uOiAiICsgaXRlbVtpXS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBQcmljZTogIiArIGl0ZW1baV0uZ2V0UHJpY2UoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgUXVhbnRpdHk6ICIgKyBpdGVtW2ldLmdldFF1YW50aXR5KCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIE91bmNlczogIiArIGl0ZW1baV0uZ2V0UGVyVW5pdE91bmNlcygpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgQW1vdW50OiAiICsgaXRlbVtpXS5nZXRBbW91bnQoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgV2VpZ2h0OiAiICsgaXRlbVtpXS5nZXRMaW5lSXRlbU91bmNlcygpKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgaWYgKG9yZGVyLmlzU2V0U2hpcHBlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaXBwZXI6ICIgKyBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBQZXItb3VuY2UgcmF0ZTogIiArIG9yZGVyLmdldFNoaXBwZXIoKS5nZXRQZXJPdW5jZVJhdGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgd2VpZ2h0IGluIG91bmNlczogIiArIG9yZGVyLmdldFRvdGFsT3VuY2VzKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaXBwaW5nIGFtb3VudDogIiArIG9yZGVyLmdldFNoaXBwaW5nQW1vdW50KCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGFtb3VudDogIiArIG9yZGVyLmdldFRvdGFsQW1vdW50KCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9lbnVtdGVzdC9lbnVtdGVzdC54c2QgYi92MS90ZXN0L3NyYy9lbnVtdGVzdC9lbnVtdGVzdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YjY1NDUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZW51bXRlc3QvZW51bXRlc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczpldD0iaHR0cDovL29wZW51cmkub3JnL2VudW10ZXN0IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0icXVhbnRpdHkiPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1vc3QiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic29tZSIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmZXciLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhbGxPck5vbmUiPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJldDpxdWFudGl0eSI+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkYXRhIj4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iZXQ6cXVhbnRpdHkiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iZXQ6YWxsT3JOb25lIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3RhdHVzcmVwb3J0Ij4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InN0YXR1cyIgdHlwZT0iZXQ6ZGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2FsZXNyZXBvcnQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idW5pdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvbmUiLz4KLSAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0d28iLz4KLSAgICAgICAgICAgICAgPCEtLSBza2lwIGEgZmV3IC0tPgotICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5pbmV0eS1uaW5lIi8+Ci0gICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib25lLWh1bmRyZWQiLz4KLSAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8IS0tIGJ1ZyBDUjEyODkwNjogZ2VuJ2QgamF2YSBjb2RlIG11c3QgcXVhbGlmeSBqYXZhLmxhbmcuKiB0eXBlcyAtLT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ib2JqZWN0Ij4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhYmMiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVmIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2VyaWNzY2hlbWEvZXJpY3NjaGVtYS54c2QgYi92MS90ZXN0L3NyYy9lcmljc2NoZW1hL2VyaWNzY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzBlNjYzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2VyaWNzY2hlbWEvZXJpY3NjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXNkYXNkIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9lcmljdGVzdC9FcmljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ3OGE3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuQ29kZUdlblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG9jdW1lbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFcmljVGVzdAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEhhc2hNYXAgbnNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG5zZXMucHV0KCAieCIsICJ4LmNvbSIgKTsKLSAgICAgICAgbnNlcy5wdXQoICJ5IiwgInkuY29tIiApOwotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlcyggbnNlcyApOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhPjwvYT4iLCBvcHRpb25zICk7Ci0gICAgICAgIHguc2F2ZSggU3lzdGVtLm91dCApOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvbmFtZXdvcmxkdXNlL2NvbS9iZWEvdGVzdC9EdW1wTmFtZXdvcmxkLmphdmEgYi92MS90ZXN0L3NyYy9uYW1ld29ybGR1c2UvY29tL2JlYS90ZXN0L0R1bXBOYW1ld29ybGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkMjE5Ny4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9uYW1ld29ybGR1c2UvY29tL2JlYS90ZXN0L0R1bXBOYW1ld29ybGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5iZWEudGVzdDsKLQotaW1wb3J0IG9yZy5vcGVudXJpLm5hbWV3b3JsZC4qOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLQotcHVibGljIGNsYXNzIER1bXBOYW1ld29ybGQKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGZpbGUgIiArIGFyZ3NbaV0pOwotICAgICAgICAgICAgZHVtcERvY3VtZW50KE5hbWV3b3JsZERvY3VtZW50LkZhY3RvcnkucGFyc2UobmV3IEZpbGUoYXJnc1tpXSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wRG9jdW1lbnQoTmFtZXdvcmxkRG9jdW1lbnQgZG9jKQotICAgIHsKLSAgICAgICAgTmFtZXdvcmxkIHdvcmxkID0gZG9jLmdldE5hbWV3b3JsZCgpOwotICAgICAgICBOYW1ld29ybGQuSXNsYW5kW10gaXNsYW5kcyA9IHdvcmxkLmdldElzbGFuZCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlzbGFuZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJc2xhbmQgdGFyZ2V0IG5hbWVzcGFjZTogIiArIGlzbGFuZHNbaV0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgTG9jW10gbG9jcyA9IGlzbGFuZHNbaV0uZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG9jcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgTG9jYXRpb246ICIgKyBsb2NzW2pdLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgTG9jLlJlZmVyZW5jZVtdIHJlZnMgPSBsb2NzW2pdLmdldFJlZmVyZW5jZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVmcy5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBSZWZlcmVuY2U6ICIgKyByZWZzW2tdLmdldFRvKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9udW1lcmFscy9udW1lcmFscy54c2QgYi92MS90ZXN0L3NyYy9udW1lcmFscy9udW1lcmFscy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNTkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvbnVtZXJhbHMvbnVtZXJhbHMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnCi0gICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly9vcGVudXJpLm9yZy90ZXN0TnVtZXJhbHMnCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCc+Ci0gIDx4czplbGVtZW50IG5hbWU9J2RvYyc+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2ludCcgdHlwZT0neHM6aW50JyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3Nob3J0JyB0eXBlPSd4czpzaG9ydCcgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdieXRlJyB0eXBlPSd4czpieXRlJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2RvdWJsZScgdHlwZT0neHM6ZG91YmxlJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2Zsb2F0JyB0eXBlPSd4czpmbG9hdCcgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdib29sZWFuJyB0eXBlPSd4czpib29sZWFuJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3N0cmluZycgdHlwZT0neHM6c3RyaW5nJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2RlY2ltYWwnIHR5cGU9J3hzOmRlY2ltYWwnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naW50ZWdlcicgdHlwZT0neHM6aW50ZWdlcicgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdsb25nJyB0eXBlPSd4czpsb25nJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2hleEJpbmFyeScgdHlwZT0neHM6aGV4QmluYXJ5JyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2Jhc2U2NEJpbmFyeScgdHlwZT0neHM6YmFzZTY0QmluYXJ5JyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2RhdGUnIHR5cGU9J3hzOmRhdGUnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZGF0ZVRpbWUnIHR5cGU9J3hzOmRhdGVUaW1lJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2dZZWFyTW9udGgnIHR5cGU9J3hzOmdZZWFyTW9udGgnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZHVyYXRpb24nIHR5cGU9J3hzOmR1cmF0aW9uJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J1FOYW1lJyB0eXBlPSd4czpRTmFtZScgLz4KLSAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3JhbmRvbS9SYW5kb20uamF2YSBiL3YxL3Rlc3Qvc3JjL3JhbmRvbS9SYW5kb20uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2Y2I0MC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9yYW5kb20vUmFuZG9tLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjQgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuQ29tbWFuZExpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuQ3Vyc29yOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5QdXJjaGFzZU9yZGVyOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sQ3VzdG9tZXJCZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sTGluZUl0ZW1CZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sU2hpcHBlckJlYW47Ci0KLXB1YmxpYyBjbGFzcyBSYW5kb20gaW1wbGVtZW50cyBSdW5uYWJsZQotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInNlZWQiLCAiaSIsICJ0IiwgImRvY3MiLCAiPyIsICJoZWxwIiB9KSk7Ci0gICAgICAgIGxvbmcgc2VlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgdGhyZWFkcyA9IDE7Ci0gICAgICAgIGludCBkb2NzID0gMTA7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2wuZ2V0T3B0KCI/IikgIT0gbnVsbCB8fCBjbC5nZXRPcHQoImhlbHAiKSAhPSBudWxsIHx8IGNsLmFyZ3MoKS5sZW5ndGggIT0gMCkKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHJhbmRvbSBbLXNlZWQgI10gWy1pIGl0ZXJhdGlvbnNdIFstdCB0aHJlYWRzXSBbLWRvY3MgZG9jc10gWy1yZWFkb25seV0gWy1ub3NhdmVdIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZWFkb25seSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBub3NhdmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gbm9xdWVyeSA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2wuZ2V0T3B0KCJzZWVkIikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZWVkID0gTG9uZy5wYXJzZUxvbmcoY2wuZ2V0T3B0KCJzZWVkIikpOwotICAgICAgICAgICAgaWYgKGNsLmdldE9wdCgiaSIpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgaXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQoY2wuZ2V0T3B0KCJpIikpOwotICAgICAgICAgICAgaWYgKGNsLmdldE9wdCgidCIpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyZWFkcyA9IEludGVnZXIucGFyc2VJbnQoY2wuZ2V0T3B0KCJ0IikpOwotICAgICAgICAgICAgaWYgKGNsLmdldE9wdCgiZG9jcyIpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZG9jcyA9IEludGVnZXIucGFyc2VJbnQoY2wuZ2V0T3B0KCJkb2NzIikpOwotICAgICAgICAgICAgbm9xdWVyeSA9IChjbC5nZXRPcHQoIm5vcXVlcnkiKSAhPSBudWxsKTsKLSAgICAgICAgICAgIHJlYWRvbmx5ID0gKGNsLmdldE9wdCgicmVhZG9ubHkiKSAhPSBudWxsKTsKLSAgICAgICAgICAgIG5vc2F2ZSA9IChjbC5nZXRPcHQoIm5vc2F2ZSIpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZWVkPSIgKyBzZWVkKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaXRlcmF0aW9ucz0iICsgaXRlcmF0aW9ucyApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0aHJlYWRzPSIgKyB0aHJlYWRzKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9jcz0iICsgZG9jcyApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlYWRvbmx5ID8gInJlYWRvbmx5IiA6ICJyZWFkL3dyaXRlIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obm9zYXZlID8gIm5vc2F2ZSIgOiAid2l0aCBzYXZlIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obm9xdWVyeSA/ICJub3F1ZXJ5IiA6ICJ3aXRoIHF1ZXJ5Iik7Ci0gICAgICAgICAgICBkb1Rlc3RzKHNlZWQsIGl0ZXJhdGlvbnMsIHRocmVhZHMsIGRvY3MsIHJlYWRvbmx5LCBub3NhdmUsIG5vcXVlcnkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZG9UZXN0cyhsb25nIHNlZWQsIGludCBpdGVyYXRpb25zLCBpbnQgdGhyZWFkQ291bnQsIGludCBkb2NDb3VudCwgYm9vbGVhbiByZWFkb25seSwgYm9vbGVhbiBub3NhdmUsIGJvb2xlYW4gbm9xdWVyeSkKLSAgICB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHNoYXJlZERvY3MgPSBuZXcgWG1sT2JqZWN0IFtkb2NDb3VudF07Ci0gICAgICAgIFRocmVhZFtdIHRocmVhZHMgPSBuZXcgVGhyZWFkW3RocmVhZENvdW50XTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBpdGVyYXRpb25zIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0aHJlYWRDb3VudDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJhbmRvbSBydW5uYWJsZSA9IG5ldyBSYW5kb20oc2VlZCwgc2hhcmVkRG9jcywgcmVhZG9ubHksIG5vc2F2ZSwgbm9xdWVyeSwgdGhyZWFkQ291bnQgPiAxKTsKLSAgICAgICAgICAgICAgICB0aHJlYWRzW2pdID0gbmV3IFRocmVhZChydW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgdGhyZWFkc1tqXS5zdGFydCgpOwotICAgICAgICAgICAgICAgIHNlZWQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGhyZWFkQ291bnQ7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZHNbal0uam9pbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhyZWFkIGludGVycnVwdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAgICAgIlNlY29uZHMgdG8gcnVuIHJhbmRvbSB0ZXN0czogIiArIChlbmQgLSBzdGFydCkgLyAxMDAwICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCAiXHJTZWVkOiAiICsgX3NlZWQgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgZCA9IDAgOyBkIDwgX2RvY3MubGVuZ3RoIDsgZCsrICkKLSAgICAgICAgICAgICAgICBfZG9jc1sgZCBdID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAKLSAgICAgICAgICAgIF9jdXJzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgICAgICAgICAgaW50IG5JdGVyYXRpb25zID0gcm5kKCA2MDAwMCApICsgNTAwMDsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuSXRlcmF0aW9ucyA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBnb29kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfaXRlcisrOwotICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGdvb2QgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWdvb2QpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3Igb24gaXRlcmF0aW9uICIgKyBfaXRlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yIG9uIHNlZWQgIiArIF9zZWVkICk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSggU3lzdGVtLmVyciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBqYXZhLnV0aWwuUmFuZG9tIF9ybmQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBYbWxPYmplY3RbXSBfZG9jczsgLy8gc2hhcmVkIGFtb25nIHRocmVhZHMhIQotICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgX2N1cnNvcnM7Ci0gICAgcHJpdmF0ZSBsb25nICAgICAgICBfc2VlZDsKLSAgICBwcml2YXRlIGludCAgICAgICAgIF9pdGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgX3JlYWRvbmx5OwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgX25vc2F2ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgIF9ub3F1ZXJ5OwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgX2ludGVyZmVyZW5jZTsKLQotCi0gICAgcHJpdmF0ZSBpbnQgcm5kICggaW50IG4gKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ybmQubmV4dEludCggbiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBybmQgKCBpbnQgbWluLCBpbnQgbWF4UGx1c09uZSApCi0gICAgewotICAgICAgICByZXR1cm4gX3JuZC5uZXh0SW50KG1heFBsdXNPbmUgLSBtaW4pICsgbWluOwotICAgIH0KLQotICAgIHByaXZhdGUgWG1sQ3Vyc29yIGdldEN1cnNvciAoICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gX2N1cnNvcnMuc2l6ZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG4gPT0gMCB8fCAobiA8IF9kb2NzLmxlbmd0aCAqIDMpICYmIHJuZCggNCApID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjID0gX2RvY3NbIHJuZCggX2RvY3MubGVuZ3RoICkgXS5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgIF9jdXJzb3JzLmFkZCggYyApOwotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFhtbEN1cnNvcikgX2N1cnNvcnMuZ2V0KCBybmQoIG4gKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpdGVyYXRlICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggcm5kICggNiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgIDAgOiBpbnRlcmF0ZUhpZ2goKTsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDEgOiBpbnRlcmF0ZUhpZ2goKTsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDIgOiBpbnRlcmF0ZUhpZ2goKTsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDMgOiBpbnRlcmF0ZU1lZGl1bSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDQgOiBpbnRlcmF0ZU1lZGl1bSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDUgOiBpbnRlcmF0ZUxvdygpOyAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX2ludGVyZmVyZW5jZSkKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfaW50ZXJmZXJlbmNlKQotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGludGVyYXRlSGlnaCAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3dpdGNoICggcm5kICggMiApICkKLSAgICAgICAgewotICAgICAgICBjYXNlICAwIDogbW92ZUN1cnNvclJpZ2h0T25lVG9rZW4oKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgIDEgOiBtb3ZlQ3Vyc29yTGVmdE9uZVRva2VuKCk7ICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW50ZXJhdGVNZWRpdW0gKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoIF9yZWFkb25seSA/IHJuZCAoIDQgKSA6IHJuZCAoMjQpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAgMCA6IGdldENoYXJzKCk7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMSA6IGdldFRleHRWYWx1ZSgpOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMiA6IGNvbXBhcmVWYWx1ZSgpOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMyA6IHByZXZUb2tlblR5cGUoKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAgNCA6IGluc2VydFRleHQoKTsgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNSA6IG1vdmVDaGFyc1JpZ2h0KCk7ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNiA6IG1vdmVDaGFyc0xlZnQoKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNyA6IGluc2VydEVsZW0oKTsgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgOCA6IGluc2VydEF0dHIoKTsgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgOSA6IHJlbW92ZVhtbCgpOyAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMCA6IHJlbW92ZVhtbENvbnRlbnRzKCk7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMSA6IGNvcHlYbWwoKTsgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMiA6IGNvcHlYbWxDb250ZW50cygpOyAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMyA6IG1vdmVYbWwoKTsgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNCA6IG1vdmVYbWxDb250ZW50cygpOyAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNSA6IHJlbW92ZVRleHQoKTsgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNiA6IG1vdmVUZXh0KCk7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNyA6IGNvcHlUZXh0KCk7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOCA6IGluc2VydENvbW1lbnQoKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOSA6IGluc2VydFByb2NpbnN0KCk7ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMCA6IHNldFRleHRWYWx1ZSgpOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMSA6IHNldFN0cm9uZygpOyAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMiA6IG9iamVjdFNldCgpOyAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMyA6IHNldE5hbWUoKTsgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbnRlcmF0ZUxvdyAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3dpdGNoICggcm5kIChfcmVhZG9ubHkgPyAxIDogMCwgX25vc2F2ZSA/IDggOiAxNykgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICAwIDogY2hhbmdlVHlwZSgpOyAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAxIDogY3JlYXRlQm9va21hcmsoKTsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAyIDogY2xlYXJCb29rbWFyaygpOyAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgIDMgOiBsb2FkRG9jKCk7ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDQgOiBsb2FkU2NoZW1hZERvYygpOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDUgOiBjb21wYXJlQ3Vyc29ycygpOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDYgOiBnZXRPYmplY3QoKTsgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDcgOiBuZXdDdXJzb3IoKTsgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAgOCA6IHZhbGlkYXRlKCk7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgOSA6IGV4ZWNRdWVyeSgpOyAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMCA6IHhtbElucHV0U3RyZWFtKCk7ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMSA6IGRvY0J5dGVzKCk7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMiA6IGN1cnNvckJ5dGVzKCk7ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMyA6IG5ld0RvbU5vZGUoKTsgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNCA6IG9iamVjdFN0cmluZygpOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNSA6IGN1cnNvclN0cmluZygpOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNiA6IHByZXR0eU9iamVjdCgpOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgZmluZE9iamVjdCAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0gICAgICAgIGMucHVzaCgpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCAhKGMuaXNDb250YWluZXIoKSB8fCBjLmlzQXR0cigpKSApCi0gICAgICAgICAgICBpZiAoYy50b05leHRUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICghYy5pc0VuZGRvYygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeCA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICBjLnBvcCgpOwotICAgICAgICAgICAgaWYgKHggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRPYmplY3QgcmV0dXJuZWQgbnVsbCAtIGNvbnRlbnQgbXVzdCBoYXZlIGNoYW5nZWQiKTsKLSAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICB9Ci0KLSAgICAgICAgYy5wb3AoKTsKLSAgICAgICAgYy5wdXNoKCk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoICEoYy5pc0NvbnRhaW5lcigpIHx8IGMuaXNBdHRyKCkpICkKLSAgICAgICAgICAgIGlmIChjLnRvUHJldlRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPSBjLmdldE9iamVjdCgpOwotICAgICAgICBjLnBvcCgpOwotICAgICAgICBpZiAoeCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0T2JqZWN0IHJldHVybmVkIG51bGwgLSBjb250ZW50IG11c3QgaGF2ZSBjaGFuZ2VkIik7Ci0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmV0dHlPYmplY3QgKCApCi0gICAgewotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFNhdmVQcmV0dHlQcmludCgpOwotICAgICAgICBmaW5kT2JqZWN0KCkueG1sVGV4dCggb3B0aW9ucyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgb2JqZWN0U3RyaW5nICggKQotICAgIHsKLSAgICAgICAgZmluZE9iamVjdCgpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjdXJzb3JTdHJpbmcgKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlVHlwZSAoICkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCBvLCBuOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG8gPSBmaW5kT2JqZWN0KCk7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBmaW5kT2JqZWN0KCkuc2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgbiA9IG8uY2hhbmdlVHlwZSggdHlwZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZG9jcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobyA9PSBfZG9jc1sgaSBdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9kb2NzWyBpIF0gPSBuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcmV2VG9rZW5UeXBlICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkucHJldlRva2VuVHlwZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbmV3Q3Vyc29yICggKQotICAgIHsKLSAgICAgICAgZmluZE9iamVjdCgpLm5ld0N1cnNvcigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0TmFtZSAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZmluZE9iamVjdCgpLm5ld0N1cnNvcigpOwotCi0gICAgICAgIGlmICghYy5pc1N0YXJ0ZG9jKCkpCi0gICAgICAgICAgICBjLnNldE5hbWUoIGdldFFOYW1lKCkgKTsKLQotICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG5ld0RvbU5vZGUgKCApCi0gICAgewotICAgICAgICBpZiAocm5kKCA1ICkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5uZXdEb21Ob2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB4bWxJbnB1dFN0cmVhbSAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHJuZCggNSApICE9IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXM7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgeGlzID0gZ2V0Q3Vyc29yKCkubmV3WE1MSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCB4aXMubmV4dCgpICE9IG51bGwgKQotICAgICAgICAgICAgOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvYmplY3RTZXQgKCApCi0gICAgewotICAgICAgICBmaW5kT2JqZWN0KCkuc2V0KCBmaW5kT2JqZWN0KCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNldFN0cm9uZyAoICkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gZmluZE9iamVjdCgpOwotCi0gICAgICAgIGlmICh4IGluc3RhbmNlb2YgUHVyY2hhc2VPcmRlcikKLSAgICAgICAgewotICAgICAgICAgICAgUHVyY2hhc2VPcmRlciBvID0gKFB1cmNoYXNlT3JkZXIpIHg7Ci0gICAgICAgICAgICBvLnNldERhdGUoIENhbGVuZGFyLmdldEluc3RhbmNlKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4IGluc3RhbmNlb2YgWG1sQ3VzdG9tZXJCZWFuKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXN0b21lckJlYW4gbyA9IChYbWxDdXN0b21lckJlYW4pIHg7Ci0gICAgICAgICAgICBvLnNldE5hbWUoICJCb2IiICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChybmQoIDIgKSA9PSAwKQotICAgICAgICAgICAgICAgIG8uc2V0QWdlKCAyMyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocm5kKCAyICkgPT0gMCkKLSAgICAgICAgICAgICAgICBvLnNldE1vbyggMjQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJuZCggMiApID09IDApCi0gICAgICAgICAgICAgICAgby5zZXRQb28oIDIwMCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHggaW5zdGFuY2VvZiBYbWxMaW5lSXRlbUJlYW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbExpbmVJdGVtQmVhbiBvID0gKFhtbExpbmVJdGVtQmVhbikgeDsKLSAgICAgICAgICAgIG8uc2V0UGVyVW5pdE91bmNlcyggbmV3IEJpZ0RlY2ltYWwoIDEyMi40NCApICk7Ci0gICAgICAgICAgICBvLnNldFByaWNlKCBuZXcgQmlnRGVjaW1hbCggNTU1LjMzICkgKTsKLSAgICAgICAgICAgIG8uc2V0UXVhbnRpdHkoIEJpZ0ludGVnZXIudmFsdWVPZiggMTExICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4IGluc3RhbmNlb2YgWG1sU2hpcHBlckJlYW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFNoaXBwZXJCZWFuIG8gPSAoWG1sU2hpcHBlckJlYW4pIHg7Ci0gICAgICAgICAgICBvLnNldFBlck91bmNlUmF0ZSggbmV3IEJpZ0RlY2ltYWwoIDMuMTQxNTkgKSApOwotICAgICAgICAgICAgby5zZXROYW1lKCAiRXJpYyIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb21wYXJlVmFsdWUgKCApCi0gICAgewotICAgICAgICBmaW5kT2JqZWN0KCkuY29tcGFyZVZhbHVlKCBmaW5kT2JqZWN0KCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlICggKQotICAgIHsKLSAgICAgICAgZmluZE9iamVjdCgpLnZhbGlkYXRlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBleGVjUXVlcnkgKCApCi0gICAgewotICAgICAgICBpZiAoX25vcXVlcnkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBpZiAocm5kKCAyMCApID4gMCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIG5hbWUgPSBnZXRRTmFtZSgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0KLSAgICAgICAgICAgICJkZWNsYXJlIG5hbWVzcGFjZSB4eHg9JyIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIicgIiArCi0gICAgICAgICAgICAgICAgIi4vL3h4eDoiICsgbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdCB4ID0gZ2V0Q3Vyc29yKCkuZXhlY1F1ZXJ5KCBxdWVyeSApLmdldE9iamVjdCgpOwotCi0gICAgICAgIGlmIChybmQoIDMgKSA9PSAwKQotICAgICAgICAgICAgX2RvY3NbIHJuZCggX2RvY3MubGVuZ3RoICkgXSA9IHg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldE9iamVjdCAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLmdldE9iamVjdCgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZ2V0Q2hhcnMgKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS5nZXRDaGFycygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb21wYXJlQ3Vyc29ycyAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5pc0luU2FtZURvY3VtZW50KCBnZXRDdXJzb3IoKSApOwotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuY29tcGFyZVBvc2l0aW9uKCBnZXRDdXJzb3IoKSApOwotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuaXNBdFNhbWVQb3NpdGlvbkFzKCBnZXRDdXJzb3IoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIF94bWxzID0KLSAgICB7Ci0gICAgICAgICI8YS8+IiwKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBfc2NoZW1hX3htbHMgPQotICAgIHsKLSAgICAgICAgIjxwbzpwdXJjaGFzZS1vcmRlciB4bWxuczpwbz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyc+XG4iICsgCi0gICAgICAgICI8cG86Y3VzdG9tZXIgYWdlPSczMScgcG9vPScyMDAnPlxuIiArIAotICAgICAgICAgICAgIjxwbzpuYW1lPkRhdmlkIEJhdTwvcG86bmFtZT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86YWRkcmVzcz5HbGFkd3luZSwgUEE8L3BvOmFkZHJlc3M+XG4iICsgCi0gICAgICAgICI8L3BvOmN1c3RvbWVyPlxuIiArIAotICAgICAgICAiPHBvOmN1c3RvbWVyIGFnZT0nMzcnPlxuIiArIAotICAgICAgICAgICAgIjxwbzpuYW1lPkVyaWMgVmFzaWxpazwvcG86bmFtZT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86YWRkcmVzcz5SZWRtb25kLCBXQTwvcG86YWRkcmVzcz5cbiIgKyAKLSAgICAgICAgIjwvcG86Y3VzdG9tZXI+XG4iICsgCi0gICAgICAgICI8cG86ZGF0ZT4yMDAyLTA5LTMwVDE0OjE2OjAwLTA1OjAwPC9wbzpkYXRlPlxuIiArIAotICAgICAgICAiPHBvOmxpbmUtaXRlbT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDE8L3BvOmRlc2NyaXB0aW9uPlxuIiArIAotICAgICAgICAgICAgIjxwbzpwZXItdW5pdC1vdW5jZXM+NTwvcG86cGVyLXVuaXQtb3VuY2VzPlxuIiArIAotICAgICAgICAgICAgIjxwbzpwcmljZT4yMS43OTwvcG86cHJpY2U+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnF1YW50aXR5PjI8L3BvOnF1YW50aXR5PlxuIiArIAotICAgICAgICAiPC9wbzpsaW5lLWl0ZW0+XG4iICsgCi0gICAgICAgICI8cG86bGluZS1pdGVtPlxuIiArIAotICAgICAgICAgICAgIjxwbzpkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMjwvcG86ZGVzY3JpcHRpb24+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnBlci11bml0LW91bmNlcz41PC9wbzpwZXItdW5pdC1vdW5jZXM+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnByaWNlPjE5Ljg5PC9wbzpwcmljZT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cXVhbnRpdHk+MjwvcG86cXVhbnRpdHk+XG4iICsgCi0gICAgICAgICI8L3BvOmxpbmUtaXRlbT5cbiIgKyAKLSAgICAgICAgIjxwbzpsaW5lLWl0ZW0+XG4iICsgCi0gICAgICAgICAgICAiPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzPC9wbzpkZXNjcmlwdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cHJpY2U+MTkuODk8L3BvOnByaWNlPlxuIiArIAotICAgICAgICAgICAgIjxwbzpxdWFudGl0eT4xPC9wbzpxdWFudGl0eT5cbiIgKyAKLSAgICAgICAgIjwvcG86bGluZS1pdGVtPlxuIiArIAotICAgICAgICAiPHBvOnNoaXBwZXI+XG4iICsgCi0gICAgICAgICAgICAiPHBvOm5hbWU+VVBTPC9wbzpuYW1lPlxuIiArIAotICAgICAgICAgICAgIjxwbzpwZXItb3VuY2UtcmF0ZT4wLjc0PC9wbzpwZXItb3VuY2UtcmF0ZT5cbiIgKyAKLSAgICAgICAgIjwvcG86c2hpcHBlcj5cbiIgKyAKLSAgICAgICAgIjwvcG86cHVyY2hhc2Utb3JkZXI+XG4iICsKLSAgICAgICAgIiIsCi0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBsb2FkRG9jICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAocm5kKCAxNSApID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0gPQotICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBfeG1sc1sgcm5kKCBfeG1scy5sZW5ndGggKSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFNjaGVtYWREb2MgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChybmQoIDQgKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZG9jc1sgcm5kKCBfZG9jcy5sZW5ndGggKSBdID0KLSAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgX3NjaGVtYV94bWxzWyBybmQoIF9zY2hlbWFfeG1scy5sZW5ndGggKSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvckxlZnRPbmVUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnRvUHJldlRva2VuKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yUmlnaHRPbmVUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnRvTmV4dFRva2VuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjaGFyW10gX2NoYXJzID0KLSAgICB7Ci0gICAgICAgICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLAotICAgICAgICAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLCAKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnICcsICc8JywgJz4nLCAnJicsICctJywgJz8nCi0gICAgfTsKLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZ2V0VGV4dFZhbHVlICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLQotICAgICAgICBpZiAoYy5pc0ZpbmlzaCgpIHx8IGMuaXNOYW1lc3BhY2UoKSB8fCBjLmlzVGV4dCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgYy5nZXRUZXh0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VGV4dFZhbHVlICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLQotICAgICAgICBpZiAoYy5pc0ZpbmlzaCgpIHx8IGMuaXNOYW1lc3BhY2UoKSB8fCBjLmlzVGV4dCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gcm5kKCAxMCApIDsgaSA+PSAwIDsgaS0tICkKLSAgICAgICAgICAgIHNiLmFwcGVuZCggX2NoYXJzWyBybmQoIF9jaGFycy5sZW5ndGggKSBdICk7Ci0KLSAgICAgICAgYy5zZXRUZXh0VmFsdWUoIHNiLnRvU3RyaW5nKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbW92ZVRleHQgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkubW92ZUNoYXJzKCBybmQoIDEwICksIGdldEN1cnNvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjb3B5VGV4dCAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5jb3B5Q2hhcnMoIHJuZCggMTAgKSwgZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRleHQgKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS5yZW1vdmVDaGFycyggcm5kKCA2ICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0Q29tbWVudCAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5pbnNlcnRDb21tZW50KCAicG9vIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0UHJvY2luc3QgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuaW5zZXJ0UHJvY0luc3QoICJ0YXJnZXQiLCAidmFsIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0VGV4dCAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0KLSAgICAgICAgaWYgKGMuaXNBbnlBdHRyKCkgfHwgYy5pc1N0YXJ0ZG9jKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSBybmQoIDEwICkgOyBpID49IDAgOyBpLS0gKQotICAgICAgICAgICAgc2IuYXBwZW5kKCBfY2hhcnNbIHJuZCggX2NoYXJzLmxlbmd0aCApIF0gKTsKLQotICAgICAgICBjLmluc2VydENoYXJzKCBzYi50b1N0cmluZygpICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvY0NoYXJzICggKQotICAgIHsKLSAgICAgICAgX2RvY3NbIHJuZCggX2RvY3MubGVuZ3RoICkgXS54bWxUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGN1cnNvckNoYXJzICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkueG1sVGV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb2NCeXRlcyAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX2RvY3NbIHJuZCggX2RvY3MubGVuZ3RoICkgXS5zYXZlKCBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3Vyc29yQnl0ZXMgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnNhdmUoIG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbW92ZUNoYXJzUmlnaHQgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnRvTmV4dENoYXIoIHJuZCggMTAgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtb3ZlQ2hhcnNMZWZ0ICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS50b1ByZXZDaGFyKCBybmQoIDEwICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFFOYW1lIGdldFFOYW1lICggKQotICAgIHsKLSAgICAgICAgUU5hbWUgbmFtZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKCBybmQoIDMgKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwIDogbmFtZSA9IFhtbEJlYW5zLmdldFFOYW1lKCAiZm9vLmNvbSIsICJmb28iICk7IGJyZWFrOwotICAgICAgICBjYXNlIDEgOiBuYW1lID0gWG1sQmVhbnMuZ2V0UU5hbWUoICJiYXIuY29tIiwgImJhciIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMiA6IG5hbWUgPSBYbWxCZWFucy5nZXRRTmFtZSggIm1vbyIgKTsgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydEVsZW0gKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0KLSAgICAgICAgaWYgKGMuaXNBbnlBdHRyKCkgfHwgYy5pc1N0YXJ0ZG9jKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBjLmluc2VydEVsZW1lbnQoIGdldFFOYW1lKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLQotICAgICAgICB3aGlsZSAoICFjLmlzRW5kZG9jKCkgJiYgIWMuaXNDb250YWluZXIoKSApCi0gICAgICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgaWYgKGMuaXNFbmRkb2MoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIAotICAgICAgICBjLmluc2VydEF0dHJpYnV0ZSggZ2V0UU5hbWUoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVYbWxDb250ZW50cyAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy5yZW1vdmVYbWxDb250ZW50cygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5WG1sQ29udGVudHMgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuY29weVhtbENvbnRlbnRzKCBnZXRDdXJzb3IoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5WG1sICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmNvcHlYbWwoIGdldEN1cnNvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1vdmVYbWxDb250ZW50cyAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5tb3ZlWG1sQ29udGVudHMoIGdldEN1cnNvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1vdmVYbWwgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkubW92ZVhtbCggZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlWG1sICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLQotICAgICAgICBpZiAoIWMuaXNTdGFydGRvYygpICYmICFjLmlzRmluaXNoKCkpCi0gICAgICAgICAgICBjLnJlbW92ZVhtbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQm9va21hcmsgZXh0ZW5kcyBYbWxDdXJzb3IuWG1sQm9va21hcmsKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQm9va21hcmsgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnNldEJvb2ttYXJrKCBuZXcgQm9va21hcmsoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbGVhckJvb2ttYXJrICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS5jbGVhckJvb2ttYXJrKCBCb29rbWFyay5jbGFzcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBSYW5kb20obG9uZyBzZWVkLCBYbWxPYmplY3RbXSBzaGFyZWREb2NzLCBib29sZWFuIHJlYWRvbmx5LCBib29sZWFuIG5vc2F2ZSwgYm9vbGVhbiBub3F1ZXJ5LCBib29sZWFuIGludGVyZmVyZW5jZSkKLSAgICB7Ci0gICAgICAgIF9zZWVkID0gc2VlZDsKLSAgICAgICAgX3JuZCA9IG5ldyBqYXZhLnV0aWwuUmFuZG9tKHNlZWQpOwotICAgICAgICBfZG9jcyA9IHNoYXJlZERvY3M7Ci0gICAgICAgIF9yZWFkb25seSA9IHJlYWRvbmx5OwotICAgICAgICBfbm9zYXZlID0gbm9zYXZlOwotICAgICAgICBfbm9xdWVyeSA9IG5vcXVlcnk7Ci0gICAgICAgIF9pbnRlcmZlcmVuY2UgPSBpbnRlcmZlcmVuY2U7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvZGVmYXVsdHMueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9kZWZhdWx0cy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDg2N2MuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9kZWZhdWx0cy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnRucz0iaHR0cDovL29wZW51cmkub3JnL2RlZiIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2RlZiIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZWZhdWx0cyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ0bnM6Y29vbCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvb2wiIHR5cGU9InhzOmludCIgZGVmYXVsdD0iNzgzIi8+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlZC54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVkLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5M2M1NC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVkLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImNoYWluIiB0eXBlPSJjaGFpbmxpbmsiLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY2hhaW5saW5rIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9ImNoYWluIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0ibmFtZSIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InRva2VuIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0iNSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InRva2VuIi8+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjEueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTU1MzQyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIxIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIxIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJpbmNsdWRlZC54c2QiLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJvbmVjaGFpbiI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpjaGFpbiIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjIueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjk1ZGRjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIyIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIyIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJpbmNsdWRlZC54c2QiLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0d29jaGFpbnMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6Y2hhaW4iIG1pbk9jY3Vycz0iMiIgbWF4T2NjdXJzPSIyIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2ludHRlc3QueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbnR0ZXN0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmNmUwNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2ludHRlc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iamF2YTppbnQudGVzdCIKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnRucz0iamF2YTppbnQudGVzdCI+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTGF0aXR1ZGVEZWdyZWVzVHlwZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPGRlZmluaXRpb24+RGVncmVlcyBvZiBMYXRpdHVkZTwvZGVmaW5pdGlvbj4KLSAgICAgICAgPFVTTVRGcmVmPlNlZSBVU01URiBmaWVsZCBsYXRpdHVkZS5kZWdyZWVzLjE3LjE8L1VTTVRGcmVmPgotICAgICAgICA8RG9EWE1McmVmPlRCRDwvRG9EWE1McmVmPgotICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2hvcnQiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMDAiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjkwIi8+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1xkXXsyfSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJMb25naXR1ZGVEZWdyZWVzVHlwZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPGRlZmluaXRpb24+RGVncmVlcyBvZiBMb25naXR1ZGU8L2RlZmluaXRpb24+Ci0gICAgICAgIDxVU01URnJlZj5TZWUgVVNNVEYgZmllbGQgbG9uZ2l0dWRlLmRlZ3JlZXMuMTguMTwvVVNNVEZyZWY+Ci0gICAgICAgIDxEb0RYTUxyZWY+VEJEPC9Eb0RYTUxyZWY+Ci0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaG9ydCI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIwMDAiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjE4MCIvPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IltcZF17M30iLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icG9zaXRpb24iPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibGF0IiB0eXBlPSJ0bnM6TGF0aXR1ZGVEZWdyZWVzVHlwZSIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsb24iIHR5cGU9InRuczpMb25naXR1ZGVEZWdyZWVzVHlwZSIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbGlzdGFuZHVuaW9uLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbGlzdGFuZHVuaW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4MTM5OS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2xpc3RhbmR1bmlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnRucz0iaHR0cDovL29wZW51cmkub3JnL2x1dCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2x1dCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bmlvbnMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibm5pIiB0eXBlPSJ0bnM6YWxsTk5JIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InNpemVzIiB0eXBlPSJ0bnM6bGlzdC1vci1hbGwiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9J2xpc3Qtb2YtaW50Jz4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0neHM6aW50Jy8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhbGxOTkkiPgotICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOnVuaW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibGlzdC1vci1hbGwiPgotICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0idG5zOmxpc3Qtb2YtaW50Ij4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVua25vd24iLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOnVuaW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibGlzdC1vZi1hbGxOTkkiPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ0bnM6YWxsTk5JIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsaXN0cyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnQtbGlzdCIgdHlwZT0idG5zOmxpc3Qtb2YtaW50Ii8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9Im5uaS1saXN0IiB0eXBlPSJ0bnM6bGlzdC1vZi1hbGxOTkkiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRhdGUtb3ItZGF0ZVRpbWUiPgotICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6ZGF0ZSB4czpkYXRlVGltZSIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0id2hlbiIgdHlwZT0idG5zOmRhdGUtb3ItZGF0ZVRpbWUiLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbmNpZGVudC1yZXBvcnRzIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOndoZW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbmFtZXdvcmxkLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbmFtZXdvcmxkLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkZjZiNi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL25hbWV3b3JsZC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm53PSJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5hbWV3b3JsZCI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaXNsYW5kIj4KLSAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ibnc6bG9jIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb2MiPgotICAgIDx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0byIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9ub25hbWVzcGFjZS54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL25vbmFtZXNwYWNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkODRiNS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL25vbmFtZXNwYWNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5jaGFpbiIgdHlwZT0ibmNoYWlubGluayIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuY2hhaW5saW5rIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9Im5jaGFpbiIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9Im5uYW1lIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibnRva2VuIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0iNSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9Im5uYW1lIiB0eXBlPSJudG9rZW4iLz4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL3N1YnN0Z3JvdXAueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9zdWJzdGdyb3VwLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1YmM3MC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL3N1YnN0Z3JvdXAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9zZ3MiIHhtbG5zOnNnPSJodHRwOi8vb3BlbnVyaS5vcmcvc2dzIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQyIgdHlwZT0ieHNkOnRva2VuIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QiIvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkIiIHR5cGU9InhzZDpub3JtYWxpemVkU3RyaW5nIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QSIvPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IloiIHR5cGU9InNnOkV4dCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOlkiIC8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlkiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzpYIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJYIiB0eXBlPSJzZzpCYXNlIi8+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW55VHlwZSIvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbnlUeXBlVGFpbCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkFueVR5cGUiLz4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbm9uU2ltcGxlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6aW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOm1heEV4Y2x1c2l2ZSB2YWx1ZT0iMTAwIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFub25TaW1wbGVUYWlsIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QW5vblNpbXBsZSIvPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFub25Db21wbGV4Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvbyIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW5vbkNvbXBsZXhUYWlsIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QW5vbkNvbXBsZXgiLz4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNnOkEiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVucmVsYXRlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeHQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2c6QmFzZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdFRlc3QiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphbGw+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0ic2c6YWJzdHJhY3QiLz4KLQkJCTwveHNkOmFsbD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgYWJzdHJhY3Q9InRydWUiLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uY3JldGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzphYnN0cmFjdCIvPgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImJsb2NrVGVzdCI+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmFsbD4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJzZzpibG9jayIvPgotCQkJPC94c2Q6YWxsPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImJsb2NrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBibG9jaz0ic3Vic3RpdHV0aW9uIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InN1YmJsb2NrIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6YmxvY2siLz4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9JbnRlcm4uamF2YSBiL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvSW50ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNmNmYmEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9JbnRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzdHJlYW10ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm4KLXsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9JVEVSID0gMTAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DUkVBVEUgPSAxMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfQ09NUCA9IDEwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICBjaGFyW10gY2EgPSB7ICdhJywgJ2EnLCAnYSd9OwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSAiYWFhIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKCJhYWEiKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKGNhKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKGNhKS5pbnRlcm4oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBTdHJpbmcudmFsdWVPZihjYSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFhYSIgPT0gU3RyaW5nLmNvcHlWYWx1ZU9mKGNhKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSAiYWFhIik7Ci0KLSAgICAgICAgbG9uZyBzdGFydDsKLSAgICAgICAgZG91YmxlIGQxID0gMDsKLSAgICAgICAgZG91YmxlIGQyID0gMDsKLSAgICAgICAgZG91YmxlIGQzID0gMDsKLQotICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKLSAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTEoU3RyaW5nLnZhbHVlT2YoIE1hdGguCi0gICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgotICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocW4xLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUxKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotCi0gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOwotICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUxOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKLQotICAgICAgICAvL2NyZWF0ZTIKLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotCi0gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOwotICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUyOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKLQotICAgICAgICAvL2NyZWF0ZTMKLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotCi0gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOwotICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUzOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKLSAgICB9Ci19Ci0KLWNsYXNzIENhY2hlCi17Ci0gICAgSGFzaE1hcCBoMSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBRTmFtZSBjcmVhdGUxKFN0cmluZyBsLCBTdHJpbmcgdSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUobCAsdSk7Ci0gICAgfQotCi0gICAgUU5hbWUgY3JlYXRlMihTdHJpbmcgbCwgU3RyaW5nIHUpCi0gICAgewotICAgICAgICBpbnQgaGNvZGUgPSBsLmhhc2hDb2RlKCkgKyAzMyp1Lmhhc2hDb2RlKCk7Ci0gICAgICAgIEludGVnZXIga2V5ID0gbmV3IEludGVnZXIoaGNvZGUpOwotCi0gICAgICAgIGlmKCBoMS5jb250YWluc0tleSgga2V5ICkgKQotICAgICAgICAgICAgcmV0dXJuIChRTmFtZSloMS5nZXQoa2V5KTsKLQotICAgICAgICBRTmFtZSBxbiA9IG5ldyBRTmFtZShsLCB1KTsKLSAgICAgICAgaDEucHV0KGtleSwgcW4pOwotICAgICAgICByZXR1cm4gcW47Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIFFOYW1lIGNyZWF0ZTMoU3RyaW5nIGwsIFN0cmluZyB1KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZTIobCwgdSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFFOYW1lCi0gICAgewotICAgICAgICBwcml2YXRlIFN0cmluZyBsb2NhbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotCi0gICAgICAgIHByaXZhdGUgUU5hbWUoKQotICAgICAgICB7fQotICAgICAgICBwcml2YXRlIFFOYW1lKFN0cmluZyBsLCBTdHJpbmcgdSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYWwgPSBsOwotICAgICAgICAgICAgdXJpID0gdTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxJbnRlcm4oIFFOYW1lIHFuICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxvY2FsPT1xbi5sb2NhbCAmJiB1cmk9PXFuLnVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxFeHRlcm4oIFFOYW1lIHFuICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxvY2FsLmVxdWFscyhxbi5sb2NhbCkgJiYgdXJpLmVxdWFscyhxbi51cmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsb2NhbCArICIsIiArIHVyaTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9TdWJTdHJlYW1zVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9TdWJTdHJlYW1zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RhNDdiLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvU3ViU3RyZWFtc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzdHJlYW10ZXN0OwotCi0vKgotKiBDcmVhdGVkIGJ5IGNlemFyQGJlYS5jb20KLSovCi0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW1GYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWxwdWxsLnN0cmVhbS5YbWxTdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhwcFhtbFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhtbFN0cmVhbUZhY3Rvcnk7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU3ViU3RyZWFtc1Rlc3QKLXsKLSAgICBwdWJsaWMgU3ViU3RyZWFtc1Rlc3QoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICAvL3N1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJTdHJlYW0oKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdCB3b3Jrcy4iKTsKLQotICAgICAgICAvL3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJLZXZpbidzIGV4Y2VwdGlvbiIpOwotCi0gICAgICAgIC8vYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWFkZXIgcmVhZGVyMTsKLSAgICAgICAgUmVhZGVyIHJlYWRlcjI7Ci0gICAgICAgIGlmKCBhcmdzLmxlbmd0aD09MCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gIjxhPjxiPjxjIGExPSdhMXYnIGEyPSdhMnYnIC8+PC9iPjx4Lz4iICsKLSAgICAgICAgICAgICAgICAiPHk+U29tZSB0ZXh0PC95PjwvYT4iOwotICAgICAgICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0gICAgICAgICAgICByZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlcjEgPSBuZXcgRmlsZVJlYWRlcihhcmdzWzBdKTsKLSAgICAgICAgICAgIHJlYWRlcjIgPSBuZXcgRmlsZVJlYWRlcihhcmdzWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVhZGVyIC4uLiIpOwotICAgICAgICBYbWxTdHJlYW1Tb3VyY2Ugc291cmNlID0gbmV3IFhwcFhtbFN0cmVhbUltcGwocmVhZGVyMSk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIG15U3RyZWFtID0gWG1sU3RyZWFtRmFjdG9yeS4KLSAgICAgICAgICAgICAgICBjcmVhdGVYbWxJbnB1dFN0cmVhbSggc291cmNlICk7Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmFiZWxTdHJlYW0gPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgIG5ld0lucHV0U3RyZWFtKHJlYWRlcjIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibXlTdHJlYW0gLi4uIik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBteVN0cmVhbS5oYXNOZXh0KCkgJiYgaTwzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15OiAiICsgbXlTdHJlYW0uaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgbXlTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiOiAiICsgYmFiZWxTdHJlYW0uaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJhYmVsU3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzID0gbXlTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIGJic3MgPSBiYWJlbFN0cmVhbS5nZXRTdWJTdHJlYW0oKTsKLQotICAgICAgICBmb3IoaW50IGk9MDsgKG15c3MuaGFzTmV4dCgpIHx8IGJic3MuaGFzTmV4dCgpKSAmJiBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU1VCU3RyZWFtOiAiICsgbXlzcy5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgYmJzcy5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmJzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYnNzMiA9IG15c3MuZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIGZvcig7IG15c3MyLmhhc05leHQoKSB8fCBiYnNzMi5oYXNOZXh0KCkgOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU3ViU1VCU3RyZWFtIDI6ICIgKyBteXNzMi5oYXNOZXh0KCkgKwotICAgICAgICAgICAgICAgICAgICAiICciICsgbXlzczIubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFN1YlNVQlN0cmVhbSAyOiAiICsgYmJzczIuaGFzTmV4dCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiAnIiArIGJic3MyLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgbXlzczIuY2xvc2UoKTsKLSAgICAgICAgYmJzczIuY2xvc2UoKTsKLQotICAgICAgICBmb3IoOyBteXNzLmhhc05leHQoKSB8fCBiYnNzLmhhc05leHQoKSA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyBteXNzLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTVUJTdHJlYW06ICIgKyBiYnNzLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYnNzLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoOyBteVN0cmVhbS5oYXNOZXh0KCkgfHwgYmFiZWxTdHJlYW0uaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyBteVN0cmVhbS5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiOiAiICsgYmFiZWxTdHJlYW0uaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJhYmVsU3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtYWluMigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluMigpCi0gICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWFkZXIgcmVhZGVyMTsKLSAgICAgICAgUmVhZGVyIHJlYWRlcjI7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9ICI8YT48Yj48YyBhMT0nYTF2JyBhMj0nYTJ2JyAvPjwvYj48eC8+IiArCi0gICAgICAgICAgICAgICAgIjx5PlNvbWUgdGV4dDwveT48L2E+IjsKLSAgICAgICAgICAgIHJlYWRlcjEgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOwotICAgICAgICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWFkZXIgLi4uIik7Ci0gICAgICAgIFhtbFN0cmVhbVNvdXJjZSBzb3VyY2UgPSBuZXcgWHBwWG1sU3RyZWFtSW1wbChyZWFkZXIxKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlTdHJlYW0gPSBYbWxTdHJlYW1GYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKCBzb3VyY2UgKTsKLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYWJlbFN0cmVhbSA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpLgotICAgICAgICAgICAgbmV3SW5wdXRTdHJlYW0ocmVhZGVyMik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJteVN0cmVhbSAuLi4iKTsKLSAgICAgICAgZm9yKGludCBpPTA7IG15U3RyZWFtLmhhc05leHQoKSAmJiBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MgPSBteVN0cmVhbS5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmJzcyA9IGJhYmVsU3RyZWFtLmdldFN1YlN0cmVhbSgpOwotCi0gICAgICAgIGZvcihpbnQgaT0wOyBteXNzLmhhc05leHQoKSAmJiBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYnNzLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzMiA9IG15c3MuZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIGJic3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgZm9yKDsgbXlzczIuaGFzTmV4dCgpIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFN1YlNVQlN0cmVhbSAyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiAnIiArIG15c3MyLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTdWJTVUJTdHJlYW0gMjogIiArCi0gICAgICAgICAgICAgICAgICAgICIgJyIgKyBiYnNzMi5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0gICAgICAgIG15c3MyLmNsb3NlKCk7Ci0gICAgICAgIGJic3MyLmNsb3NlKCk7Ci0KLSAgICAgICAgZm9yKDsgbXlzcy5oYXNOZXh0KCkgfHwgYmJzcy5oYXNOZXh0KCkgOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYnNzLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoOyBteVN0cmVhbS5oYXNOZXh0KCkgOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgLy9iYWJlbFN0cmVhbS5oYXNOZXh0KCkgKyAgLy9CQUJFTCBidWdidWc6IHVuL2NvbW1lbnQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xpbmUgeW91J2xsIGdldCBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIG5leHQoKQotICAgICAgICAgICAgICAgICAgICAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1haW4zKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4zKCkKLSAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWRlciByZWFkZXIxOwotICAgICAgICBSZWFkZXIgcmVhZGVyMjsKLSAgICAgICAgU3RyaW5nIHMgPSAiPD94bWwgdmVyc2lvbj0nMS4xLjEnPz48YT48YiB4bWxucz0nJyB4bWxuczphPSdzZGZzZGYnPjxjIGExPSdhJmx0OzF2JyBhMj0nYTJ2JyAvPjwvYj48eC8+IiArCi0gICAgICAgICAgICAiPHk+U29tZSZsdDsgYW5kICZndDt0ZXh0PC95PjwvYT4iOwotICAgICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKLSAgICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWFkZXIgLi4uIGluIG1haW4zIik7Ci0gICAgICAgIFhtbFN0cmVhbVNvdXJjZSBzb3VyY2UgPSBuZXcgWHBwWG1sU3RyZWFtSW1wbChyZWFkZXIxKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlTdHJlYW0gPSBYbWxTdHJlYW1GYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKCBzb3VyY2UgKTsKLQotICAgICAgICAvL1hNTElucHV0U3RyZWFtIGJhYmVsU3RyZWFtID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCi0gICAgICAgIC8vICAgIG5ld0lucHV0U3RyZWFtKHJlYWRlcjIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibXlTdHJlYW0gLi4uIik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBteVN0cmVhbS5oYXNOZXh0KCkgJiYgaTwwOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15OiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgbXlTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKyAiICciICsKLSAgICAgICAgICAgIC8vICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzcyA9IG15U3RyZWFtLmdldFN1YlN0cmVhbSgpOwotICAgICAgICAvL1hNTElucHV0U3RyZWFtIGJic3MgPSBiYWJlbFN0cmVhbS5nZXRTdWJTdHJlYW0oKTsKLQotICAgICAgICBmb3IoaW50IGk9MDsgbXlzcy5oYXNOZXh0KCkgJiYgaTwzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgLy8gICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgLy9YTUxJbnB1dFN0cmVhbSBiYnNzMiA9IG15c3MuZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIGZvcig7IG15c3MyLmhhc05leHQoKSA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTdWJTVUJTdHJlYW0gMjogIiArCi0gICAgICAgICAgICAgICAgICAgICIgJyIgKyBteXNzMi5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTdWJTVUJTdHJlYW0gMjogIiArCi0gICAgICAgICAgICAvLyAgICAgICAgIiAnIiArIGJic3MyLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgbXlzczIuY2xvc2UoKTsKLSAgICAgICAgLy9iYnNzMi5jbG9zZSgpOwotCi0gICAgICAgIGZvcig7IG15c3MuaGFzTmV4dCgpIC8qfHwgYmJzcy5oYXNOZXh0KCkqLyA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgIC8vICAgICAgICBiYnNzLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoOyBteVN0cmVhbS5oYXNOZXh0KCkgOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKwotICAgICAgICAgICAgICAgICAgICAvL2JhYmVsU3RyZWFtLmhhc05leHQoKSArICAvL0JBQkVMIGJ1Z2J1ZzogdW4vY29tbWVudCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGluZSB5b3UnbGwgZ2V0IGRpZmZlcmVudCBiZWhhdmlvciBmb3IgbmV4dCgpCi0gICAgICAgICAgICAvLyAgICAgICAgIiAnIiArCi0gICAgICAgICAgICAvLyAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9YbWxTdHJlYW1Db25mb3JtYW5jZS5qYXZhIGIvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9YbWxTdHJlYW1Db25mb3JtYW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZmYTFhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvWG1sU3RyZWFtQ29uZm9ybWFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzdHJlYW10ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IG9yZy54bWxwdWxsLm14cDEuTVhQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwubXhwMS5NWFBhcnNlckNhY2hpbmdTdHJpbmdzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW1GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB4bWxleHQueG1sLlhwcEFkYXB0b3I7Ci1pbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhwcFhtbFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhtbFN0cmVhbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotLyoqCi0gKiAgIFRlc3RzIHRoZSBjb25mb3JtYW5jZSBvZiB0aGUgWE1MSW5wdXRTdHJlYW0gcHJvZHVjZWQgYnkgWHBwWG1sU3RyZWFtSW1wbC4KLSAqICAgQGF1dGhvciBDZXphciBBbmRyZWkKLSAqLwotcHVibGljIGNsYXNzIFhtbFN0cmVhbUNvbmZvcm1hbmNlCi17Ci0gICAgZmluYWwgc3RhdGljIGludCBUSU1FUyA9IDMwOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIGFyZ3MubGVuZ3RoPjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhcmdzWzBdKTsKLSAgICAgICAgICAgIGlmKCBmLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgICAgIGNvbXBhcmVEaXIoZik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLy9jb21wYXJlRmlsZShmKTsKLSAgICAgICAgICAgICAgICBwcmludEZpbGUoZik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRUaGlzIGFwcCB0ZXN0cyB0aGUgY29uZm9ybWFuY2Ugb2YgdGhlIHR3byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJYTUxJbnB1dFN0cmVhbSBcblx0cHJvZHVjZWQgYnkgQmFiZWwgcGFyc2VyIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJYcHAzIHBhcnNlci4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXHRVU0FHRTogamF2YSAuLi4gdGVzdC5YbWxTdHJlYW1Db25mb3JtYW5jZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJ8ZmlsZSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdGRpclx0XHRNYWtlcyB0aGUgdGVzdCBmb3IgYWxsIHRoZSBmaWxlcyBpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZGlyLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRmaWxlXHRcdE1ha2VzIHRoZSB0ZXN0IG9ubHkgZm9yIHRoYXQgZmlsZS4iKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjb21wYXJlRmlsZShGaWxlIGZpbGUpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmaWxlLmdldFBhdGgoKSArICIgc2l6ZTogIiArIGZpbGUubGVuZ3RoKCkpOwotCi0gICAgICAgIGlmKCFmaWxlLmlzRmlsZSgpKQotICAgICAgICAgICAgLy90aHJvdyBuZXcgRXhjZXB0aW9uKCJjb21wYXJlRmlsZTogZmlsZSBub3QgYSBGaWxlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgUmVhZGVyIHIxID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgICAgIFJlYWRlciByMiA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhwcCA9IFhtbFN0cmVhbUZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0obmV3IFhwcFhtbFN0cmVhbUltcGwocjIpKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmFiZWwgPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgIG5ld0lucHV0U3RyZWFtKHIxKTsKLQotICAgICAgICB3aGlsZSggeHBwLmhhc05leHQoKSB8fCBiYWJlbC5oYXNOZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYTUxFdmVudCB4cHBldmVudCA9IHhwcC5wZWVrKCk7Ci0gICAgICAgICAgICBYTUxFdmVudCBiYWJlbGV2ZW50ID0gYmFiZWwucGVlaygpOwotCi0gICAgICAgICAgICBpZiggISgiIit4cHBldmVudCkuZXF1YWxzKCgiIitiYWJlbGV2ZW50KSkgKQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoeHBwZXZlbnQsIGJhYmVsZXZlbnQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgICBgIiArIHhwcGV2ZW50ICsgIidcbiAgIGAiICsgYmFiZWxldmVudCArCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIiciKTsgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4cHBldmVudCA9IHhwcC5uZXh0KCk7Ci0gICAgICAgICAgICBiYWJlbGV2ZW50ID0gYmFiZWwubmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgIHhwcCAgIG92ZXJsaW1pdDogIiArIHhwcC5uZXh0KCkgKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgIGJhYmVsIG92ZXJsaW1pdDogIiArIGJhYmVsLm5leHQoKSApOwotCi0gICAgICAgIHIxLmNsb3NlKCk7Ci0gICAgICAgIHIyLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9jb21wYXJlUGVyZihmaWxlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBwcmludEZpbGUoRmlsZSBmaWxlKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXRQYXRoKCkgKyAiIHNpemU6ICIgKyBmaWxlLmxlbmd0aCgpKTsKLQotICAgICAgICBpZighZmlsZS5pc0ZpbGUoKSkKLSAgICAgICAgICAgIC8vdGhyb3cgbmV3IEV4Y2VwdGlvbigiY29tcGFyZUZpbGU6IGZpbGUgbm90IGEgRmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFJlYWRlciByMiA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhwcCA9IFhtbFN0cmVhbUZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0obmV3IFhwcFhtbFN0cmVhbUltcGwocjIpKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbW9ycGhlZFN0cmVhbTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgeHF1ZXJ5Iik7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG1sT2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoeHBwKTsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjcnMgPSB4bWxPYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgcmVzQ3JzID0gY3JzLmV4ZWNRdWVyeSgiJHRoaXMiKTsKLSAgICAgICAgICAgIC8vIG5vdCB5ZXQgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgIC8vbW9ycGhlZFN0cmVhbSA9IHJlc0Nycy5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IHJlc0Nycy5uZXdSZWFkZXIoKTsKLSAgICAgICAgICAgIHJlYWRlciA9IHJlc0Nycy5uZXdSZWFkZXIoKTsKLSAgICAgICAgICAgIG1vcnBoZWRTdHJlYW0gPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyZWFkZXIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLi4uIik7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbW9ycGhlZFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB4cHAgPSBtb3JwaGVkU3RyZWFtOwotCi0gICAgICAgIHdoaWxlKCB4cHAuaGFzTmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgWE1MRXZlbnQgeHBwZXZlbnQgPSB4cHAucGVlaygpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGAiICsgeHBwZXZlbnQgKyAiJyIpOyBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICB4cHBldmVudCA9IHhwcC5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByMi5jbG9zZSgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHByaW50RXJyb3IoWE1MRXZlbnQgeHBwZXZlbnQsIFhNTEV2ZW50IGJhYmVsZXZlbnQpCi0gICAgewotICAgICAgICBTdHJpbmcgc3hwcCA9ICIiK3hwcGV2ZW50OwotICAgICAgICBTdHJpbmcgc2JhYiA9ICIiK2JhYmVsZXZlbnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFUlJPUi0tLS0tIik7Ci0gICAgICAgIGlmKCAhc3hwcC50cmltKCkuZXF1YWxzKHNiYWIudHJpbSgpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigieHBwICAgOmAiICsgc3hwcCArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJiYWJlbCA6YCIgKyBzYmFiICsgIiciKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInhwcCAgIDoiKTsKLSAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPHN4cHAubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSlzeHBwLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIyIgKyBiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlxuYmFiZWwgOiIpOwotICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8c2JhYi5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKXNiYWIuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAjIiArIGIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4tLS0tLS0tLS0tIik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY29tcGFyZURpcihGaWxlIGRpcikKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIWRpci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiY29tcGFyZURpcjogZGlyIG5vdCBhIERpcmVjdG9yeSIpOwotCi0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgY29tcGFyZUZpbGUoZmlsZXNbaV0pOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNvbXBhcmVQZXJmKEZpbGUgZmlsZSkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9uZyBzdGFydDsKLSAgICAgICAgZG91YmxlIHhzdGltZSA9IDA7Ci0gICAgICAgIGRvdWJsZSB4cnRpbWUgPSAwOwotICAgICAgICBkb3VibGUgYmFiZWx0aW1lID0gMDsKLQotICAgICAgICAvL2JhYmVsCi0gICAgICAgIGZvciggaW50IGk9MDsgaTxUSU1FUzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYWJlbCA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpLgotICAgICAgICAgICAgICAgIG5ld0lucHV0U3RyZWFtKHIpOwotICAgICAgICAgICAgd2hpbGUoIGJhYmVsLmhhc05leHQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWE1MRXZlbnQgYmFiZWxldmVudCA9IGJhYmVsLnBlZWsoKTsKLSAgICAgICAgICAgICAgICBiYWJlbGV2ZW50ID0gYmFiZWwubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFiZWx0aW1lICs9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQoIi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8veHBwIHdpdGggZGlyZWN0IGFjY2VzIHRvIHRoZSB4cHAgcGFyc2VyCi0gICAgICAgIGZvciggaW50IGk9MDsgaTxUSU1FUzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBNWFBhcnNlciB4cHAgPSAoTVhQYXJzZXIpIG5ldyBNWFBhcnNlckNhY2hpbmdTdHJpbmdzKCk7Ci0gICAgICAgICAgICB4cHAuc2V0RmVhdHVyZSggTVhQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgeHBwLnNldElucHV0KCByICk7Ci0gICAgICAgICAgICBpbnQgZXZlbnRUeXBlID0geHBwLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgd2hpbGUgKCBldmVudFR5cGUgIT0geHBwLkVORF9ET0NVTUVOVCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXZlbnRUeXBlID0geHBwLm5leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeHJ0aW1lICs9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQoIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8veHBwIHdpdGggWHBwWG1sU3RyZWFtSW1wbAotICAgICAgICBmb3IoIGludCBpPTA7IGk8VElNRVM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgICAgICAgICAvL1hNTElucHV0U3RyZWFtIHhwcCA9IG5ldyBYcHBBZGFwdG9yKCkuZ2V0U3RyZWFtKHIyKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBYTUxJbnB1dFN0cmVhbSB4cHAgPSAoWE1MSW5wdXRTdHJlYW0pIG5ldyBYcHBYbWxTdHJlYW1JbXBsKHIpOwotCi0gICAgICAgICAgICB3aGlsZSggeHBwLmhhc05leHQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWE1MRXZlbnQgeHBwZXZlbnQgPSB4cHAucGVlaygpOwotICAgICAgICAgICAgICAgIHhwcGV2ZW50ID0geHBwLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhzdGltZSArPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCJgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBFUkY6ICBiYWJlbC94cHBJUyA9ICIgKyBkZWMoYmFiZWx0aW1lL3hzdGltZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcdGJhYmVsL3hwcFJhdyA9ICIgKyBkZWMoYmFiZWx0aW1lL3hydGltZSkgKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGRlYyggZG91YmxlIGYpCi0gICAgewotICAgICAgICByZXR1cm4gIiIgKyAoKGRvdWJsZSlNYXRoLnJvdW5kKGYqMTAwKSkvMTAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3N0c3NjaGVtYS9zdHMueHNkIGIvdjEvdGVzdC9zcmMvc3Rzc2NoZW1hL3N0cy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NWNlMzAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc3Rzc2NoZW1hL3N0cy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICB4bWxuczpzdHM9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3htbGJlYW4vaW50ZXJuYWwvc29hcC10ZXN0LXNjcmlwdCIKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94bWxiZWFuL2ludGVybmFsL3NvYXAtdGVzdC1zY3JpcHQiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBibG9ja0RlZmF1bHQ9IiNhbGwiPgotICAKLQotPHhzOmVsZW1lbnQgbmFtZT0ic29hcC10ZXN0LXNjcmlwdCI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InN0czpyZXF1ZXN0U3BlYyIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJldmVudCIgdHlwZT0ic3RzOmV2ZW50U3BlYyIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiIHR5cGU9InN0czpzZXRPZkV2ZW50cyIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzOmludCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0ic2V0T2ZFdmVudHMiPgotICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgIDx4czplbGVtZW50IG5hbWU9ImV2ZW50IiB0eXBlPSJzdHM6ZXZlbnRTcGVjIi8+Ci0gIDwveHM6Y2hvaWNlPgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVlc3RTcGVjIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgIDx4czplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RhcnQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29udGludWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDwveHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImV4cGVjdCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJldmVudFNwZWMiPgotICA8eHM6c2VxdWVuY2U+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbnRpbnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpbmlzaCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZXhwZWN0IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gIDwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNmY3NDIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmJlYS50ZXN0OwotCi1pbXBvcnQgd2VibG9naWMueG1sLnNjaGVtYS5tb2RlbC5wYXJzZXIuWFNEUGFyc2VyRmFjdG9yeTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLnBhcnNlci5YU0RQYXJzZXI7Ci1pbXBvcnQgd2VibG9naWMueG1sLnNjaGVtYS5tb2RlbC5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLlhTRFNjaGVtYTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLlhTREV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW1GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLmV2ZW50cy5OYW1lOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgeG1sLnV0aWwuU2NoZW1hVHlwZTsKLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc2NoZW1hLlNjaGVtYVR5cGVTeXN0ZW1CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc2NoZW1hLlNjaGVtYVR5cGVDb2RlUHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnRvb2wuQ29tbWFuZExpbmU7Ci1pbXBvcnQgb3JnLm9wZW51cmkubXl0ZXN0LlNpbXBsaWNpdHk7Ci1pbXBvcnQgb3JnLm9wZW51cmkubXl0ZXN0LlBlcnNvbjsKLQotcHVibGljIGNsYXNzIFRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgbnVsbCk7Ci0gICAgICAgIFhTRFBhcnNlciB4c2RwYXJzZXIgPSBYU0RQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWFNEUGFyc2VyKCk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtRmFjdG9yeSB4bWxwYXJzZXIgPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBzaW1wbGV0ZXN0ID0gZmFsc2U7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTY2hlbWFUeXBlU3lzdGVtQnVpbGRlcigidGVzdCIpOwotCi0gICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVhZGVyIGlucHV0ID0gbmV3IEZpbGVSZWFkZXIoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgc2RvYyA9IHhzZHBhcnNlci5wYXJzZVNjaGVtYSh4bWxwYXJzZXIubmV3SW5wdXRTdHJlYW0oaW5wdXQpKTsKLSAgICAgICAgICAgICAgICBYU0RTY2hlbWEgcyA9IHNkb2MuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRBbGxDb21wb25lbnRzKHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlICIgKyBhcmdzW2ldICsgIjpcbiIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHBhcnNpbmcgZmlsZSAiICsgYXJnc1tpXSArICI6XG4iICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWFNERXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBwYXJzaW5nIHNjaGVtYSBmaWxlICIgKyBhcmdzW2ldICsgIjpcbiIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJ1aWxkZXIucmVzb2x2ZUFsbFR5cGVzKCk7Ci0gICAgICAgIGJ1aWxkZXIuamF2YWl6ZUFsbFR5cGVzKCk7Ci0KLSAgICAgICAgLy8gT0ssIGhlcmUgd2UgZ28KLQotICAgICAgICBTY2hlbWFUeXBlW10gZ3R5cGVzID0gYnVpbGRlci5nbG9iYWxUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGd0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gZ3R5cGVzW2ldOwotCi0gICAgICAgICAgICAvLyBwcmludCBvbmx5IHR5cGVzIGluIHRoaXMgdHlwZSBzeXN0ZW0KLSAgICAgICAgICAgIGlmICghdHlwZS5nZXRTY2hlbWFUeXBlU3lzdGVtKCkuZXF1YWxzKGJ1aWxkZXIpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlByaW50aW5nIHR5cGUiKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlQ29kZVByaW50ZXIucHJpbnRUeXBlKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCksIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICBib29sZWFuIHNpbXBsZXRlc3QgPSBmYWxzZTsKLQotICAgICAgICBpZiAoc2ltcGxldGVzdCkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFN0b3JlIHN0b3JlID0gbmV3IFRlc3RTdG9yZShvcmcub3BlbnVyaS5teXRlc3QuU2ltcGxlRG9jdW1lbnQudHlwZSk7Ci0gICAgICAgICAgICBUZXN0U3RvcmUuQ3Vyc29yIGN1cnNvciA9IHN0b3JlLm5ld0N1cnNvcigpOwotCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkdvdCBzdG9yZSwgZmlsbGluZyBpdCBpbi4uLiIpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgInNpbXBsZSIpKTsKLSAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRBdHRyaWJ1dGUobmV3IE5hbWUobnVsbCwgIm5vdGUiKSwgImEgc21hbGxpc2ggbnVtYmVyIik7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMTQzIik7Ci0gICAgICAgICAgICBjdXJzb3IudG9Sb290KCk7Ci0gICAgICAgICAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBTaW1wbGljaXR5IHNpbXAgPSAoU2ltcGxpY2l0eSljdXJzb3Iub2JqKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSB2YWx1ZSBvZiBzaW1wbGljaXR5OiAiICsgc2ltcC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQW5kIGEgbm90ZTogIiArIHNpbXAuZ2V0Tm90ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RTdG9yZSBzdG9yZSA9IG5ldyBUZXN0U3RvcmUob3JnLm9wZW51cmkubXl0ZXN0LkN1c3RvbWVyRG9jdW1lbnQudHlwZSk7Ci0gICAgICAgICAgICBUZXN0U3RvcmUuQ3Vyc29yIGN1cnNvciA9IHN0b3JlLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJHb3Qgc3RvcmUsIGZpbGxpbmcgaXQgaW4uLi4iKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJjdXN0b21lciIpKTsKLSAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJmaXJzdG5hbWUiKSk7Ci0gICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAibnVtYmVyIikpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgIm51bWJlciIpKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJiaXJ0aGRheSIpKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJudW1iZXIiKSk7Ci0gICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAibnVtYmVyIikpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImJpcnRoZGF5IikpOwotICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIkhvd2R5Iik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiNDM2Iik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMTIzIik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMTk5OC0wOC0yNloiKTsKLSAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCI0NCIpOwotICAgICAgICAgICAgY3Vyc29yLnRvTmV4dCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIjkzMyIpOwotICAgICAgICAgICAgY3Vyc29yLnRvTmV4dCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIjIwMDAtMDgtMDYtMDg6MDAiKTsKLSAgICAgICAgICAgIGN1cnNvci50b1Jvb3QoKTsKLSAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIFBlcnNvbiBwZXJzb24gPSAoUGVyc29uKWN1cnNvci5vYmooKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLmdldEZpcnN0bmFtZSgpID0gIiArIHBlcnNvbi5nZXRGaXJzdG5hbWUoKSk7Ci0gICAgICAgICAgICBpbnQgc3VtID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyc29uLmNvdW50T2ZOdW1iZXIoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLmdldE51bWJlcigiICsgaSArIikgPSAiICsgcGVyc29uLmdldE51bWJlcihpKSk7Ci0gICAgICAgICAgICAgICAgc3VtICs9IHBlcnNvbi5nZXROdW1iZXIoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInN1bSBvZiBudW1iZXJzID0gIiArIHN1bSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcnNvbi5jb3VudE9mQmlydGhkYXkoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLmdldEJpcnRoZGF5KCIgKyBpICsiKSA9ICIgKyBwZXJzb24uZ2V0QmlydGhkYXkoaSkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLnhnZXRCaXJ0aGRheSgiICsgaSArIikgPSAiICsgcGVyc29uLnhnZXRCaXJ0aGRheShpKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24ueGdldEJpcnRoZGF5KCIgKyBpICsiKS5nRGF0ZVZhbHVlKCkuZ2V0RGF5KCkgPSAiICsgcGVyc29uLnhnZXRCaXJ0aGRheShpKS5nRGF0ZVZhbHVlKCkuZ2V0RGF5KCkpOwotICAgICAgICAgICAgICAgIHN1bSArPSBwZXJzb24uZ2V0TnVtYmVyKGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXR0aW5nIGZpcnN0bmFtZSB0byBHZW9yZ2UiKTsKLSAgICAgICAgICAgIHBlcnNvbi5zZXRGaXJzdG5hbWUoIkdlb3JnZSIpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0Rmlyc3RuYW1lKCkgPSAiICsgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0U3RvcmUuamF2YSBiL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdFN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzcyOWIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0U3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnZhbHVlcy5UeXBlU3RvcmVVc2VyRmFjdG9yeTsKLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IHhtbC51dGlsLlhtbE9iamVjdDsKLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U3RvcmUKLXsKLSAgICBUZXN0VHlwZVN0b3JlIF9yb290OwotCi0gICAgcHVibGljIFRlc3RTdG9yZShTY2hlbWFUeXBlIHJvb3RUeXBlKQotICAgIHsKLSAgICAgICAgX3Jvb3QgPSBtYWtlUm9vdFN0b3JlKHJvb3RUeXBlKTsKLSAgICB9Ci0KLSAgICBDdXJzb3IgbmV3Q3Vyc29yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ3Vyc29yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEN1cnNvcgotICAgIHsKLSAgICAgICAgVGVzdFR5cGVTdG9yZSBfY3VycG9zID0gX3Jvb3Q7Ci0gICAgICAgIGludCBfY3VySW5kZXggPSAwOwotCi0gICAgICAgIHB1YmxpYyBYbWxPYmplY3Qgb2JqKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpX2N1cnBvcy5fdXNlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcmVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY3VycG9zLl9wYXJlbnQgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvUm9vdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJwb3MgPSBfcm9vdDsKLSAgICAgICAgICAgIF9jdXJJbmRleCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvUGFyZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNQYXJlbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBfY3VycG9zID0gX2N1cnBvcy5fcGFyZW50OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX3BhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChfY3VySW5kZXggKyAxIDwgX2N1cnBvcy5fcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIF9jdXJJbmRleCsrOwotICAgICAgICAgICAgX2N1cnBvcyA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX3BhcmVudC5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoX2N1ckluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9QcmV2KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNQcmV2KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgX2N1ckluZGV4LS07Ci0gICAgICAgICAgICBfY3VycG9zID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChfY3VySW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX3BhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChfY3VySW5kZXggLSAxID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpID4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvRmlyc3RDaGlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBfY3VySW5kZXggPSAwOwotICAgICAgICAgICAgX2N1cnBvcyA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KF9jdXJJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvTGFzdENoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIF9jdXJJbmRleCA9IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgICAgIF9jdXJwb3MgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChfY3VySW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkTmFtZWQoWE1MTmFtZSBuYW1lLCBpbnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgdGFyZ2V0aW5kZXggPSAwOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9yZS5fbmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2N1ckluZGV4ID0gdGFyZ2V0aW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY3VycG9zID0gc3RvcmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXJnZXRpbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZEF0KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgX2N1ckluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICBfY3VycG9zID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGlsZEF0KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHRhcmdldCA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgIHRhcmdldC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbnNlcnRDaGlsZEF0KGludCBpbmRleCwgWE1MTmFtZSBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICBpbmRleCA+IDAgOiBpbmRleCA+IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBfY3VycG9zLl90ZXh0TGVhZkNvbnRlbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5hZGQoaW5kZXgsIF9jdXJwb3MubWFrZU5ld0NoaWxkKG5hbWUsIGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChYTUxOYW1lIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJwb3MuX3RleHRMZWFmQ29udGVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmFkZChfY3VycG9zLm1ha2VOZXdDaGlsZChuYW1lLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjb3VudENoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIHJldHVybiBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFhNTE5hbWUgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIGF0dHIgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGF0dHIuX3RleHRMZWFmQ29udGVudDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICIiIDogcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBdHRyaWJ1dGUoWE1MTmFtZSBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFhNTE5hbWUgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBhdHRyID0gX2N1cnBvcy5tYWtlTmV3Q2hpbGQobmFtZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGF0dHIuX3RleHRMZWFmQ29udGVudCA9IHZhbHVlOwotICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzLnB1dChuYW1lLCBhdHRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2N1cnBvcy5fdGV4dExlYWZDb250ZW50ID0gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyAvLyBpbiBwcmFjdGljZSBwZXJoYXBzIHdlIHdhbnQgdG8gY29uY2F0ZW5hdGUgZmxhdHRlbmVkIHN0cmlwcGVkIHRleHQKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBfY3VycG9zLl90ZXh0TGVhZkNvbnRlbnQ7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAiIiA6IHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIEN1cnNvciBuZXdDdXJzb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJzb3IgcmVzdWx0ID0gbmV3IEN1cnNvcigpOwotICAgICAgICAgICAgcmVzdWx0Ll9jdXJJbmRleCA9IF9jdXJJbmRleDsKLSAgICAgICAgICAgIHJlc3VsdC5fY3VycG9zID0gX2N1cnBvczsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRlc3RUeXBlU3RvcmUgbWFrZVJvb3RTdG9yZShTY2hlbWFUeXBlIHJvb3RUeXBlKQotICAgIHsKLSAgICAgICAgVGVzdFR5cGVTdG9yZSByZXN1bHQgPSBuZXcgVGVzdFR5cGVTdG9yZSgpOwotICAgICAgICByZXN1bHQuX3BhcmVudCA9IG51bGw7Ci0gICAgICAgIHJlc3VsdC5fbmFtZSA9IG51bGw7Ci0gICAgICAgIHJlc3VsdC5faXNBdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgcmVzdWx0Ll91c2VyID0gKChUeXBlU3RvcmVVc2VyRmFjdG9yeSlyb290VHlwZSkuY3JlYXRlVHlwZVN0b3JlVXNlcigpOwotICAgICAgICBpZiAocmVzdWx0Ll91c2VyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJlc3VsdC5fdXNlci5hdHRhY2hfc3RvcmUocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy90ZXN0c3RvcmUvY29tL2JlYS90ZXN0L1Rlc3RUeXBlU3RvcmUuamF2YSBiL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdFR5cGVTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQzODVjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdFR5cGVTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5iZWEudGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudmFsdWVzLlR5cGVTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnZhbHVlcy5UeXBlU3RvcmVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudmFsdWVzLlR5cGVTdG9yZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgeG1sLnV0aWwuU2NoZW1hVHlwZTsKLWltcG9ydCB4bWwudXRpbC5RTmFtZVNldDsKLWltcG9ydCB4bWwudXRpbC5YbWxDdXJzb3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VHlwZVN0b3JlIGltcGxlbWVudHMgVHlwZVN0b3JlCi17Ci0gICAgVGVzdFR5cGVTdG9yZSBfcGFyZW50OwotICAgIFR5cGVTdG9yZVVzZXIgX3VzZXI7Ci0gICAgWE1MTmFtZSBfbmFtZTsKLSAgICBib29sZWFuIF9pc0F0dHJpYnV0ZTsKLSAgICBib29sZWFuIF9pc05pbDsKLSAgICBTdHJpbmcgX3RleHRMZWFmQ29udGVudDsKLSAgICBMaXN0IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzOwotICAgIE1hcCBfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzOwotCi0gICAgcHVibGljIFhtbEN1cnNvciBuZXdfY3Vyc29yKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlX3RleHQoVHlwZVN0b3JlVXNlciB1c2VyKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KCFoYXNFbGVtZW50cygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZldGNoX3RleHQoaW50IHdoaXRlc3BhY2VSdWxlKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KCFoYXNFbGVtZW50cygpKTsKLSAgICAgICAgcmV0dXJuIF90ZXh0TGVhZkNvbnRlbnQgPT0gbnVsbCA/ICIiIDogYXBwbHlfd3NyKF90ZXh0TGVhZkNvbnRlbnQsIHdoaXRlc3BhY2VSdWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9yZV90ZXh0KFR5cGVTdG9yZVVzZXIgdXNlciwgU3RyaW5nIHRleHQpCi0gICAgewotICAgICAgICBhc3NlcnQoIWhhc0VsZW1lbnRzKCkpOwotICAgICAgICBfdGV4dExlYWZDb250ZW50ID0gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZXJlIHRoZSBUeXBlU3RvcmUgaXMgcmVzcG9uc2libGUgZm9yIGxvY2F0aW5nIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIFRoaXMgaXMgZG9uZSBhcyBmb2xsb3dzCi0gICAgICogKDEpIGdvIHRvIHRoZSBwYXJlbnQgVHlwZVN0b3JlVXNlcgotICAgICAqICgyKSBhc2sgaXQgdG8gZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KHFuYW1lKSAob3IgX2F0dHJpYnV0ZV8pLCBhbmQgcmV0dXJuIGl0IGlmIG5vdCBudWxsLgotICAgICAqICgyKSBvdGhlcndpc2UsIGdyYWIgYSBuZXcgVHlwZVN0b3JlVXNlclZpc2l0b3IgdmlhIHYgPSBwYXJlbnR1c2VyLm5ld192aXNpdG9yKCk7Ci0gICAgICogKDMpIGNhbGwgdi52aXNpdChuYW1lKSBvbiBfZXZlcnlfIGVsZW1lbnQgcW5hbWUgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIG9uZSBpbiBvcmRlcgotICAgICAqICg0KSByZXR1cm4gdGhlIHJlc3VsdCBvZiB2LmdldF9kZWZhdWx0X3RleHQoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfZGVmYXVsdF90ZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfcGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIFN0cmluZyBkZWZ0ZXh0ID0KLSAgICAgICAgICAgIF9pc0F0dHJpYnV0ZSA/IF9wYXJlbnQuX3VzZXIuZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3RleHQoX25hbWUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJlbnQuX3VzZXIuZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KF9uYW1lKTsKLSAgICAgICAgaWYgKGRlZnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gX3BhcmVudC5fdXNlci5uZXdfdmlzaXRvcigpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX3BhcmVudC5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc2libGluZyA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQoc2libGluZy5fbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IuZ2V0X2RlZmF1bHRfdGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJJbnZhcmlhbnQgZXJyb3I6IHBhcmVudCBkb2Vzbid0IGhhdmUgdGhpcyBhcyBjaGlsZC4iOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZ0ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcHV0ZV9lbGVtZW50ZmxhZ3MoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpbnQgZmxhZ3M7Ci0gICAgICAgIGlmIChfaXNBdHRyaWJ1dGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZsYWdzID0gX3BhcmVudC5fdXNlci5nZXRfYXR0cmlidXRlZmxhZ3MoX25hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmxhZ3MgPSBfcGFyZW50Ll91c2VyLmdldF9lbGVtZW50ZmxhZ3MoX25hbWUpOwotICAgICAgICAgICAgaWYgKGZsYWdzID09IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IF9wYXJlbnQuX3VzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHNpYmxpbmcgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdChzaWJsaW5nLl9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9lbGVtZW50ZmxhZ3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJJbnZhcmlhbnQgZXJyb3I6IHBhcmVudCBkb2Vzbid0IGhhdmUgdGhpcyBhcyBjaGlsZC4iOwotICAgICAgICAgICAgICAgIGZsYWdzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmxhZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZV9uaWwoVHlwZVN0b3JlVXNlciB1c2VyKQotICAgIHsKLSAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBkb25lIGxhdGVyCi0gICAgICAgIF9pc05pbCA9IF91c2VyLmJ1aWxkX25pbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmRfbmlsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaXNOaWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkoU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgdGVzdCBoYXJuZXNzIGhhcyBubyBuYW1lc3BhY2Ugc3VwcG9ydCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY291bnRfZWxlbWVudHMoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChUZXN0VHlwZVN0b3JlKWkubmV4dCgpKS5fbmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlcihYTUxOYW1lIG5hbWUsIGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKHN0b3JlLl9uYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLl91c2VyOwotICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsgLy8gbm8gZXhjZXB0aW9uIHBsZWFzZQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoWE1MTmFtZSBuYW1lLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBUeXBlU3RvcmVVc2VyIHRhcmdldCA9IG51bGw7Ci0gICAgICAgIGludCBpbnNlcnRpbmRleCA9IDA7Ci0KLSAgICAgICAgaWYgKF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxhc3Rmb3VuZGF0ID0gMDsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdGZvdW5kYXQgPSBpbnNlcnRpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnNlcnRpbmRleCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZTsgaW5zZXJ0IHJpZ2h0IGJlZm9yZQotICAgICAgICAgICAgICAgIGluc2VydGluZGV4ID0gbGFzdGZvdW5kYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpbmRleCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgc2V2ZXJhbDsgdGhhdCdzIGlsbGVnYWwuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGZvdW5kIGFsbCBidXQgbGFzdCBvbmU6IHdlIG11c3QgYmUgYXBwZW5kaW5nLgotICAgICAgICAgICAgICAgIC8vIGJ1dCB3aGVyZSB0byBhcHBlbmQ/Ci0KLSAgICAgICAgICAgICAgICBRTmFtZVNldCBkZWxpbWl0ZXJzID0gX3BhcmVudC5fdXNlci5nZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyhuYW1lKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW5zZXJ0aW5kZXggPSBsYXN0Zm91bmRhdCArIDE7IGluc2VydGluZGV4IDwgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpOyBpbnNlcnRpbmRleCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKV9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChpbnNlcnRpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXJzLmNvbnRhaW5zKHN0b3JlLl9uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpbnNlcnRpbmRleCBpcyB3aGVyZXZlciB0aGUgZmlyc3QgZGVsaW1pdGVyIGlzIGZvdW5kCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBpbnNlcnRpbmRleCBpcyBvbmUgcGFzdCB0aGUgZW5kLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVGVzdFR5cGVTdG9yZSBuZXdDaGlsZCA9IG1ha2VOZXdDaGlsZChuYW1lLCBmYWxzZSk7Ci0gICAgICAgIF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmFkZChpbnNlcnRpbmRleCwgbmV3Q2hpbGQpOwotICAgICAgICByZXR1cm4gbmV3Q2hpbGQuX3VzZXI7Ci0gICAgfQotCi0gICAgVGVzdFR5cGVTdG9yZSBtYWtlTmV3Q2hpbGQoWE1MTmFtZSBuYW1lLCBib29sZWFuIGlzQXR0cmlidXRlKQotICAgIHsKLSAgICAgICAgVGVzdFR5cGVTdG9yZSByZXN1bHQgPSBuZXcgVGVzdFR5cGVTdG9yZSgpOwotICAgICAgICByZXN1bHQuX3BhcmVudCA9IHRoaXM7Ci0gICAgICAgIHJlc3VsdC5fbmFtZSA9IG5hbWU7Ci0gICAgICAgIHJlc3VsdC5faXNBdHRyaWJ1dGUgPSBpc0F0dHJpYnV0ZTsKLSAgICAgICAgaWYgKGlzQXR0cmlidXRlKQotICAgICAgICAgICAgcmVzdWx0Ll91c2VyID0gX3VzZXIuY3JlYXRlX2F0dHJpYnV0ZV91c2VyKG5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQuX3VzZXIgPSBfdXNlci5jcmVhdGVfZWxlbWVudF91c2VyKG5hbWUsIG51bGwpOyAvLyBubyB4c2k6dHlwZXMgZm9yIG5vdwotICAgICAgICBpZiAocmVzdWx0Ll91c2VyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJlc3VsdC5fdXNlci5hdHRhY2hfc3RvcmUocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoKQotICAgIHsKLSAgICAgICAgaWYgKF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHN0b3JlLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBfY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9IG51bGw7Ci0gICAgICAgIGlmIChfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RvcmUuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPSBudWxsOwotICAgICAgICBfdXNlci5kaXNjb25uZWN0X3N0b3JlKCk7Ci0gICAgICAgIF91c2VyID0gbnVsbDsKLSAgICAgICAgX3BhcmVudCA9IG51bGw7Ci0gICAgICAgIF9uYW1lID0gbnVsbDsKLSAgICAgICAgX3RleHRMZWFmQ29udGVudCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBmaW5kSW5zZXJ0SW5kZXhCYXNlZE9uT3JkZXIoWE1MTmFtZVtdIG9yZGVyLCBYTUxOYW1lIG5hbWVUb0FkZCkKLSAgICB7Ci0gICAgICAgIGludCBvcmRlcmluZGV4ID0gMDsKLSAgICAgICAgaW50IGluc2VydGluZGV4ID0gMDsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICB3aGlsZSAob3JkZXJpbmRleCA8IG9yZGVyLmxlbmd0aCAmJiAhb3JkZXJbb3JkZXJpbmRleF0uZXF1YWxzKHN0b3JlLl9uYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3JkZXJbb3JkZXJpbmRleF0uZXF1YWxzKG5hbWVUb0FkZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0aW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9yZGVyaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc2VydGluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluc2VydF9lbGVtZW50X3VzZXIobmFtZSwgY291bnRfZWxlbWVudHMobmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9lbGVtZW50KFhNTE5hbWUgbmFtZSwgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgVHlwZVN0b3JlVXNlciB0YXJnZXQgPSBudWxsOwotICAgICAgICBpbnQgcmVtb3ZlaW5kZXggPSAwOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMucmVtb3ZlKHJlbW92ZWluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2F0dHJpYnV0ZV91c2VyKFhNTE5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChzdG9yZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHN0b3JlLl91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9hdHRyaWJ1dGVfdXNlcihYTUxOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyAhPSBudWxsICYmIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIFRlc3RUeXBlU3RvcmUgbmV3Q2hpbGQgPSBtYWtlTmV3Q2hpbGQobmFtZSwgdHJ1ZSk7Ci0gICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMucHV0KG5hbWUsIG5ld0NoaWxkKTsKLSAgICAgICAgcmV0dXJuIG5ld0NoaWxkLl91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCB8fCAhX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5yZW1vdmUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRfZWxlbWVudHMoVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgdmlzaXRvci52aXNpdChzdG9yZS5fbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlzaXRvci52aXNpdChudWxsKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFbGVtZW50cygpCi0gICAgewotICAgICAgICByZXR1cm4gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWxnb3JpdGhtIHVzZWQgYnkgYXBwbHlfd3NjYW5vbjogc29tZXRpbWVzIHVzZWQgaW4gaW1wbHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgYXBwbHlfd3NyKFN0cmluZyB2LCBpbnQgd3NyKQotICAgIHsKLSAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFIHx8IHdzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0KLSAgICAgICAgaWYgKHYuaW5kZXhPZignXG4nKSA+PSAwKQotICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXG4nLCAnICcpOwotICAgICAgICBpZiAodi5pbmRleE9mKCdcdCcpID49IDApCi0gICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdcdCcsICcgJyk7Ci0gICAgICAgIGlmICh2LmluZGV4T2YoJ1xyJykgPj0gMCkKLSAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1xyJywgJyAnKTsKLQotICAgICAgICBpZiAod3NyID09IFNjaGVtYVR5cGUuV1NfUkVQTEFDRSkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgaW50IGxlbiA9IHYubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIC8qIGEgdHJpY2s6IGV4YW1pbmUgZXZlcnkgb3RoZXIgY2hhcmFjdGVyIGxvb2tpbmcgZm9yIHBhaXJzIG9mIHNwYWNlcyAqLwotICAgICAgICBleGFtaW5lOiBpZiAodi5jaGFyQXQoMCkgIT0gJyAnKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAyOyBqIDwgbGVuOyBqICs9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopID09ICcgJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqIC0gMSkgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gbGVuIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGogPT0gbGVuICYmIHYuY2hhckF0KGogLSAxKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaiBpcyBwb2ludGluZyBhdCB0aGUgZmlyc3Qgd3MgdG8gYmUgcmVtb3ZlZCwgb3IgcGFzdCBlbmQgKi8KLSAgICAgICAgY2hhcltdIGNoID0gdi50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgaSA9IGo7Ci0KLSAgICAgICAgc2hpZnRlcjogZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBqIHdhcyB3cyBvciBwYXN0IGVuZCAqLwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgaWYgKGogIT0gJyAnKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaiB3YXMgbm9ud3MgKi8KLSAgICAgICAgICAgICAgICBjaFtpKytdID0gY2hbaisrXTsKLSAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgaWYgKGNoW2pdID09ICcgJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoW2krK10gPSBjaFtqKytdOwotICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzaGlmdGVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hbal0gPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2gsIDAsIChpID09IDAgfHwgY2hbaSAtIDFdICE9ICcgJykgPyBpIDogaSAtIDEpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy91bm1hcnNoYWwvY29tL2JlYS90ZXN0L1Rlc3RTdHJ1Y3R1cmUuamF2YSBiL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVGVzdFN0cnVjdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQwNWQ0Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVGVzdFN0cnVjdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmJlYS50ZXN0OwotCi1wdWJsaWMgY2xhc3MgVGVzdFN0cnVjdHVyZQotewotICAgIHB1YmxpYyBpbnQgdmFySW50OwotICAgIHB1YmxpYyBmbG9hdCB2YXJGbG9hdDsKLSAgICBwdWJsaWMgU3RyaW5nIHZhclN0cmluZzsKLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVW5tYXJzaGFsLmphdmEgYi92MS90ZXN0L3NyYy91bm1hcnNoYWwvY29tL2JlYS90ZXN0L1VubWFyc2hhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDRmOWI0Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVW5tYXJzaGFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnVubWFyc2hhbC5NZXNzYWdlUGxhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnVubWFyc2hhbC5Vbm1hcnNoYWxQbGFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudW5tYXJzaGFsLlNpbXBsZVR5cGVQbGFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudW5tYXJzaGFsLlN0cnVjdHVyZVBsYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy51bm1hcnNoYWwuVW5tYXJzaGFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBVbm1hcnNoYWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNZXNzYWdlUGxhbiBtZXNzYWdlUGxhbiA9IG5ldyBNZXNzYWdlUGxhbigyKTsKLQotICAgICAgICBTaW1wbGVUeXBlUGxhbiBwYXJhbTFQbGFuID0gbmV3IFNpbXBsZVR5cGVQbGFuKFNpbXBsZVR5cGVQbGFuLkpBVkFfRkxPQVQsIHRydWUsIFNjaGVtYVR5cGUuQlRDX0RPVUJMRSwgbnVsbCwgMCk7Ci0KLSAgICAgICAgU3RydWN0dXJlUGxhbiBwYXJhbTJQbGFuID0gbmV3IFN0cnVjdHVyZVBsYW4oKTsKLQotICAgICAgICBwYXJhbTJQbGFuLnNldFRhcmdldENsYXNzKGNvbS5iZWEudGVzdC5UZXN0U3RydWN0dXJlLmNsYXNzKTsKLSAgICAgICAgcGFyYW0yUGxhbi5zZXRJbmZvRm9yRWxlbWVudChuZXcgUU5hbWUoInZhckludCIpLCBuZXcgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8oInZhckludCIsIGZhbHNlLCAiY29tLmJlYS50ZXN0LlRlc3RTdHJ1Y3R1cmUiLCBudWxsLCBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mby5TSU5HTEVUT04sIG5ldyBTaW1wbGVUeXBlUGxhbihTaW1wbGVUeXBlUGxhbi5KQVZBX0lOVCwgdHJ1ZSwgU2NoZW1hVHlwZS5CVENfSU5URUdFUiwgbnVsbCwgMCkpKTsKLSAgICAgICAgcGFyYW0yUGxhbi5zZXRJbmZvRm9yRWxlbWVudChuZXcgUU5hbWUoInZhckZsb2F0IiksIG5ldyBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mbygidmFyRmxvYXQiLCBmYWxzZSwgImNvbS5iZWEudGVzdC5UZXN0U3RydWN0dXJlIiwgbnVsbCwgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8uU0lOR0xFVE9OLCBuZXcgU2ltcGxlVHlwZVBsYW4oU2ltcGxlVHlwZVBsYW4uSkFWQV9GTE9BVCwgdHJ1ZSwgU2NoZW1hVHlwZS5CVENfRkxPQVQsIG51bGwsIDApKSk7Ci0gICAgICAgIHBhcmFtMlBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJ2YXJTdHJpbmciKSwgbmV3IFN0cnVjdHVyZVBsYW4uRmllbGRJbmZvKCJ2YXJTdHJpbmciLCBmYWxzZSwgImNvbS5iZWEudGVzdC5UZXN0U3RydWN0dXJlIiwgbnVsbCwgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8uU0lOR0xFVE9OLCBuZXcgU2ltcGxlVHlwZVBsYW4oU2ltcGxlVHlwZVBsYW4uSkFWQV9TVFJJTkcsIGZhbHNlLCBTY2hlbWFUeXBlLkJUQ19TVFJJTkcsIG51bGwsIDApKSk7Ci0KLSAgICAgICAgbWVzc2FnZVBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJMYXN0VHJhZGVQcmljZSIpLCBuZXcgTWVzc2FnZVBsYW4uUGFyYW1JbmZvKDAsIE1lc3NhZ2VQbGFuLlBhcmFtSW5mby5TSU5HTEVUT04sIHBhcmFtMVBsYW4pKTsKLSAgICAgICAgbWVzc2FnZVBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJpbnB1dFN0cnVjdCIpLCBuZXcgTWVzc2FnZVBsYW4uUGFyYW1JbmZvKDEsIE1lc3NhZ2VQbGFuLlBhcmFtSW5mby5TSU5HTEVUT04sIHBhcmFtMlBsYW4pKTsKLQotICAgICAgICBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKG5ldyBGaWxlKGFyZ3NbMF0pKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlucHV0ID0geG9iai5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICB3aGlsZSAoeGlucHV0Lmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHhpbnB1dC5wZWVrKCkuaXNTdGFydEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHhpbnB1dC5za2lwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVbm1hcnNoYWxDb250ZXh0IGNvbnRleHQgPSBuZXcgVW5tYXJzaGFsQ29udGV4dCgpOwotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pbWVzc2FnZVBsYW4udW5tYXJzaGFsKHhpbnB1dCwgY29udGV4dCk7Ci0gICAgICAgIGNvbnRleHQuY29tcGxldGUoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgIiArIGkgKyAiID0gIiArIHJlc3VsdFtpXSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0W2ldIGluc3RhbmNlb2YgVGVzdFN0cnVjdHVyZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0U3RydWN0dXJlIHMgPSAoVGVzdFN0cnVjdHVyZSlyZXN1bHRbaV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHZhckludCA9ICIgKyBzLnZhckludCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHZhckZsb2F0ID0gIiArIHMudmFyRmxvYXQpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB2YXJTdHJpbmcgPSAiICsgcy52YXJTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveG1scGFkL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94bWxwYWQvWG1sUGFkLmphdmEgYi92MS90ZXN0L3NyYy94bWxwYWQvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3htbHBhZC9YbWxQYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyOTdmYS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94bWxwYWQvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3htbHBhZC9YbWxQYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54bWxwYWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKLQotcHVibGljIGNsYXNzIFhtbFBhZAotewotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIaSB0aGVyZSEiICk7Ci0KLSAgICAgICAgbmV3IFhtbFBhZCgpLnJ1bigpOwotICAgIH0KLQotICAgIHZvaWQgcnVuICggKQotICAgIHsKLS8vICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoIFN5c3RlbS5pbi5yZWFkKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9UZXN0WFBhdGguamF2YSBiL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9UZXN0WFBhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NzJlZi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vVGVzdFhQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhwYXRoLmpheGVuOwotCi1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotaW1wb3J0IG9yZy5qYXhlbi5YUGF0aFN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEF1dGhvcjogQ2V6YXIgQW5kcmVpIChjZXphci5hbmRyZWkgYXQgYmVhLmNvbSkKLSAqIERhdGU6IE9jdCAxMCwgMjAwMwotICovCi1wdWJsaWMgY2xhc3MgVGVzdFhQYXRoCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFhtbE9iamVjdCBkb2M7Ci0KLSAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCE9MSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RYUGF0aCB0ZXN0L2Nhc2VzL3hwYXRoL3Rlc3RYUGF0aC54bWwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UobmV3IEZpbGUoYXJnc1swXSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSB4cGF0aCA9IG5ldyBTdHJpbmdbMjVdOwotICAgICAgICAgICAgeHBhdGhbMF0gPSAiL2RvYy9hL0B0ZXN0IjsKLSAgICAgICAgICAgIHhwYXRoWzFdID0gIi8vLiI7Ci0gICAgICAgICAgICB4cGF0aFsyXSA9ICIvZG9jIjsKLSAgICAgICAgICAgIHhwYXRoWzNdID0gIi9kb2MvYSI7Ci0gICAgICAgICAgICB4cGF0aFs0XSA9ICIvL0AqIjsKLSAgICAgICAgICAgIHhwYXRoWzVdID0gIi4iOwotICAgICAgICAgICAgeHBhdGhbNl0gPSAiLy9hbmNlc3Rvci1vci1zZWxmOjoqIjsKLSAgICAgICAgICAgIHhwYXRoWzddID0gIi4vY2hpbGQ6OipbMV0iOwotICAgICAgICAgICAgeHBhdGhbOF0gPSAiLy9kZXNjZW5kYW50LW9yLXNlbGY6OiovQCpbMV0iOwotICAgICAgICAgICAgeHBhdGhbOV0gPSAiLy9AKiB8ICogfCBub2RlKCkiOwotICAgICAgICAgICAgeHBhdGhbMTBdID0gIi8vKiI7Ci0gICAgICAgICAgICB4cGF0aFsxMV0gPSAiL2RvYy9uYW1lc3BhY2U6OioiOwotICAgICAgICAgICAgeHBhdGhbMTJdID0gIi8vZGVzY2VuZGFudDo6Y29tbWVudCgpIjsKLSAgICAgICAgICAgIHhwYXRoWzEzXSA9ICIvLypbbG9jYWwtbmFtZSgpPSdhJ10iOwotICAgICAgICAgICAgeHBhdGhbMTRdID0gIi8vKi9AKiI7ICAgICAgICAgLy8gICIvLypbY3VycmVudCgpXS9AKiI7Ci0gICAgICAgICAgICB4cGF0aFsxNV0gPSAiLy8qW2xhc3QoKV0iOwotICAgICAgICAgICAgeHBhdGhbMTZdID0gImRvYy8qW2xhc3QoKV0iOwotICAgICAgICAgICAgeHBhdGhbMTddID0gIi9kb2MvYS8qL0AqIjsgLy8gIi9kb2MvYS8qW2N1cnJlbnQoKV0vQCoiOwotICAgICAgICAgICAgeHBhdGhbMThdID0gImRvYy9kZXNjZW5kYW50Ojpub2RlKCkiOwotICAgICAgICAgICAgeHBhdGhbMTldID0gImRvYy9hL0AqIjsKLSAgICAgICAgICAgIHhwYXRoWzIwXSA9ICJkb2MvYi9hL2FuY2VzdG9yLW9yLXNlbGY6OioiOwotICAgICAgICAgICAgeHBhdGhbMjFdID0gImRvYy9iL2EvcHJlY2VkaW5nOjoqIjsKLSAgICAgICAgICAgIHhwYXRoWzIyXSA9ICJkb2MvYS9mb2xsb3dpbmc6OioiOwotICAgICAgICAgICAgeHBhdGhbMjNdID0gIi9kb2MvYi9wcmVjZWRpbmctc2libGluZzo6KiI7Ci0gICAgICAgICAgICB4cGF0aFsyNF0gPSAiL2RvYy9hL2ZvbGxvd2luZy1zaWJsaW5nOjoqIjsKLQotICAgICAgICAgICAgdGVzdDEoZG9jLCB4cGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhQYXRoU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggZS5nZXRNdWx0aWxpbmVNZXNzYWdlKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QxKFhtbE9iamVjdCBkb2MsIFN0cmluZ1tdIHhwYXRoZXMpIHRocm93cyBKYXhlbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHhwYXRoZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJ1blhwYXRoMihkb2MsIHhwYXRoZXNbaV0sIGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5YcGF0aDEoWG1sT2JqZWN0IGRvYywgU3RyaW5nIHhwYXRoU3RyLCBpbnQgaSkKLSAgICAgICAgdGhyb3dzIEpheGVuRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuPj4+PT09PT09PT09PT09PT09PT0gIiArIGkgKyAiICIgKyB4cGF0aFN0ciArICIgPT09PT09PT09PT09PT09PT09PT09PT09PDw8Iik7Ci0KLSAgICAgICAgWFBhdGggeHBhdGggPSBuZXcgWEJlYW5zWFBhdGgoeHBhdGhTdHIpOwotICAgICAgICBYbWxDdXJzb3IgeGMgPSBkb2MubmV3Q3Vyc29yKCk7Ci0JCUxpc3QgcmVzdWx0cyA9IHhwYXRoLnNlbGVjdE5vZGVzKCB4YyApOwotCi0gICAgICAgIEl0ZXJhdG9yIHJlc3VsdEl0ZXIgPSByZXN1bHRzLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50IDo6IFxuIiArIGRvYyApOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIHdoaWxlICggcmVzdWx0SXRlci5oYXNOZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4YyA9IChYbWxDdXJzb3IpcmVzdWx0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4gIiArIChqKyspICsgIiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08ICIgKyB4Yy5jdXJyZW50VG9rZW5UeXBlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCB4YyApOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4+Pj5SZXN1bHRzOiAiICsgaiArICIgICAgIiArIHhwYXRoU3RyICsgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PTw8PCIpOwotCQl4Yy5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5YcGF0aDIoWG1sT2JqZWN0IGRvYywgU3RyaW5nIHhwYXRoU3RyLCBpbnQgaSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4+Pj49PT09PT09PT09PT09PT09PSAiICsgaSArICIgIiArIHhwYXRoU3RyICsgIiA9PT09PT09PT09PT09PT09PT09PT09PT08PDwiKTsKLQotICAgICAgICBYbWxDdXJzb3IgeGMgPSBkb2MubmV3Q3Vyc29yKCk7Ci0JCXhjLnNlbGVjdFBhdGgoeHBhdGhTdHIpOwotCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCA6OiBcbiIgKyBkb2MgKTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICB3aGlsZSAoIHhjLnRvTmV4dFNlbGVjdGlvbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+ICIgKyAoaisrKSArICIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCAiICsgeGMuY3VycmVudFRva2VuVHlwZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggeGMgKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuPj4+UmVzdWx0czogIiArIGogKyAiICAgICIgKyB4cGF0aFN0ciArICIgPT09PT09PT09PT09PT09PT09PT09PT09PT08PDwiKTsKLQkJeGMuZGlzcG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNEZW1vLmphdmEgYi92MS90ZXN0L3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWEJlYW5zRGVtby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjc5OTlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNEZW1vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhwYXRoLmpheGVuOwotCi1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotaW1wb3J0IG9yZy5qYXhlbi5KYXhlbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbi5YQmVhbnNYUGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCi0gKiBEYXRlOiBPY3QgMTAsIDIwMDMKLSAqLwotcHVibGljIGNsYXNzIFhCZWFuc0RlbW8KLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB4cGF0aFN0cjsKLSAgICAgICAgICAgIEZpbGUgZmlsZTsKLQotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIT0yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IFhCZWFuc0RlbW8gZmlsZS54bWwgeHBhdGgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgIHhwYXRoU3RyID0gYXJnc1sxXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVzdDEoeHBhdGhTdHIsIGZpbGUpOwotCi0gICAgICAgICAgICB0ZXN0Myh4cGF0aFN0ciwgZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MShTdHJpbmcgeHBhdGhTdHIsIEZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4gLS0tLS0gdGVzdDE6ICAgWEJlYW5zWFBhdGguc2VsZWN0Tm9kZXMoeHBhdGhTdHIpIE5hdmlnYXRvcjogWG1sQm9va21hcmtzICsgMSBYbWxDdXJzb3IgZW1iZWRlZCBpbiB0aGUgYm9va21hcmsgLS0tLS0iKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOwotICAgICAgICAgICAgWFBhdGggeHBhdGggPSBuZXcgWEJlYW5zWFBhdGgoeHBhdGhTdHIpOwotICAgICAgICAgICAgWG1sQ3Vyc29yIHhjID0gZG9jLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRzID0geHBhdGguc2VsZWN0Tm9kZXMoeGMpOwotCi0gICAgICAgICAgICBJdGVyYXRvciByZXN1bHRJdGVyID0gcmVzdWx0cy5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50IDo6ICIgKyBkb2MgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgWFBhdGggOjogIiArIHhwYXRoICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHRzIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0KLSAgICAgICAgICAgIHdoaWxlICggcmVzdWx0SXRlci5oYXNOZXh0KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhjID0gKFhtbEN1cnNvcilyZXN1bHRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIHhjICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHRzLnNpemUoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDMoU3RyaW5nIHhwYXRoU3RyLCBGaWxlIGZpbGUpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIC0tLS0tIHRlc3QzOiAgIFhtbEN1cnNvci5zZWxlY3RQYXRoKGNwYXRoKSAgLS0tLS0iKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNwYXRoID0gWG1sQmVhbnMuY29tcGlsZVBhdGgoIHhwYXRoU3RyICk7Ci0gICAgICAgICAgICBYbWxPYmplY3QgZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZmlsZSk7Ci0gICAgICAgICAgICBYbWxDdXJzb3Igc3BlYWtlciA9IGRvYy5uZXdDdXJzb3IoKTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQkJCXNwZWFrZXIudG9TdGFydERvYygpOwotCQkJc3BlYWtlci5zZWxlY3RQYXRoKGNwYXRoKTsKLQkJCXNwZWFrZXIuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCXdoaWxlICggc3BlYWtlci50b05leHRTZWxlY3Rpb24oKSApCi0JCQl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHNwZWFrZXIpOwotCQkJCWNvdW50ICs9IChzcGVha2VyID09IG51bGwgPyAwIDogMSk7Ci0JCQl9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+ICIgKyBjb3VudCArICIgc2VsZWN0aW9ucyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YUGF0aFBlcmYuamF2YSBiL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YUGF0aFBlcmYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzMjI0OC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWFBhdGhQZXJmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhwYXRoLmpheGVuOwotCi1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotaW1wb3J0IG9yZy5qYXhlbi5KYXhlbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbi5YQmVhbnNYUGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCi0gKiBEYXRlOiBPY3QgMTAsIDIwMDMKLSAqLwotcHVibGljIGNsYXNzIFhQYXRoUGVyZgotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHhwYXRoU3RyOwotICAgICAgICAgICAgRmlsZSBmaWxlOwotCi0gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGghPTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogWEJlYW5zRGVtbyBmaWxlLnhtbCB4cGF0aCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0gICAgICAgICAgICAgICAgeHBhdGhTdHIgPSBhcmdzWzFdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3Rlc3QxKHhwYXRoU3RyLCBmaWxlKTsKLSAgICAgICAgICAgIC8vdGVzdDIoeHBhdGhTdHIsIGZpbGUpOwotCi0vLyAgICAgICAgICAgIHRlc3QzdCh4cGF0aFN0ciwgZmlsZSk7Ci0vLyAgICAgICAgICAgIHRlc3QzKHhwYXRoU3RyLCBmaWxlKTsKLS8vICAgICAgICAgICAgdGVzdDQoZmlsZSk7Ci0KLSAgICAgICAgICAgIHRlc3Q1KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MShTdHJpbmcgeHBhdGhTdHIsIEZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4gLS0tLS0gdGVzdDE6ICAgWEJlYW5zWFBhdGguc2VsZWN0Tm9kZXMoeHBhdGhTdHIpIE5hdmlnYXRvcjogWG1sQm9va21hcmtzICsgMSBYbWxDdXJzb3IgZW1iZWRlZCBpbiBOYXZpZ2F0b3IgLS0tLS0iKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOwotICAgICAgICAgICAgWFBhdGggeHBhdGggPSBuZXcgWEJlYW5zWFBhdGgoeHBhdGhTdHIpOwotICAgICAgICAgICAgWG1sQ3Vyc29yIHhjID0gZG9jLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRzID0geHBhdGguc2VsZWN0Tm9kZXMoeGMpOwotCi0gICAgICAgICAgICBJdGVyYXRvciByZXN1bHRJdGVyID0gcmVzdWx0cy5pdGVyYXRvcigpOwotCi0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnQgOjogIiArIGRvYyApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBYUGF0aCA6OiAiICsgeHBhdGggKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdHMiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICAgICAgd2hpbGUgKCByZXN1bHRJdGVyLmhhc05leHQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeGMgPSAoWG1sQ3Vyc29yKXJlc3VsdEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggeGMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdHMuc2l6ZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MihTdHJpbmcgeHBhdGhTdHIsIEZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4gLS0tLS0gdGVzdDI6ICAgWEJlYW5zWFBhdGguc2VsZWN0Tm9kZXMoeHBhdGhTdHIpIE5hdmlnYXRvcjogWG1sQm9va21hcmtzICsgMSBYbWxDdXJzb3IgZW1iZWRlZCBpbiBOYXZpZ2F0b3IgLS0tLS0iKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOwotICAgICAgICAgICAgWFBhdGggeHBhdGggPSBuZXcgWEJlYW5zWFBhdGgoeHBhdGhTdHIpOwotICAgICAgICAgICAgWG1sQ3Vyc29yIGRvY1hDID0gZG9jLm5ld0N1cnNvcigpOwotCi0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzdGFydDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIHNwZWFrZXIgPSAoWG1sQ3Vyc29yKXhwYXRoLnNlbGVjdFNpbmdsZU5vZGUoZG9jWEMpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoc3BlYWtlciA9PSBudWxsID8gMCA6IDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigoaioxMDApICsgIiAgICAgICAgICAgICAgICBcdCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQyKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+PiAiICsgY291bnQgKyAiIHNlbGVjdGlvbnMgaW4gIiArIChlbmQgLSBzdGFydCkgKyAiIG1zIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MyhTdHJpbmcgeHBhdGhTdHIsIEZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4gLS0tLS0gdGVzdDM6ICAgWG1sQ3Vyc29yLnNlbGVjdFBhdGgoY3BhdGgpICAtLS0tLSIpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgY3BhdGggPSBYbWxCZWFucy5jb21waWxlUGF0aCggeHBhdGhTdHIgKTsKLSAgICAgICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShmaWxlKTsKLSAgICAgICAgICAgIFhtbEN1cnNvciBzcGVha2VyID0gZG9jLm5ld0N1cnNvcigpOwotCi0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcGVha2VyLnRvU3RhcnREb2MoKTsKLSAgICAgICAgICAgICAgICAgICAgc3BlYWtlci5zZWxlY3RQYXRoKGNwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9zcGVha2VyLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICggc3BlYWtlci50b05leHRTZWxlY3Rpb24oKSApIDsKLQotICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoc3BlYWtlciA9PSBudWxsID8gMCA6IDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKGoqMTAwKSArICIgICAgICAgICAgICAgICAgXHQiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0MikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gIiArIGNvdW50ICsgIiBzZWxlY3Rpb25zIGluICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtcyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDN0KFN0cmluZyB4cGF0aFN0ciwgRmlsZSBmaWxlKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiAtLS0tLSB0ZXN0MzogICBYbWxDdXJzb3Iuc2VsZWN0UGF0aChjcGF0aCkgIC0tLS0tIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjcGF0aCA9IFhtbEJlYW5zLmNvbXBpbGVQYXRoKCB4cGF0aFN0ciApOwotICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOwotICAgICAgICAgICAgWG1sQ3Vyc29yIHNwZWFrZXIgPSBkb2MubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBzcGVha2VyLnRvU3RhcnREb2MoKTsKLSAgICAgICAgICAgIHNwZWFrZXIuc2VsZWN0UGF0aChjcGF0aCk7Ci0gICAgICAgICAgICAvL3NwZWFrZXIuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLSAgICAgICAgICAgIHdoaWxlICggc3BlYWtlci50b05leHRTZWxlY3Rpb24oKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNwZWFrZXIpOwotICAgICAgICAgICAgICAgIGNvdW50ICs9IChzcGVha2VyID09IG51bGwgPyAwIDogMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+ICIgKyBjb3VudCArICIgc2VsZWN0aW9ucyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDQoRmlsZSBmaWxlKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiAtLS0tLSB0ZXN0NDogICAxIFhtbEN1cnNvciBoYW5kQ29kZWQgIC0tLS0tIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShmaWxlKTsKLSAgICAgICAgICAgIFhtbEN1cnNvciB4YyA9IGRvYy5uZXdDdXJzb3IoKTsKLQotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzdGFydDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeGMudG9TdGFydERvYygpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlYyhuZXcgU3RyaW5nW10geyJQTEFZIiwiQUNUIiwiU0NFTkUiLCJTUEVFQ0giLCJTUEVBS0VSIn0sIDAsIHhjKTsKLQotICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoeGMgPT0gbnVsbCA/IDAgOiAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oKGoqMTAwKSArICIgICAgICAgICAgICAgICAgXHQiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0MikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gIiArIGNvdW50ICsgIiBzZWxlY3Rpb25zIGluICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtcyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVjKFN0cmluZ1tdIHhwLCBpbnQgaSwgWG1sQ3Vyc29yIHhjICkKLSAgICB7Ci0gICAgICAgIGlmIChpPj14cC5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHhjKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4Yy50b0NoaWxkKHhwW2ldKSkgZG8KLSAgICAgICAgewotICAgICAgICAgICAgcmVjKHhwLCBpKzEsIHhjKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSh4Yy50b05leHRTaWJsaW5nKHhwW2ldKSk7Ci0gICAgICAgIHhjLnRvUGFyZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0NSgpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIC0tLS0tIHRlc3Q1OiAgIFhCZWFuc1hQYXRoLnNlbGVjdE5vZGVzKHhwYXRoU3RyKSBOYXZpZ2F0b3I6IFhtbEJvb2ttYXJrcyArIDEgWG1sQ3Vyc29yIGVtYmVkZWQgaW4gTmF2aWdhdG9yIC0tLS0tIik7Ci0KLSAgICAgICAgLy9TdHJpbmcgeG1sRG9jU3RyID0gIjxBQUE+ICA8QkJCIGlkID0gXCJiMVwiLz4gPEJCQiBuYW1lID0gXCIgYmJiIFwiLz4gPEJCQiBuYW1lID0gXCJiYmJcIi8+ICA8L0FBQT4iOwotICAgICAgICAvL1N0cmluZyB4cGF0aFN0ciA9ICIvL0JCQltub3JtYWxpemUtc3BhY2UoQG5hbWUpPSdiYmInXSI7Ci0KLSAgICAgICAgU3RyaW5nIHhtbERvY1N0ciA9Ci0gICAgICAgICAgIjxBQUE+XG4iICsKLSAgICAgICAgICAiICA8QkNDPiBcbiIgKwotICAgICAgICAgICIgICAgIDxCQkIvPlxuIiArCi0gICAgICAgICAgIiAgICAgPEJCQi8+IFxuIiArCi0gICAgICAgICAgIiAgICAgPEJCQi8+IFxuIiArCi0gICAgICAgICAgIiAgPC9CQ0M+IFxuIiArCi0gICAgICAgICAgIiAgPEREQj4gXG4iICsKLSAgICAgICAgICAiICAgICA8QkJCLz5cbiIgKwotICAgICAgICAgICIgICAgIDxCQkIvPiBcbiIgKwotICAgICAgICAgICIgIDwvRERCPiBcbiIgKwotICAgICAgICAgICIgIDxCRUM+IFxuIiArCi0gICAgICAgICAgIiAgICAgPENDQy8+XG4iICsKLSAgICAgICAgICAiICAgICA8REJELz4gXG4iICsKLSAgICAgICAgICAiICA8L0JFQz4gXG4iICsKLSAgICAgICAgICAiPC9BQUE+ICI7Ci0gICAgICAgIFN0cmluZyB4cGF0aFN0ciA9ICIvLypbY29udGFpbnMobmFtZSgpLCdDJyldIjsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhtbERvY1N0cik7Ci0gICAgICAgICAgICBYUGF0aCB4cGF0aCA9IG5ldyBYQmVhbnNYUGF0aCh4cGF0aFN0cik7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgeGMgPSBkb2MubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdHMgPSB4cGF0aC5zZWxlY3ROb2Rlcyh4Yyk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIHJlc3VsdEl0ZXIgPSByZXN1bHRzLml0ZXJhdG9yKCk7Ci0KLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCA6OiAiICsgZG9jICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIFhQYXRoIDo6ICIgKyB4cGF0aCApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0cyIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgICAgICB3aGlsZSAoIHJlc3VsdEl0ZXIuaGFzTmV4dCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4YyA9IChYbWxDdXJzb3IpcmVzdWx0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCB4YyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0cy5zaXplKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL2RlZmF1bHQueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9kZWZhdWx0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlMWQ5Zi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL2RlZmF1bHQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idmFsaWRFbGVtRGVmYXVsdCIgICB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9IjEiLz4KLTwhLS0gQkFVOiB3ZSBjYW4ndCBjb21waWxlIGFueSBtb3JlIGJlY2F1c2UgaXQncyBpbnZhbGlkCi0gIDx4czplbGVtZW50IG5hbWU9ImludmFsaWRFbGVtRGVmYXVsdCIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSJhIi8+Ci0tLT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0idmFsaWRFbGVtRml4ZWQiICAgICB0eXBlPSJ4czppbnQiIGZpeGVkPSIyIi8+Ci08IS0tIEJBVTogd2UgY2FuJ3QgY29tcGlsZSBhbnkgbW9yZSBiZWNhdXNlIGl0J3MgaW52YWxpZAotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnZhbGlkRWxlbUZpeGVkIiAgIHR5cGU9InhzOmludCIgZml4ZWQ9ImIiLz4KLS0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9InZhbGlkQXR0ckRlZmF1bHQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0ciIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSIzIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08IS0tIEJBVTogd2UgY2FuJ3QgY29tcGlsZSBhbnkgbW9yZSBiZWNhdXNlIGl0J3MgaW52YWxpZAotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnZhbGlkQXR0ckRlZmF1bHQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0ciIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSJjIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotLS0+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idmFsaWRBdHRyRml4ZWQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXJpY3R0ciIgdHlwZT0ieHM6aW50IiBmaXhlZD0iNCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPCEtLSBCQVU6IHdlIGNhbid0IGNvbXBpbGUgYW55IG1vcmUgYmVjYXVzZSBpdCdzIGludmFsaWQKLSAgPHhzOmVsZW1lbnQgbmFtZT0iaW52YWxpZEF0dHJGaXhlZCI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyIiB0eXBlPSJ4czppbnQiIGZpeGVkPSJkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotLS0+ICAgIAotICA8IS0tIHR5cGVzIHRvIGhlbHAgdGVzdCBuaWwgLS0+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iY2FuQmVOaWwiIG5pbGxhYmxlPSJ0cnVlIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvcGVyc29uLnhzZCBiL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvcGVyc29uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmYjA4NS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL3BlcnNvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiA+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+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveHN0eXBlcy9zZXR0ZXJzLnhzZCBiL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvc2V0dGVycy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmQ1ODkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMveHN0eXBlcy9zZXR0ZXJzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0ic2V0dGVycyIgdGFyZ2V0TmFtZXNwYWNlPSJzZXR0ZXJzIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL3NpbXBsZWMueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9zaW1wbGVjLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyY2RlYi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL3NpbXBsZWMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGljaXR5Ij4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJtdDp0aG91c2FuZCI+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJub3RlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InRob3VzYW5kIj4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgotICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlIiB0eXBlPSJtdDpzaW1wbGljaXR5Ii8+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL3hzdHlwZXMueG1sIGIvdjEvdGVzdC9zcmMveHN0eXBlcy94c3R5cGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjYTk0Yy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL3hzdHlwZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nSVNPLTg4NTktMSc/PgotPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci08Y3VzdG9tZXIgeG1sbnM9Imh0dHA6Ly9vcGVudXJpLm9yZy94c3R5cGVzL3Rlc3QiCi0gICBnZW5kZXI9Im1hbGUiCi0gICBoZXhBdHQ9IjQ3NDc0OTUxNTQ1NzU5NDc0NyIKLSAgIGJhc2U2NEF0dD0iCi0JVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoCi0JIgotICAgYW55dXJpQXR0PSJodHRwOi8vZG1vei5vcmcvV29ybGQvRnJhbudhaXMvIgotICAgcW5hbWVBdHQ9InByZWY6bG9jYWxuYW1lIiB4bWxuczpwcmVmPSJzb21lX3VyaSIKLSAgIG5vdGF0aW9uQXR0PSJKUEVHIgotICA+Ci0gIDxmaXJzdG5hbWU+SG93ZHk8L2ZpcnN0bmFtZT4KLSAgPG51bWJlcj40MzY8L251bWJlcj4KLSAgPG51bWJlcj4xMjM8L251bWJlcj4KLSAgPGJpcnRoZGF5PjE5OTgtMDgtMjZaPC9iaXJ0aGRheT4KLSAgPG51bWJlcj40NDwvbnVtYmVyPgotICA8bnVtYmVyPjkzMzwvbnVtYmVyPgotICA8YmlydGhkYXk+MjAwMC0wOC0wNi0wODowMDwvYmlydGhkYXk+Ci0gIDxoZXg+NDU0NzQ5NTE1NDU3NTk1QTRBPC9oZXg+Ci0gIDxiYXNlNjQ+VkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoPC9iYXNlNjQ+Ci0gIDxhbnl1cmk+aHR0cDovLzNzcGFjZS5vcmcvc3BhY2UlMjBzcGFjZS88L2FueXVyaT4KLSAgPHFuYW1lPm9wZW51cmlfb3JnX2xvY2FsbmFtZTwvcW5hbWU+Ci0gIDxub3RhdGlvbj5HSUY8L25vdGF0aW9uPgotPC9jdXN0b21lcj4KZGlmZiAtLWdpdCBhL3YxL3hiZWFuZW52LmNtZCBiL3YxL3hiZWFuZW52LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkMTUxZi4uMDAwMDAwMAotLS0gYS92MS94YmVhbmVudi5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TRVQgWE1MQkVBTlNfSE9NRT0lfmRwMC4KZGlmZiAtLWdpdCBhL3YxL3hiZWFuZW52LnNoIGIvdjEveGJlYW5lbnYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZjJkNzkuLjAwMDAwMDAKLS0tIGEvdjEveGJlYW5lbnYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1leHBvcnQgWE1MQkVBTlNfSE9NRT1gcHdkYApkaWZmIC0tZ2l0IGEvdjEveGtpdC9SRUFETUUudHh0IGIvdjEveGtpdC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYwZWM5Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi1YTUxCZWFucyB2IDEuMC4yIERldmVsb3BtZW50IEtpdAotCi0KLVdlbGNvbWUgdG8gWE1MQmVhbnMhCi0KLUFwYWNoZSBYTUxCZWFucyBpcyBhbiBlZmZvcnQgdW5kZXJnb2luZyBpbmN1YmF0aW9uIGF0IHRoZSAKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpLCBzcG9uc29yZWQgYnkgdGhlIFhNTCBwcm9qZWN0LiAKLUluY3ViYXRpb24gaXMgcmVxdWlyZWQgb2YgYWxsIG5ld2x5IGFjY2VwdGVkIHByb2plY3RzIHVudGlsIGEgCi1mdXJ0aGVyIHJldmlldyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5mcmFzdHJ1Y3R1cmUsIGNvbW11bmljYXRpb25zLCAKLWFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcyBoYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCAKLXdpdGggb3RoZXIgc3VjY2Vzc2Z1bCBBU0YgcHJvamVjdHMuIFdoaWxlIGluY3ViYXRpb24gc3RhdHVzIGlzIG5vdCAKLW5lY2Vzc2FyaWx5IGEgcmVmbGVjdGlvbiBvZiB0aGUgY29tcGxldGVuZXNzIG9yIHN0YWJpbGl0eSBvZiB0aGUgCi1jb2RlLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgdGhlIHByb2plY3QgaGFzIHlldCB0byBiZSBmdWxseSAKLWVuZG9yc2VkIGJ5IHRoZSBBU0YuIAotCi0KLUtpdCBjb250ZW50czoKLQotKDEpIE9uZSBjb3B5IG9mIHhiZWFuLmphciwgd2hpY2ggY29udGFpbnMgWE1MQmVhbnMuCi0gICAgU2hvdWxkIHdvcmsgb24gYW55IEpESyAxLjQueC4KLSAgICAuL2xpYi94YmVhbi5qYXIKLQotKDIpIExpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIFhNTCBCZWFucyBhbmQgaW5jbHVkZWQgbGlicmFyaWVzCi0gICAgLi9saWNlbnNlLnR4dAotCi0oMykgT25lIGZvbGRlciBmdWxsIG9mIGNvbW1hbmQtbGluZSBzY3JpcHRzLCBwb2ludGluZyB0byB0aGUKLSAgICB1c2VmdWwgbWFpbigpIGZ1bmN0aW9ucyBpbiB0aGUgSkFSLgotICAgIC4vYmluCi0KLSg0KSBPbmUgYml0IG9mIGFudCB0YXNrIGRvY3VtZW50YXRpb24uCi0gICAgLi9hbnR0YXNrLmh0bWwKLQotKDUpIEEgY29weSBvZiB0aGUgcGxhaW4gamF2YWRvYyB0cmVlIGZvciBvcmcuYXBhY2hlLnhtbGJlYW5zLioKLSAgICAuL2RvY3MvcmVmZXJlbmNlCi0KLSg2KSBBIHByZWxpbWluYXJ5IGNvbGxlY3Rpb24gb2YgbmljZWx5IGZvcm1hdHRlZCB1c2VyLWxldmVsCi0gICAgZG9jdW1lbnRhdGlvbiBIVE1MIChpbmNsdWRlcyByZWZvcm1hdHRlZCBhbmQgbmljZWx5Ci0gICAgb3JnYW5pemVkIGphdmFkb2MgYXMgd2VsbCkKLSAgICAuL2RvY3MvZ3VpZGUKLQotKDcpIEEgZmV3IHNhbXBsZSBzY2hlbWFzCi0gICAgLi9zY2hlbWFzCi0KLQotV2hlcmUgdG8gc3RhcnQ/Ci0KLSgxKSBTZXR1cC4KLQotICAgIDEuIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIEpESyAxLjQueCBpbnN0YWxsZWQ7IHRoYXQgamF2YVsuZXhlXQotICAgICAgIGlzIG9uIHlvdXIgcGF0aCBhbmQgdGhhdCBKQVZBX0hPTUUvYmluIGNvbnRhaW5zIGphdmFbLmV4ZV0sCi0gICAgICAgamF2YWNbLmV4ZV0sIGFuZCBqYXJbLmV4ZV0uCi0KLSAgICAyLiBzZXQgeW91ciBYTUxCRUFOU19IT01FIGVudiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgZGlyZWN0b3J5Ci0gICAgICAgY29udGFpbmluZyB4YmVhbi5qYXIgKGkuZS4sIC4vbGliKS4KLQotICAgIDMuIHB1dCB0aGUgc2NyaXB0cyBpbiAuL2JpbiBvbiB5b3VyIHBhdGguCi0KLSAgICA0LiBydW4gInNjb21wIiB3aXRoIG5vIGFyZ3VtZW50cy4gIFlvdSBzaG91bGQgZ2V0IGEgInVzYWdlIgotICAgICAgIG1lc3NhZ2UuCi0KLSgyKSBUcnkgc29tZSBzY2hlbWEgY29tcGlsYXRpb24KLQotICAgIDEuIEluIHRoZSAuL3NjaGVtYXMgZGlyZWN0b3J5IHlvdSdsbCBmaW5kIHNvbWUgY29sbGVjdGlvbnMgb2YKLSAgICAgICBzY2hlbWFzIHlvdSBjYW4gdHJ5IG91dC4KLQotICAgICAgICAgLSBlYXN5cG86IGEgY29udHJpdmVkIHNpbXBsZSBzdGFydGVyICJwdXJjaGFzZSBvcmRlciIKLSAgICAgICAgIC0gczRzOiB0aGUgU2NoZW1hIGZvciBTY2hlbWEKLQotICAgICAgIFRvIGNvbXBpbGUgdGhlbSwgeW91IGNhbiBqdXN0IHNlbmQgdGhlIHdob2xlIGRpcmVjdG9yeSB0bwotICAgICAgIHNjb21wLCBmb3IgZXhhbXBsZSwgImNkIHNhbXBsZXMiOyB0aGVuICJzY29tcCBlYXN5cG8iLgotICAgICAgIFlvdSB3aWxsIGdldCBhbiAieG1sdHlwZXMuamFyIiBvdXQgdGhhdCBjb250YWlucyBhbGwgdGhlCi0gICAgICAgY29tcGlsZWQgWE1MQmVhbnMuICBUbyBwaWNrIHlvdXIgb3duIEpBUiBmaWxlbmFtZSBqdXN0IHNheQotCi0gICAgICAgc2NvbXAgLW91dCBteWVhc3lwby5qYXIgZWFzeXBvCi0KLQotICAgIDIuIEVzcGVjaWFsbHkgYXMgeW91IGdldCBzdGFydGVkLCB5b3Ugd2lsbCB3YW50IHRvIHNlZSB0aGUKLSAgICAgICAuamF2YSBzb3VyY2UgY29kZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLiAgVG8gZ2V0IHRoYXQsCi0gICAgICAgdXNlIGEgY29tbWFuZC1saW5lIGxpa2UKLQotICAgICAgIHNjb21wIC1zcmMgbXlzcmNkaXIgLW91dCBteWVhc3lwby5qYXIgZWFzeXBvCi0KLSAgICAgICBUaGUgIm15c3JjZGlyIiB3aWxsIGNvbnRhaW4gYWxsIHRoZSAuamF2YSBzb3VyY2UgY29kZQotICAgICAgIGZvciB0aGUgZ2VuZXJhdGVkIFhNTEJlYW5zLgotCi0oMykgVHJ5IHVzaW5nIHlvdXIgY29tcGlsZWQgWE1MQmVhbnMKLQotICAgIE5vdywgYXJtZWQgd2l0aCB0aGUgWE1MQmVhbnMgc291cmNlIGNvZGUgYW5kIHRoZSBiYXNpYwotICAgIGRvY3MsIHlvdSdyZSByZWFkeSB0byBwcm9ncmFtLiAgVGhpbmdzIHlvdSBuZWVkIHRvIGtub3c6Ci0KLSAgICAqIFRoZSBvcmcuYXBhY2hlLnhtbGJlYW5zIHBhY2thZ2UgaGFzIGFsbCB0aGUgcHVibGljIGNsYXNzZXMKLSAgICAgIGZvciBYTUxCZWFucy4gIFByb2dyYW1zIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIGFueXRoaW5nCi0gICAgICBlbHNlIGluIHhiZWFuLmphciBkaXJlY3RseS4KLQotICAgICogWG1sT2JqZWN0IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgWE1MQmVhbnMuICBJdAotICAgICAgY29ycmVzcG9uZHMgdG8geHM6YW55VHlwZS4KLQotICAgICogRXZlcnkgc2NoZW1hIHR5cGUgY29ycmVzcG9uZHMgdG8gYW4gWE1MQmVhbiBpbnRlcmZhY2UsCi0gICAgICBlLmcuLCBYbWxBbnlTaW1wbGVUeXBlIGNvcnJlc3BvbmRzIHRvIHhzOmFueVNpbXBsZVR5cGUsIGFuZAotICAgICAgWG1sSW50IGNvcnJlc3BvbmRzIHRvIHhzOmludCwgZXRjLi4gQW5kIG9mIGNvdXJzZSB0aGlzCi0gICAgICBleHRlbmRzIHRvIHRoZSBYTUxCZWFuIGNsYXNzZXMgY29tcGlsZWQgZnJvbSB1c2VyLWRlZmluZWQKLSAgICAgIHNjaGVtYXMuCi0KLSAgICAqIEV2ZXJ5IFhNTEJlYW4gaW50ZXJmYWNlIGhhcyBhbiBpbm5lciBGYWN0b3J5IGNsYXNzIGZvcgotICAgICAgY3JlYXRpbmcgb3IgcGFyc2luZyBpbnN0YW5jZXMsIGUuZy4sIHRvIGxvYWQgYSBmaWxlIG9mCi0gICAgICBnZW5lcmljIHR5cGUsIHVzZSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteWZpbGUpOyB0bwotICAgICAgcGFyc2UgYSBzdHJpbmcgeW91IGV4cGVjdCB0byBiZSBhIHB1cmNhaHNlLW9yZGVyLCB1c2UKLSAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCI8ZXA6cHVyY2hhc2Utby4uLiIpOwotCi0gICAgKiBYbWxDdXJzb3IgaXMgdGhlIEFQSSBmb3IgZnVsbCBYTUwgaW5mb3NldCB0cmVld2Fsa2luZy4KLSAgICAgIEl0IGlzIG9idGFpbmVkIHZpYSB4bWxvYmplY3QubmV3Q3Vyc29yKCkuIFVzaW5nIGl0IGlzCi0gICAgICBsZXNzIGNvbnZlbmllbnQsIGJ1dCBmYXN0ZXIgdGhhbiB1c2luZyBYTUwgT2JqZWN0cywKLSAgICAgIGJlY2F1c2UgaXQgZG9lcyBub3QgY3JlYXRlIG9iamVjdHMgYXMgaXQgdHJhdmVyc2VzCi0gICAgICB0aGUgWE1MIHRyZWUuCi0KLSAgICAqIFNjaGVtYVR5cGUgaXMgdGhlIGJhc2ljICJzY2hlbWEgcmVmbGVjdGlvbiIgQVBJIChqdXN0IGxpa2UKLSAgICAgIENsYXNzLCBidXQgZm9yIFNjaGVtYSkuICBHZXQgdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBvZiBhbnkKLSAgICAgIGluc3RhbmNlIGJ5IHNheWluZyAieG9iai5zY2hlbWFUeXBlKCk7IiBnZXQgdGhlIHN0YXRpYwotICAgICAgY29uc3RhbnQgc2NoZW1hIHR5cGUgY29ycmVzcG9uZGluZyB0byBhbnkgWE1MQmVhbiBjbGFzcwotICAgICAgYnkgc2F5aW5nICJNeVB1cmNoYXNlT3JkZXIudHlwZSIgb3IgIlhtbEludC50eXBlIi4KLSAgICAgIChBbmFsb2dvdXMgdG8gIm9iai5nZXRDbGFzcygpIiBhbmQgIk9iamVjdC5jbGFzcyIuKQotCi0gICAgKiBBIG51bWJlciBvZiB1dGlsaXR5IG1ldGhvZHMgYXJlIGF2YWxpYWJsZSBvbgotICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucywgaW5jbHVkaW5nIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUKLSAgICAgIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBKYXZhIGNsYXNzIGlzIGFuIFhtbEJlYW4gYW5kCi0gICAgICBmdW5jdGlvbnMgdG8gbWFuYWdlIHJ1bnRpbWUtbG9hZGluZyBvZiBzY2hlbWEgdHlwZQotICAgICAgc3lzdGVtcy4KLQotICAgIFdpdGggdGhhdCwgeW91J3JlIHJlYWR5IHRvIG5hdmlnYXRlIHRoZSBqYXZhZG9jIGFuZCBwbGF5Ci0gICAgd2l0aCB0aGUgY29kZS4gIEFsc28sIHRyeSByZWFkaW5nIHNvbWUgb2Ygb3VyIAotICAgIGRvY3MgdGhhdCBhcmUgaW5jbHVkZWQgaW4gLi9kb2NzCi0KLSg0KSBUcnkgc29tZSBvZiB0aGUgb3RoZXIgdXRpbGl0aWVzOyB5b3UgY2FuIGFsc28gc2VlIGEgZmV3Ci0gICAgZXhhbXBsZXMgb2YgWE1MQmVhbiB0ZWNobmlxdWVzIGluIHRoZWlyIHNvdXJjZSBjb2RlLgotCi0gICAgMS4gInhwcmV0dHkgaW5zdGFuY2UueG1sIiBwcmV0dHktcHJpbnRzIGFuIFhNTCBpbnN0YW5jZQotICAgICAgIGRvY3VtZW50LgotCi0gICAgICAgVGhlIGNvZGUgaXMgaW4geG1sLmFwYWNoZS5vcmcudG9vbC5QcmV0dHlQcmludGVyIGFuZCBpcwotICAgICAgIGEgcmVhc29uYWJsZSBleGFtcGxlIG9mIGhvdyB0byBsb2FkIGFuZCBzYXZlIG91dCBhbgotICAgICAgIGFyYml0cmFyeSBYTUwgZG9jdW1lbnQuICBYbWxPcHRpb25zIGFyZSB1c2VkIHRvIHByb2R1Y2UKLSAgICAgICB0aGUgcHJldHR5LXByaW50aW5nLgotCi0gICAgMi4gInZhbGlkYXRlIGluc3RhbmNlLnhtbCBzY2hlbWEueHNkIiB3aWxsIHZhbGlkYXRlIHRoZQotICAgICAgIGluc3RhbmNlIGFnYWluc3QgdGhlIHNjaGVtYS4gIFhNTEJlYW5zIGlzIGludGVuZGVkIHRvCi0gICAgICAgYmUgYSB2ZXJ5IGFjY3VyYXRlIFhNTCBzY2hlbWEgdmFsaWRhdG9yLgotCi0gICAgICAgVGhlIGNvZGUgaXMgaW4geG1sLmFwYWNoZS5vcmcudG9vbC5JbnN0YW5jZVZhbGlkYXRvci4KLSAgICAgICBJdCBpcyBhbiBleGNlbGxlbnQgZXhhbXBsZSBvZiBob3cgdG8gbG9hZCBhIHNjaGVtYQotICAgICAgIHR5cGUgc3lzdGVtIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUsIGxvYWQgYW5kIHZhbGlkYXRlCi0gICAgICAgYW4gaW5zdGFuY2Ugd2l0aGluIHRoYXQgdHlwZSBzeXN0ZW0sIGFuZCBob3cgdG8gb2J0YWluCi0gICAgICAgbGlzdHMgb2YgYW5kIGxvY2F0aW9ucyBmb3IgdmFsaWRhdGlvbiBlcnJvcnMuCi0KLSAgICAzLiAieHNkdHJlZSBlYXN5cG8iIHdpbGwgc2hvdyB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gICAgICAgb2YgdGhlIHNjaGVtYSB0eXBlcyBpbiB0aGF0IGRpcmVjdG9yeS4KLQotICAgICAgIFRoZSBjb2RlIGlzIGluIHhtbC5hcGFjaGUub3JnLnRvb2wuVHlwZUhpZXJhcmNoeVByaW50ZXIKLSAgICAgICBhbmQgaXMgYSBnb29kIGludHJvZHVjdGlvbiB0byBob3cgdG8gdHJhdmVyc2UgdGhlCi0gICAgICAgbWV0YWRhdGEgaW4gYSBzY2hlbWEgdHlwZSBzeXN0ZW0uCi0KLSAgICA0LiAiZHVtcHhzYiB4YmVhbi5qYXIiIG9yICJkdW1weHNiIG15ZmlsZS54c2IiIHdpbGwgZHVtcAotICAgICAgIHRoZSBjb250ZW50cyBvZiAieHNiIiAoYmluYXJ5IHNjaGVtYSBtZXRhZGF0YSkgZmlsZXMKLSAgICAgICBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0uICBUaGVzZSAueHNiIGZpbGVzIGNvbnRhaW4KLSAgICAgICB0aGUgY29tcGlsZWQgbWV0YWRhdGEgcmVzdWx0aW5nIGZyb20gdGhlIC54c2QgZmlsZXMKLSAgICAgICBvZiBhIHR5cGUgc3lzdGVtLiAgVGhleSBhcmUgYW5hbG9nb3VzIHRvIC5jbGFzcyBmaWxlcwotICAgICAgIGZvciAuamF2YS4KLQo=